C语言中的字符串变量

C语言中的字符串变量

van 知其变,守其恒,为天下式.

C语言中的字符串变量

下文不包含字符串变量的所有知识点,仅为本人在课程学习中记录认为比较关键的部分,便于自己复习,也有助于C语言小白加深C语言中字符串变量的理解。

总纲

  1. C语言没有字符串类型
  2. C语言中的字符串依赖字符数组存在
  3. C语言中字符串是一种逻辑类型

image-20240501160141931

注意事项

  1. 字符串必须以 '\0' 结尾
  2. 在C语言中求字符串的长度不是O(1)的时间复杂度

字符串的声明与初始化

1
2
3
4
5
// 声明字符串变量并赋初始值
char str1[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 数组初始化式
char str2[] = "hello"; // 语法糖: "hello"是数组初始化式的简写形式

char* p = "ABC" + 1; // 这里的ABC是字符串字面值

字符串字面值与数组初始化

"hello" 直接出现在代码中时,它被视为一个字符串字面值。字符串字面值是一个常量,并且在程序的整个生命周期内存在。这意味着它通常存储在程序的只读数据段中。例如:

1
printf("%s", "hello"); // 这里的 "hello" 是字符串字面值

在这个例子中,"hello" 直接作为参数传递给 printf 函数,它在内存中的位置是固定的,并且通常不可修改。

当使用 "hello" 来初始化一个字符数组时,它作为数组初始化式的一部分。在这种情况下,字符串字面值 "hello" 用于初始化数组中的元素,数组的元素可以被修改。例如:

1
char str2[] = "hello"; // 初始化字符数组

这里,"hello" 用作数组 str2 的初始化式。这意味着字符串 "hello" 的内容(包括结尾的空字符 \0)被复制到 str2 数组中。因此,str2 是一个包含6个字符('h', 'e', 'l', 'l', 'o', '\0')的数组,这些字符存储在栈上(如果在函数内部声明)或全局/静态存储区(如果在函数外部声明),并且可以被修改。

在处理字符串时,这种区分对于理解如何安全地操作字符串非常关键。

建议:

  1. 如果初始化字符数组,{‘H’,’e’,’l’,’l’,’o’,’\0’}
  2. 如果初始化字符串,”hello”

遵循上述建议代码的可读性将会比较好,但字符串字面值初始化字符数组也有其简洁性。

1
2
char str[10] = "hello"; // 长度为10的数组
char str[5] = "hello"; // 长度为5,不表示字符串,会发生数组越界。

读写字符串的方式

第一种方式: printf/scanf + %s

匹配规则,建议自己敲一下。我得到的结果是 %s 会忽略前置的空白字符,遇到空白字符结束。

scanf + %s 的缺点:

  1. 不能够存储空白字符
  2. 不会检查数组越界

第二种方式: puts/gets

puts(str)等价于 printf("%s\n", str);

gets(str) 从 stdin 中读取一行数据,存入字符数组,并将 '\n' 替换为 '\0'

gets 的缺点:

不会检查数组越界。fgets(str, MAXLINE, stdin) 可以弥补这个缺点,并且会存储 \n, 在后面额外添加 \0

  • Title: C语言中的字符串变量
  • Author: van
  • Created at : 2024-05-02 23:43:16
  • Updated at : 2024-09-02 00:06:29
  • Link: https://xblog.aptzone.cc/2024/05/02/C语言中的字符串变量/
  • License: All Rights Reserved © van
Comments