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

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

1. Chuỗi định dạng dữ liệu

  • %c : Ký tự đơn
  • %s : Chuỗi
  • %d : Số nguyên hệ 10 có dấu
  • %f : Số chấm động (VD 5.54 khi in sẽ ra 5.540000)
  • %e : Số chấm động (ký hiệu có số mũ)
  • %g : Số chấm động (VD 5.54 khi in sẽ in ra 5.54)
  • %x : Số nguyên hex không dấu (hệ 16)
  • %o : Số nguyên bát phân không dấu (hệ 8)
  • l : Tiền tố dùng kèm với %d, %x, %o để chỉ số nguyên dài (ví dụ%ld)

2. Xuất dữ liệu dùng printf

Chúng ta sử dụng hàm printf để xuất dữ liệu ra màn hình console (từ print có nghĩa là in). Kết hợp với các chuỗi định dạng ở trên, chúng ta xét một ví dụ đơn giản sau.

Ví dụ 1:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main()
{
    int a = 12;
    float b = 13.5;
    char c = 'Q';
    long d = 3454;
    char* s = "nguyenvanquan7826"; // khai bao kieu chuoi
    printf("Vi du ve su dung lenh printf\n");
    printf("Tong cua %d va %f la %f \n", a, b, a+b);
    printf("Tich cua %d va %ld la %ld \n", a, d, a*d);
    printf("Ky tu c la: %c \n", c);
    printf("Chuoi s la: %s \n", s);
    printf("Dinh dang so mu cua b la %e \n", b);
    printf("So he 16 va he 8 cua %d la %x va %o \n", a, a, a);
    printf("Ma ASCII cua %c la %d", c, c);
    return 0;
}

Ở trên mình có dùng một số ký tự điều khiển (\n – xuống dòng) đã được đề cập ở bài trước, các bạn có thể xem lại nếu không nhớ.

Chuỗi định dạng được đặt trong ngoặc kép: “”. Tương ứng với mỗi định dạng là một biến có kiểu tương ứng, nếu khác kiểu sẽ dẫn đến sai sót.

Các bạn cũng chú ý là đối với số nguyên và ký tự có sự qua lại với nhau thông qua mã ASCII nên chúng ta có thể in mã của ký tự bằng định dạng %d và cũng có thể in ký tự có mã là số nào đó thông qua định dạng %c. Tuy nhiên bản chất của biến không thay đổi. Ở Vd trên câu lệnh in mã ASCII của c sẽ cho số nguyên nhưng bản chất c vẫn là một biến kiểu char.

Ví dụ 2:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
#include <stdio.h>
int main()
{
    int a = 12;
    float b = 13.5;
    char c = 'Q';
    long d = 3454;
    char s[] = "nguyenvanquan7826"; // khai bao kieu chuoi
    printf("%6d %5.3f %.3f \n", a, b, a+b);
    printf("%-5d %5ld %5ld \n", a, d, a*d);
    printf("%5c \n", c);
    printf("%30s \n", s);
    return 0;
}

Các bạn thấy ví dụ này chúng ta dùng các định dạng %d, %f nhưng lại chèn thêm các số ở giữa thành %6d, %5.3f. Ý nghĩa của chúng như sau:

  • %5c : Xuất ký tự có bề rộng 5
  • %5d : Số nguyên có bề rộng 5
  • %20s : Xuất chuỗi có bề rộng 20
  • %5.3f : Xuất số thực có bề rộng 5 trong đó có 3 số sau dấu phẩy
  • %-5d : Số nguyên có bề rộng 5 nhưng căn lề trái

Các bạn chạy chương trình, xem kết quả để thấy rõ hơn. Trong TH nếu bề rộng của chúng ta có kích thước bé hơn độ dài của số thì sao? Ví dụ chúng ta có số int a = 1234 nhưng chỉ in là %2d, rõ ràng dành 2 phần trống là ít hơn số a có 4 chữ số nhưng kết quả là số vẫn được in đầy đủ. Các bạn có thể thử.

Ví dụ 3:

Đặt bài toán là giả sử chúng ta có các biến thể hiện ngày tháng năm sinh bất kỳ (ví dụ ngay = 12, thang = 8, nam = 1992). Hãy in ra theo định dạng là dd/mm/yyyy. Nghĩa là chúng ta phải in ra kết quả 12/08/1992.

01
02
03
04
05
06
07
08
09
10
11
12
#include <stdio.h>
int main()
{
    int ngay = 12;
    int thang = 8;
    int nam = 1992;
    printf("KQ: %02d/%02d/%04d\n", ngay, thang, nam);
    return 0;
}

Ở trên, các bạn chú ý chúng ta dùng %02d nghĩa là sao? Nhĩa là số in ra sẽ có 2 chữ số, nếu ban đầu số có ít hơn 2 thì sẽ thêm số 0 đằng trước để đủ 2 chữ số. Ví dụ số 8 sẽ thành 08. Nếu dùng %05d thì sẽ là 00008.

3. Nhập dữ liệu dùng scanf

Ví dụ 1:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
#include <stdio.h>
int main()
{
    int a;
    float b;
    printf("Nhap so nguyen a = ");
    scanf("%d", &a);
    printf("Nhap so thuc b = ");
    scanf("%f", &b);
    printf("a = %d \t b = %.3f", a, b);
    return 0;
}

Việc sử dụng lệnh scanf kết hợp với chuỗi định dạng để nhập dữ liệu sẽ tương tự như khi xuất dữ liệu bằng lệnh printf.

Chú ý đừng quên ký tự & trước mỗi biến khi nhập. Nếu không sẽ sai.

Ví dụ 2:

01
02
03
04
05
06
07
08
09
10
11
12
13
/* Tinh dien tich hinh chu nhat */
#include <stdio.h>
int main()
{
    int a, b;
    printf("Nhap chieu dai, chieu rong: \n");
    scanf("%d%d", &a, &b);
    printf("Dien tich HCN: %d\n", a * b);
    return 0;
}

Ở ví dụ trên, các bạn thấy chúng ta có thể dùng 1 lệnh scanf để nhập dữ liệu cho nhiều biến, mỗi biến tương ứng với 1 định dạng nhất định.

4. Nhập chuỗi trong C

4.1 Lỗi khi nhập chuỗi bằng scanf

Nếu các bạn dùng hàm scanf để nhập chuỗi thì bạn sẽ thấy rằng không thể nhập được chuỗi có dấu cách hoặc nếu trước đó bạn nhập số thì sau đó không nhập được chuỗi nữa. Nếu không tin bạn có thể thử chạy với chương trình sau:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
#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? ");
    scanf("%s", ten); // nhap chuoi khong can dau &
    printf("Ban bao nhieu tuoi roi? ");
    scanf("%d", &tuoi);
    printf("Nguoi yeu cua ban ten la gi? ");
    scanf("%s", tenNguoiYeu);
    printf("\n====\n");
    printf("Ten: %s \nTuoi:%d \nNY:%s \n", ten, tuoi, tenNguoiYeu);
    return 0;
}