我正在尝试将一行80个字符的输入分成一个数组,其中每个元素都指向一串字符。从本质上讲,把char变成[80]就像“Hello world!”进入char * b [64],其中b [0]指向“Hello”,b [1]指向“world!”
基本上,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;
}
main()中的变量args不显示变量commarray在parse()中的作用。相反,我得到了胡言乱语。为什么是这样?我以为传递数组默认是通过引用传递?对于commarray,我得到了适当的字符串指针数组(我认为)。对于args,我什么都没用。
答案 0 :(得分:1)
指针地狱就在你身边。我可以看到代码中至少有两个基本问题,但可能还有更多。
1)您为commarray的所有作业重复使用word。所以你最终得到指向同一个单词数组的commarray中的所有指针。显然那是行不通的。
2)当您退出解析函数时,字数组不再在范围内,因此它变为无效的内存。所以你所有的args数组指针都指向同一段无效的(因此是垃圾)内存。
我的建议,停止使用指针,开始使用C ++,即std :: string类,它将比任何指针更具逻辑性和直观性。