Page 104 - C-Language
P. 104

}


        is executed with this input


         42
         life


        the output will be 42 "" instead of expected 42 "life".


        This is because a newline character after 42 is not consumed in the call of scanf() and it is
        consumed by fgets() before it reads life. Then, fgets() stop reading before reading life.

        To avoid this problem, one way that is useful when the maximum length of a line is known -- when
        solving problems in online judge syste, for example -- is avoiding using scanf() directly and
        reading all lines via fgets(). You can use sscanf() to parse the lines read.


         #include <stdio.h>
         #include <string.h>

         int main(void) {
             int num = 0;
             char line_buffer[128] = "", str[128], *lf;

             fgets(line_buffer, sizeof(line_buffer), stdin);
             sscanf(line_buffer, "%d", &num);
             fgets(str, sizeof(str), stdin);

             if ((lf = strchr(str, '\n')) != NULL) *lf = '\0';
             printf("%d \"%s\"\n", num, str);
             return 0;
         }


        Another way is to read until you hit a newline character after using scanf() and before using
        fgets().


         #include <stdio.h>
         #include <string.h>

         int main(void) {
             int num = 0;
             char str[128], *lf;
             int c;

             scanf("%d", &num);
             while ((c = getchar()) != '\n' && c != EOF);
             fgets(str, sizeof(str), stdin);

             if ((lf = strchr(str, '\n')) != NULL) *lf = '\0';
             printf("%d \"%s\"\n", num, str);
             return 0;
         }



        Adding a semicolon to a #define





        https://riptutorial.com/                                                                               80
   99   100   101   102   103   104   105   106   107   108   109