C语言学习字符串
一、C语言一般是如何定义字符串的
char word[]={‘H’, ‘e’, ‘l’, ‘l’, ‘o’,‘!’,'\0'};在结尾加一个0,才能正常定义这个字符串,而且在计算长度的时候需要将这个0也加上。

一般来说,C语言的字符串定义有以下注意点;
• 以0(整数0)结尾的⼀一串字符
• 0或’\0’是⼀一样的,但是和’0’不同
• 0标志字符串的结束,但它不是字符串的⼀一部分
• 计算字符串⻓长度的时候不包含这个0
• 字符串以数组的形式存在,以数组或指针的形式访问
• 更多的是以指针的形式
• string.h (标准库)里有很多处理字符串的函数
二、example
• char *str = “Hello”;有一个叫str的指针,它指向了一个字符数组,里面的内容是Hello
• char word[] = “Hello”;当前这里有一个字符数组,里面的内容是Hello
• char line[10] = “Hello”;有一个字符数组叫line,定义了它10个字节那么大的长度,里面放了Hello,一共有5个字符,需要占6个字节的空间(要算上结尾的0)
三、字符串常量
• “Hello”
• ″Hello″ 会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0
• 两个相邻的字符串常量会被自动连接起来

这里在第一个printf的时候,两个字符串用双引号括起来,中间没有其他符号,C语言会自动帮我们将他们连接起来
• 行末的\表示下⼀一行还是这个字符串常量
• C语言的字符串是以字符数组的形态存在的
• 不能用运算符对字符串做运算
• 通过数组的方式可以遍历字符串
• 唯一特殊的地方是字符串字⾯面量可以用来初始化字符数组
• 以及标准库提供了一系列字符串函数
@注意点
char* s = "Hello, world!";
• s 是一个指针,初始化为指向一个字符串常量
• 由于这个常量所在的地⽅方,所以实际上s是 const char* s ,但是由于历史的原因,编译器接受不带const的写法
#include <stdio.h> int main(void) { int i=0; //本地变量 char *s = "Hello world"; //s[0] = 'B'; char *s2 = "Hello world"; printf("&i=%p\n",&i); printf("s = %p\n",s); printf("s2 = %p\n",s2); printf("Here!s[0]=%c\n",s[0]); return 0; }


• 但是试图对s所指的字符串做写⼊入会导致严重的后果
• 如果需要修改字符串,应该用数组:
char s[] = "Hello, world!";
四、指针还是数组?
• char *str = “Hello”;
• char word[] = “Hello”;
• 数组:这个字符串在这里
• 作为本地变量空间自动被回收
• 指针:这个字符串不知道在哪里
• 处理参数
• 动态分配空间

五、char*是字符串?
• 字符串可以表达为char*的形式
• char*不一定是字符串
• 本意是指向字符的指针,可能指向的是字符的数组(就像int*一样)
• 只有它所指的字符数组有结尾的0,才能说它所指的是字符串
六、字符串赋值
• char *t = “title”;
• char *s;
• s = t;
• 并没有产⽣生新的字符串,只是让指针s指向了t所指的字符串,对s的任何操作就是对t做的
七、字符串输入输出
• char string[8];
• scanf(“%s”, string);
• printf(“%s”, string);
• scanf读入一个单词(到空格、tab或回车为止)
• scanf是不安全的,因为不知道要读入的内容的长度
安全的输入
在%和s之间的数字表示最多允许读入的字符的数量,这个数字应该比数组的大小小一
#include <stdio.h> int main() { char word[8]; char word2[8]; scanf("%7s",word); //%s之前限制长度 scanf("%s",word2);//假如超过限定长度,会报abort trap:6,scanf数组越界 printf("%s##%s##\n",word,word2); return 0; }

八、常见错误
• char *string;定义一个指针变量,
• scanf(“%s”, string);
• 以为char*是字符串类型,定义了一个字符串类型的变量string就可以直接使用了
• 由于没有对string初始化为0,所以不一定每次运行都出错
九、空字符串
• char buffer[100]=””;
• 这是一个空的字符串,buffer[0] == ‘\0’
• char buffer[] = “”;
• 这个数组的长度只有1!只有buffer[0]
十、字符串数组
• char **a
• a是一个指针,指向另一个指针,那个指针指向一个字符(串)
• char a[][]
• a是一个二维数组,第二个维度的大小不知道,不能编译通过
• char a[][10]
• a是一个二维数组,a[x]是一个char[10],长度为10,a[0],10个字符
• char *a[]
• a是一个一维数组,a[x]是一个char*,a[0]是一个指针,指向外面其他的内容
#include <stdio.h> int main(void) { char * str[] = {'0',"January","February", "March","April","May", "June","July","August","September", "October","November","December","\0"}; //指针数组,每个指针指向一个字符串常量 printf("请输入月份: "); int month; scanf("%d",&month); printf("%s",str[month]); return 0; }
十一、程序参数
• int main(int argc, char const *argv[])
• argv[0]是命令本身
• 当使用Unix的符号链接时,反映符号链接的名字
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!