C 字符串
目标
在本文章中,您将学习C字符串以及如何有效地操作字符串。
介绍C字符串
字符串是字符序列。C语言没有内置的字符串类型。相反,它使用一个字符数组来定义字符串。因此,C语言中的字符串是一个字符数组。
为了标记字符串的结尾,C使用特殊字符'\0
'。'\0
'被称为空字符。当你显示字符串时,' \0
'不会显示。
null字符的ASCII码为0(零)。C不把空字符计算在字符串长度中。但是在定义字符串时,需要在数组中保留一个元素来存储空字符。
重要的是要注意null字符并不等同于null指针常量。
下面的例子定义了一个包含6个字符的字符串(包括空字符),将字符赋值给字符串数组元素,并在输出中显示该字符串:
#include <stdio.h>
int main()
{
char message[6];
// 赋值字符串元素
message[0] = 'H';
message[1] = 'e';
message[2] = 'l';
message[3] = 'l';
message[4] = 'o';
message[5] = '\0';
// 显示字符串
printf("%s", message);
return 0;
}
输出:
Hello
它是怎么执行的。
- 第一,定义字符串message,它是一个由6个字符组成的数组。
- 第二,将字符分配给单个字符串元素。要结束一个字符串,将'\0'字符赋值给最后一个元素。
- 第三,在输出中显示字符串。要显示字符串,可以使用%s格式说明符。
C允许将字符串初始化为字符串字面量。在这种情况下,编译器将在字符串的末尾添加\0字符。例如:
char message[6] = "Hello";
在这个例子中,字符串“Hello”有5个字符。但是,您需要使用6作为数组的大小来存储空字符。
为了简单起见,可以将中括号置空:
char message[] = "Hello";
如果设置字符串的大小并在字符串中放入更多字符,就会得到字符串溢出错误。
将字符串字面量赋给字符串变量:
要定义字符串字面量,您需要将文本包含在双引号""中。例如:
"Hello"
因为C不允许你将一个数组赋值给另一个数组,所以你不能像这样将字符串字面量赋值给字符串变量:
message = "Hello";
相反,您需要使用标准库函数strcpy()将字符串字面量复制到变量。strcpy()复制整个字符串,包括空字符。要使用strcpy()函数,需要包含string.h标准库。
下面的示例演示了如何将message字符串初始化为“Hello”:
#include <stdio.h>
#include <string.h>
int main()
{
char message[6];
// 把“Hello”赋值给message
strcpy(message, "Hello");
printf("%s", message);
return 0;
}
获得字符串长度:strlen()
c使用可变长度字符串。例如:
#include <stdio.h>
#include <string.h>
int main()
{
char first_string[100] = "Hello";
printf("%s", message);
return 0;
}
这个例子定义了一个最多可以容纳100个字符的字符串。数组的大小为100。但是字符串的长度是5。
要获取字符串的长度,可以使用标准库函数strlen():
#include <stdio.h>
#include <string.h>
int main()
{
// 把 "Hello" 赋值给字符串
char first_string[100] = "Hello";
// 获得字符串的长度
int len = strlen(first_string);
printf(" first_string 的长度是 %d", len);
return 0;
}
将两个字符串连接成一个:strcat()
要将两个字符串连接成一个字符串,可以使用标准库函数strcat()。例如:
#include <stdio.h>
#include <string.h>
int main()
{
char first_string[25] = "Hello",
last_string[25] = "World",
full_string[50];
// 把first_string拷贝给full_string
strcpy(full_string, first_string);
// 连接“ ”和full_string
strcat(full_string, " ");
// 连接last_string和full_string
strcat(full_string, last_string);
// 显示full_string
printf("%s", full_string);
return 0;
}
输出:
Hello World
它是怎么执行的。
第一,声明三个变量用于存储三个字符串 first_string
,last_string
,full_string
:
char first_string[25] = "Hello",
last_string[25] = "World",
full_string[50];
第二,拷贝字符串first_string到full_string:
// 把first_string拷贝给full_string
strcpy(full_string, first_string);
第三,连接字符串“ ”和full_string:
// 连接“ ”和full_string
strcat(full_string, " ");
第四,连接last_string和full_string:
// 连接last_string和full_string
strcat(full_string, last_string);
最后,显示full_string:
// 显示full_string
printf("%s", full_string);
从标准输入中读取一个字符串
标准函数fgets()允许从键盘(或标准输入)读取字符串。下面是fgets()函数的一般语法:
fgets(名字,sizeof(名字),stdin)
在这个语法:
- 名称指定了一个字符串变量。
- sizeof(名字)表示要读取的最大字符数(加1个null字符)。
- stdin是标准输入,在本例中是键盘。
如果按下Enter键,fgets()函数还会从键盘读取行尾字符(\n)。
下面的例子展示了如何从键盘读取字符串:
#include <stdio.h>
#include <string.h>
int main()
{
char message[100];
// 从输入中读取字符串
fgets(message, sizeof(message), stdin);
// 显示输入字符串
printf("%s", message);
printf("字符串的长度是 %d\n", strlen(message));
// 显示字符
for (int i = 0; i < strlen(message); i++)
{
if (message[i] == '\0')
printf("message[%d] = NUL\n", i);
else if (message[i] == '\n')
printf("message[%d] = NEW_LINE\n", i);
else
printf("message[%d] = %c\n", i, message[i]);
}
return 0;
}
如果您输入消息hi
并按enter,您将看到以下输出:
hi
hi
字符串的长度是 3
message[0] = h
message[1] = i
message[2] = NEW_LINE
可以看到,字符串的最后一个字符是新行字符(\n),而不是NUL字符(\0)。
要解决这个问题,你需要用\0结束字符串:
message[strlen(message) - 1] = '\0';
下面的程序通过使用NUL字符('\0')来修复从键盘读取的字符串:
#include <stdio.h>
#include <string.h>
int main()
{
char message[100];
// 从输入获得字符串
fgets(message, sizeof(message), stdin);
message[strlen(message) - 1] = '\0';
// 显示输入字符串
printf("%s\n", message);
printf("字符串长度是 %d\n", strlen(message));
return 0;
}
输出:
hi
hi
字符串长度是 2
比较两个字符串
要比较两个字符串,可以使用strcmp()函数。strcmp()比较每个字符串的第一个字符,如果它们相等,则继续每个字符串中的第二个字符,直到字符不同或达到NUL字符。
strcmp()如果第一个字符串在第二个字符串之前返回-1,如果两个字符串相等返回0,如果第一个字符串在第二个字符串之后返回1。
请看下面的例子:
#include <stdio.h>
#include <string.h>
int main()
{
char sender[25] = "xiaoming",
receiver[25] = "xiaowang";
int result = strcmp(sender, receiver);
printf("%d", result); // -1
return 0;
}
输出:
-1
程序显示-1表示字符串“xiaoming”在“xiaowang”之前。
总结
- 在C语言中,字符串是一个字符数组。字符串使用null字符('\0')来表示字符串的结束。
- 使用strcpy()函数将一个字符串复制到另一个字符串。
- strlen()函数的作用是:获取字符串的长度。
- 使用strcat()函数将两个字符串连接成一个字符串。
- 使用strcmp()函数比较两个字符串。
- 在printf()函数中使用%s格式说明符向输出显示一个字符串。