Strtok删除分隔符之前的最后一个字符

时间:2016-11-12 14:34:14

标签: c file input strtok

我尝试使用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,"批准"," Western",161,8.9 "备忘录",2000年," R""推理/惊悚",113,8.5

输出如下:

Good,the Bad and the Ugl,1966,APPROVED,Western,161,8.9

2 个答案:

答案 0 :(得分:1)

你忽略了std::string remove(const char* toRemove, const char* original) { return remove(std::string(toRemove), std::string(original)); } 的返回值,并试图弄清楚它正在分离的字符串。我建议这样做(尽管你应该经常检查错误的数据格式,例如当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;
}

答案 1 :(得分:0)

注意:&#39;标题&#39;有一个主要的分隔符,

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

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

如果你想(稍后)删除任何``&#34;`(双引号),那么周围的双引号仍将存在并可以轻松删除。

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