分裂c char字符阵列成字(Splitting C char array into words)

2019-11-01 17:26发布

我试图分裂一个给定的字符数组为单独的字符串。 我通过把每一个字的地址到一个数组,然后获得从地址字符串以打印这样做。

所以,我已经更新了我的代码,但现在该程序打印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();
}

Answer 1:

你已经忘记了您的内存,你的指针指向等。如果您想返回指针来标记列表,你需要的东西是这样的:

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()语句中的代码打印出来的地址,看看它是如何工作的(或调试它,如果必要的话)。



Answer 2:

声明指针数组“字符* ARGS [100]”作为全局变量。 在你的程序的被分配内存的局部指针和它的寿命是函数内的。 所以在你的指针变量的作用域结束功能的结束。 在这里有内存泄漏了。



Answer 3:

冻结是由于

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

反复在那里你-在一个无限循环-发现在第一令牌comPtrtoken变得&comPtr[0]在每次迭代中(除非字符串以空格开头),和分配给args[i]

第一个电话后,所有调用strtok是应在相同的字符串找到更多的标记-如果有的话-应该有一个NULL的第一个参数。

另外,你或许应该增加i在循环,因为想必你不希望覆盖args[0]随着每一个新的令牌。



文章来源: Splitting C char array into words