在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 Ritchie Your name is Dennis.
尽管在上面的程序中输入了Dennis Ritchie,但只有"Dennis"存储在了name字符串中。这是因为Dennis后面有一个空格。
另外请注意,我们使用了代码name而不是&name
与scanf()
一起使用。
scanf("%s", name);
这是因为name是一个char
数组,我们知道在C语言中数组名会“退化”为指针。
因此,scanf()
中的 name 已经指向字符串第一个元素的地址,这就是为什么我们不需要使用&
。
如何读取一行文本?
您可以使用fgets()
函数来读取一行字符串。然后,您可以使用puts()
来显示字符串。
示例2:fgets()和puts()
#include <stdio.h>
int main()
{
char name[30];
printf("Enter name: ");
fgets(name, sizeof(name), stdin); // read string
printf("Name: ");
puts(name); // display string
return 0;
}
输出
Enter name: Tom Hanks Name: Tom Hanks
在这里,我们使用了fgets()
函数从用户那里读取字符串。
fgets(name, sizeof(name), stdlin); // 读取字符串
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: H
printf("%c", *(name+1)); // Output: a
printf("%c", *(name+7)); // Output: o
char *namePtr;
namePtr = name;
printf("%c", *namePtr); // Output: H
printf("%c", *(namePtr+1)); // Output: a
printf("%c", *(namePtr+7)); // Output: o
}