gpt4 book ai didi

c - 它是基于命令行的 C 程序来检查回文字符串,我的答案是正确的,但我必须在终端中提供参数 2 次

转载 作者:行者123 更新时间:2023-11-30 21:22:47 25 4
gpt4 key购买 nike

我认为我在主函数中犯了错误,如果有的话请向我解释,因为我是命令行和函数的新手

#include < stdio.h > 
#include < string.h >
int palindrome(char string[200]) {
int i;
int flag = 0;
for (i = 0; i < strlen(string); i++) {
if (string[i] == string[strlen(string) - i - 1])
flag = 1;
break;
}
if (flag == 1)
printf("palindrome string");
else
printf("not palindrome string");

return 0;

}
int main(int argc, char * argv[]) {
char string[200];
gets(string);
(argv[1]) == string;
return palindrome(argv[1]);

}

最佳答案

正如注释中所指出的,行 (argv[1]) == string 不执行任何操作(gcc 谁会告诉你警告:语句无效[-Wunused-value])

此外,不能使用gets函数,即使对于测试程序,fgets也会做同样的工作,而且更安全:

/* assuming string is an array: */
fgets(string, sizeof string, stdin);

/* when string points on at least `size` bytes: */
fgets(string, size, stdin);

因此,您更正后的 main() 代码可能是:

int main(int argc, char * argv[])   
{
char string[200];
fgets(string, sizeof string, stdin);

return palindrome(string);
}
<小时/>

但是palindrome函数有逻辑问题,请看:

int flag = 0;
for (i = 0; i < strlen(string); i++) {
if (string[i] == string[strlen(string) - i - 1])
flag = 1;
break;
}

在此处放置 break,您将仅测试 i = 0(您可以添加一个 printf("testing i=%d", i ); 就在 if 之前即可看到这一点。

因此,每个以相同字母开头和结尾的字符串都将被视为回文......

而且,您应该反转测试。如果两个测试字母不同,flag 应初始化为 1 并设置为 0

您的 for 循环应如下所示:

int flag = 1;
for (i = 0; i < strlen(string); i++) {
printf("testing %d vs %d\n", i, strlen(string)-i-1);
if (string[i] != string[strlen(string) - i - 1])
{
flag = 0;
break;
}
}
<小时/>

要更进一步,可以改进给定的代码:

  • 有很多次调用 strlen() 函数,其中一次调用就足够了,
  • 每个字母都测试两次,for循环退出条件可以更好...

关于c - 它是基于命令行的 C 程序来检查回文字符串,我的答案是正确的,但我必须在终端中提供参数 2 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51318512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com