2012-10-22 115 views
1

我有我的C. 輸出的格式一些問題,請參閱下面的圖片爲我的輸出C輸出格式問題

See image

我希望我的輸出爲如下

輸入詞:KayaK

皮划艇是迴文。

// palindrome.c 
    #include <stdio.h> 
    #include <string.h> 
    #include <ctype.h> 
    #define MAXLEN 20 

    int isPalindrome(char [], int); 

    int main(void) { 
    char word[MAXLEN+1]; 
    int size; 

    printf("Enter word: "); 
    fgets(word,MAXLEN+1,stdin); 
    size = strlen(word); 
    if (isPalindrome(word, size-1)) //size - 1 because strlen includes \0 
    { 
    printf("%s is a palindrome.\n",word); 
    } 
    else 
    { 
    printf("%s is not a palindrome.\n",word); 
    } 
    return 0; 
    } 

int isPalindrome(char str[], int size) { 
int i; 
for (i = 0; i < size; i++) 
{ 
    if (tolower(str[i]) != tolower(str[size - i - 1])) 
    { 
     return 0; 
    } 
} 
return 1; 
} 

回答

8

fgets讀取字符串,包括終止換行符。在進一步處理之前將其剝離。

請注意,當您傳遞size-1時,您實際上已將此考慮在內,但原因不正確。它包括\n,而不是\0

+0

您好,感謝您的及時回覆。 我在C中頗爲新穎。你是什麼意思? –

+0

「word [strlen(word)-1] = 0;'應該這樣做。不過,你應該檢查它不是零長度的。 –

1

你的碼掩碼包含結束線的標記的原始字符串的問題:

此行砍掉尾隨零

if (isPalindrome(word, size-1)) //size - 1 because strlen includes \0 

的評論是錯誤的,順便說一句:strlen不包括\0,它包括\n

此行忽略尾隨size - i - 1\n因爲減去1再次,即使你已經減去它,當你第一次調用的函數:

if (tolower(str[i]) != tolower(str[size - i - 1])) 

你應該這樣做:

size--; 
word[size] = '\0'; 
if (isPalindrome(word, size-1)) //size - 1 because strlen includes \0 

現在您可以如下更正迴文檢查程序:

if (tolower(str[i]) != tolower(str[size - i])) // No "minus one" 
{ 
    return 0; 
} 
+0

嗯...你說的那一行刪除了尾部的零,實際上,考慮到'\ n'減小了大小。但是你所說的行忽略了尾部'\ n'正在考慮'\ 0'(雖然實際上是\ n)(str [size]指向實際字符串之外的事實,無論終結符是什麼) –

+1

最後一個代碼片段是錯誤的,size-0(不是「減1」)指向超出這個單詞的點 –

+0

@ MichaelKrelin-hacker不,它沒有,因爲'size'被傳遞了一個已經減少了兩次的值從包含'\ n'的原始長度開始(一次用'--',另一個用'size-1'將值傳遞給函數時) – dasblinkenlight

0

去掉它意味着將它從字符串中刪除。

//... 
printf("Enter word: "); 
fgets(word,MAXLEN+1,stdin); 
size = strlen(word); 
word[size-1] = '\0' 
//program 
+0

謝謝所有... :) 我設法解決了我的問題:) –

+0

否問題:) @勞倫斯·旺 –