为什么我的代码不能检查单词是否是回文工作?

时间:2017-10-19 23:15:14

标签: c

所以我正在尝试制作一个代码来检查一个单词是否是回文。因此,我颠倒了用户输入的单词并检查单词是否相等。但是,它总是返回“不相等”。有人能够解释为什么这不起作用?

#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;
}

1 个答案:

答案 0 :(得分:1)

实际问题是无法删除尾随换行符。引用输出有时可以帮助您轻松识别非打印字符问题,例如tabsnewlines等。这样做会立即显示问题。 (注意:引号最终以原始逻辑结束)

$ ./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;

坚持下去并祝你好运。