2011-10-13 33 views
0
#include<stdio.h> 
#include<stdlib.h> 

#define n ((sizeof(char)) * 100) 

int stringlength(char * str) 
{ 
    int count=0; 
    while(*str) 
    { 
     if(*str == '\n') 
     { 
      *str=0; 
     } 
     else 
      count++, str++; 
    } 
    return count; 
} 


int palin1(char *str, int k) 
{ 
    char * pend = str + k - 1; 
    if(*pend != *str) 
     return 0; 
    else 
     palin1(str+1, k-1); 
     return 1; 
}  

int palin(char *str) 
{ 
    int length = stringlength(str), f=0; 
    char *pend = str + length - 1; 
    while(str <= pend) 
    { 
     if(*str == *pend) f=1; 
     else 
      return (f = 0); 
     str++, pend--; 
    } 
    return 1; 
} 

main() 
{ 
    char * ps = (char *)malloc(n); 
    int flag; 
    if(ps == NULL) printf("Malloc Fail\n"); 
    else 
    { 
     printf("Malloc Succeeded, you have memory of %d bytes\n", n); 
     printf("This program checks if String is Palindrome or not\n\ 
     \nEnter your String: "); 
     fgets(ps, 100, stdin); 
     printf("You entered: %s of length %d", ps, stringlength(ps)); 
     int i = 0; 
     printf("\n\nEnter:\n1.Using iteration\n2.Using Recursion "); 
     scanf("%d", &i); 
     switch(i) 
     { 
      case 1: 
       flag=palin(ps); 
       break; 
      case 2: 
       flag=palin1(ps,stringlength(ps)); 
       break; 
      default: 
       printf("Invalid input"); 
     } 

     if(flag) printf("\nYou entered a Palindrome"); 
     else printf("\nNot a Palindrome"); 
    } 
    free (ps); 
    return 0; 
} 

爲什麼上面的程序http://www.ideone.com/qpGxi不給上把輸入的任何輸出:程序異常終止,如果輸入是非常大的

mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

我知道fgets(ps,100,stdin)將只需要100字符而不是更多,但爲什麼程序停止執行?

+3

這只是真棒: - ))#define n((sizeof(char))* 100)' – cnicutar

+0

哈哈,是的,這是非常不必要的。我從來沒有見過(sizeof(char))不等於1的系統。 – Chriszuma

+3

@Lohit:我建議你不要定義小寫字母標識符。我曾經用一個'#define'來調試學員代碼,當他引入一個名稱相同的變量時,開始無法編譯......花了我很多時間來找到它! – pmg

回答

1

根據fgets spec的推薦,您應該檢查fgets故障。

if (fgets(ps,100,stdin) == NULL) { 
    printf("Input failed."); 
    //check for 'feof' or 'ferror' here 
    return -1; 
} 
printf("You entered: %s of length %d",ps,stringlength(ps)); 

我不明白爲什麼fgets會失敗,但你會得到一個未初始化字符緩衝區回來,將導致程序崩潰printf

編輯:你也應該注意你的編譯器警告。

prog.c:49: warning: return type defaults to ‘int’ 
prog.c: In function ‘main’: 
prog.c:59: warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result 
prog.c:63: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result 
prog.c: In function ‘palin’: 
prog.c:46: warning: control reaches end of non-void function 
prog.c: In function ‘main’: 
prog.c:52: warning: ‘flag’ may be used uninitialized in this function 

你可以看到,即使你的編譯器建議檢查fgets爲空。此外,在默認情況下,flag應設置爲0,否則如果用戶輸入的內容不是12,則會出現未定義的行爲。

編輯2:爲了基督的緣故哦!你的程序工作正常!你忘了在Ideone中檢查「run program」 !!!

http://www.ideone.com/7ecZd

0

它的終止,因爲留在輸入流中,如果輸入過大的字符。例如,如果你希望只需要使用fgets字符,但已經給出了輸入作爲 -

StackOverflow的

Overflow留在輸入流。他們需要從流中刪除,以便進一步的輸入操作成功。因此,從使用流去掉那些多餘的字符 -

fgets(ps,100,stdin); 
while (getchar() != '\n'); 

由於輸入流與違規字符來襲,scanf語句其實需要用戶輸入不工作,並跳轉到後續操作。

還初始化flag變量爲其他方式它有垃圾值。

+0

爲什麼不只是'fflush(stdin)'如果輸入流真的包含了某些內容? –

+0

因爲'fflush'只爲輸出或更新流定義;它不會清除輸入流。 –

+0

@JohnBode你可以提供一些我可以讀到的有關fflush的內容,它明確指出fflush沒有爲輸入流定義?我一直在尋找,但沒有得到任何東西。 –

0

你不能打破一個字符串就這樣

printf("%s\n", "string literal **WRONGLY**\n 
broken right after the line break."); 

你可以做的是利用加入連續字符串文字的預處理功能,使只有一個

printf("%s\n", "string literal **CORRECTLY**\n" 
"broken because the preprocessor joins these 2 parts.");