C 语言中的字符串
C 语言中的字符串是一个 char 类型的一维数组,数组中的最后一个字符是一个"空字符",用 '\0' 表示。因此,C 语言中的字符串可以定义为以空字符结尾的 char 类型值序列。
在 C 语言中创建字符串
我们创建一个字符串"Hello"。它包含五个 char 值。在 C 语言中,char 类型的字面量表示使用单引号符号,例如 'H'。将这五个字母放在单引号中,后跟一个用 '\0' 表示的空字符,赋值给一个 char 类型数组。数组的大小为 5 个字符加上 6 个空字符。
示例
char greet[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
初始化字符串而不指定大小
C 语言允许初始化数组而不声明大小,在这种情况下,编译器会自动确定数组大小。
示例
char greet[] = {'H', 'e', 'l', 'l', 'o', '\0'};
在内存中创建的数组可以示意性地显示如下:

如果字符串不以"\0"结尾,则会导致不可预测的行为。
注意:字符串的长度不包括空字符。库函数 strlen() 返回此字符串的长度为 5。
循环遍历字符串
您可以使用 for 循环 或任何其他 循环语句 循环遍历字符串(字符数组),以访问和操作字符串中的每个字符。
示例
在下面的示例中,我们将打印字符串的字符。
#include <stdio.h> #include <string.h> int main (){ char greeting[] = {'H', 'e', 'l', 'l', 'o', '\0'}; for (int i = 0; i < 5; i++) { printf("%c", greeting[i]); } return 0; }
输出
它将产生以下输出 -
Hello
打印字符串(使用 %s 格式说明符)
C 语言提供了一个格式说明符"%s",用于在使用 printf() 或 fprintf() 等函数时打印字符串。
示例
"%s"说明符指示函数遍历数组,直到遇到空终止符 (\0) 并打印每个字符。这有效地打印了字符数组所表示的整个字符串,而无需使用循环。
#include <stdio.h> int main (){ char greeting[] = {'H', 'e', 'l', 'l', 'o', '\0'}; printf("Greeting message: %s ", greeting ); return 0; }
输出
它将产生以下输出 -
Greeting message: Hello
您可以声明一个超大数组并分配较少的字符数,C 编译器 对此不会产生任何问题。但是,如果数组大小小于初始化时指定的字符数,则输出中可能会出现垃圾值。
char Greeting[3] = {'H', 'e', 'l', 'l', 'o', '\0'}; printf("%s", Greeting);
使用双引号构造字符串
C 语言允许您通过将字符括在双引号中来构造字符串,而不是像以前那样用单引号将单个 char 值组成一个 char 数组,并使用 "\0" 作为最后一个元素。这种初始化字符串的方法更方便,因为编译器会自动添加"\0"作为最后一个字符。
Example
#include <stdio.h> int main() { // 创建字符串 char Greeting[] = "Hello World"; // 打印字符串 printf("%s ", greeting); return 0; }
输出
它将产生以下输出 -
Hello World
使用 scanf() 输入字符串
如果要让用户输入字符串,声明一个以空字符结尾的字符串会比较困难。您可以借助 for 循环,一次接受一个字符并将其存储在数组的每个下标中 -
语法
for(i = 0; i < 6; i++){ scanf("%c", &greeting[i]); } greeting[i] = '\0';
示例
在以下示例中,您可以使用 scanf() 函数 输入一个字符串。输入特定字符(以下示例中为 5 个)后,我们将赋值 null ('\0') 来终止该字符串。
printf("Starting Typing... "); for (i = 0; i < 5; i++) { scanf("%c", &greeting[i]); } // 手动赋值 NULL greeting[i] = '\0'; // 打印字符串 printf("Value of greeting: %s ", greeting);
输出
运行代码并检查其输出 −
Starting typing... Hello Value of greeting: Hello
示例
无法输入"\0"(空字符串),因为它是不可打印的字符。为了解决这个问题,在 scanf() 语句中使用了"%s"格式说明符 -
#include <stdio.h> #include <string.h> int main (){ char greeting[10]; printf("Enter a string: "); scanf("%s", greeting); printf("You entered: "); printf("%s", greeting); return 0; }
输出
运行代码并检查其输出 −
Enter a string: Hello You entered: Hello
注意:如果数组的大小小于输入字符串的长度,则可能会导致垃圾数据、数据损坏等情况。
包含空格的字符串输入
scanf("%s") 会读取字符,直到遇到空格(空格、制表符、换行符等)或 EOF。因此,如果您尝试输入一个包含多个单词(以空格分隔)的字符串,C 程序会接受第一个空格之前的字符作为字符串的输入。
示例
请看以下示例 -
#include <stdio.h> #include <string.h> int main (){ char greeting[20]; printf("Enter a string: "); scanf("%s", greeting); printf("You entered: "); printf("%s", greeting); return 0; }
输出
运行代码并检查其输出 −
Enter a string: Hello World! You entered: Hello
使用 gets() 和 fgets() 函数进行字符串输入
要接受中间带有空格的字符串输入,我们应该使用 gets() 函数。它被称为非格式化控制台输入函数,定义在 stdio.h" 头文件 中。
示例:使用 gets() 函数进行字符串输入
请看以下示例 -
#include <stdio.h> #include <string.h> int main(){ char name[20]; printf("Enter a name: "); gets(name); printf("You entered: "); printf("%s", name); return 0; }
输出
运行代码并检查其输出 −
Enter a name: Sachin Tendulkar You entered: Sachin Tendulkar
在较新版本的 C 语言中,gets() 已被弃用。它是一个潜在的危险函数,因为它不执行边界检查,并且可能导致缓冲区溢出。
建议使用 fgets() 函数。
fgets(char arr[], size, stream);
fgets() 函数 可用于接受来自任何输入流的输入,例如 stdin(键盘)或 FILE(文件流)。
示例:使用 fgets() 函数进行字符串输入
以下程序使用 fgets() 并接受来自用户的多字输入。
#include <stdio.h> #include <string.h> int main(){ char name[20]; printf("Enter a name: "); fgets(name, sizeof(name), stdin); printf("You entered: "); printf("%s", name); return 0; }
输出
运行代码并检查其输出 −
Enter a name: Virat Kohli You entered: Virat Kohli
示例:使用 scanf("%[^ ]s") 输入字符串
您也可以使用 scanf("%[^ ]s") 作为替代方案。它会读取字符,直到遇到换行符 (" ")。
#include <stdio.h> #include <string.h> int main (){ char name[20]; printf("Enter a name: "); scanf("%[^ ]s", name); printf("You entered "); printf("%s", name); return 0; }
输出
运行代码并检查其输出 −
Enter a name: Zaheer Khan You entered Zaheer Khan
使用 puts() 和 fputs() 函数打印字符串
我们一直在使用带有 %s 说明符的 printf() 函数 来打印字符串。我们也可以使用 puts() 函数(在 C11 和 C17 版本中已弃用)或 fputs() 函数 作为替代方案。
示例
请看以下示例 -
#include <stdio.h> #include <string.h> int main (){ char name[20] = "Rakesh Sharma"; printf("With puts(): "); puts(name); printf("With fputs(): "); fputs(name, stdout); return 0; }
输出
运行代码并检查其输出 −
With puts(): Harbhajan Singh With fputs(): Harbhajan Singh