所以我正在尝试制作一个代码来检查一个单词是否是回文。因此,我颠倒了用户输入的单词并检查单词是否相等。但是,它总是返回“不相等”。有人能够解释为什么这不起作用?
#include <stdio.h>
#include <string.h>
#define STRING_LENGTH 200
int main() {
char s[STRING_LENGTH] = {0};
fgets(s, STRING_LENGTH, stdin);
int Ordlengde = strlen(s) - 1;
printf("The word contains %i letters", Ordlengde);
int i;
char palindrom[STRING_LENGTH];
int x = 0;
for (i = Ordlengde; i >= 0; --i)
{
palindrom[x++] = s[i];
}
int Ordlengde1 = strlen(palindrom) - 1;
printf("The word contains %i letters", Ordlengde);
printf("\nThe word reversed is %s", palindrom);
printf("%s",s);
if (strcmp(s , palindrom) == 0)
printf("are equal\n");
else
printf("are not equal \n");
return 0;
}
答案 0 :(得分:1)
实际问题是无法删除尾随换行符。引用输出有时可以帮助您轻松识别非打印字符问题,例如tabs
,newlines
等。这样做会立即显示问题。 (注意:引号最终以原始逻辑结束)
$ ./bin/palindrome
foo
The word contains 3 lettersThe word contains 3 letters
The word reversed is '
oof' <-> 'foo
' (original) are not equal
(您正在将\noof
与失败的foo\n
进行比较)
纠正换行线并稍微整理一下,你的逆转和检查的逻辑工作正常,例如。
#include <stdio.h>
#include <string.h>
#define STRING_LENGTH 200
int main() {
int x = 0, Ordlengde;
char s[STRING_LENGTH] = "",
palindrom[STRING_LENGTH] = "";
printf ("enter a word: ");
if (!fgets (s, STRING_LENGTH, stdin)) { /* VALIDATE INPUT */
fprintf (stderr, "error: invalid input - EOF.\n");
return 1;
}
Ordlengde = strlen(s) - 1;
if (s[Ordlengde] == '\n') /* check/remove '\n' */
s[Ordlengde] = 0;
while (Ordlengde--) /* reverse s */
palindrom[x++] = s[Ordlengde];
printf ("\noriginal: '%s'\nreversed: '%s' - ", s, palindrom);
if (strcmp(s , palindrom) == 0) /* compare */
printf("is a palindrom\n");
else
printf("is not a palindrom\n");
return 0;
}
示例使用/输出
$ ./bin/palindrome
enter a word: foo
original: 'foo'
reversed: 'oof' - is not a palindrom
$ ./bin/palindrome
enter a word: foof
original: 'foof'
reversed: 'foof' - is a palindrom
最后一些笔记。首先,如果您期望用户输入,则提示输入。否则,让用户在控制台上看一个闪烁的光标 - 想知道程序是否挂起。当然,你知道你需要输入一个单词,但有关其他人第一次运行你的代码的事情。没有什么特别的,只需要一个简单的提示:
printf ("enter a word: ");
接下来,我会推荐&#34;传统&#34;检查字符串的全长减1.为什么?如果字符串长201个字符怎么办?最后没有新行...这就是为什么下面的传统检查将保留原始长度,直到您确认有newline
要修剪:
Ordlengde = strlen(s);
if (Ordlengde && s[Ordlengde - 1] == '\n') /* remove '\n' */
s[--Ordlengde] = 0;
坚持下去并祝你好运。