1.字符串和\0
C语言中有字符类型,但没有字符串类型,C语言中字符串就是由双引号引起来的一串字符,比如:"asdf";
一个字符串中我们能直观的看到一些字符,比如:字符串常量"asdfgh"中,我们看到了asdfgh这六个字符,实际上在末尾还隐藏着一个'\0'的转义字符,'\0'是作为字符串的结束标志存在的。
正因为\0是作为结束标志存在的,所以printf打印和计算字符串长度strlen遇到\0时,就会自动停止。
其实字符串和字符数组是非常类似的,字符串在内存中储存也是连续的,和数组是一样的。
2.字符数组的创建和初始化
字符数组就是一个存放字符的叔祖,例如:
1.//创建字符数组并初始化
2.char arr[4]={'s','f','f','r'};
这里的arr就是一个字符数组,可以存放4个字符,我们可以根据需求修改数组的大小。
我们可以使用下标访问字符数组,如下:
#include <stdio.h>
int main()
{
char arr[] = { 's','a','s'};
int sd = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sd; i++)
{
printf("%c", arr[i]);
}
return 0;
}
3.字符串常量初始化字符数组
字符数组的初始化,也可以直接使用常量字符串 ,如下代码;
1.//指定数组大小
2.char data[4]={'s','e','y','t'};
3.//通过初始化内容来确定元素个数
4.char data2[]={'e','g','f',''s};
所以当我们使用常量字符串初始化数组的时候,其实我们给数组中存放了能看到的字符和一个\0字符。这里我们也可以做一个对比:
#include <stdio.h>
int main()
{
char arr[]={'s','g','d'};
char arr1[]="sgd";
return 0;
}
在vs2022中调试后,我们在监视窗口中观察是这样的:
确实在使用常量字符串初始化的时候,数组中多了一个'\0',这个'\0'就是字符串中隐藏的 。
4.'\0'作为字符串的结束表示
在这里我们演示一下\0的作用,请看如下代码:
#include <stdio.h>
int main()
{
char arr[]={'d','t','h','u'};
char arr1[]="dthu";
printf("%c",arr);
printf("%c",arr1);
return 0;
}
输出结果:
我们可以看到arr与arr1相比,多出了很多的随机值,这就是因为arr没有\0隐藏在结尾,所以打印就没有停止。
如果我们在arr后面加上\0会怎样呢?
#include <stdio.h>
int main()
{
char arr[] = { 'd','t','h','u' ,'\0'};
char arr1[] = "dthu";
printf("%s\n", arr);
printf("%s\n", arr1);
return 0;
}
运行结果:
看到这里相信就算我不说,大家应该都懂了\0的作用和重要性了吧?
5.字符数组的输入与输出
我们可以使用scanf与printf完成字符串的输入与输出,请看下面的代码:
#include <stdio.h>
int main()
{
char arr[10] = { 0 };
scanf("%s", arr);
printf("%s", arr);
return 0;
}
输入输出的结果:
注:在使用scanf输入的时候要保证字符数组够大,能够容纳输入进去的的字符,要不然就会出问题,这也是scanf被诟病不安全的地方。