2013-06-02 74 views
0

我對C很新,因此作爲我學習的一部分,我想創建一個函數,它只是返回一個字符串,它是輸入中的下一行沒有任何需要的論據。如何創建一個函數來返回輸入的下一行C

這是我到目前爲止有:

#define BUFFER 256 
char *str; 
char *getline() 
{ 
    if (str == 0) 
     str = (char*)calloc(BUFFER, sizeof(char)); 
    if (fgets(str, BUFFER, stdin) != 0) 
    { 
     size_t len = strlen(str); 
     if (len > 0 && str[len-1] == '\n') 
      str[len-1] = '\0'; 
     return str; 
    } 
    return 0; 
} 

現在,這是做這樣的事情的最好方法?有沒有更好的辦法可以解決你的問題? 如果這是最好的方式,我應該在哪裏免費分配我已經分配的calloc

+0

誰負責釋放'str'?如果該線路長於256,該怎麼辦?沒有安全的參數就沒有辦法做到這一點。 – Elazar

+0

哦,'str'應該是本地的或者是數組。 – Elazar

+0

@ H2CO3你對getline的這個接口感覺很舒服 - 'str == 0'?它是一個變相的單身物體與公共場所。 – Elazar

回答

2

這工作,但這裏有一些注意事項要牢記:

  • Don't cast the return value of malloc()

  • 你甚至不需要calloc() - fgets() NUL終止字符串。更好的是,使用static數組。

  • 請勿使用全局變量。改爲使用static存儲持續時間聲明str

  • 而不是256,使用LINE_MAX - 一條線怎麼只能少於256個字符?

  • getline()是POSIX C庫中函數的名稱。重命名您的函數以避免名稱衝突。

  • 檢查malloc()是否失敗!

  • 不要忘記free()讀取最後一行後,如果您使用動態內存管理的方法函數的返回值。

  • 爲新行結束可以這樣簡單的檢查:


char *p = strchr(str, '\n'); 
if (p) 
    *p = 0; 

所有的一切,我會寫的功能是這樣的:

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

char *my_getline_stdin() 
{ 
    static char buf[LINE_MAX]; 

    if (fgets(buf, sizeof(buf), stdin)) { 
     char *p = strchr(buf, '\n'); 
     if (p) 
      *p = 0; 

     return buf; 
    } 

    return NULL; 
} 
相關問題