如果用%s输出没有\0的若干字符(不是字符串)会发生什么呢?
会在goodbye字符串后面输出一些无法预测的乱七八糟字符,直到在内存中找到第一个'\0'为止
c语言是基于指针的,它不会自动判断指针是否越界
用%s输出,必须遇到\0才会结束
那么如果字符串后面的内存里刚好是0,就能正常输出
但是大概率会多输出一堆乱码
(1)利用 %s 输入字符串:
利用 scanf() 中用格式串 “%s” 指定格式,直接用数组名作输入项整体输入字符串。
示例:
#include<stdio.h>
int main(void)
{
char ch1[10],ch2[10],ch3[10];
scanf("%s%s%s", ch1,ch2,ch3);//这里不需要加取地址操作符&
printf("%s %s %s",ch1,ch2,ch3);
}
运行结果:
总结:
(1)数组名本身就代表该数组的首地址(即第一个元素的地址),所以在 scanf() 中输入的时候不需要带取地址操作符 &。
(2)这里是整体输入,所以要清楚这里在输入字符串的结尾,系统会加上 ‘\0’。
(3)还有这里是用多个数组输入多个字符串中间可以用空格隔开。
示例:如果这里输入:You are students!<回车>
则在ch1、ch2、ch3 中分别存入的是 ‘You’,‘are’,‘students!’。
(4)scanf()中空格是多个字符的分隔符,所以不能给一个字符数组里输入这种带空格的字符串,如果输入了,那么就会只有第一个空格前面的字符串有效。
以上总结(4)的示例:
#include<stdio.h>
int main(void)
{
char ch1[15];
scanf("%s", ch1);
printf("%s", ch1);
}
运行结果:
(2)利用 %s 来输出字符串
在 printf() 中用字符串 “%s”指定格式,用数组名做输出项整体输出字符数组。
示例:
#include<stdio.h>
int main(void)
{
char ch[] = { "I am a student!" };
int sz = sizeof(ch) / sizeof(ch[0]);//计算结果为字符串数加1——系统自动在结尾添加 '\0'
printf("%d\n", sz);
printf("%s\n", ch);
}
运行结果:
总结:
(1)如果数组长度大于字符串长度,则遇到 ‘\0’ 就会结束;
(2)如果数组中有多个 ‘\0’ ,输出时遇到第一个 ‘\0’ 即结束;
(3)如果数组中没有 ‘\0’ ,则用此格式输出时会将内存中该数组中的所有内容一起输出,直到遇到第一个 ‘\0’ 为止。因此,这种情况最好改用 “%c” 输出。
(4)只有字符数组能够整体输入和输出,其他数组都不行。