我有一个长字符串,我想获取它的特定子字符串并将其存储到字符串数组中。我尝试将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;
}
}
答案 0 :(得分:1)
一种解决方案可能是使用strtok
,strncpy
,realloc
函数。例如:
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保留在 在不妨碍重入的情况下,呼叫保持不变。