Home / Lập trình / C / Bài 3 – Nhập xuất trong c (tt)

Bài 3 – Nhập xuất trong c (tt)

4.2 Hiện tượng trôi lệnh

Hiện tượng như trên được gọi là hiện tượng trôi lệnh. Nếu bây giờ bạn thực hiện cho nhập số trước và chuỗi ngay sau đó thì hiện tượng này cũng xảy ra vì scanf chỉ đọc số theo đúng định dạng mà không đọc được phím enter khi bạn nhấn lúc nhập xong số (enter là ký tự hoặc cũng có thể coi là chuỗi), nó được lưu vào bộ đệm và khi đọc giá trị nhập cho chuỗi nó tìm trong bộ đệm thấy ký tự enter là kiểu chuỗi nên nó gán luôn cho chuỗi đó.

Để nhập được chuỗi có khoảng trắng (dấu cách) chúng ta sử dụng hàm gets.

Để không bị trôi lệnh khi nhập số trước và chuỗi sau ta cần xóa bộ đệm bàn phím bằng lệnh fflush(stdin); ngay sau khi nhập số.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
int main()
{
    int tuoi = 0;
    // khai bao chuoi co toi da 30 ky tu
    char ten[30], tenNguoiYeu[30];
    printf("Ho va ten cua ban ten la gi? ");
    gets(ten); // nhap chuoi khong can dau &
    printf("Ban bao nhieu tuoi roi? ");
    scanf("%d", &tuoi);
    fflush(stdin);
    printf("Nguoi yeu cua ban ten la gi? ");
    gets(tenNguoiYeu);
    printf("\n====\n");
    printf("Ten: %s \nTuoi:%d \nNY:%s \n", ten, tuoi, tenNguoiYeu);
    return 0;
}

Nếu bạn dùng Linux thì fflush(stdin); sẽ không hoạt động, bạn có thể khắc phục bằng cách nhập vào 1 chuỗi tạm ngay sau khi nhập số. Việc nhập chuỗi tạm này chỉ để xóa bỏ các ký tự, chuỗi ký tự thừa có trong bộ đệm như sau (cách này cũng dùng được khi bạn làm trên windows).

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
int main()
{
    int tuoi = 0;
    // khai bao chuoi co toi da 30 ky tu
    char ten[30], tenNguoiYeu[30], temp[255];
    printf("Ho va ten cua ban ten la gi? ");
    gets(ten); // nhap chuoi khong can dau &
    printf("Ban bao nhieu tuoi roi? ");
    scanf("%d", &tuoi);
    //fflush(stdin);
    gets(temp);
    printf("Nguoi yeu cua ban ten la gi? ");
    gets(tenNguoiYeu);
    printf("\n====\n");
    printf("Ten: %s \nTuoi:%d \nNY:%s \n", ten, tuoi, tenNguoiYeu);
    return 0;
}

5. Giải thích một chút về printf, scanf và stdio.h

5.1 Chữ f trong printf và scanf

Như các bạn đã biết print nghĩa là in, scanquét hay ta gọi trong này là để nhập. Vậy tại sao chúng lại có chữ f đằng sau để thành printfscanf ?

Chữ f này có nghĩa là format (định dạng). Như các bạn thấy chúng ta nhập hoặc xuất các giá trị của các biến đều có định dạng % gì đó ví dụ %d là số nguyên, %f là số thực,… và chữ f này chính là có ý nghĩa như thế.

5.2 Thư viện stdio.h ?

Trong tất cả các chương trình từ trước tới giờ, chúng ta luôn có #include <stdio.h>, vậy nó là gì?

#include nghĩa là bao gồm tức là chương trình của chúng ta sẽ khai báo sử dụng một cái gì đó, mà ở đây là sử dụng thư viện stdio.h

Vậy stdio.h là gì? std viết tắt của standard , i viết tắt của input, o viết tắt của output, h viết tắt của header (header – đầu, trên đầu – vì nó được khai báo ở trên đầu của các chương trình). Vậy nó có nghĩa là standard input output – nhập xuất chuẩn. Chúng ta hiểu nó là thư viện phục vụ cho việc nhập xuất chuẩn của chương trình. Nhập xuất chuẩn chính là nhập từ bàn phím và xuất ra màn hình. Có còn rất nhiều nguồn nhập xuất như nhập từ file, nhập từ con trỏ chuột,… xuất ra máy in, xuất ra file,… nhưng họ coi bàn phím và màn hình là hệ thống nhập xuất chuẩn.