如果用%s输出没有\0的若干字符(不是字符串)会发生什么呢?

如果用%s输出没有\0的若干字符(不是字符串)会发生什么呢?

img

会在goodbye字符串后面输出一些无法预测的乱七八糟字符,直到在内存中找到第一个'\0'为止

c语言是基于指针的,它不会自动判断指针是否越界
用%s输出,必须遇到\0才会结束
那么如果字符串后面的内存里刚好是0,就能正常输出
但是大概率会多输出一堆乱码

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7685712
  • 你也可以参考下这篇文章:用%s方法输入超过字符数组大小的字符串
  • 除此之外, 这篇博客: C语言归纳(二)字符数组原来这么好理解?中的 2、用格式符号 %s 来整体输入和输出字符串 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • (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)只有字符数组能够整体输入和输出,其他数组都不行。