2014-10-11 66 views
1

我想連接通過argv []傳遞給c字符串的多個參數。我沒有使用char數組,因爲我不想限制通過argv []傳遞的字符數量。Realloc()行爲

這是我如何執行我的程序的一個例子。

可執行-cmd rotn 13的Hello World

char *externalCommand = NULL; 
    if (argc >= 3 && strcmp(argv[1], "-cmd") == 0) 
     { 
      externalCommand = (char *)malloc(sizeof(char) * (strlen(argv[2]) + 1)); 
      strcpy(externalCommand, argv[2]); 
      for (int i = 3; i < argc; ++i) 
      { 
       int textLength = strlen(externalCommand); 
       externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 1)); 
       strcpy(externalCommand + textLength, " "); 
       strcpy(externalCommand + textLength + 1, argv[i]); 
      } 
     } 

我的目標是與字符串結束的 「externalCommand」 等於 「rotn 13 Hello World」 的 當我經過for循環第一次,externalCommand是「rotn 13」,這是正常的。

當我再次通過循環時,運行realloc()時出現奇怪的行爲。 externalCommand變成了「rotiÍÍÍýýýý«««««««îþîþ」。我知道這些是垃圾值,但我不明白爲什麼realloc()會覆蓋字符串中的數字「13」。

爲了解決這個問題,我可以代替:

externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 1)); 

有:

externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 3)); 

不覆蓋值13

我想明白爲什麼我需要在重新分配時向textLength添加3。

回答

3

realloc()是沒有分配足夠的內存來保存要複製到緩衝區中的數據。使用這個來代替:

externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 1 + strlen(argv[i]) + 1)); 

話雖這麼說,如果你預先計算的緩衝區大小,你可以擺脫realloc()和使用單個malloc()

char *externalCommand = NULL; 
if (argc >= 3 && strcmp(argv[1], "-cmd") == 0) 
{ 
    int textlength = strlen(argv[2]); 
    for (int i = 3; i < argc; ++i) 
     textLength += (1 + strlen(argv[i])); 

    externalCommand = (char *)malloc(sizeof(char) * (textLength + 1)); 

    strcpy(externalCommand, argv[2]); 
    for (int i = 3; i < argc; ++i) 
    { 
     strcat(externalCommand, " "); 
     strcat(externalCommand, argv[i]); 
    } 
} 
+0

謝謝,我會用你的第二種方法,因爲它更乾淨:) – Cubia 2014-10-11 20:44:56

2

realloc()改變存儲器塊的大小ptr指向到作爲輸入傳遞大小字節

你缺少用於argv的分配[I]

你應該被給予所需要的總大小作爲參數中的realloc以realloc的

你需要給大小正文長度+的strlen(argv的[1])+ 2

+0

您需要+2佔空格字符和空終止符。 – 2014-10-11 19:52:24

+0

@RemyLebeau,謝謝,更新它 – radar 2014-10-11 19:53:30

+0

@Rajesh謝謝你的答案,我upvoted,但我接受別人的答案,因爲它有一個替代方法。非常好的答案,但。 – Cubia 2014-10-11 20:44:06