c - 将连续的制表符读取为空字段 fscanf

标签 c

我有一个文件,其中某些字段由制表符分隔。一行中始终有 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/

相关文章:

c - 如何在C中打开一个进程?

c - strcmp 的段错误(列表)

python - 从 Python 运行 C 程序,然后捕获输出

将整数转换并存储为 char 指针

c - 在 C 中创建大小在运行时决定的数组时出错

c - 如何使用 write() 或 fwrite() 将数据写入终端(stdout)?

C 中无符号长二维数组转换为无符号一维字符数组

c - 使用 scanf 读取 double 的段错误

objective-c - OSC 库在 iOS6 上使用 ARC

Curl SMTP TLS 错误