尝试在不使用内置函数的情况下在 C 中实现字符串的回文时,一些测试用例失败

问题描述 投票:0回答:1

我收到了这个问题作为实验室作业,我只剩下 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
c loops c-strings palindrome string-length
1个回答
0
投票

对于初学者来说,代码不应被编译,因为存在重复的声明

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 );
© www.soinside.com 2019 - 2024. All rights reserved.