【发布时间】:2018-05-12 15:15:24
【问题描述】:
我正在标记由逗号分隔的行,并且由于某些标题中包含逗号,因此它们被引号包围。我标记化到第一个引号,将其存储在 fronttoken 中,然后到第二个引号,将其存储到标题中,最后我标记化直到 \n。我不明白为什么。
它与strsep有关吗?我没有使用 strtok,因为如果字符串由“,”组成,多个分隔符之间没有任何内容,我想捕获空标记。
由于 tempStr 的分配远远超过了必要的数量,它应该足以作为 strcpy 的 *dest。我已经坚持了几个小时。如果有人能指出我的错误,我将不胜感激。谢谢。
int main(int argc, char * argv[])
{
char* one = "hello, my, name, is, code monkey, \"This, is a title\", more, random, stuff\n";
char* two = "blah blah blah";
char* tempStr= malloc(1000);
void* freeTempStr = tempStr;
strcpy(tempStr, one);
char* fronttoken = strsep(&tempStr, "\"");
char* title = strsep(&tempStr, "\"");
char* backtoken = strsep(&tempStr, "\n");
char* token;
strcpy(tempStr, fronttoken);
token = strsep(&tempStr, ",");
while (token != NULL)
{
printf("Front tokens: %s\n", token);
token = strsep(&tempStr, ",");
}
printf("Title: %s\n", title);
strcpy(tempStr, backtoken);
token = strsep(&tempStr, ",");
while (token != NULL)
{
printf("Back tokens: %s\n", token);
token = strsep(&tempStr, ",");
}
//2nd strcpy gives segmentation fault
free(freeTempStr)
return 0;
}
输出...
Front tokens: hello Front tokens: my Front tokens: name Front tokens: is Front tokens: code monkey Front tokens: Title: This, is a title Segmentation fault
【问题讨论】:
-
我不明白你在做什么,你真的了解
strsep()的行为吗? -
如果找不到分隔符,
strsep会将tempStr设置为NULL,因此您可能将NULL 作为第一个参数传递给strcpy,从而导致段错误。您可以通过使用调试器并在发生段错误时检查tempStr的值来测试此假设 -
@Stargateur 我正在尝试正确标记包含电影属性的大型 CSV 文件。有些电影的标题中有逗号,这就是为什么我有一个前后标记以便绕过标题中的逗号。
-
格式正确的 CSV 文件将在包含逗号的字段周围使用双引号。如果字段以双引号开头,则必须进行不同的解析。如果您的文件格式不正确,那么它就是模棱两可的。此外,如果处理不当,您将丢失字符串中嵌入的逗号。在双引号字段中,输入中的两个相邻双引号映射到转换后的字符串中的一个。当然,您必须在输出时撤消此操作。
-
@M.M 在对前面的token进行token化之前tempStr的初始值为0x604440 "" 那么当strsep对最后一个token进行token化时,tempStr就变成了0x0。在再次使用之前,我是否必须再次 malloc tempStr?