原文: https://www.programiz.com/c-programming/c-strings

在本教程中,您将学习 C 编程中的字符串。 您将学习通过示例来声明它们,对其进行初始化以及如何将它们用于各种 I/O 操作。

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

  1. char c[] = "c string";

当编译器遇到用双引号引起来的字符序列时,默认情况下会在末尾附加一个空字符\0

C 编程字符串 - 图1


如何声明一个字符串?

声明字符串的方法如下:

  1. char s[5];

C 编程字符串 - 图2

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


如何初始化字符串?

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

  1. char c[] = "abcd";
  2. char c[50] = "abcd";
  3. char c[] = {'a', 'b', 'c', 'd', '\0'};
  4. char c[5] = {'a', 'b', 'c', 'd', '\0'};

C 编程字符串 - 图3

让我们再举一个例子:

  1. char c[5] = "abcde";

在这里,我们试图将 6 个字符(最后一个字符为'\0')分配给具有 5 个字符的char数组。 这很糟糕,您永远不要这样做。


给字符串赋值

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

  1. char c[100];
  2. c = "C programming"; // Error! array type is not assignable.

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


从用户读取字符串

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

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


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

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char name[20];
  5. printf("Enter name: ");
  6. scanf("%s", name);
  7. printf("Your name is %s.", name);
  8. return 0;
  9. }

输出

  1. Enter name: Dennis Ritchie
  2. Your name is Dennis.

即使在上述程序中输入了Dennis Ritchie,在name字符串中也仅存储了"Dennis"。 这是因为Dennis之后有一个空格。


如何读取一行文本?

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


示例 2:fgets()puts()

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char name[30];
  5. printf("Enter name: ");
  6. fgets(name, sizeof(name), stdin); // read string
  7. printf("Name: ");
  8. puts(name); // display string
  9. return 0;
  10. }

输出

  1. Enter name: Tom Hanks
  2. Name: Tom Hanks

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

fgets(name, sizeof(name), stdlin); // read string

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

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

注意gets()函数也可以接受用户输入。 但是,它已从 C 标准中删除。

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


将字符串传递给函数

字符串可以通过类似于数组的方式传递给函数。 了解有关将数组传递给函数的更多信息。


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

  1. #include <stdio.h>
  2. void displayString(char str[]);
  3. int main()
  4. {
  5. char str[50];
  6. printf("Enter string: ");
  7. fgets(str, sizeof(str), stdin);
  8. displayString(str); // Passing string to a function.
  9. return 0;
  10. }
  11. void displayString(char str[])
  12. {
  13. printf("String Output: ");
  14. puts(str);
  15. }

字符串和指针

类似于数组,字符串名称“退化”到指针。 因此,您可以使用指针来操作字符串的元素。 我们建议您在检查本示例之前,先检查 C 数组和指针


示例 4:字符串和指针

  1. #include <stdio.h>
  2. int main(void) {
  3. char name[] = "Harry Potter";
  4. printf("%c", *name); // Output: H
  5. printf("%c", *(name+1)); // Output: a
  6. printf("%c", *(name+7)); // Output: o
  7. char *namePtr;
  8. namePtr = name;
  9. printf("%c", *namePtr); // Output: H
  10. printf("%c", *(namePtr+1)); // Output: a
  11. printf("%c", *(namePtr+7)); // Output: o
  12. }

常用的字符串函数