C 语言字符串

2025 年 6 月 12 日 | 阅读 10 分钟

在 C 语言编程中,字符串可以定义为以空字符 ('\0') 终止的一维字符数组。字符数组或字符串用于操作文本,例如单词或句子。数组中的每个字符占用一个字节的内存,最后一个字符必须始终为 0。

终止字符 ('\0') 在字符串中很重要,因为它是识别字符串结束的唯一方式。当我们定义一个字符串为 char s[10] 时,字符 s[10] 在内存中会被隐式地用空字符初始化。在 C 语言编程中,'%s' 用作字符串的格式说明符。

声明

在 C 语言编程中,字符串的声明就像声明一个字符类型的一维数组一样简单。以下是声明字符串的语法。

在给定语法中,

  • string_name:它表示分配给字符串变量的名称。
  • size:它用于声明字符串的长度,即字符串将容纳多少个字符。

在 C 语言中有两种声明字符串的方式。

  1. 通过字符数组
  2. 通过字符串字面量

使用字符数组

让我们看看在 C 语言中通过字符数组声明字符串的例子。

我们知道,数组索引从 0 开始,因此它将如下图所示。


C Strings

在声明字符串时,大小不是强制性的。因此,我们可以将上面的代码写成如下所示。

使用字符串字面量

我们也可以在 C 语言中通过字符串字面量来定义字符串。例如:

在这种情况下,编译器会在字符串的末尾追加 '\0'。

初始化

我们可以通过字符列表或字符串字面量来初始化字符串。

C 字符串示例

让我们看一个简单的例子来说明 C 语言中的字符串。

示例

编译并运行

输出

Char Array Value is: tpointtech
String Literal Value is: tpointtech

说明

在此示例中,我们演示了在 C 语言中初始化和打印字符数组(字符串)的两种方法。之后,数组 ch 使用单个字符(包括空终止符 '\0')进行初始化,而 ch2 使用字符串字面量。两者都使用 %s 打印,显示相同的输出:“tpointtech”。

访问元素

在 C 语言中,我们可以通过给出字符的位置来引用字符串中的任何字符,类似于 数组。我们在方括号 [] 中给出索引和字符串名称。

C 字符串访问元素示例

让我们举一个例子来说明如何在 C 字符串中访问元素。

示例

编译并运行

输出

t
c

说明

在此示例中,我们定义了一个字符串为“TpointTech”的字符数组,并打印特定位置的字符。由于 C 语言中的数组是零索引的,string[5] 读取第六个字符 't',string[8] 读取第九个字符 'c',两者都打印在不同的行上。第三次访问 string[10] 读取空终止符 '\0',它表示字符串的结束,并且不打印任何可见内容。因此,结果包括字符 't' 和 'c',每行一个。

更新元素

在 C 语言中,也可以更新字符串中的字符。它允许我们使用该字符的索引来更新任何字符串字符。

C 字符串更新元素示例

让我们举一个例子来说明如何在 C 字符串中更新元素。

示例

编译并运行

输出

Before updating of string: TPointTech 
After updating the string: tpointtech

说明

在此示例中,我们从字符串“TPointTech”创建一个字符数组并将其打印。之后,代码修改了数组中的一些字符:string[0] 设置为 't',string[1] 设置为 'p',string[6] 设置为 't'。修改后,将打印新字符串。因此,输出将显示原始字符串,后跟修改后的字符串“tpointtech”。

字符串长度

在 C 语言中,我们必须遍历到空字符 ('\0') 才能确定字符串的长度。C 标准库中的 strlen() 函数主要用于查找字符串长度。

C 字符串长度示例

让我们举一个例子来说明如何在 C 字符串中查找字符串长度。

示例

编译并运行

输出

Length of the string is: 10

说明

在此示例中,我们声明了一个字符串为“TpointTech”的字符数组,并使用 string.h 库中的 strlen 函数计算其长度,该函数返回字符数。之后,它打印长度,即 10。

遍历字符串

在 C 语言中,字符串遍历是任何编程语言中最重要的方面之一。我们可能需要操作非常大的文本,这可以通过遍历文本来完成。遍历字符串与遍历整数数组有所不同。我们需要知道数组的长度才能遍历整数数组,而我们可以使用字符串中的空字符来识别字符串的结束并终止循环。

因此,有两种遍历字符串的方式。

  • 通过使用字符串的长度
  • 通过使用空字符。

让我们讨论它们中的每一个。

使用字符串的长度

让我们看一个计算字符串中元音字母数量的例子。

示例

编译并运行

输出

The number of vowels 4

使用空字符

让我们看一个使用空字符计算元音字母数量的相同例子。

示例

编译并运行

输出

The number of vowels 4

接受字符串作为输入

在 C 语言中,我们使用 scanf 来接受用户的输入。然而,它也可以用于字符串,但场景不同。考虑以下代码,它在遇到空格时存储字符串。

C 语言接受字符串作为输入的示例

让我们举一个例子来说明如何在 C 语言中接受字符串作为输入。

示例

编译并运行

输出

Enter the string: Hello TpointTech
You entered Hello

从输出可以看出,以上代码不适用于带有空格的字符串。为了使此代码适用于带有空格的字符串,scanf 函数需要进行细微更改,即,我们必须编写:scanf("%[^\n]s",s) 而不是 scanf("%s",s),这会指示编译器在遇到换行符 (\n) 时存储字符串 s。让我们考虑以下示例来存储带空格的字符串。

示例

编译并运行

输出

Enter the string: Hello TpointTech
You entered Hello TpointTech

说明

在这里,我们还必须注意,在 scanf 中存储字符串时不需要使用地址 (&) 运算符,因为字符串 s 是一个字符数组,并且数组的名称,即 s,表示字符串(字符数组)的基地址。因此,我们不需要使用它。

使用 fgets()

如果我们要读取整个字符串,包括空格,我们需要使用 fgets() 函数。与 scanf() 不同,fgets() 会读取整行,包括空格,直到找到换行符。

使用 fgets() 的 C 字符串示例

让我们举一个例子来说明 C 字符串中的 fgets() 函数。

示例

编译并运行

输出

Enter a string: TpointTech
You entered: TpointTech

说明

在此示例中,我们使用 fgets() 读取整行输入(包括空格)到字符数组 str 中。它要求用户输入一个字符串,安全地存储多达 99 个字符,然后打印输入的字符串。fgets() 函数比 scanf("%s", ...) 更适合,因为它读取空格并避免缓冲区溢出。如果缓冲区中有空间,输入可能包含换行符。

一些要点

然而,在使用 scanf 输入字符串时,必须注意以下几点。

  • 编译器不会对字符数组执行边界检查。因此,字符串的长度可能会超过字符数组的维度,这可能会覆盖一些重要数据。
  • 我们可以使用 gets() 而不是 scanf,gets() 是一个在头文件 string.h 中定义的内置函数。gets() 每次只能接收一个字符串。

使用 puts() 和 fputs() 函数

在 C 语言中,我们使用带有 %s 说明符的 printf() 函数来显示字符串。我们可以使用 puts() 函数(在 C11 和 C17 版本中已移除)或 fputs() 函数作为替代。

示例

编译并运行

输出

Using puts():
Hello from TpointTech!
Using fputs():
Hello from TpointTech!

说明

在此示例中,我们定义了一个字符串并使用 puts() 和 fputs() 函数打印它。首先,puts("Using puts():") 打印一个标签,然后 puts(str) 打印字符串并具有在末尾插入新行的副作用。之后,printf("Using fputs():\n") 打印另一个带有新行的标签。最后,fputs(str, stdout) 输出相同的字符串,但与 puts() 不同,它在打印后不添加新行。

将字符串传递给函数

因为字符串是数组,我们可以像将数组传递给函数一样将字符串传递给函数。

C 语言将字符串传递给函数的示例

让我们举一个例子来说明如何在 C 语言中将字符串传递给函数。

示例

编译并运行

输出

The string is: Hello from main!

说明

在此示例中,我们在 main 函数中声明一个字符串,并将其发送到另一个名为 displayString 的函数。之后,此函数将字符串作为字符数组参数并显示它。它展示了在 C 语言中如何通过仅传递数组名称(指向字符串第一个字符的指针)将字符串传递给函数。

指针与字符串

在 C 语言中,我们已经使用了 指针 和数组、函数 以及基本数据类型。然而,指针可以用于指向字符串。使用指针指向字符串有各种优点。让我们考虑以下示例通过指针访问字符串。

C 语言中指针与字符串的示例

让我们举一个例子来说明 C 语言中指针与字符串。

示例

编译并运行

输出

tpointtech

C Strings

我们知道字符串是字符数组,所以指针可以以与数组相同的方式使用。在上面的例子中,p 被声明为字符数组 s 的指针。p 的作用类似于 s,因为 s 是字符串的基地址,并且在内部被视为指针。但是,我们不能直接更改 s 的内容或将 s 的内容复制到另一个字符串中。为此,我们需要使用指针来存储字符串。在下面的例子中,我们展示了使用指针将一个字符串的内容复制到另一个字符串中。

示例

编译并运行

输出

String p: hello tpointtech
copying the content of p into q...
String q: hello tpointtech

一旦定义了字符串,它就不能被重新分配给另一组字符。但是,使用指针,我们可以将一组字符分配给字符串。考虑以下示例。

示例

编译并运行

输出

Before assigning: hello tpointtech
After assigning: hello

C 字符串选择题

1) C 字符串中空字符 '\0' 的目的是什么?

  1. 标记字符串的开头
  2. 分隔字符串中的单词
  3. 表示字符串的结尾
  4. 计算字符串中的字符数
 

答案: c) 表示字符串的结尾


2) 以下哪一项使用字符串字面量正确初始化字符串?

  1. char s[] = "tech";
  2. char s[] = {'t','e','c','h'};
  3. char s[5] = tech;
  4. string s = "tech";
 

答案: a) char s[] = "tech";


3) C 语言中哪个函数用于确定字符串的长度?

  1. strlength()
  2. length()
  3. strlen()
  4. getlen()
 

答案: c) strlen()


4) 以下代码的输出是什么?

  1. h
  2. e
  3. l
  4. o
 

答案: b) e


5) puts() 和 fputs() 函数的主要区别是什么?

  1. puts() 读取输入,fputs() 写入输出
  2. 没有区别
  3. puts() 与文件一起工作,fputs() 不行
  4. puts() 自动添加换行符,fputs() 不添加
<
 
答案: d) puts() 自动添加换行符,fputs() 不添加