我试图将给定的char数组拆分为单独的字符串。我这样做是通过将每个单词的地址放入一个数组,然后从地址中获取字符串进行打印。
所以我更新了我的代码,但现在程序在打印numArgs之后但在“test2”之前冻结。我不明白为什么。
----------------old code-----------------------
char* parseArgs(char* comPtr){
char *args[100] = {0};
char *token;
int i = 0;
token = strtok(comPtr, " ");
while(token != NULL){
args[i] = malloc(100);
args[i] = &token;
token = strtok(NULL, " ");
}
return *args;
}
char* args = parseArgs(comPtr);
int i = 0;
while(i < numArgs){
printf("arg%d: %s\n",i,&args[i]);
i++;
}
-----------------------end old code--------------------
------------------new code------------------------
int countArgs(char* comPtr){
char *token;
int i = 0;
token = strtok(comPtr, " ");
while(token != NULL){
i++;
token = strtok(NULL, " ");
}
return i;
}
char** parseArgs(char* comPtr){
printf("test1");
char** args = calloc(100, sizeof(char*));
char* token;
int i = 0;
while(token = strtok(comPtr, " ")){
args[i] = token;
}
printf("test2");
return args;
}
printf("ComPtr: %s\n",comPtr);
char* path = "/bin/";
//int pid = fork(); //pid always 0 so using pid = 1 to test
//printf("PID:%d",pid);
int pid = 1;
printf("PID:%d",pid);
if(pid != 0){
int numArgs = countArgs(comPtr);
printf("test1");
printf("NumArgs: %d\n",numArgs);
printf("test2");
char** args = parseArgs(comPtr);
int i = 0;
printf("test3");
while(i < numArgs){
printf("arg%d: %s\n",i,args[i]);
printf("test4");
i++;
}
}
else{
//waitpid();
}
答案 0 :(得分:2)
你已经忘记了记忆的位置,你的指针指向等等。如果你想返回指针的指针列表,你需要这样的东西:
char** parseArgs(char* comPtr){
char** p_args = calloc(100, sizeof(char*);
int i = 0;
char* token;
while (token = strtok(comPtr, " "))
p_args[i] = token;
return p_args;
}
char** p_args = parseArgs(comPtr);
int i = 0;
while(i < numArgs)
{
printf("arg%d: %s\n",i,p_args[i]);
i++;
}
free(p_args);
我还没有对它进行测试,但它应该指向正确的方向。仔细考虑它与程序的不同之处,并在代码中使用调试器和/或printf()
语句打印出地址并查看其工作原理(或在必要时进行调试)。
答案 1 :(得分:0)
将指针数组'char * args [100]'声明为全局变量。在你的程序中,你正在为本地指针分配内存,它的生命在函数内。所以在函数的末尾你的指针变量范围结束。这里也有内存泄漏。
答案 2 :(得分:0)
冻结是由于
int i = 0;
while(token = strtok(comPtr, " ")){
args[i] = token;
}
你重复 - 在无限循环中 - 找到comPtr
中的第一个标记,token
在每次迭代中变为&comPtr[0]
(除非字符串以空格开头),并且已分配到args[i]
。
在第一次调用之后,所有对strtok
的调用都会在同一个字符串中找到更多的标记 - 如果有的话 - 应该有一个NULL
第一个参数。
此外,您应该在循环中增加i
,因为您可能不想用每个新令牌覆盖args[0]
。