#include<stdio.h>int main(){ char c[] = {'a','b','c'};//普通的字符数组 printf("%s\n", c);//乱码,因为没有'\0'结尾,用%s打印出错 //有'\0'结尾的字符数组就是字符串 char c1[] = { 'a','b','c','\0'}; printf("%s\n", c1); char c2[]= { 'a','b','c','\0' ,'d','e','f'}; printf("%s\n", c2);// \0后面的部分不会被打印 return 0;}
运行结果如下:
文章插图
打印字符串的时候遇到'\0'就停止打印,字符数组含有'\0'就是字符串 。
注意:char c[] = "hello",用" "括起来的就是字符串,此时编译器会自动在后面加上\0,在内部其实是这样的额char c[] = {'h','e','l','l','o','\0'} 。
scanf和getsscanf 遇到空格结束,遇到\n结束,所以用scanf这种方式并不是很好,有时候想要读取一个hello world遇到空格结束,只能读取到hello 。
- gets(str)允许输入的字符串有空格
- scanf不允许含有空格
- 但是scanf和gets都有一个很致命的缺点,就是如果存放读取字符的空间不足,会自动向后存储,会造成内存污染,假设给定的字符空间是num[5]大小是5,但是如果输入的字符大小超过5,依旧会存储,此时会自动覆盖后面空间的内容,会造成内存污染

文章插图
示例:
#include<stdio.h>int main(){ char buf[5] = ""; fgets(buf, sizeof(buf), stdin); printf("%s\n", buf); return 0;}
运行结果如下:
文章插图
fgets会把回车键\n读取,但是scanf和gets遇到\n会结束读取 。
有一种情况,定义了一个数组char a[3];,输入的时候输入的是a+回车,那么此时用fgets获取char数组内的内容就是a[3] = {'a','回车','\0'};
如何去掉\n?
只需要将\n替换成\0
示例:
char buf[128] = "helloA";//buf[5]=0;int i=0;while(buf[i]!='\0'){ i++;}buf[i-1] = '\0';printf("%s\n",buf);
strlen【C语言基础--数组】size_tnstrlen(const chars);功能:计算指定指定字符串s的长度,不包含字符串结束符‘\0’
参数:s:字符串首地址
返回值:字符串s的长度,size_t为unsigned int类型
fgets相对于scanf和gets不会污染内存(安全),但是fgets会读取\n,所以只需要将\n去掉就可以了 。
字符数组输出函数printf
char buf[1024] = "hello world";printf("%s\n",buf)
打印字符串的时候遇到'\0'就停止打印 。puts*
经验总结扩展阅读
- 累加和为 K 的子数组问题
- C++和Java多维数组声明和初始化时的区别与常见问题
- 可持久化数组 P3919 【模板】可持久化线段树 1
- LeetCode - 数组的旋转总结
- .NET源码学习 [算法2-数组与字符串的查找与匹配]
- LeetCode - 二维数组及滚动数组
- Excel怎么使用MMULT函数返回两个数组的矩阵乘积呢?
- 非零 excel用数组公式获取一列中非空值,看一看
- 索引超出了数组界限如何解决
- 数一数的数组词有哪些