【问题标题】:Strtok deletes last char before delimiterStrtok 删除分隔符前的最后一个字符
【发布时间】:2017-03-26 14:55:30
【问题描述】:

我正在尝试使用 fgets 读取文件并使用 strtok 对其进行标记,但不知何故我丢失了第一个标记(标题)的最后一个字符。我已经尝试了一段时间来解决这个问题,但似乎无法做到这一点,任何帮助表示赞赏。我已经在分隔符之前添加了一个字符,但我不太确定如何实现。

char line[201];
char *title;
int year;
char *age;
char *genre;
int lenght; 
float rating;
while ((fgets(line,sizeof(line),fp)) != NULL){
    strtok(line,"\"");
    title = line;
    year = atoi(strtok(NULL,","));
    age = strtok(NULL,",");
    memmove(age, age+1, strlen(age));
    genre = strtok(NULL,",");
    memmove(genre, genre+1, strlen(genre));
    lenght = atoi(strtok(NULL,","));
    rating = atof(strtok(NULL,","));
    x = new_film(title,year,age,genre,lenght,rating);
    Insert(root, x);
}

文件数据如下所示:

“好,坏,丑”,1966,“批准”,“西方”,161,8.9 《纪念品》,2000,”R”,”神秘/惊悚”,113,8.5

输出如下所示:

The Good, the Bad and the Ugl,1966,批准,西方,161,8.9

【问题讨论】:

  • 无法从显示的代码中重现(尽管它留下了一些不受欢迎的" 标记)。它必须在您未显示的代码中。例如,我得到"The Good, the Bad and the Ugly,所以我的猜测是其中一个函数正试图通过猜测来去除引号,这些已经被删除了。
  • 你对strtok 的使用很糟糕——你从不检查它的返回值,并且你忽略了它的第一个返回值——这就是为什么你的标题以" 开头的原因。还有那些讨厌的字符串移位?
  • strtok(line,"\""); title = line; --> title = strtok(line,"\"");
  • @WeatherVane im 使用 memmove 删除前导“和尾随”被 strtok 删除,尽管它不应该?而我现在这样做太可怕了,我刚刚破解了它,并将返回以使其更清洁、更好
  • 这不是我的错。

标签: c file input strtok


【解决方案1】:

您对忽略来自strtok 的返回值并试图摆弄它分离的字符串感到困惑。我建议这样做(尽管您应该始终检查错误的数据格式,例如当strtok 返回NULL 时):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char line[201];
    char *title;
    int year;
    char *age;
    char *genre;
    int lenght; 
    float rating;
    while ((fgets(line,sizeof(line),stdin)) != NULL){

        title = strtok(line, "\"");                 // use this value
        year = atoi(strtok(NULL, "\",\n"));         // added delimiters
        age = strtok(NULL, "\",\n");
        genre = strtok(NULL, "\",\n");
        lenght = atoi(strtok(NULL, "\",\n"));
        rating = (float)atof(strtok(NULL, "\",\n"));

        printf("%s\n", title);
        printf("%d\n", year);
        printf("%s\n", age);
        printf("%s\n", genre);
        printf("%d\n", lenght);
        printf("%f\n", rating);
        printf("\n");
    }
    return 0;
}

程序输出:

The Good, the Bad and the Ugly
1966
APPROVED
Western
161
8.900000

Memento
2000
R
Mystery/Thriller
113
8.500000

【讨论】:

  • 实际上,当我复制字符串时,问题出在我的新结构函数中,非常感谢,我可能会浪费很多时间来找到这个
【解决方案2】:

注意:“标题”有一个前导分隔符,

当要检查的下一个字符是分隔符时,您应该非常小心。

强烈建议始终为您当前的数据示例使用,(逗号)分隔符。

如果你想(以后)删除任何 ``"`(双引号),那么周围的双引号仍然存在并且可以很容易地删除。

让我们记住strtok() 将分隔符替换为 NUL 字节,因此对strtok() 的第一次调用(在发布的代码中)将已经修剪了尾随双引号

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2015-01-12
    • 1970-01-01
    相关资源
    最近更新 更多