2014-03-04 79 views
0

我在將來自getchar()的輸入放入char * arr []數組中時遇到了麻煩。我這樣做的原因是因爲輸入數據,這將是一個帶有命令行參數的文件,將被存儲在char指針數組中,以傳遞給execvp函數。構造一個char指針數組

我使用的是getchar(),所以我稍後可以實現一個允許用戶按下'tab'按鈕並嘗試將文件與已輸入的文本進行匹配的功能。

執行以下程序後,I型: LS -a(後面有個空格)

這顯然應該運行,但沒有,我收到了SEG 11故障。如果有人可以指出我做錯了那將是非常好的!

謝謝。

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

int main(){ 

    char *arr[10]; 
    int l_count = 0, w_count = 0; 
    char c; 
    char *curLine; 
    curLine = (char*)calloc(10, sizeof(char)); 
    while((c=getchar()) != '\n'){ 
     if (isspace(c)){ 
      curLine[l_count]='\0'; 
      memcpy(arr[w_count],curLine,strlen(curLine));   
      ++w_count; 
      l_count=0; 
     }  
     else{ 
      curLine[l_count]=c; 
      ++l_count; 
     } 
    } 
    arr[w_count]='\0'; 

    // Testing 
    int i; 
    for (i=0;i<2;i++){ 
     printf("%s, ", arr[i]); 
    } 
    printf("\n"); 

    return 0; 
} 
+0

您需要爲循環中的每次迭代分配一個新的讀緩衝區。沒有memcpy()應該是必需的,雖然'realloc()'策略可能是有保證的,如果你達到你的分配限制而不觸及一些空間或EOF。你的「完成」檢測應該*分配*(不是memcpy)分配的字符串指針到'arr'中的下一個槽,然後用新分配的緩衝區重新開始。 – WhozCraig

回答

0

其實你想這樣的:

int main(){ 
    char *arr[10]; 
    int l_count = 0, w_count = 0; 
    char c; 
    char *curLine; 

    curLine = (char*)calloc(10, sizeof(char)); 

    while (1) 
    { 
     c = getchar() ; 
     if (isspace(c)){ 
      curLine[l_count]='\0'; 
      arr[w_count] = curLine ; 
      ++w_count; 
      l_count=0; 
      curLine = calloc(10, sizeof(char)); 
      if (c == '\n') 
       break ; 
     }  
     else{ 
      curLine[l_count]=c; 
      ++l_count; 
     } 
    } 

    // Testing 
    int i; 
    for (i = 0; i < w_count; i++){ 
     printf("%s, ", arr[i]); 
    } 
    printf("\n"); 

    // free memory 
    for (i = 0; i < w_count; i++){ 
     free(arr[i]); 
    } 

    return 0; 
} 

在這裏,我們還提供免費的內存到底,這是很好的做法,即使在程序結束反正有。

即使還有更多的檢查要完成,例如,如果輸入的單詞超過9個字符,它將溢出由calloc分配的內存,如果輸入超過10個單詞,則會溢出arr數組長度爲10.

順便說一句,C中您沒有投下返回值calloc,mallocrealloc

0

悉心爲您還沒有分配給的memcpy在ARR任何空間,所以這條線 的memcpy起動器(ARR [w_count],curLine,strlen的(curLine)); 正在將您的curLine複製到內存中的隨機位置。類似於之後所有的arr用法。