c - 字符串标记化c的麻烦

标签 c string tokenize

我有这段代码,它需要一个文件“schedule.txt”,让用户输入一个类,它会显示该类的时间,不幸的是我在标记化方面遇到了困难......

int main(int argc, char *argv[]) 
{
    // Declare variables
    FILE *inp = NULL;
    char str[200];
    char class[7][20];
    double times[15];
    double times2[15];
    int i;
    const char delim[] = " 0123456789:";

    // Open the file, quit if it fails...
    inp = fopen(argv[1], "r");
    if(inp == NULL){
        fprintf(stderr, "Unable to open file: %s\n", argv[1]);
        exit(1);
    }

    // Read the file and tokenize it for names of classes and times
    i = 0;
    while(fgets(str, 200, inp) != NULL){
        str[strlen(str)-1] = '\0';

        char *classToken = strtok(str, "0123456789");
        strcpy(class[i], classToken);

        char *timeToken = strtok(NULL, " ");
        times[i] = atof(timeToken);

        i++;
    }

    for(i = 2; i < 6; i++){
        printf("%f\n", times[i]);
    }

    return 0;
}

我希望将文件标记为两个不同的数组,一个包含类的字符串,另一个是不带“:”的时间,但是当我将分隔符作为数字时,它不允许我使用时间的第一个数字,但是当分隔符为“”时,字符串数组也包含时间,我该怎么办? 该文件如下所示:

 Class Schedule
 Class          Time
 Physics            15:30
 Calculus       9:00
 Biology            14:30
 Chemistry      11:30

最佳答案

您遇到两个问题:第一个问题是 strtok 修改了字符串,并将找到的标记分隔符替换为字符串终止符。

因此,如果您的输入字符串看起来像 "Physics 15:30" ,那么在第一次调用 strtok 后,它将被修改为看起来像 "Physics\05:30"

解决这个问题的方法是使用空格(或制表符,或两者)作为标记分隔符,然后在获取下一个标记时跳过空格。

第二个问题是您使用atof来获取时间。时间不是浮点值,特别是当前的编号系统都没有使用 : 来分隔整数和小数部分。更不用说 15:30 作为 float 将是 15.30,它与 15.50 不同(反过来,它不是与时间 15:50 相同)。

解决这两个问题的一个简单方法是使用 sscanf而是将该行解析为两个字符串

关于c - 字符串标记化c的麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40584292/

相关文章:

elasticsearch - Elastic Search 忽略 `token_chars`

java - 如何为 OpenNLP 准备训练数据以对包含多个单词的标记进行标记?

c# - 如何将短日期字符串转换回 DateTime 对象?

python - 用字典中的新值替换字符串时遇到问题

c - yy_top_state() 似乎因 flex 而失败

c - GstMultifilesink 后消息回调

Javascript:使用通配符和替换方法

c++ - 在循环中使用 isstringstream 作为分词器

c - 函数返回错误值

c - c中二维数组的大小