kid_0203 2015-11-29 08:06 采纳率: 50%
浏览 3557
已采纳

c语言关于printf输出字符串以及scanf的一些问题

代码一

 #include <stdio.h>
char ch1[]      = {'a', 'b', 'c'};
char ch2[]      = "abc";
int main(void)
{
        printf("String ch1 is: %s\n", ch1);
        printf("String ch2 is: %s\n", ch2);

        return 0;
}

代码二

 #include <stdio.h>
int main(void)
char ch1[]      = {'a', 'b', 'c'};
char ch2[]      = "abc";
{
        printf("String ch1 is: %s\n", ch1);
        printf("String ch2 is: %s\n", ch2);

        return 0;
}

代码一输出的第一行和第二行都是abc,代码二第一行是abc和乱码第二行是abc
请问这是为什么按说ch1没有结束符呀

代码三

 scanf("%d",&x); /*此时输入一串数字并回车,变量x将正常接收到输入的整数*/ 
scanf("%d",&y); /*若此时输入的是字母而不是数字,比如输入“s”并回车*/ 
/*那么变量y将不会接收到任何字符或数字,其值保持原样,不发生任何改变*/ 
scanf("%c",&a);

请问代码3中的s为什么会被a接收?输入的是字母而不是数字的话,应该等待用户

代码四

 #include <stdio.h>
int main()
{int x,y;
scanf("%d",&x);
scanf("%d",&y); 
printf("%d%d",x,y);
        return 0;
}



代码四中 如果输入:s 1
为什么两个出来都是乱码?1难道没有被x接受吗?

  • 写回答

3条回答 默认 最新

  • 纹枰老妖 2015-11-29 10:17
    关注

    我们首先谈论一下printf函数,比如如下调用【printf("%s",ch1);】时会发生什么呢?程序会把ch1作为地址数据传递给printf函数,然后printf函数按照这个地址往后一个个的打印出字符,但打印字符也要有个尽头吧,程序没理由无限的往后打印啊,所以在printf函数里面,尽头的条件就是遇到空字符【也就是数值为0的字符】,printf会停止打印。
    弄明白这一点,咱们再回头看看题主的代码,首先看第一个程序:“ch1”与“ch2”都是在全局域声明的,而在全局域声明的所有变量都有一个共同点:那就是都会被自动初始化为0【变成char的形式就是空字符】,所以第一个代码中,当ch1传递给printf时,printf一定会遇到一个空字符,因为您的ch1数组为3个字节,而因为字节对齐的缘故,ch1与ch2之间,至少要隔4个字节,也就是说,在ch1的a、b、c后面,实际上还有一个空字符。不信的话您把第一个程序代码改成【char ch1[] = { 'a', 'b', 'c','d' }; char ch2[] = { 'a', 'b', 'c','d' };】这种形式,其它不变再运行的话,相信ch1或ch2至少有一个会打印出【abcdabcd】这个字符串。 接下来再说说第二个代码程序,原因也就很简单了,因为ch1是自动变量的性质,而自动变量是不会有默认初始化的形式的,也就是说ch1数组周围本身就是乱码,所以交给printf函数执行后,printf函数肯定会打印出几个乱码,直至侥幸碰到意外的空字符为止。

    接下来再谈谈scanf函数,scanf函数是一个int类型的函数,它从输入流中读取字符序列,然后把字符序列转换并匹配给其余的参数,它返回的是成功匹配的个数,如果碰到输入无法与格式相匹配的情况,比如您的【s】匹配数值,它就会返回0!这也就是意味着,下一次再调用scanf函数时,它会从上一个转换失败的最后一个字符的下一个字符开始匹配!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看