>我有一个字符指针,指向从文本文件中获取的字符串,我想逐行拆分并存储到数组中。我的代码在这里:
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 语言中的首选方法。当您习惯于java
或C#
的拆分方法时,它有点难以使用,但它有其好处。
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++;
}