作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我认为我在主函数中犯了错误,如果有的话请向我解释,因为我是命令行和函数的新手
#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/
我是一名优秀的程序员,十分优秀!