2017-10-19 53 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

相關問題