c - 在 C 中解析一行以获取字符和两位数字

标签 c parsing

我有一个输入文件,其中包含以下行:

e 45

我需要一种方法将数字“45”设置为名为 value 的 int 变量。 我尝试过这样做

sscanf(inputfile, " %d", &value);

但值(value)没有改变。 我使用的功能错误吗?

最佳答案

您的使用:

sscanf(inputfile, " %d", &value);

有两点是错误的。首先,sscanf 不会从文件流中读取(大概是 inputfile 引用的),sscanf 的原型(prototype)是:

int sscanf(const char *str, const char *format, ...);

其中第一个参数是 const char * ,它解析缓冲区中的信息(您很可能会通过调用 fgets 来填充缓冲区以从文件中读取信息)

其次,对于字符串 "e 45",尝试使用 "%d" 进行解析会导致匹配失败,因为当"%d" 转换说明符遇到非数字,转换失败,从输入缓冲区提取字符停止并且调用失败。

相反,您需要先删除 "45" 之前的所有非数字字符,然后再尝试使用 "%d" 进行解析。您可以使用否定的字符类赋值抑制运算符(例如'*')和"%*[^ 0-9]%d" 这会导致 sscanf 跳过前导空格(这是不需要的),并将读取并丢弃所有非数字(使得跳过前导空格带有多余的 ' ')和 "%*[^0-9]" ('^' 抑扬符导致否定匹配 "[...]" 中的字符),最后用 "%d" 解析整数值。

一个简短的例子是:

#include <stdio.h>

int main (void) {

    char *s = "e 45";
    int n;

    if (sscanf (s, " %*[^0-9]%d", &n) != 1) {
        fputs ("error: invalid format.\n", stderr);
        return 1;
    }

    printf ("n: %d\n", n);

    return 0;
}

(注意:始终,始终检查任何 scanf 函数的返回)

示例使用/输出

$ ./bin/sscanfn
n: 45

仔细检查一下,如果您还有其他问题,请告诉我。

关于c - 在 C 中解析一行以获取字符和两位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53551154/

相关文章:

c - 结构尺寸

c - Stack Smashing 尝试给出段错误

c - 为什么 isnormal() 说一个值是正常的,而实际上不是?

c - 将字符串设置为C中的子字符串

c - 一个好的c语言解析器?

python - 使用 Python 对字符串中的文本进行解析和分组

python - Pandas:如何从 excel 文件中读取 DataFrame,其中多行有时由换行符 (\n) 分隔

c - c中的值如何存储在不同的数据类型中

c - 将两个字符从字符串移动到另一个字符串会出错

java - 如何在Java中解析JSON