I`ve been trying to this for quite a while now and after some research I had no success, so my last resort was asking a question. My input looks like this:
1.0.0.0/255.0.0.0/127.0.0.1/1112
1.2.0.0/255.255.0.0/2.4.6.9/1112
1.2.3.0/255.255.255.0/1.2.3.1/111
I need to extract 4 strings from each line, so for exemple the first line would give me
s1 = 1.0.0.0
s2 = 255.0.0.0
s3 = 127.0.0.1
s4 = 1112
Here is what I have tried:
scanf("%s/%s/%s/%s", str1, str2, str3, str4); // This doesn't consume the "/"
scanf("%[^/]s%[^/]s%[^/]s%[^/]s", str1, str2, str3, str4); // This only gets the first string
scanf(""%[^\n]s%*c%s%*c%s%*c%s", str1, str2, str3, str4); // Hera %*c was supposed to consume the "/" and do not store it, it doen't happen tho
How can I get the 4 strings from each input line using a single scanf
inside a while (!feof(fileIn))
? Thank you.
You already got quite close: you missed to consume the delimiter in your second approach:
should do the job.
There are a few issues with the posted code. The scanset directive is
%[]
; there is nos
in this. The format strings using%[^/]s
are attempting to match a literals
in the input. But this will always fail because%[^/]
matches any character except for/
. When a/
is encountered, the match fails and the/
character is left in the input stream. It is this character which must be consumed before continuing on to the next input field.Also, note that
while(!feof(file)){}
is always wrong. Instead, try fetching input by lines usingfgets()
, and parsing withsscanf()
. Thefgets()
function returns a null pointer when end-of-file is reached.Further, you should always specify a maximum width when reading strings with
scanf()
family functions to avoid buffer overflow.Here is an example program:
Sample interaction using sample input from the question: