meiyanfei 2015-11-07 01:48 采纳率: 80%
浏览 1591
已采纳

[c语言]关于 scanf() 和 char数组 的小实验的问题

写了三个小的几乎一样的test代码,但是输出却不同,不明白为什么,求大神指点。
全部代码如下:
#include
void sub1(void);

int main()
{
/*test1*/
sub1();

/*test2 */
char w0[2]={'a','a'};         
char * pc0 = w0;      

printf("\nw1 = %s",w0);   /*wrong*/
printf("\nw1 = %s",pc0);   /*wrong*/

/*test3 */
char w1[2];         
char * pc = w1;  

printf("\n\nInput:");    
scanf("%2s",w1);          /*try input aa*/

printf("\nw1 = %s",w1);   /*right*/
printf("\nw1 = %s",pc);  /*right*/

return 0;

}

void sub1(void)
{
char w1[2];

char * pc = w1;

printf("\nInput:");    
scanf("%2s",w1);          /*try input aa*/

printf("\nw1 = %s",w1);   /*right*/
printf("\nw1 = %s",pc);   /*wrong*/

}
凡是scanf输入的地方,都是输入aa,然后回车。请问为何得到的结果,三个都不同。我在注释里标明了正常输出的代码和错误输出的代码。理论上3个实验中,字符串都没有用\0结尾,那么为何有些能够正常输出?

  • 写回答

2条回答 默认 最新

  • Meditator_hkx 2015-11-07 02:09
    关注

    题主这个问题问的好,我学的时候就没有你这么细心。
    观察一下就会发现,当需要手动输入2个字符时,最后就不会出错;
    而初始化时赋值2个字符,输出就会有问题。
    我们继续往后推:在命令行界面赋值和程序初始化赋值有什么区别?
    那就是:初始化只给定字符,没有输入结束标志(没有'\0'),但手动输入时,我们最后都会敲一个回车键('\n'),那么在这里,回车就代表了字符数组结束标志。
    即便数组大小都被限定,但是字符数组的第一限制不是大小而是结束标志!

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

报告相同问题?

悬赏问题

  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器