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 以便考虑所有参数。
对 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 以便考虑所有参数。