【发布时间】: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/10622916strsep如果在最后一个令牌之后再次调用,也可以返回NULL。 -
char fail_ind;足以容纳长度为零的字符串。如果你想使用字符串函数,如果你想实际存储任何东西,那可能还不够大。 -
如果要存储长度为1的字符串,使用
char fail_ind[2];并使用strncpy绑定副本