我收到了这个问题作为实验室作业,我只剩下 3 天的时间来提交它。
该程序将打印
1
表示回文,打印 -1
表示非回文。我可以使用 strrev()
轻松完成此操作,但我们大学使用的编码平台托管在 Linux 上,因此大多数内置字符串函数都不起作用。
我尝试了很多解决方法,但没有任何效果。我被迫在没有字符串函数的情况下实现这个问题,所以它变得有点复杂。我设法找到了一些不错的半工作代码,但在某些测试用例中失败了。
显然,在某些测试用例中它打印了
-1
或 1
的相反符号,这就是导致错误的原因。
#include<stdio.h>
#include<string.h>
int main(){
char string[25],reverse_string[25]={'\0'};
int i, length = 0, flag =0;
int i,length=0,t,flag=0;
scanf("%d",&t);
while(t--){
gets(string);
for(i=0;string[i]!='\0';i++){
length++;
}
for(i=length-1;i>=0;i--){
reverse_string[length-i-1]=string[i];
}
for(flag=1,i=0;i<length;i++){
if(reverse_string[i]!=string[i]){
flag=0;
}
}
if(flag==1){
printf("1\n");
}
else{
printf("-1\n");
}
}
}
预期输出:
3
asdffgg
-1
qq
1
dfghht
-1
我在网站上得到的输出:
3
asdffgg
1
qq
-1
dfghht
-1
我在控制台本地获得的输出:
3
1
asdffgg
-1
qq
-1
对于初学者来说,代码不应被编译,因为存在重复的声明
int i, length = 0, flag =0;
int i,length=0,t,flag=0;
您应该删除第一个声明。
现在关于您获得的输出。
在
scanf
的这个电话之后
scanf("%d",&t);
输入缓冲区将包含与按下的键
'\n'
相对应的新行字符 Enter
。因此,以下对 gets
的调用立即遇到新行字符,并因此存储一个空字符串。你会得到以下输出
3
1
因为空字符串是回文。
然后输入该字符串后
asdffgg
您的程序正确报告该字符串不是回文。
asdffgg
-1
之后输入字符串
qq
但是在循环中您没有重置变量的值
length
。它仍然存储先前输入的字符串 "asdffgg"
的长度,该长度等于 7
。这个 for 循环用于字符串 "qq"
for(i=0;string[i]!='\0';i++){
length++;
}
使变量
length
的值等于9
(7
加上字符串"qq"
的长度)。
因此,以下 for 循环调用未定义的行为,您会得到
qq
-1
首先不要使用该功能
gets
。它不安全并且不受 C 标准支持。请改用 scanf
或 fgets
。例如
scanf( "%24s", string );
辅助数组
reverse_string
是多余的。在 while 循环的每次迭代中,将变量 length
的值重置为 0
。
此外,您还应该在使用变量的最小范围内声明变量。
例如,要检查字符串是否为回文,您可以编写
size_t n = 0;
while( string[n] ) ++n;
size_t i = 0;
while ( i < n / 2 && string[i] == string[n - i - 1] ) ++i;
printf( "%d\n", i == n / 2 ? 1 : -1 );