在本教程中,您将学习 C 编程中的字符串。 您将学习通过示例来声明它们,对其进行初始化以及如何将它们用于各种 I/O 操作。
在 C 编程中,字符串是一个以空字符\0结尾的字符序列。 例如:
char c[] = "c string";
当编译器遇到用双引号引起来的字符序列时,默认情况下会在末尾附加一个空字符\0。

如何声明一个字符串?
声明字符串的方法如下:
char s[5];

在这里,我们声明了一个 5 个字符的字符串。
如何初始化字符串?
您可以通过多种方式初始化字符串。
char c[] = "abcd";char c[50] = "abcd";char c[] = {'a', 'b', 'c', 'd', '\0'};char c[5] = {'a', 'b', 'c', 'd', '\0'};

让我们再举一个例子:
char c[5] = "abcde";
在这里,我们试图将 6 个字符(最后一个字符为'\0')分配给具有 5 个字符的char数组。 这很糟糕,您永远不要这样做。
给字符串赋值
数组和字符串是 C 语言中的二等公民。 一旦声明,它们就不支持赋值运算符。 例如,
char c[100];c = "C programming"; // Error! array type is not assignable.
注意:使用strcpy()函数复制字符串。
从用户读取字符串
您可以使用scanf()函数读取字符串。
scanf()函数读取字符序列,直到遇到空格(空格,换行符,制表符等)为止。
示例 1:scanf()读取字符串
#include <stdio.h>int main(){char name[20];printf("Enter name: ");scanf("%s", name);printf("Your name is %s.", name);return 0;}
输出
Enter name: Dennis RitchieYour name is Dennis.
即使在上述程序中输入了Dennis Ritchie,在name字符串中也仅存储了"Dennis"。 这是因为Dennis之后有一个空格。
如何读取一行文本?
您可以使用fgets()函数读取一行字符串。 并且,您可以使用puts()显示字符串。
示例 2:fgets()和puts()
#include <stdio.h>int main(){char name[30];printf("Enter name: ");fgets(name, sizeof(name), stdin); // read stringprintf("Name: ");puts(name); // display stringreturn 0;}
输出
Enter name: Tom HanksName: Tom Hanks
在这里,我们使用fgets()函数从用户读取字符串。
fgets(name, sizeof(name), stdlin); // read string
sizeof(name)的结果为 30。因此,我们最多可以输入 30 个字符,这是name字符串的大小。
为了打印字符串,我们使用了puts(name);。
注意: gets()函数也可以接受用户输入。 但是,它已从 C 标准中删除。
这是因为gets()允许您输入任何长度的字符。 因此,可能存在缓冲区溢出。
将字符串传递给函数
字符串可以通过类似于数组的方式传递给函数。 了解有关将数组传递给函数的更多信息。
示例 3:将字符串传递给函数
#include <stdio.h>void displayString(char str[]);int main(){char str[50];printf("Enter string: ");fgets(str, sizeof(str), stdin);displayString(str); // Passing string to a function.return 0;}void displayString(char str[]){printf("String Output: ");puts(str);}
字符串和指针
类似于数组,字符串名称“退化”到指针。 因此,您可以使用指针来操作字符串的元素。 我们建议您在检查本示例之前,先检查 C 数组和指针。
示例 4:字符串和指针
#include <stdio.h>int main(void) {char name[] = "Harry Potter";printf("%c", *name); // Output: Hprintf("%c", *(name+1)); // Output: aprintf("%c", *(name+7)); // Output: ochar *namePtr;namePtr = name;printf("%c", *namePtr); // Output: Hprintf("%c", *(namePtr+1)); // Output: aprintf("%c", *(namePtr+7)); // Output: o}
