2010-04-14 78 views
0

我在編寫getstring函數時遇到了一些麻煩,這是我迄今爲止所做的。幫助編寫getstring函數

問候, V

const char* getstring() 
{ 


    char *buffer; 
    int i = 255; 

    buffer = (char *)malloc(i*sizeof(char)); 

    *buffer = getchar(); 
    while (*buffer != '\n') 
    { 
     buffer++; 
     *buffer = getchar(); 
    } 
    *buffer = '\0'; 

    const char* _temp = buffer; 
    return _temp; 
} 


int main() 
{ 
    char* temp = getstring(); 

    for (;temp++ ; *temp != '\0') 
    { 
     printf("%c", *temp); 
    } 

    return 0; 
} 

回答

2

當後者指向字符串的終止'\0'時,您將_temp設置爲buffer

移動行:

const char* _temp = buffer; 

是行之後立即:

buffer = (char *)malloc(i*sizeof(char)); 

使得_temp所指向的緩衝區的開始。

你有一些其他問題:

  1. 不要使用名稱_temp - 名以一個前導下劃線被保留;

  2. 您需要測試您是否不會在緩衝區中寫入超過i個字節;

  3. 您應該測試malloc()返回NULL;您需要測試getchar()返回EOF。這意味着在將其分配給*buffer之前,需要將getchar()結果存儲在類型爲int的變量中;

  4. 正如Michael Mrozek在評論中指出的那樣,for循環中的表達式是錯誤的。

...作爲一個風格點,sizeof(char)總是1,所以乘以它是不必要的;並且在C中投入malloc()的結果是不必要的,並且被認爲是不受歡迎的(不同於C++,在需要的地方)。

+0

小副作用不值得自己的答案:for循環參數是倒退 – 2010-04-14 22:17:15

+0

是現在所有的變化和它的工作正常。 甚至不能確定for循環是如何扭曲的,當我正在進行實驗時,它肯定會在某個時刻出現。 謝謝, V – volting 2010-04-14 22:33:24

2

爲什麼不直接使用

char buffer[255]; 
scanf("%254s", &buffer); 

char* buffer = readline("GO GO GO:"); 
+0

或者:fgets(buffer,sizeof(buffer),stdin); – 2010-04-14 22:18:24

+0

不,這不是功課。我想我可以提到,函數是從ARM MCU串行獲取字符串,但我認爲它不相關。 我不認爲他們中的任何一個選項都可以工作, 謝謝 – volting 2010-04-14 22:24:40

0

你需要跟蹤分配的指針 - 由malloc()返回的值 - 立即打電話給malloc()之後可以將它傳回給調用者。您還應該檢查EOF以及換行符 - 並且需要int(而不是char)才能保留getchar()的值。至少!

1
const char* _temp = buffer; 

只是調用之後將上述聲明malloc

重要:
免費main()使用後分配到buffer內存。

free(temp); 
+0

是忘了那麼做, 謝謝, V – volting 2010-04-14 22:34:03