2013-04-27 55 views
0

一個簡單的程序,一個用於讀取輸入的靜態字符串,然後將其傳遞給函數。只是想知道爲什麼它使用while(* string!='\ 0')表達式找不到'\ 0'字符。行尾字符未檢測到

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int is_palindrome(char *string) 
{ 
    int length, mid, end, i; 
    length=0; 
    if (string == NULL) 
     return 0; 

    while (string[length] != '\0') 
    { 
     printf("%c\n", string[length]); 
     length++; 

    } 
    //Not working version 
    /* 
    while(*string!='\0') 
     length++; 
    */ 

    end = length - 1; 
    mid = length/2; 
    printf(" end=%d, mid=%d\n", end, mid); 
    for (i = 0; i < mid; i++) { 
     if (string[i] != string[end]) { 
      printf("It's not palindrome\n"); 
      return 0; 
     } 
     end--; 
    } 

    if (i == mid) { 
     printf("It's palindrome\n"); 
     return 1; 
    } 

    return 0; 
} 

int main(void) 
{ 
    char string[100]; 
    printf("Enter a string to test for the parlindrome\n"); 
    gets(string); 

    int length = strlen(string); 
    printf("You entered %s,length is %d\n", string, length); 
    if (is_palindrome(string)) 
     ; 
    printf("Enter to Quit\n"); 
    char x; 
    scanf("%c", &x); 
    return 0; 
} 
+1

請勿使用'gets'。你應該使用'fgets'來代替。 – squiguy 2013-04-27 02:54:01

+0

我甚至在獲得後在最後手動添加'\ 0'。但它仍然不起作用 – fiftyplus 2013-04-27 02:55:22

+0

'gets()'不是'\ 0''問題的原因;它會正確地終止輸入緩衝區。但它本質上是不安全的,因爲它不能防止過長的輸入;這是一個等待發生的緩衝區溢出。它甚至在最新版本的標準中從C中刪除。使用'fgets()'而不是'gets()'不會解決你所問的問題,但無論如何都要這樣做。 ('fgets()'離開字符串中的''n''字符,所以你必須處理這個問題。) – 2013-04-27 03:58:24

回答

3

而不是

while(*string!='\0') 
    length++; 

char* p = string; 
while(*p++) 
    length++; 

否則指針不動,你卡在無限循環(如果字符串不爲空)。使用p可避免更改原始指針。

還使用它們之前初始化所有變量,好的經驗法則。

+1

不,它不會,如果長度最初爲0並且字符串爲空,則長度將保持爲0,因爲* p將爲0. – 2013-04-27 03:21:55

+0

我站在(實際坐下)更正。 'p'確實增加了,但'length'沒有。完全是我的不好。由於'while(* p)++ p;'後面跟着'(p-string)',所以在我的腦海中仍然存在着「長度」的無用性,因爲它提供了沒有額外變量的長度。我完全道歉。擁有17K代表的民衆不會犯這樣的錯誤(但顯然是有14K代表的* * * * P)。 (和+1,很好的答案)。 – WhozCraig 2013-04-27 03:26:38

+0

謝謝,沒問題 - 它不是像我沒有做過123123次一樣的監督:) – 2013-04-27 03:29:38

1

初始化length到0之前在while循環中使用它的值。您可以使用標準庫函數strlen()

此外,在迴文檢查中,您應該減少end與您增加i相同。實際上,你將前半部分的字符與最後一個字符進行比較。這將匹配諸如「aaaabfa」但不是「abcdcba」的字符串。

+0

main()中的長度變量?是否會影響字符串的形成? – fiftyplus 2013-04-27 02:57:02

+0

您在不工作的循環中使用的長度變量。也許你打算使用'i',然後設置'length = i;'。 – 2013-04-27 02:57:39

+0

對於長度分配感到抱歉,它最初並未使用。我修改了我的代碼,並添加了不起作用的部分,你可以看看 – fiftyplus 2013-04-27 03:04:43