C语言中的字符串变量
C语言中的字符串变量
下文不包含字符串变量的所有知识点,仅为本人在课程学习中记录认为比较关键的部分,便于自己复习,也有助于C语言小白加深C语言中字符串变量的理解。
总纲
- C语言没有字符串类型
- C语言中的字符串依赖字符数组存在
- C语言中字符串是一种逻辑类型
注意事项
- 字符串必须以
'\0'
结尾 - 在C语言中求字符串的长度不是O(1)的时间复杂度
字符串的声明与初始化
1 | // 声明字符串变量并赋初始值 |
字符串字面值与数组初始化
当 "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'
)的数组,这些字符存储在栈上(如果在函数内部声明)或全局/静态存储区(如果在函数外部声明),并且可以被修改。
在处理字符串时,这种区分对于理解如何安全地操作字符串非常关键。
建议:
- 如果初始化字符数组,{‘H’,’e’,’l’,’l’,’o’,’\0’}
- 如果初始化字符串,”hello”
遵循上述建议代码的可读性将会比较好,但字符串字面值初始化字符数组也有其简洁性。
1 | char str[10] = "hello"; // 长度为10的数组 |
读写字符串的方式
第一种方式: printf/scanf + %s
匹配规则,建议自己敲一下。我得到的结果是 %s
会忽略前置的空白字符,遇到空白字符结束。
scanf + %s 的缺点:
- 不能够存储空白字符
- 不会检查数组越界
第二种方式: 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