求助 为什么第一次总是错的

测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。 

#include<stdio.h>
int main()
{
    char a[80]={0};
    while(gets(a)!='\0')
   {
       char s[80][80];
    int i,j,x;
    i=j=x=0;

    for(x=0;a[x]!='\0';x++)
    {
        if(a[x]==' ') {i=0; j++;}
        else  {s[j][i]=a[x]; i++;}
    }

    for(;j>0;j--)
        printf("%s ",s[j]);
    printf("%s\n",s[0]);
    memset(s,0,sizeof(s));
   }
    return 0;
}

为什么第一次答案总是有一个框

char a[80]={0}应该不用定义内容的吧

直接char a[80]不行吗?

新手,请教一下

首先,字符串总长度不超过80,也即可以达到80,那么char数组最小也得是81,因为还有null字符作为结尾。

你的s数组作为局部数组,是分配在栈上的,**OS不会将栈上内存自动置零**,第一次memset前,s内容很可能是非零的。你的代码中也没有给s中的字符串添加null结尾的逻辑,所以很可能出现乱码。得把memset移动到循环体开头。

很多新手都误以为C语言自动将分得内存清零,其实在绝大多数场合中这种想法都是完全错误的。事实上只有全局和静态数组分配后,对应内存会清零。局部数组和malloc获得的内存都不会自动初始化,如果不指定初始值,其实际初始内容多半是无法预测的值。

#includee<stdio.h>

int main()

{

    char a[80]={0};

    while(gets(a)!='\0')

   {

       char s[80][80];

  memset(s,0,sizeof(s));

    int i,j,x;

    i=j=x=0;

    for(x=0;a[x]!='\0';x++)

    {

        if(a[x]==' ') {i=0; j++;}

        else  {s[j][i]=a[x]; i++;}

    }

    for(;j>0;j--)

        printf("%s ",s[j]);

    printf("%s\n",s[0]);

   }

    return 0;

}