跳到主要内容

C 语言字符串编程

提示
  1. 字符串定义和初始化:在C语言中,字符串是由字符组成的序列,以空字符 \0 结束。字符串可以通过多种方式声明和初始化,例如 char c[] = "abcd";char c[] = {'a', 'b', 'c', 'd', '\0'};
  2. 字符串的读取和赋值:使用 scanf() 函数可以读取字符串,但它在遇到空白字符时会停止读取。而 fgets() 函数可以读取一整行文本。字符串数组一旦声明,就不能使用赋值运算符直接赋值,需要使用诸如 strcpy() 这样的函数。
  3. 字符串和指针的关系:字符串名在大多数情况下会转换为指向其首元素的指针,因此可以使用指针操作字符串中的字符。例如,*(name+1) 表示字符串的第二个字符。

在C编程中,字符串是以空字符\0结束的字符序列。例如:

char c[] = "c string";

当编译器遇到双引号内的字符序列时,默认在末尾追加一个空字符\0

C编程中字符串的内存图

如何声明字符串?

以下是声明字符串的方法:

char s[5];

C编程中的字符串声明

这里,我们声明了一个包含5个字符的字符串。

如何初始化字符串?

您可以通过多种方式初始化字符串。

char c[] = "abcd";

char c[50] = "abcd";

char c[] = {'a', 'b', 'c', 'd', '\0'};

char c[5] = {'a', 'b', 'c', 'd', '\0'};

C编程中字符串的初始化

让我们看另一个示例:

char c[5] = "abcde";

这里,我们尝试将6个字符(最后一个字符是'\0')赋给一个包含5个字符的char数组。这是不好的,您永远不应该这样做。

给字符串赋值

数组和字符串在C中是二等公民;它们不支持赋值运算符一旦被声明。例如,

char c[100];
c = "C编程"; // 错误!数组类型不可赋值。

注意: 使用strcpy()函数y来复制字符串。

从用户读取字符串

您可以使用scanf()函数来读取字符串。

scanf()函数读取字符序列,直到遇到空白(空格、换行符、制表符等)。

示例1:使用scanf()读取字符串

#include <stdio.h>
int main()
{
char name[20];
printf("输入姓名: ");
scanf("%s", name);
printf("您的名字是%s。", name);
return 0;
}

输出

输入姓名: Dennis Ritchie
您的名字是Dennis。

尽管在上面的程序中输入了Dennis Ritchie,但只有"Dennis"被存储在name字符串中。这是因为Dennis后面有一个空格。

还要注意,我们使用了name代码,而不是&namescanf()一起。

scanf("%s", name);

这是因为name是一个char数组,我们知道在C中数组名称衰减为指针。

因此,在scanf()中的name已经指向了字符串中第一个元素的地址,这就是为什么我们不需要使用&的原因。

如何读取一行文本?

您可以使用fgets()函数来读取一行字符串。并且,您可以使用puts()来显示字符串。

示例2:fgets()和puts()

#include <stdio.h>
int main()
{
char name[30];
printf("输入姓名: ");
fgets(name, sizeof(name), stdin); // 读取字符串
printf("姓名: ");
puts(name); // 显示字符串
return 0;
}

输出

输入姓名: Tom Hanks
姓名: Tom Hanks

这里,我们使用了fgets()函数从用户那里读取字符串。

fgets(name, sizeof(name), stdin); // 读取字符串

sizeof(name)结果为30。因此,我们最多可以输入30个字符,这是name字符串的大小。

为了打印字符串,我们使用了puts(name);

注意: gets()函数也可以用来从用户那里输入。然而,它已从C标准中移除。

这是因为gets()允许您输入任何长度的字符。因此,可能会出现缓冲区溢出。

将字符串传递给函数

字符串可以以与数组类似的方式传递给函数。了解更多关于向函数传递数组

示例3:将字符串传递给函数

#include <stdio.h>
void displayString(char str[]);

int main()
{
char str[50];
printf("输入字符串: ");
fgets(str, sizeof(str), stdin);
displayString(str); // 向函数传递字符串。
return 0;
}
void displayString(char str[])
{
printf("字符串输出: ");
puts(str);
}

字符串和指针

与数组类似,字符串名称也会“衰减”为指针。因此,您可以使用指针来操作字符串中的元素。我们建议您在查看此示例之前检查C数组和指针

示例4:字符串和指针

#include <stdio.h>

int main(void) {
char name[] = "Harry Potter";

printf("%c", *name); // 输出: H
printf("%c", *(name+1)); // 输出: a
printf("%c", *(name+7)); // 输出: o

char *namePtr;

namePtr = name;
printf("%c", *namePtr); // 输出: H
printf("%c", *(namePtr+1)); // 输出: a
printf("%c", *(namePtr+7)); // 输出: o
}

常用的字符串函数

  • strlen() - 计算字符串的长度
  • strcpy() - 将一个字符串复制到另一个
  • strcmp() - 比较两个字符串
  • strcat() - 连接两个字符串