2012-01-19 97 views
0

我需要得到一個字符串不求回報的長度, 創建100字符的緩衝區,滿我做一個realloc的添加空間,在一個char字符串Ç分配一個字符串,不知道的字符數

這是我的代碼的結束......你能幫助我嗎?

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

int main(int argc, char **argv) 
{ 
    char *content = malloc(10*sizeof(char)); 
    char c; 
    content[0]='\0'; 

    while ((c = getchar()) != EOF) 
    { 
     if (strlen(content) < 10){ 
      strcat(content, &c); 
      content[strlen(content)+1] = '\0'; 
     } 
     else { 
      content=realloc(content,sizeof(char)*(strlen(content))+2); 
      strcat(content, &c); 
      content[strlen(content)+1] = '\0'; 
     } 
    } 
    printf("%s",content);  

    return 0; 
} 
+0

什麼問題?你有沒有試過這段代碼?也許它已經是正確的了? –

+0

一旦你超過10個字符,你會爲每個字符讀取一個'realloc' ... – Lindydancer

+0

爲什麼不使用scanf或獲取。 – riship89

回答

2

這裏的幾個問題:

  1. 使用strcat那樣!您應該傳遞一個指向終止字符串的指針,而不是指向單個字符的指針。這只是偶然的作品。
  2. 保持在一個單獨的變量軌道分配的存儲器的大小,而不是使用strlen()
  3. 使用另一種單獨的變量,而不是通過調用strlen()不斷跟蹤的位置的字符串英寸循環完成後,設置終止\0一次。
  4. 更好的再分配的策略是在塊增長的內存分配,即不是每一個字節。每當您分配的內存耗盡時,您可以分配X個字節,或者您可以將分配的字節數加倍。
0

你應該做的@cnicutar建議:

content[index] = c; 

此外,還有在你的代碼的另一個問題。當您將「c」連接到「content」時,您將覆蓋「content」末尾的'\ 0'。記住strlen會查找'\ 0'。

的另一個問題是:

content[strlen(content)+1] = '\0'; 

當你的strlen是9,你會在內容[10]被放置 '\ 0'。你已經分配了大小爲10的「內容」,所以它意味着它從內容[0]到內容[9]。

簡單

content[strlen(content)] = '\0'; 

應該做你想要什麼。

+0

關於「覆蓋\ 0」,'man strcat'說'strcat()和strncat()函數將空終止的字符串s2的副本追加到空終止的字符串s1的末尾,然後添加終止\ 0' – mvds

相關問題