C:将子串存储在字符串数组中

时间:2015-03-22 20:32:37

标签: c arrays string

我有一个长字符串,我想获取它的特定子字符串并将其存储到字符串数组中。我尝试将malloc()与memcpy()一起使用,但它似乎不起作用。我该怎么做呢?代码:

for(i = 0; i < strlen(p); i++){
        if(p[i] == ':'){
            cnt++;
            end = i - start;
            list[i] = malloc(1000);
            memcpy( list[i], &p[start], end );
            list[i][end] = '\0';
            //printf("%s\n", list[i]);
            start = i + 1;
        }
    }

3 个答案:

答案 0 :(得分:1)

一种解决方案可能是使用strtokstrncpyrealloc函数。例如:

int main(void){
    char str[] = "asbd0:sdsd1:ssdwdwd2";
    int tokens = 0;
    int i = 0;
    char **res = NULL;

    char *token = strtok(str, ":");
    for (tokens = 1; token; ++tokens) {
        res = realloc(res, tokens *sizeof(*res));       
        res[tokens - 1] = malloc(strlen(token) + 1);
        strncpy(res[tokens - 1], token, strlen(token) + 1);
        token = strtok(NULL, ":");
    }

    for (i = 0; i<tokens-1; ++i){
        puts(res[i]);
    }
    return 0;
}

这样我们每次找到另一个:分隔字符串时都会根据需要扩展我们的“字符串数组”。

coliru

答案 1 :(得分:1)

int len   = 0;
int start = 0;
int cnt   = 0;

for( = 0; i < strlen(p); i++)
{       
    if(p[i] == ':')
    { // then, found delimeter
        len = i - start+1;
        list[cnt] = malloc(len);
        memset( list[cnt],'\0', len );
        memcpy( list[cnt], &p[start], len );

        //printf("%s\n", list[i]);
        start = i + 1;
        cnt++;
    } // end if
} // end for

答案 2 :(得分:0)

我建议你使用strtok或更好的strtok_r。像这样使用它们。

char *str = "Hello you new guy";
char *temp;
temp = strtok(str," ");
while(temp!=NULL) {
    printf("%s\n",temp);
    temp = strtok(NULL," ");
}
小心!strtok是破坏性的。请改用strtok_r:

  

就像strtok一样,这个函数将字符串拆分成几个可以访问的标记    连续调用strtok_r。不同之处在于有关下一个令牌的信息是    存储在第三个参数save_ptr指向的空间中,save_ptr是一个指向字符串的指针    指针。使用空指针调用strtok_r并将save_ptr保留在    在不妨碍重入的情况下,呼叫保持不变。