2017-10-19 72 views
0

所以我试图做一个代码来检查一个单词是否是回文。所以,我倒转了用户输入的单词并检查单词是否相等。但是,它总是返回“不等于”。有人可以善意解释为什么这不起作用吗?为什么我的代码不能检查单词是否是回文工作?

#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

为什么你从strlen的返回值中减去1? – bruceg

+0

您需要null终止您在'palindrom []'中构建的字符串。 –

+1

@bruceg我怀疑它正在剥离尾随的换行符。 –

回答

1

实际的问题是无法删除尾随的换行符。它有时可以帮助引用您的输出以便于识别非打印字符问题,如tabsnewlines等。这样做会立即显示出问题。 (注:在报价结束了原来的逻辑)

$ ./bin/palindrome 
foo 
The word contains 3 lettersThe word contains 3 letters 
The word reversed is ' 
oof' <-> 'foo 
' (original) are not equal 

(你是比较\nooffoo\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: "); 

接下来,我会推荐“传统”与字符串的全长减去1。为什么检查?如果字符串长达201个字符会怎么样?会有结尾没有新行......这就是为什么直到确认有一个newline修剪低于传统检查将保留原始长度:

Ordlengde = strlen(s); 
if (Ordlengde && s[Ordlengde - 1] == '\n') /* remove '\n' */ 
    s[--Ordlengde] = 0; 

坚持下去,祝你好运与您的编码。

+0

我明白了。谢谢你的详细解释。我很感激! – kenn1ld

+0

当然,很高兴提供帮助。我在答案的末尾添加了一些注释。 –

+0

at'if(Ordlengde && s [Ordlengde] =='\ n')':'Ordlengde &&'似乎几乎毫无意义的后卫。 – BLUEPIXY

相关问题