将C char数组拆分为单词

时间:2013-03-08 06:23:42

标签: c arrays string pointers char

我试图将给定的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();
}

3 个答案:

答案 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]