字符串输出的奇怪现象!解决思路

字符串输出的奇怪现象!
include <stdio.h>
struct   product
{
  char   dm[4];
          char   mc[2];
  int   dj;
  int   sl;
  long   je;
}cp[5];

      void   main()
      {
 
      int   i;

    for(i=0;i <5;i++)
      {
        scanf( "%s%s%d%d%ld ",cp[i].dm,cp[i].mc,&cp[i].dj,&cp[i].sl,&cp[i].je);

printf( "%s   %s   %d   %d   %ld ",cp[i].dm,cp[i].mc,cp[i].dj,cp[i].sl,cp[i].je);

    }
     
 
      }
定义了   dm[4]   输入4个字符     从0开始到3   就是四个字符哦!
但是为什么   输入   jioh   we   4   8   32       的时候   就输出   jiohwe   we   4   8   32
总是把后面的   那2个接在前面的字符串后面??但是如果定义为   dm[5]就不会出现这个问题     那是什么原因   就算是   字符串结束符 '\0 '     就是存到dm[4]里呀!
你们知道什么原因么?(分只有那么一点点了   体谅)


 


------解决方案--------------------
因为用%s输出的时候字符串以\0为结尾标志...楼主的 结构体里char dm[4];但输入的jioh就是4个字符了.没有地方存放那个字符结束标志\0...所以它会等到它会一直输出的下一个字符变量的结束...

这里有一个问题就是.那第2字字符数组变量好像也应该比你输入的字符多一个字节用来存放\0才对...

也有中能是内在对齐的原因所以才能正常输出...
------解决方案--------------------
dm[4]只能存4个字符,包括最后的 '\0 ',你把它变成dm[5]当然就没事了。
C中编译器是不检查数组越界的,所以你的程序可能可以执行。
------解决方案--------------------
cnvb(壮士沈)高见!
所以楼主以后使用字符数组的时候最好使用char str[MAXSIZE + 1],记得要给 '\0 '留个位置啊:)
------解决方案--------------------
to:cnvb(壮士沈)
这里有一个问题就是.那第2字字符数组变量好像也应该比你输入的字符多一个字节用来存放\0才对...
也有中能是内在对齐的原因所以才能正常输出...
/*************************************************************/
不是这个原因,在两个数组后面紧跟着定义的是int型变量,而他输入的数值正好只用了int变量的低位字节,高字节被初始化为零,而0值在字符型变量的意义正好是NULL,所以%s格式的输出到此为止,不信你可以输入一个int各个直接都不为零的数值试一下,%s会接着输出,具体输出到什么位置那就要看什么时候遇到null了!(不同的系统int的字节数不同!)
------解决方案--------------------
晕,楼主看来还是没明白呢,看来之前的CSYNYK() 和cnvb(壮士沈)说的过火了!
4个字符空间都用来放字符了,那 '\0 '放哪呢?
就是这么个简单的问题
%s输出是要遇到 '\0 '才会认为是个有效输出字符串