【问题标题】:strtok - Tokenize txt file with characters in cstrtok - 用 c 中的字符标记 txt 文件
【发布时间】:2021-06-21 10:23:51
【问题描述】:

我有一个带有分隔符“;”的 txt 文件。
我正在使用 fgets 在 C 中读取此文件并使用 strtok 标记字段。

文件记录示例 -
500;Y;一些错误信息

我要加载文件的 C 结构

typedef errRec{
    long id;
    char fail_ind;
    char error_msg[1000];
}errrec_t;

我正在标记文件字段,如下所示。
errRec.id = atol(strtok(fileRec,";"));
strcpy(errRec.fail_ind,strtok(NULL,";"));
strcpy(errRec.error_msg, strtok(NULL,";"));

问题: strcpy 对 id 和 error_msg 有效,但对字符类型的 fail_ind 无效。
我收到警告 -

warning #167: argument of type "YESNOIND_C_T={char}" is incompatible with parameter of type 
"char*__restrict__";
strcpy(errRec.fail_ind,strtok(NULL,";"));

如何将 strtok 中的这个字符存储在 fail_ind 或我可以通过哪些不同的方式存储该字符?

经过一些建议后,我尝试使用 strsep 而不是 strtok 来处理 NULL 值 -

char *fileRecPtr;
fileRecPtr = strdup(fileRec);

errRec.id = atol(strtok(&fileRecPtr,";"));
errRec.fail_ind = *(strsep(&fileRecPtr,";"));
strcpy(errRec.error_msg, strsep(&fileRecPtr,";"));

您认为这种方法是否正确,尤其是下面的行存储字符是否正确?

errRec.fail_ind = *(strsep(&fileRecPtr,";"));

【问题讨论】:

  • 是的,文件中的字段可以为空
  • 您不应该直接将strtok 的返回值传递给其他函数,因为它可能会返回一个NULL 指针以指示“不再有令牌”。 strsep 的可移植性较差,请参阅 stackoverflow.com/a/7219504/10622916 strsep 如果在最后一个令牌之后再次调用,也可以返回 NULL
  • char fail_ind; 足以容纳长度为零的字符串。如果你想使用字符串函数,如果你想实际存储任何东西,那可能还不够大。
  • 如果要存储长度为1的字符串,使用char fail_ind[2];并使用strncpy绑定副本

标签: c strtok


【解决方案1】:

如果您忽略程序崩溃的风险,您可以使用:

errRec.fail_ind = *strtok(NULL, ";");

这是有风险的——如果strtok() 返回一个空指针,你的程序可能会崩溃(strtok() 的其他用途也是如此)。更安全的版本保存并检查指针:

char *ptr = strtok(NULL, ";");
if (ptr == NULL)
    …report error; do not continue…
errRec.fail_ind = *ptr;

这并不能验证失败指示符是单个字符;这是否重要由您决定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2011-05-31
    相关资源
    最近更新 更多