关于C语言问题

下面程序中的
<char a[80]={'0'};
int i;
char b[80]={'0'};
int j=0; >

a[80]与b[80]为什么要初始化,该程序不初始化运行结果不对,哪位回答下?????????????、
#include<stdio.h>
#include<string.h>
void main()
{
char a[80]={'0'};
int i;
char b[80]={'0'};
int j=0;
printf("输入一串字符:");
scanf("%s",&a);
for(i=strlen(a)-1;i>=0;i--)
{
b[j]=a[i];
j++;
}
if(strcmp(b,a)==0)
printf("字符串为回文\n");
else printf("字符串不是回文\n");
}

因为在main函数里面声明的变量如果没加限制,就自动变为自动类型,而自动类型如果还没赋值的话,他的值是未知的,后来你把字符串赋值给了a,但是你要知道系统会在字符串最后加上结束符号'\0',你的for语句没有把结束符'\0'赋给b,导致b跟a的值不完全相同,所以应该在把a的值复制到b的时候,在b最后加上结束符'\0'。
但是如果你初始化了a和b,那么a和b中如果没有被赋值的位置都将自动赋值为'\0',这样就避免了b没有结束符,从而跟a不相同的情况。
还有这个语句scanf("%s",&a)是错的,数组名是地址常量,不用加&,程序改为如下就对了:

#include<stdio.h>
#include<string.h>
void main()
{
char a[80];
int i;
char b[80];
int j=0;
printf("输入一串字符:");
scanf("%s",a);
for(i=strlen(a)-1;i>=0;i--)
{
b[j]=a[i];
j++;
}
b[j]='\0';
if(strcmp(b,a)==0)
printf("字符串为回文\n");
else printf("字符串不是回文\n");
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-29
不初始化也没问题

初始化是有的程序需要直接读,你这个都在读前给了值的,不用初始化。

但是为了保险,一般都要初始化。
第2个回答  2009-12-29
字符数组是以'/0'作为结束标志,其ASCII码为0,若不经行初始化,字符数组的内容是不可预知的,运用strlen()函数无法确定字符串在何处结束,造成for循环不能正确进行
第3个回答  2009-12-29
初始化的目的是为了把数组的第2到第80个元素都用字符串结束标志填充(第一个元素用字符'0'填充,并不是字符串结束标志),这样在第二个循环给b数组赋值时就不必考虑字符串结束标志了。

如果不初始化,那么需要在第二个循环结束后单独为b数组添加一个字符串结束标志。
第4个回答  2009-12-29
a是可以不初始化的,但是b必须初始化,因为a输入用的是字符串输入,系统会自动给在输入的字符串后增加一个0,其实你也可以这样改一下就不用初始化了
#include<stdio.h>
#include<string.h>
void main()
{
char a[80];
int i;
char b[80];
int j=0;
printf("输入一串字符:");
scanf("%s",&a);
for(i=strlen(a)-1;i>=0;i--)
{
b[j]=a[i];
j++;
}
b[j]=0;//!!!!
if(strcmp(b,a)==0)
printf("字符串为回文\n");
else printf("字符串不是回文\n");
}
第5个回答  2009-12-29
strcmp 两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网