Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Vấn đề với scanf() khi có fgets()/gets()/scanf() sau nó trong C


Vấn đề: hành vi của chương trình khi scanf() được theo sau bởi fgets()/gets()/scanf().

fgets()/gets() sau 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;
}

Kết quả

Input: 30 [Enter]
String [Enter]
Output: x = 30, str =

Giải thích: fgets() và gets() đọc chuỗi từ stdin. Khi nhập số rồi Enter, ký tự newline (\n) còn lại trong buffer. fgets() đọc ngay \n đó thay vì chuỗi mong muốn.

scanf() sau scanf()

Để lặp lại scanf(), dùng vòng lặp.

Ví dụ

#include <stdio.h>

int main() {
    int a;
    printf("Nhap 'q' de thoat\n");
    do {
        printf("\nNhap ky tu (q de thoat): ");
        scanf("%c", &a);
        printf("%c\n", a);
    } while (a != 'q');
    return 0;
}

Kết quả

Input: a b q
Output:
Nhap 'q' de thoat
Nhap ky tu (q de thoat): a
a
Nhap ky tu (q de thoat):
Nhap ky tu (q de thoat): b
b
Nhap ky tu (q de thoat):
Nhap ky tu (q de thoat): q

Giải thích: Mỗi scanf() để lại \n trong buffer, scanf() tiếp theo đọc \n đó. Cách khắc phục: dùng scanf(" %c", &a) (có khoảng trắng trước %c) hoặc dùng getchar() đọc bỏ \n thừa.