2012-05-29 17 views
2

我寫了這個功能:Linux的非確定性的行爲採取輸入

char* input(char* buffer, FILE* fp) 
{ 
    char* result=fgets(buffer,LMAX,fp); 
    if(result!=NULL) 
    { 
    const unsigned int length=strlen(buffer); 
    if(buffer[length-1]=='\n') 
     buffer[length-1]='\0'; 
    } 
    return result; 
} 

它只是需要在輸入文本行,如果FP等於標準輸入。
我已經使用過很多次了,它可以工作。
我只是在這種情況下fgets的結果是fp是一個FILE指針,所以我必須檢查結果是不是NULL的情況下流不適合輸入操作。
的問題是,如果我用這種方式:

char buffer[LMAX]; // LMAX = 100, defined constant 
input(buffer,stdin); 
puts(buffer); 

如果輸入的是像「#dest:一」看跌期權打印「#dest」,切割string.The大問題的其餘部分如果我在輸入「#dest:a」這個字符串時,這個函數正在工作,並且在一個小時前(這是相同的),那麼puts是在打印「#dest:a」。並且沒有任何變化。如果我嘗試調試和我寫這篇文章:

char* input(char* buffer, FILE* fp) 
{ 
    char* result=fgets(buffer,LMAX,fp); 
    puts(buffer); //prints always "#dest :a" 
    if(result!=NULL) 
    { 
    const unsigned int length=strlen(buffer); 
    if(buffer[length-1]=='\n') 
     buffer[length-1]='\0'; 
    } 
    return result; 
} 

的問題是,在功能上它打印「#dest:一個」。
此功能有時有效,有時不起作用,我是K.O.,我無法忍受非確定性行爲,可能是這個問題(也可能是錯誤)導致的?

+0

如果初始化緩衝區會怎麼樣? ''char buffer [LMAX] = {0};'' – Fred

+1

你使用的編譯器是什麼?我想知道你怎麼能編譯「const unsigned int length = strlen(buffer);」 – Donotalo

+0

@Donotalo const const unsigned int length = strlen(buffer);'? –

回答

1

我跑了你的代碼幾次,我得到什麼,但正確的輸出,所以我不能再現問題。我確實認爲我知道問題是什麼。請撥打電話

flush(stdin); 

在您撥打電話之前輸入。

+0

C標準定義了什麼? *提示提示* – glglgl

+0

fgets不會使輸入緩衝區變髒,因爲它也讀取'\ n'字符。您是對的,代碼本身不會產生任何錯誤。 我正在使用改變原始字符串內容的strtok(出於某種奇怪的原因)。 –

相關問題