2013-03-28 135 views
0

我試圖將一行80個字符的輸入分成一個數組,其中每個元素指向一個字符串。本質上,把一個char [80]變成「Hello world!」轉換爲char * b [64],其中b [0]指向「Hello」,b [1]指向「world!」將字符分成char指針數組

基本上,strsep(),讓我用下面的代碼:

while((cmd->argv[argc++] = strsep(clPtr, WHITESPACE)) != NULL); 

我想知道我怎麼會去修改這個代碼:

int parse(char* comm, char** commarray) { 
    int count = 0; 
    char word[80] = ""; 
    char ch[2] = {' ', '\0'}; 

    if(strlen(comm) == 0) { 
    commarray[0] = "NULL"; 
    return 0; 
    } 

    for(size_t i = 0; i < strlen(comm); i++) { 
    int c = int(comm[i]); 
    if(!isspace(c)) { 
     ch[0] = comm[i]; 
     strcat(word, ch); 
     if(i == (strlen(comm) - 1)) { 
     commarray[count] = word; 
     cout << commarray[count] << endl; 
     count++; 
     } 
    } 
    else if(isspace(c) && word != "") { 
     commarray[count] = word; 
     cout << commarray[count] << endl; 
     word[0] = '\0'; 
     count++; 
    } 
    } 

return 1; 
} 

//main 
int main() { 
    char command[80]; 
    char* args[64]; 

    while(true) { 
    cout << "order>"; 
    cin.getline(command, 80); 

    if(strcmp(command, "quit") == 0 || strcmp(command, "exit") == 0) { 
     break; 
    } 

    parse(command, args); 

    cout << args[0] << endl; 

    if(strcmp(args[0], "quit") == 0 || strcmp(args[0], "exit") == 0) { 
     break; 
    } 

    /*for(int i = 0; i < 3; i++) { 
     cout << args[i] << endl; 
    }*/ 
    } 
    return 0; 
} 

變量ARGS中main()不顯示變量commarray在parse()中的作用。相反,我得到的是胡言亂語。爲什麼是這樣?我認爲傳遞數組默認情況下是通過引用傳遞的?對於commarray,我得到適當的字符串指針數組(我認爲)。對於參數,我沒有任何可用的東西。

回答

1

指針地獄是你在哪裏。我可以看到代碼至少有兩個基本問題,但可能還有更多。

1)你可以重複使用單詞來處理所有commarray的作業。所以你最終得到commarray中的所有指針都指向同一個數組。顯然這是行不通的。

2)當您退出解析函數時,字數組不再處於範圍內,因此它變成無效內存。所以你有所有的參數數組指針指向同一塊無效的(因此垃圾)內存。

我的建議,停止使用指針,開始使用C++,即std :: string類,它比任何指針都將在邏輯和直觀上表現得更加出色。

+0

1)實際上,commarray中的每個指針指向一個不同的單詞。 commarray得到我需要的東西。參數不。 2)這很有意義。所以我應該讓commarray指向我傳遞的部分? 我實際上已經有了可用的代碼將一個字符串拆分成一個字符串向量。我應該把所有這些東西都傳遞給execv,但是,這顯然需要一堆char指針。 – KingTouchstone

+0

@KingTouchstone然後做分割使用std ::字符串,當你完成分割,將std :: string轉換爲字符指針。 – john

+0

是的,我想我會這麼做。我希望避免這種情況,但由於我並不在意表現,所以我說得對。 我真的很感謝你的幫助! – KingTouchstone