sscanf阅读错误的值

时间:2015-11-27 07:28:16

标签: c scanf

C的新手,我试图解析文件中的输入。我在获取操作和地址字段时没有问题,但是我得到了大小字段的值“32767”。

以下是导致问题的代码:

#include <stdio.h>
#include <string.h>

void read_file(char *filename)
{
    // operation field, address field, size field 
    FILE *file = fopen(filename, "r");
    char buff[25];
    char operation;
    long address;
    int size;

    char *cur_trace = fgets(buff, 25, file);

    while (cur_trace) {
        // read indivdual fields of trace
        // if cur_trace[0] == I then ignore line
        if (cur_trace[0] != 'I') {
            sscanf(cur_trace, " %c %lx[^,]%*c%u", &operation, &address, &size);
            printf("operation: %c\n address: %lx\n size: %u\n", operation, address, size);
        }   
        cur_trace = fgets(buff, 25, file);
    }
}

int main(int argc, char const *argv[])
{
    read_file("tester.txt");
    return 0;
}

这是我正在阅读的输入文字。所有以“我”开头的行都被忽略了。

I 0400d7d4,8
 M 0421c7f0,4
 L 04f6b868,8
 S 7ff0005c8,8

2 个答案:

答案 0 :(得分:2)

括号不是格式字符串的通用部分,它是读取字符串的特定scanf格式代码的一部分。它不能作为一种模式放在任何地方,或用于任何其他格式。

顺便说一句,读取十六进制值将停在第一个非十六进制字符处,所以无论如何你都不需要它。只是这样做。

class1a

应该足够了(如果变量的类型是正确的。)

答案 1 :(得分:0)

问题是你的格式字符串没有解析第三个参数&amp; size,因为格式字符串。

32767值只是未初始化的垃圾。

您需要检查sscanf是否返回3,以便考虑所有参数。

相关问题