Computer >> Máy Tính >  >> Lập trình >> lập trình C

Sự cố với scanf () khi có fgets () / get () / scanf () sau nó trong C

Sự cố nói rằng điều gì sẽ hoạt động hoặc đầu ra nếu scanf được theo sau bởi fgets () / get () / scanf ().

fgets () / get () theo sau là scanf ()

Ví dụ

#include<stdio.h>
int main() {
   int x;
   char str[100];
   scanf("%d", &x);
   fgets(str, 100, stdin);
   printf("x = %d, str = %s", x, str);
   return 0;
}

Đầu ra

Input:
30
String
Output:
x = 30, str =

Giải thích

fgets () và get () được sử dụng để lấy đầu vào chuỗi từ người dùng tại thời điểm chạy. Tôi ở trên mã khi chúng tôi chạy, nhập giá trị số nguyên thì nó sẽ không nhận giá trị chuỗi vì khi chúng tôi đặt dòng mới sau giá trị số nguyên, thì fgets () hoặc get () sẽ lấy dòng mới là đầu vào thay vì đầu vào mong muốn là “Chuỗi” .

scanf () theo sau là scanf ()

Để liên tục nhận được scanf () theo sau bởi scanf (), chúng ta có thể sử dụng một vòng lặp.

Ví dụ

#include<stdio.h>
int main() {
   int a;
   printf("enter q to quit");
   do {
      printf("\nenter a character and q to exit");
      scanf("%c", &a);
      printf("%c\n", a);
   }while (a != ‘q’);
   return 0;
}

Đầu ra

Input:
abq
Output:
enter q to quit
enter a character and q to exita
a
enter a character and q to exit
enter a character and q to exitb
b
enter a character and q to exit
enter a character and q to exitq

Giải thích

Ở đây chúng ta có thể thấy một dòng bổ sung 'nhập một ký tự và q để thoát' sau một dòng mới bổ sung, điều này là do mỗi lần scanf () để lại một ký tự dòng mới trong bộ đệm được đọc bởi anh ấy tiếp theo scanf () theo sau nó . Để giải quyết vấn đề này bằng cách sử dụng ‘\ n’ với mã định kiểu trong scanf () như scanf (“% c \ n”); hoặc tùy chọn khác là chúng ta có thể sử dụng thêm getchar () hoặc scanf () để đọc thêm dòng mới.