Nhập và Xuất trong C 71
i 6 Nhập và Xut trong C
Mục tiêu:
Kết thúc bài học này, bạn có thể:
Hiểu các hàm nhập xuất định dạng scanf() và printf()
S dng c hàm nhập xuất ký tự getchar() và putchar().
Giới thiệu
Trong bất k ngôn ngữ lập trình nào, việc nhập giá trị cho các biến và in cng ra sau khi xử lý có th
được làm theo hai cách:
1. Thông qua phương tiện nhập/xuất chuẩn (I / O).
2. Thông qua những tập tin.
Trong phần này ta sẽ nói về chức năng nhập và xuất cơ bản. Nhập và xuất (I/O) luôn là các thành phần
quan trọng của bất kỳ chương trình nào. Ðtạo nh hữu ích, chương trình ca bạn cần khnăng
nhập dữ liu vào và hiển thị lại những kết quả của nó.
Trong C, thư vin chuẩn cung cấp những thủ tục cho việc nhập và xut. Thư vin chuẩn có những hàm
qun c thao c nhập/xuất ng như các thao c tn t và chuỗi. Trong bài học này, tất cả
những hàm nhập dùng để đọc dữ liệu vào t thiết bị nhập chuẩn và tất cả những hàm xuất dùng đ viết
kết quả ra thiết bị xuất chuẩn. Thiết bị nhập chuẩn thông thưng là bàn phím. Thiết bị xuất chun
thông thường là màn hình (console). Nhp và xuất ra có thể được định ng đến tập tin hay t tập tin
thay vì thiết bị chun. Những tập tin có thể được lưu trên đĩa hay trên bất cứ thiết bị lưu trữ nào khác.
D liệu đu ra cũng có thể được gửi đến máy in.
6.1 Tp tin tiêu đề <stdio.h>
Trong các ví d trước, ta đã tng viết dòng mã sau:
#include <stdio.h>
Ðây là lệnh tiền xử (preprocessor command). Trong C chuẩn, hiệu # nên đặt ti cột đầu
tiên. stdio.h mt tập tin và được gọi là tập tin tu đ (header). chứa các macro cho nhiều
hàm nhp và xuất đưc dùng trong C. Hàm printf(), scanf(), putchar() và getchar() được thiết kế theo
cách gi các macro trong tập tin stdio.h để thực thi các công việc tương ứng.
6.2 Nhập và xuất trong C (Input and Output)
Thư viện chuẩn trong C cung cấp hai hàm đ thực hiện các yêu cầu nhập và xuất có định dạng. Chúng
là:
printf() Hàm xuất có định dạng.
scanf() Hàm nhập có định dạng.
Những hàm này gi là những hàm được định dạng vì chúng th đọc và in dliệu ra theo các định
dạng khác nhau được điều khiển bởi người dùng. Bộ định dng qui định dạng thức mà theo đó giá
trcủa biến sẽ được nhập vào và in ra.
72 Lập trình cơ bản C
6.2.1 printf()
Chúng ta đã quen thuộc với hàm y qua các phần trước. đây, chúng ta sẽ xem chúng chi tiết hơn.
Hàm printf() được dùng đhiển thị dữ liệu trên thiết bxuất chuẩn console (màn hình). Dng mẫu
chung của hàm này như sau:
printf(“control string”, argument list);
Danh ch tham số (argument list) bao gồm c hằng, biến, biểu thức hay hàm và được phân cách bởi
dấu phẩy. Cần phải có một lệnh định dạng nằm trong chuỗi điều khiển (control string) cho mỗi
tham strong danh sách. Những lệnh định dạng phải tương ứng với danh sách c tham s v s
lượng, kiểu dữ liệu và th tự. Chuỗi điều khiển phải luôn đưc đặt bên trong cặp dấu nháy kép, đây
là dấu phânch (delimiters). Chuỗi điều khiển chứa một hay nhiều hơn ba thành phần dưới đây :
Ký tvăn bản (Text characters) – Bao gồm các ký tự có th in ra được và sẽ được in giống như
ta nhìn thy. c khoảng trắng thường đưc dùng trong việc phân chia các trường (field) đưc
xut ra.
Lệnh định dạng - Định nghĩa cách thức các mục d liệu trong danh ch tham ssđược hiển
thị. Một lệnh định dạng bắt đầu với một ký hiệu % và theo sau là một mã định dạng tương ứng cho
mục dliệu. Dấu % được dùng trong hàm printf() đ chra các đặc tả chuyển đi. Các lệnh định
dạng và các mục dữ liệu tương thích nhau theo thứ tự và kiu từ trái sang phải. Một mã định dạng
thì cần thiết cho mọi mục dữ liệu cần in ra.
Các ký tự không in được – Bao gm phím tab, dấu khoảng trắng và dấu xuống dòng.
Mỗi lnh định dạng gồm một hay nhiều mã định dạng. Một mã định dạng bao gồm hiệu % mt
b định kiểu. Bảng 6.1 liệt kê các định dạng khác nhau được hỗ trợ bởi câu lệnh printf():
Ðịnh dạng printf() scanf()
Ký tự đơn (Single Character) %c %c
Chui (String) %s %s
Snguyên có dấu (Signed decimal integer) %d %d
Số thập phân có dấu chấm động (Floating point) %f %f hoc %e
Số thập phân có dấu chấm động - Biểu diễn phần thập phân %lf %lf
Số thập phân có dấu chấm động - Biểu diễn dạng số %e %f hoc %e
Số thập phân có dấu chấm động (%f hoc %e, con số nào ít hơn) %g
Số nguyên không dấu (Unsigned decimal integer) %u %u
Số thập lục phân kng dấu (Dùng “ABCDEF”)
(Unsigned hexadecimal integer)
%x %x
Số bát phân không du (Unsigned octal integer) %o %o
Bảng 6.1: Mã định dạng trong printf ()
Trong bng trên, c, d, f, lf, e, g, u, s, ox là b định kiểu.
Các quy ước in cho các mã định dạng khác nhau được tổng kết trong Bảng 6.2:
Mã định dạng Quy ước in ấn
%d Các con số trong số nguyên.
Nhập và Xuất trong C 73
%f Phần snguyên của số sẽ được in nguyên dạng. Phần thập phân s chứa 6
con s. Nếu phần thập phân của con sít n 6 số, sẽ được thêm các s
không (0) bên phải hay gọi là làm tròn phía bên phi.
%e Một con số bên trái dấu chấm thập phân và 6 con s bên phải giống như %f.
Bảng 6.2: Quy ước in
Bởi vì các ký hiệu %,\ và được dùng đặc biệt trong chui điều khiển, nếu chúng ta cần in các ký hiệu
này lên màn hình, chúng phải đượcng như trong Bảng 6.3:
\\ In ký t\
\ “ In ký t
%% In ký t%
Bảng 6.3: Các ký tự đặc biệt trong chuỗi điều khiển
Bảng dưới đây đưa ra vài ví dụ sử dụng chuỗi điều khiển và mã định dạng khác nhau.
S Câu lệnh
Chuỗi
điều
khiển
Ni dung mà
chuỗi điều khiển
chứa đựng
Danh
sách
tham s
Giải thích
danh sách
tham s
Hiển thị trên
màn hình
1. printf(“%d”, 300); %d Ch chứa lệnh
định dạng
300 Hằng số 300
2. printf(“%d”, 10+5); %d Ch chứa lệnh
định dạng
10 + 5 Biểu thức 15
3. printf(“Good
Morning Mr. Lee.”);
Good
Morning
Mr. Lee.
Ch là các t
văn bản
Không có
(Nil)
Không có Good Morning
Mr. Lee.
4. int count = 100;
printf(“%d”, count);
%d Ch chứa lệnh
định dạng
Count Biến 100
5. printf(“\nhello”); \nhello Ch là các t
văn bản và ký t
không in được.
Không có Không có Hello
(Trên dòng mới)
6. #define str “Good
Apple”
……..
printf(“%s”, str);
%s Ch chứa lệnh
định dạng
Str Hằng chuỗi
Good Apple
7. ……..
int count,stud_num;
count = 0;
stud_num = 100;
printf(“%d %d\n”,
count, stud_num);
%d %d Ch chứa lệnh
định dạng trình
t thoát ra
count,
stud_num
Hai biến 0, 100
Bảng 6.4 : Chuỗi điều khiển và mã định dạng
Ví d6.1 :
Ðây là một chương trình đơn giản dùng minh họa cho một chuỗi thđược in theo lệnh định dạng.
Chương trình y cũng hin thị một tđơn, số nguyên sthực (a single character, integer, và
float).
#include <stdio.h>
void main()
74 Lập trình cơ bản C
{
int a = 10;
float b = 24.67892345;
char ch = ‘A’;
printf(\nInteger data = %d, a);
printf(\nFloat Data = %f”, b);
printf(\nCharacter = %c”, ch);
printf(\nThis prints the string”);
printf(%s”, \nThis also prints a string”);
}
Kết quchương trình như sau:
Integer data = 10
Float Data = 24.678923
Character = A
This prints the string
This also prints a string
B t (Modifier) cho các lệnh định dng trong printf()
Các lệnh đnh dng th có b t (modifier), để thay đi các đặc t chuyn đi gc. Sau đây các
b t được chp nhn trong câu lnh printf(). Nếu nhiu b t được dùng thì chúng tuân theo trình
t sau :
B t ‘-‘
D liu s được canh trái bên trong không gian dành cho , chúng sđưc in bắt đầu t v trí ngoài
cùng bên trái.
B từ xác định độ rng
Chúng có th được ng vi kiu: float, double hay char array (chui-string). B tc định độ rng
là mt số nguyên xác định độ rng nh nht của trường d liu. Các d liu có đ rng nh hơn s cho
kết qu canh phải trong trường d liu. Các d liệu cóch thước lớn hơn sđược in bng cách dùng
thêm nhng vị trí cho đủ yêu cu.Ví d, %10f lệnh định dng cho các mc d liu kiu s thc vi
độ rộng trường d liu thp nht là 10.
B từ xác định độ chính xác
Chúng có thể đưc dùng vi kiu float, double hay mng ký t (char array, string). B từ xác định đ
rộng chính xác được viết dưới dng .m vi m là mt s nguyên. Nếu s dng vi kiu float double,
chui s ch ra s con s tối đa có th được in ra phía bên phi du chm thp phân.
Nếu phn phân s ca các mc d liu kiu float hay double vượt quá độ rng con s ch trong b
t, thì sđó sẽ được làm tròn. Nếu chiu dài chuỗi vượt quá chiu dài chđịnh thì chui s đưc ct
b phần ra phía cui. Mt i s không (0) s được thêm vào nếu s con s thc s trong mt
mc d liệu ít hơn được ch định trong b t. Tương t, các khong trng sẽ được thêm vào cho chui
ký t. d, %10.3f là lnh đnh dng cho mc d liu kiu float, với đ rng ti thiểu cho trưng d
liu là 10 và 3 v trí sau phn thp phân.
Nhập và Xuất trong C 75
B t ‘0’
Theo mặc định, vic thêm vào một trường được thc hin vi các khong trng. Nếu ni dùng
mun thêm vào trường vi s không (0), b t này phi đưc dùng.
B t ‘l’
B t này có th được dùng để hin th số nguyên như: long int hay mt tham s kiu double. Mã định
dạng tương ng cho nó %ld.
B t ‘h’
B từ này được dùng để hin th kiu short integer. Mã định dạng tương ng cho nó %hd.
B t ‘*’
B ty đưc dùng khi người ng không mun chtrước đ rng ca trường muốn chương
trình xác định nó. Nhưng khi đi với b t này, mt tham số được yêu cu phi chỉ ra đ rộng trường c
th.
Chúng ta hãy xem nhng b t y hoạt động thế nào. Ðầu tiên, chúng ta xem xét tác động ca nó đi
vi nhng d liu kiu s nguyên.
Ví d 6.2:
/* Chương trình này trình bày cách dùng b t trong printf() */
#include <stdio.h>
void main()
{
printf(“The number 555 in various forms:\n”);
printf(“Without any modifier: \n”);
printf(“[%d]\n”, 555);
printf(“With - modifier:\n”);
printf(“[%-d]\n”, 555);
printf(“With digit string 10 as modifier:\n”);
printf(“[%10d]\n, 555);
printf(“With 0 as modifier: \n);
printf(“[%0d]\n”, 555);
printf(“With 0 and digit string 10 as modifiers:\n”);
printf(“[%010d]\n”, 555);
printf(“With -, 0 and digit string 10 as modifiers:\n);
printf(“[%-010d]\n”, 555);
}
Kết quả như dưới đây:
The number 555 in various forms: