0

我正在尝试将给定的 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();
}
4

3 回答 3

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()在代码中使用调试器和/或语句来打印地址并查看它是如何工作的(或在必要时对其进行调试)。

于 2013-03-08T06:36:47.130 回答
0

将指针数组 'char *args[100]' 声明为全局变量。在您的程序中,您正在为本地指针分配内存,它的生命在函数内。所以在函数结束时,您的指针变量范围结束。这里也有内存泄漏。

于 2013-03-08T06:30:46.907 回答
0

冻结是由于

int i = 0;
while(token = strtok(comPtr, " ")){
    args[i] = token;
}

在哪里你反复 - 在一个无限循环中 - 找到第一个标记comPtr,token成为&comPtr[0]每次迭代(除非字符串以空格开头),并且分配给args[i].

在第一次调用之后,所有对它的调用strtok都应该在同一个字符串中找到更多的标记——如果有的话——应该有一个NULL第一个参数。

此外,您可能应该在循环中递增i,因为大概您不想args[0]用每个新令牌覆盖。

于 2013-03-08T12:16:43.143 回答