C语言字符串怎么定义?(通俗易懂,适合新手小白)

C 语言没有真正的“字符串类型”,所谓字符串,就是以空字符 '\0' 结尾的一维字符数组。数组里每个元素占 1 字节,最后一个元素必须是 0,它告诉函数“到这里结束”。因此,字符串长度与数组长度永远差 1,初学者务必预留这一字节。理解这一点后,所有库函数、输入输出、内存操作都能迎刃而解。

字符数组与结束标志

char s[6] = "hello"; 编译器自动在 'o' 后补 0,数组实际内容为 h e l l o \0。若写成 char s[5] = "hello"; 则数组被填满,没有空间存放 '\0',后续调用 printf("%s",s) 会继续读到内存垃圾,出现乱码甚至崩溃。牢记:数组长度 ≥ 字符串长度 + 1。

两种定义方式

初学者最先接触的是“字符数组”写法:char str[32] = "abc"; 编译器把 abc\0 复制到 str 占据的栈空间,内容可改,例如 str[0] = 'A'; 合法。另一种是“字符指针”写法:char *p = "abc"; 这里的 "abc" 存放在只读数据段,p 仅仅保存首地址,试图 p[0] = 'A'; 将触发段错误。想修改就用数组,只读访问就用指针,两者用途不同。

代码演示:数组与指针差异

1 #include

2 int main(void){

3 char s1[8] = "abc"; //可写

4 char *s2 = "abc"; //只读

5 s1[0] = 'A'; //合法

6 printf("s1=%s\n", s1); //输出 Abc

7 /* s2[0] = 'A'; 运行时报错 */

8 printf("s2=%s\n", s2); //输出 abc

9 return 0;

10 }

运行结果:

s1=Abc

s2=abc

键盘输入与缓冲区

scanf("%s", str) 遇空格或换行就停止,无法读整行;gets(str) 可以读整行却容易越界,C11 已被废除。新手最安全的做法是使用 fgets:char buf[64]; fgets(buf, sizeof(buf), stdin); 它会读入换行符并在数组末尾自动补 0,只要指定长度不超过数组大小就不会溢出。

代码演示:安全读入

1 #include

2 int main(void){

3 char name[32];

4 printf("What's your name? ");

5 fgets(name, sizeof(name), stdin);

6 printf("Hello, %s", name); //name 已含换行

7 return 0;

8 }

运行示例:

What's your name? Li Hua

Hello, Li Hua

常用库函数速览

strlen 求长度不计 '\0';strcpy 拷贝整个字符串包括结束符;strcat 拼接;strcmp 按字典序比较。以上函数都要求目标空间足够,否则依旧溢出。更安全的版本是 strncpy、strncat、strncmp,它们增加“最大字符数”参数,可主动截断,降低风险。

代码演示:strcpy 与 strncpy

1 #include

2 #include

3 int main(void){

4 char src[] = "template";

5 char dst1[5];

6 char dst2[5];

7 /* strcpy(dst1, src); 可能溢出 */

8 strncpy(dst2, src, sizeof(dst2)-1); //留1字节

9 dst2[sizeof(dst2)-1] = '\0'; //手动封口

10 printf("dst2=%s\n", dst2); //输出 temp

11 return 0;

12 }

运行结果:

dst2=temp

易踩的坑与建议

① 忘记留 '\0' 空间;② 把字符指针当数组修改;③ 用 == 比较字符串(实际比较的是地址);④ 越界写入导致“看起来正常”的诡异 bug。

建议:定义宏 MAX 64,所有数组统一大小;输入一律 fgets;比较用 strcmp;拷贝用 strncpy 并手动封口。养成这些习惯,字符串就不会再是初学者的噩梦。

最后,给大家推荐一个 1.7W 字的【C语言学习小册】,直接免费下载领取,能带你踹开编程的大门,让你对 C 语言本身,以及 C 语言的周边都有一个整体上的认知,阅读完后,能帮你解开很多疑问,比如:

C语言到底是什么玩意?

C语言到底能干什么?

学编程难吗?多久能学会?

C语言和C++到底有什么关系?

2025年了,程序员有必要学习C语言吗?

为什么很多人学了 C 语言感觉它屁用没有?

学习C语言,为什么一定要学习内存?

主流的C语言编译器有哪些,它们各自有什么优缺点?

系统学习 C 语言,请猛击《C语言入门教程(非常详细,尤其适合新手小白)》。

友情链接