insert strtok results into char* (increased dynamic)

五迷三道 提交于 2019-12-24 18:26:28

问题


I'm loosing my mind. I want to split string (char* text) with spaces and insert the string results into array and return this array. I have the following method in C

char *read_command(char *text)
{
    int index=0;
    char *res=NULL;
    char *command= (char*)malloc(strlen(text)+1);
    strcpy(command, text);
    char *tok = strtok(command, " ");

    while(tok!=NULL && index ==0)
    {
        res = (char*)realloc(res, sizeof(char)*(index+1));
        char *dup = (char*)malloc(strlen(tok)+1);
        strcpy(dup, tok);
        res[index++] = dup; //Error here
        tok = strtok(NULL, " ");
    }
    res[index++]='\0';

    return res;
}

from main method

char *input="read A B C";
char *command = read_command(input);

Thank you


回答1:


You are using a wrong type to calculate the size in this call:

res = realloc(res, sizeof(char)*(index+1));

You need to use char*, not char, with sizeof, like this:

res = realloc(res, sizeof(char*)*(index+1));

Since your code returns a pointer to C strings (represented as char*) the return type should be char**.

You need to remove the index == 0 condition from the while loop, otherwise it wouldn't go past the initial iteration.

This assignment

res[index++]='\0';

should be

res[index++]=NULL;

You also need to call free(command) before returning the results to the caller. Finally, you should not cast results of malloc in C.

Here is your code after the fixes above:

char **read_command(char *text) {
    int index=0;
    char **res=NULL;
    char *command= malloc(strlen(text)+1);
    strcpy(command, text);
    char *tok = strtok(command, " ");
    while(tok!=NULL) {
        res = realloc(res, sizeof(char*)*(index+1));
        char *dup = malloc(strlen(tok)+1);
        strcpy(dup, tok);
        res[index++] = dup;
        tok = strtok(NULL, " ");
    }
    // Need space to store the "terminating" NULL
    // Thanks, BLUEPIXY, for pointing this out.
    res = realloc(res, sizeof(char*)*(index+1));
    res[index]=NULL;
    free(command);
    return res;
}

Demo on ideone.




回答2:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char **read_command(const char *text){
    int index=0;
    char **res=NULL;
    char *command= malloc(strlen(text)+1);
    strcpy(command, text+strspn(text, " \t\n"));//strspn for skip space from top
    char *tok = strtok(command, " ");

    res = realloc(res, sizeof(char*)*(index+1));
    while(tok!=NULL){
        res[index++] = tok;
        res = realloc(res, sizeof(char*)*(index+1));
        tok = strtok(NULL, " ");
    }
    res[index++]=NULL;

    return res;
}

int main(void){
    char *input="read A B C";
    char **command = read_command(input);
    int i;
    for(i=0;command[i]!=NULL;++i){
        printf("s[%d]=%s\n", i, command[i]);
    }
    free(command[0]);//for free command of read_command
    free(command);//for free res of read_command,,
    return 0;
}


来源:https://stackoverflow.com/questions/20825305/insert-strtok-results-into-char-increased-dynamic

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!