C - 如何将 strtok() 返回的令牌存储到字符指针数组中



>我有一个字符指针,指向从文本文件中获取的字符串,我想逐行拆分并存储到数组中。我的代码在这里:

char * token;
char * unsplitLines[lines];
const char * s = "n";
int i = 0;
while((token = strtok(rawFile, s)) != NULL)
{
    printf("%sn", token);
    char * temp = malloc(20);
    strcpy(temp, token);
    unsplitLines[i] = temp;
    free(temp);
    rawFile = NULL;
    i++;
}

其中unsplitLines表示文本文件中的每一行,rawFile是我尝试拆分的整个文本文件。每行最多 15 个字符,因此为了安全起见,我分配了 20 个字节。我可以正确获取令牌,但是尝试将其保存在unsplitLines[i]中时会出现麻烦。任何帮助将不胜感激。

算法沿着这些思路进行。请务必注意,strtok第一次调用后,第一个参数必须为 null。但是,split方法效率低下,strtok应该是 C 语言中的首选方法。当您习惯于javaC#的拆分方法时,它有点难以使用,但它有其好处。

char *str = "/some/path/i/want/to/split";
char *dup = strdup(str);
int i = 0;
char *split[32];
char *tok = strtok(dup, "/");
while (tok != NULL)
{
    split[i++] = tok;
    tok = strtok(NULL, "/");
}
// handle split before freeing dup
free(dup);

基本上你不能存储指向临时存储的指针。

char * temp = malloc(20); // this is temporary
.
.
free(temp); // after this any pointer to temp buffer is invalid

解决方案:不要使用 strcpy((。相反,直接在 rawFile 上操作,并将指向该文件的指针存储到 unsplitLine 中。

char * token;
char * unsplitLines[lines];
const char * s = "n";
int i = 0;
char* pointerForStrtok = rawFile;
while((token = strtok(pointerForStrtok, s)) != NULL)
{
    pointerForStrtok = NULL;
    printf("%sn", token);
    unsplitLines[i] = token;
    i++;
}

最新更新