使用strsep将CSV与一堆无用的垃圾分开(“,”Delim)。其中一个条目在任何一方都有引号(即佛罗里达州,“鲍勃”,1999年),我想在将它们保存到我的阵列之前将它们拉出来。
如何从名称中删除引号?谢谢!
for (int i = 0; i < 19; i++)
{
token = strsep(©, ","); //Split token
if (i == 3) {one_spot->location = token;}
if (i == 17) {one_spot->name = token;}//the Name is in quotes in CSV
if (i == 18) {one_spot->year = atoi(token);}
}
all_spots[j] = one_spot; //Add to array.
答案 0 :(得分:0)
你可以这样做:
"
strchr
"
memcpy
复制引号之间的字符串。
if (i == 17)
{
char *firstq = strchr(token, '"');
if(firstq == NULL)
{
one_song->name = strdup(token);
continue;
}
char *lastq = strchr(firstq++, '"');
if(lastq == NULL)
{
// does not end in ", copy everything
one_song->name = strdup(token);
continue;
}
size_t len = lastq - firstq;
char *word = calloc(len + 1, 1);
if(word == NULL)
{
// error handling, do not continue
}
memcpy(word, firstq, len); // do not worry about \0 because of calloc
one_song->name = word;
}
请注意,我使用strdup
来完成作业one_song->name = strdup(token);
和calloc
分配内存。 strsep
返回指向copy
+ an的指针
偏移。根据您创建/分配copy
的方式,此内存可能是
函数退出后无效。这就是为什么创建一个副本更好的原因
在将其分配给结构之前的原始文件。
这段代码非常简单,它不处理开头和结尾的空格
字符串。它可以区分abc
和"abc"
,但它失败了
"abc"d
或"abc"def"
。它也不处理转义引号等。此代码仅显示从引号中提取字符串的方法。为你编写练习不是我的工作,但我可以告诉你如何开始。