sscanf 读入了错误的值

sscanf reading in wrong values

对 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' 开头的行都将被忽略。

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

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

顺便说一句,读取十六进制值将在第一个非十六进制字符处停止,因此您无论如何都不需要它。只是做例如

sscanf(cur_trace, " %c %lx,%u", &operation, &address, &size);

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

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

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

您需要检查 sscanf returns 3 以便考虑所有参数。