2017-03-16 36 views
0

創建字符串所以我試圖編寫一個程序,基本上通過內存分配,每個字符讀取字符,但只通過鍵盤輸入一個字符串創建一個字符串。我知道有很多(更好)的方法可以做到,但我想通過這種特殊的方式來做到這一點! 下面的代碼:通過malloc和getchar()

int newstring (char** string) 
{ 
printf("--------------In function newstring--------------\n"); 
int i = 0; 
string = malloc (sizeof (char)); 
printf("Adress: %p\n", (void*)string); 
if (string == NULL) 
    return -1; 

while (1) 
{ 
printf("Pre-scan\n"); 
*(string[i]) = getchar(); 
printf("After-scan\nstring[%d] = %c\n", i, *(string[i])); 
i++; 
if (*(string[i-1]) == '\n') 
    break; 
printf("Reallocation to size %d\n", i+1); 
string = realloc (string, sizeof (char) * (i+1)); 
if (string == NULL) 
    return -1; 
} 

string[i-1] = '\0'; 
printf("--------------Exit function newstring--------------\n"); 
return; 
} 

int main() 
{ 
char *string; 
newstring (&string); 
printf("%s\n", string); 
} 

的問題是,程序總是讀第三個字符之前中途死機,這裏所發生的printfs輸出:

Adress: 00AE1578 
Pre-scan 
1st Input: >>Hello 
After-scan 
string[0] = H 
Reallocation to size 2 
Pre-scan 
After-scan 
string[1] = e 
Reallocation to size 3 
Pre-scan 

我想知道,如果是因爲緩衝區有一些限制,但我覺得很難相信這個限制是2個字符(我嘗試了多個輸入,總是在第三個字符之前卡住)。還試着用「scanf(」%c「,*(string [i]))」來得到相同的結果。

+0

你永遠不會調用'free' - 你的程序會泄漏內存並最終停止,因爲它會耗盡內存。 – Dai

+0

@Dai我不需要免費調用,因爲realloc已經釋放了以前分配的內存。如果你說我應該主要免費打電話,那麼你是對的,但這個計劃從來沒有達到主要的,所以這不是問題! –

+0

@ryyker我意識到這一點,我這樣做是爲了清晰(如果有人看到我的代碼,他們會知道我爲「char」數組分配內存) –

回答

2

問題啓動與此:

string = malloc (sizeof (char)); 

這裏string是一個指向實際的指針。您需要取消對它的引用:

*string = malloc (sizeof (char)); 

那麼問題

*(string[i]) = getchar(); 

繼續取消引用錯誤的事情,應該是

(*string)[i] = getchar(); 

同樣的,在您使用的其他地方錯誤的解引用。

然後

string[i-1] = '\0'; 

在這裏你不取消引用指針都沒有。應該

(*string)[i-1] = '\0'; 

最後,getchar函數返回一個int。通過將結果與EOF進行比較,檢查功能是否失敗時,這一點很重要。你根本不這樣做。

+0

好吧,我覺得做出這樣一個明顯的錯誤是非常愚蠢的! 雖然我不明白getchar部分的含義,但如果我從鍵盤掃描,爲什麼還需要搜索EOF?我不應該爲了'\ n'而選擇嗎?我確實意識到EOF也適用於輸入流的結尾,但在這種特殊情況下,如果沒有首先達到換行符,就不可能達到EOF,否? –

+0

@CarlosPinto符號常量'EOF'是一個'int'。有可能是'EOF!=(char)EOF'。關於換行符,如果輸入在文件結束之前沒有換行符而從文件重定向? –