测试输入包含一个测试用例,在一行内给出总长度不超过 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;
}