【C语言】07 字符串

1.字符串简介

* 在Java中,一个字符串可以用String类型来存储

String s = "LJ";

C语言中没有String这种类型。其实字符串就是字符序列,由多个字符组成,所以在C语言中,我们可以用字符数组来存储字符串

字符串可以看做是一个特殊的字符数组,为了跟普通的字符数组区分开来,应该在字符串的尾部添加了一个结束标志'\0'。'\0'是一个ASCII码值为0的字符,是一个空操作符,表示什么也不干。所以采用字符数组存放字符串,赋值时应包含结束标志'\0'。

注意了,尾部有个'\0',如果没有这个结束标记,说明这个字符数组存储的并不是字符串

 

2.字符串的初始化

复制代码
 1 char a[3] = {'l', 'j', '\0'};
 2 
 3 char b[3];
 4 b[0] = 'l';
 5 b[1] = 'j';
 6 b[2] = '\0';
 7 
 8 char c[3] = "lj";
 9 
10 char d[] = "lj";
11 
12 char e[20] = "lj";
复制代码

当我们使用类似第8行的初始化方式时,系统会自动在字符串尾部加上一个\0结束符

 

3.字符串的输出

我们可以使用stdio.h中两个函数来输出字符串,分别是printf和puts函数

1.printf函数

* 这个函数我们已经用过很多遍了,用格式符%s表示需要输出一个字符串

char a[3] = {'l', 'j', '\0'};
printf("%s", a);

最后面那个\0是不可能输出的,它只是个空字符,只是字符串结束的标记。

 

* 我们再来看一个例子

复制代码
1 char a[3] = {'l', 'j', '\0'}; // 添加了结束符\0
2 
3 char b[] = {'i', 's'}; // 假设忘记添加结束符\0
4 
5 printf("字符串a:%s", a); // 输出字符串a
6 
7 printf("\n"); // 换行
8 
9 printf("字符串b:%s", b); // 输出字符串b
复制代码

看清楚了,第3行的字符数组b后面没有添加结束符\0,因此b不算是个正宗的字符串。

要搞清楚为什么,首先要看看a和b的内存地址:

printf("a的地址:%x", a);
printf("\n");
printf("b的地址:%x", b);

输出结果:

可以看出来,数组b和a的内存地址是连续的。我们再回到输出b的代码:

printf("字符串b:%s", b); // 输出字符串b

%s表示期望输出一个字符串,因此printf函数会从b的首地址开始按顺序输出字符,一直到\0字符为止,因为\0是字符串的结束标记。

所以,如果想要创建一个字符串,记得加上结束符\0,不然后果很严重,会访问到一些垃圾数据。

 

2.puts函数

1 char a[] = "lj";
2 puts(a);
3 
4 puts("llj");

看第2行代码,puts函数会从a的首地址开始输出字符,一直到\0字符为止。

可以看puts函数输出一个字符串后会自动换行

* puts函数一次只能输出一个字符串,printf函数则可以同时输出多个字符串

printf("%s - %s", "lj", "llj");

 

4.字符串的输入

stdio.h中有2个函数可以用来接收用户输入的字符串,分别是scanf和gets

1.scanf函数

char a[10];
scanf("%s", a);

scanf函数会从a的首地址开始存放用户输入的字符,存放完毕后,系统会自动在尾部加上一个结束标记\0

注意,不要写成scanf("%s", &a),因为a已经代表了数组的地址,没必要再加上&这个地址运算符。

 

2.gets函数

char a[10];
gets(a);

gets跟scanf一样,会从a的首地址开始存放用户输入的字符,存放完毕后,系统会自动在尾部加上一个结束标记\0。

* gets一次只能读取一个字符串,scanf则可以同时读取多个字符串

* gets可以读入包含空格、tab的字符串,直到遇到回车为止;scanf不能用来读取空格、tab

 

5.字符串数组

1.字符串数组简介

* 一维字符数组中存放一个字符串,比如一个名字char name[20] = "lj"

* 如果要存储多个字符串,比如一个班所有学生的名字,则需要二维字符数组,char names[15][20]可以存放15个学生的姓名(假设姓名不超过20字符)

* 如果要存储两个班的学生姓名,那么可以用三维字符数组char names[2][15][20]

 

2.字符串数组的初始化

char names[2][10] = { {'J','a','y','\0'}, {'J','i','m','\0'} };

char names2[2][10] = { {"Jay"}, {"Jim"} };

char names3[2][10] = { "Jay", "Jim" };

可以把字符串数组看作是一维数组,它的元素是字符串。字符串数组names由字符串"Jay"和字符串"Jim"构成。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值