我有一个文件,其中某些字段由制表符分隔。一行中始终有 12 个制表符,某些制表符是连续的,这表示一个空字段。我想使用 fscanf 将连续的选项卡读取为空字段并将它们存储在结构中。但是好像有问题。这是我的文件:
usrid User Id 0 15 string d k y y 0 0
当我尝试使用 fscanf 读取时,一个接一个的选项卡未被识别为空字段,并且数据存储在错误的结构字段中。处理问题的最佳方法是什么?
最佳答案
fscanf
无法启动。读取空字段的唯一方法是使用 "%c"
读取定界符(这需要您事先知道哪些字段是空的——不是很有用)否则,取决于 <使用 em>格式说明符,fscanf
将简单地将 制表符
用作前导空格或遇到匹配失败 或 输入失败。
继续评论,为了根据可能分隔空字段的分隔符进行标记化,您需要使用 strsep
,因为 strtok
会将连续的分隔符视为一个分隔符。
虽然您的字符串有点不清楚 tabs
的位置,但使用 strsep
标记化的简短示例如下所示。请注意,strsep
将指向指针的指针作为其第一个参数,例如
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void) {
int n = 0;
const char *delim = "\t\n";
char *s = strdup ("usrid\tUser Id 0\t15\tstring\td\tk\ty\ty\t\t\t0\t0"),
*toks = s, /* tokenize with separate pointer to preserve s */
*p;
while ((p = strsep (&toks, delim)))
printf ("token[%2d]: '%s'\n", n++ + 1, p);
free (s);
}
(注意因为strsep
会修改字符串指针持有的地址,你需要保留一个指向s
开头的指针所以它可以在不再需要时被释放——谢谢 JL)
示例使用/输出
$ ./bin/strtok_tab
token[ 1]: 'usrid'
token[ 2]: 'User Id 0'
token[ 3]: '15'
token[ 4]: 'string'
token[ 5]: 'd'
token[ 6]: 'k'
token[ 7]: 'y'
token[ 8]: 'y'
token[ 9]: ''
token[10]: ''
token[11]: '0'
token[12]: '0'
检查一下,如果您还有其他问题,请告诉我。
关于c - 将连续的制表符读取为空字段 fscanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53494091/