Scott Jackson
Scott Jackson

Reputation: 3

sscanf reading in wrong values

Fairly new to C and am trying to parse input from a file. I have no problems getting the operation and address fields but I am getting the value "32767" for the size field.

Here is the code causing issues:

#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;
}

and here is the input text I am reading. All lines beginning with 'I' are being ignored.

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

Upvotes: 0

Views: 1671

Answers (2)

Anders
Anders

Reputation: 2316

The problem is that your format string is not parsing the 3rd argument &size, because of the format string.

The 32767 value is just uninitialized junk.

You need to check that sscanf returns 3 so that all arguments are accounted for.

Upvotes: 0

Some programmer dude
Some programmer dude

Reputation: 409176

The brackets is not a generic part of the format string, it's part of a specific scanf format code to read strings. It can't just be placed anywhere as a sort of pattern, or used for any other format.

And by the way, reading hexadecimal values will stop at the first non-hexadecimal character, so you don't need it anyway. Just doing e.g.

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

should be enough (if the types of the variables are correct).

Upvotes: 2

Related Questions