How to read string separated by / with scanf

后端 未结 2 893
青春惊慌失措
青春惊慌失措 2020-12-20 01:06

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         


        
相关标签:
2条回答
  • 2020-12-20 01:48

    You already got quite close: you missed to consume the delimiter in your second approach:

    scanf("%[^/]/%[^/]/%[^/]/%[^/]", str1, str2, str3, str4);
    

    should do the job.

    0 讨论(0)
  • 2020-12-20 01:50

    There are a few issues with the posted code. The scanset directive is %[]; there is no s in this. The format strings using %[^/]s are attempting to match a literal s 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 using fgets(), and parsing with sscanf(). The fgets() 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:

    #include <stdio.h>
    
    int main(void)
    {
        char input[4096];
        char str1[100];
        char str2[100];
        char str3[100];
        char str4[100];
    
        while (fgets(input, sizeof input, stdin)) {
            sscanf(input, " %99[^/]/ %99[^/]/ %99[^/]/ %99[^/]",
                   str1, str2, str3, str4);
    
            puts(str1);
            puts(str2);
            puts(str3);
            puts(str4);
        }
    
        return 0;
    }
    

    Sample interaction using sample input from the question:

    λ> ./a.out < readstring_test.txt 
    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
    
    0 讨论(0)
提交回复
热议问题