0

使用 strsep 拆分包含一堆无用垃圾的 CSV ("," Delim)。其中一个条目的两边都有引号(即Florida,"Bob",1999),我想在将它们保存到我的数组之前将它们拉出来。

如何从名称中删除引号?谢谢!

for (int i = 0; i < 19; i++)
{                               
  token = strsep(&copy, ","); //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.
4

1 回答 1

0

你可以这样做:

  1. 寻找第一个"使用strchr
  2. 如果找到,寻找下一个"
  3. 用于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+ 偏移量的指针。根据您创建/分配copy的方式,一旦函数退出,此内存可能无效。这就是为什么最好在将其分配给结构之前创建原始副本的原因。

这段代码很简单,它不处理字符串开头和结尾的空格。它可以区分abcand"abc"但在 "abc"dor处失败"abc"def"。它也不处理转义的引号等。此代码仅向您展示了一种从引号中提取字符串的方法。为你编写练习不是我的工作,但我可以告诉你如何开始。

于 2018-01-28T18:28:24.813 回答