Tham khảo tài liệu ''nhập và xuất trong c'', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Nguyen Dinh Phuong Bài Nhập Xuất C Mục tiêu: Kết thúc học này, bạn có thể: Hiểu hàm nhập xuất có định dạng scanf() printf() Sử dụng hàm nhập xuất ký tự getchar() putchar() Giới thiệu Trong ngôn ngữ lập trình nào, việc nhập giá trị cho biến in chúng sau xử lý làm theo hai cách: Thông qua phương tiện nhập/xuất chuẩn (I / O) Thông qua tập tin Trong phần ta nói chức nhập xuất Nhập xuất (I/O) thành phần quan trọng chương trình Ðể tạo tính hữu ích, chương trình bạn cần có khả nhập liệu vào hiển thị lại kết Trong C, thư viện chuẩn cung cấp thủ tục cho việc nhập xuất Thư viện chuẩn có hàm quản lý thao tác nhập/xuất thao tác ký tự chuỗi Trong học này, tất hàm nhập dùng để đọc liệu vào từ thiết bị nhập chuẩn tất hàm xuất dùng để viết kết thiết bị xuất chuẩn Thiết bị nhập chuẩn thông thường bàn phím Thiết bị xuất chuẩn thơng thường hình (console) Nhập xuất định hướng đến tập tin hay từ tập tin thay thiết bị chuẩn Những tập tin lưu đĩa hay thiết bị lưu trữ khác Dữ liệu đầu gửi đến máy in 6.1 Tập tin tiêu đề Trong ví dụ trước, ta viết dịng mã sau: #include Ðây lệnh tiền xử lý (preprocessor command) Trong C chuẩn, ký hiệu # nên đặt cột stdio.h tập tin gọi tập tin tiêu đề ( header) Nó chứa macro cho nhiều hàm nhập xuất dùng C Hàm printf(), scanf(), putchar() getchar() thiết kế theo cách gọi macro tập tin stdio.h để thực thi công việc tương ứng 6.2 Nhập xuất C (Input and Output) Thư viện chuẩn C cung cấp hai hàm để thực yêu cầu nhập 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 gọi hàm định dạng chúng đọc in liệu theo định dạng khác điều khiển người dùng Bộ định dạng qui định dạng thức mà theo giá trị biến nhập vào in Smith.N - Nhập Xuất C Ma$ter.P Studio E-book - 71 King.P 6.2.1 printf() Chúng ta quen thuộc với hàm qua phần trước Ở đây, xem chúng chi tiết Hàm printf() dùng để hiển thị liệu thiết bị xuất chuẩn – console (màn hình) Dạng mẫu chung hàm sau: printf(“control string”, argument list); Danh sách tham số (argument list) bao gồm hằng, biến, biểu thức hay hàm phân cách dấu phẩy Cần phải có lệnh định dạng nằm chuỗi điều khiển ( control string) cho tham số danh sách Những lệnh định dạng phải tương ứng với danh sách tham số số lượng, kiểu liệu thứ tự Chuỗi điều khiển phải đặt bên cặp dấu nháy kép“”, dấu phân cách (delimiters) Chuỗi điều khiển chứa hay nhiều ba thành phần : Ký tự văn (Text characters) – Bao gồm ký tự in in giống ta nhìn thấy Các khoảng trắng thường dùng việc phân chia trường (field) xuất Lệnh định dạng - Định nghĩa cách thức mục liệu danh sách tham số hiển thị Một lệnh định dạng bắt đầu với ký hiệu % theo sau mã định dạng tương ứng cho mục liệu Dấu % dùng hàm printf() để đặc tả chuyển đổi Các lệnh định dạng mục liệu tương thích theo thứ tự kiểu từ trái sang phải Một mã định dạng cần thiết cho mục liệu cần in Các ký tự khơng in – Bao gồm phím tab, dấu khoảng trắng dấu xuống dòng Mỗi lệnh định dạng gồm hay nhiều mã định dạng Một mã định dạng bao gồm ký hiệu % định kiểu Bảng 6.1 liệt kê mã định dạng khác hỗ trợ câu lệnh printf(): Ðịnh dạng Ký tự đơn (Single Character) Chuỗi (String) Số nguyên có dấu (Signed decimal integer) Số thập phân có dấu chấm động (Floating point) Số thập phân có dấu chấm động - Biểu diễn phần thập phân Số thập phân có dấu chấm động - Biểu diễn dạng số mũ Số thập phân có dấu chấm động (%f %e, số hơn) Số ngun khơng dấu (Unsigned decimal integer) Số thập lục phân không dấu (Dùng “ABCDEF”) (Unsigned hexadecimal integer) Số bát phân không dấu (Unsigned octal integer) printf() %c %s %d %f %lf %e %g %u %x scanf() %c %s %d %f %e %lf %f %e %o %o %u %x Bảng 6.1: Mã định dạng printf () Trong bảng trên, c, d, f, lf, e, g, u, s, o x định kiểu Các quy ước in cho mã định dạng khác tổng kết Bảng 6.2: Mã định dạng %d 72 Quy ước in ấn Các số số nguyên Smith.N - Lập trình C Nguyen Dinh Phuong %f Phần số nguyên số in nguyên dạng Phần thập phân chứa số Nếu phần thập phân số số, thêm số khơng (0) bên phải hay gọi làm trịn phía bên phải Một số bên trái dấu chấm thập phân số bên phải giống %f %e Bảng 6.2: Quy ước in Bởi ký hiệu %,\ “ dùng đặc biệt chuỗi điều khiển, cần in ký hiệu lên hình, chúng phải dùng Bảng 6.3: \\ \“ %% In ký tự \ In ký tự “ In ký tự % Bảng 6.3: Các ký tự đặc biệt chuỗi điều khiển Bảng đưa vài ví dụ sử dụng chuỗi điều khiển mã định dạng khác printf(“%d”, 300); Chuỗi điều khiển %d printf(“%d”, 10+5); %d printf(“Good Morning Mr Lee.”); int count = 100; printf(“%d”, count); printf(“\nhello”); Good Morning Mr Lee %d Số Câu lệnh \nhello #define str “Good %s Apple” …… printf(“%s”, str); …… %d %d int count,stud_num; count = 0; stud_num = 100; printf(“%d %d\n”, count, stud_num); Nội dung mà chuỗi điều khiển chứa đựng Chỉ chứa lệnh định dạng Chỉ chứa lệnh định dạng Chỉ ký tự văn Danh sách tham số 300 Giải thích danh sách tham số Hằng số 300 10 + Biểu thức 15 Không có Khơng có (Nil) Hiển thị hình Good Morning Mr Lee Chỉ chứa lệnh Count định dạng Chỉ ký tự Khơng có văn ký tự khơng in Biến 100 Khơng có Hello (Trên dòng mới) Chỉ chứa định dạng Hằng chuỗi Good Apple Hai biến 0, 100 lệnh Str Chỉ chứa lệnh count, định dạng trình stud_num tự Bảng 6.4 : Chuỗi điều khiển mã định dạng Ví dụ 6.1 : Ðây chương trình đơn giản dùng minh họa cho chuỗi in theo lệnh định dạng Chương trình hiển thị ký tự đơn, số nguyên số thực (a single character, integer, float) #include void main() Smith.N - Nhập Xuất C Ma$ter.P Studio E-book - 73 King.P { 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 chương trình sau: Integer data = 10 Float Data = 24.678923 Character = A This prints the string This also prints a string Bổ từ (Modifier) cho lệnh định dạng printf() Các lệnh định dạng có bổ từ (modifier), để thay đổi đặc tả chuyển đổi gốc Sau bổ từ chấp nhận câu lệnh printf() Nếu có nhiều bổ từ dùng chúng tuân theo trình tự sau : Bổ từ ‘-‘ Dữ liệu canh trái bên khơng gian dành cho nó, chúng in vị trí ngồi bên trái Bổ từ xác định độ rộng Chúng dùng với kiểu: float, double hay char array (chuỗi-string) Bổ từ xác định độ rộng số nguyên xác định độ rộng nhỏ trường liệu Các liệu có độ rộng nhỏ cho kết canh phải trường liệu Các liệu có kích thước lớn in cách dùng thêm vị trí cho đủ yêu cầu.Ví dụ, %10f lệnh định dạng cho mục liệu kiểu số thực với độ rộng trường liệu thấp 10 Bổ từ xác định độ xác Chúng dùng với kiểu float, double hay mảng ký tự (char array, string) Bổ từ xác định độ rộng xác viết dạng m với m số nguyên Nếu sử dụng với kiểu float double, chuỗi số số số tối đa in phía bên phải dấu chấm thập phân Nếu phần phân số mục liệu kiểu float hay double vượt độ rộng số bổ từ, số làm trịn Nếu chiều dài chuỗi vượt chiều dài định chuỗi cắt bỏ phần dư phía cuối Một vài số không (0) thêm vào số số thực mục liệu định bổ từ Tương tự, khoảng trắng thêm vào cho chuỗi ký tự Ví dụ, %10.3f lệnh định dạng cho mục liệu kiểu float, với độ rộng tối thiểu cho trường liệu 10 vị trí sau phần thập phân 74 Smith.N - Lập trình C Nguyen Dinh Phuong Bổ từ ‘0’ Theo mặc định, việc thêm vào trường thực với khoảng trắng Nếu người dùng muốn thêm vào trường với số không (0), bổ từ phải dùng Bổ từ ‘l’ Bổ từ dùng để hiển thị số nguyên như: long int hay tham số kiểu double Mã định dạng tương ứng cho %ld Bổ từ ‘h’ Bổ từ dùng để thị kiểu short integer Mã định dạng tương ứng cho %hd Bổ từ ‘*’ Bổ từ dùng người dùng không muốn trước độ rộng trường mà muốn chương trình xác định Nhưng với bổ từ này, tham số yêu cầu phải độ rộng trường cụ thể Chúng ta xem bổ từ hoạt động Ðầu tiên, xem xét tác động liệu kiểu số nguyên Ví dụ 6.2: /* Chương trình trình bày cách dùng bổ từ printf() */ #include 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 as modifier: \n”); printf(“[%0d]\n”, 555); printf(“With and digit string 10 as modifiers:\n”); printf(“[%010d]\n”, 555); printf(“With -, and digit string 10 as modifiers:\n”); printf(“[%-010d]\n”, 555); } Kết đây: The number 555 in various forms: Smith.N - Nhập Xuất C Ma$ter.P Studio E-book - 75 King.P Without any modifier: [555] With - modifier: [555] With digit string 10 as modifier: [ 555] With as modifier: [555] With and digit string 10 as modifiers: [0000000555] With -, and digit string 10 as modifiers: [555 ] Chúng ta dùng ký hiệu ‘[‘ ‘]’ để nơi trường bắt đầu nơi kết thúc Khi dùng %d mà khơng có bổ từ, thấy dùng cho trường có độ rộng với số nguyên Khi dùng %10d thấy dùng 10 khoảng trắng cho trường số canh lề phải theo mặc định Nếu ta dùng bổ từ –, số canh trái trường Nếu dùng bổ từ 0, thấy số thêm vào thay khoảng trắng Bây xem bổ từ dùng với số thực Ví dụ 6.3: /* Chương trình trình bày cách dùng bổ từ printf() */ #include void main() { printf(“The number 555.55 in various forms:\n”); printf(“In float form without modifiers:\n”); printf(“[%f]\n”, 555.55); printf(“In exponential form without any modifier:\n”); printf(“[%e]\n”, 555.55); printf(“In float form with - modifier:\n”); printf(“[%-f]\n”, 555.55); printf(“In float form with digit string 10.3 as modifier\n”); printf(“[%10.3f]\n”, 555.55); printf(“In float form with as modifier:\n”); printf(“[%0f]\n”, 555.55); printf(“In float form with and digit string 10.3”); printf(“as modifiers:\n”); printf(“[%010.3f]\n”, 555.55); printf(“In float form with -, ”); 76 Smith.N - Lập trình C Nguyen Dinh Phuong printf(“and digit string 10.3 as modifiers:\n”); printf(“[%-010.3f]\n”, 555.55); printf(“In exponential form with 0”); printf(“ and digit string 10.3 as modifiers:\n”); printf(“[%010.3e]\n”, 555.55); printf(“In exponential form with -, 0”); printf(“ and digit string 10.3 as modifiers:\n”); printf(“[%-010.3e]\n\n”, 555.55); } Kết sau: The number 555.55 in various forms: In float form without modifiers: [555.550000] In exponential form without any modifier: [5.555500e+02] In float form with - modifier: [555.550000] In float form with digit string 10.3 as [ modifier 555.550] In float form with as modifier: [555.550000] In float form with and digit string 10.3 as modifiers: [000555.550] In float form with -, and digit string 10.3 as modifiers: [555.550 ] In exponential form with and digit string 10.3 as modifiers: [05.555e+02] In exponential form with -,0 and digit string 10.3 as modifiers: [5.555e+02] Theo mặc định cho %f, thấy có số cho phần thập phân mặc định cho %e số phần nguyên số phần bên phải dấu chấm thập phân Chú ý cách thể Smith.N - Nhập Xuất C Ma$ter.P Studio E-book - 77 King.P số cuối ví dụ trên, số số bên phải dấu chấm thập phân 3, dẫn đến kết khơng làm trịn Bây giờ, xem bổ từ dùng với chuỗi số Chú ý cách mở rộng trường để chứa toàn chuỗi Hơn nữa, ý cách đặc tả độ xác việc giới hạn số ký tự in Ví dụ 6.4: /* Chương trình trình bày cách dùng bổ từ với chuỗi*/ #include void main() { printf(“A string in various forms:\n”); printf(“Without any format command:\n”); printf(“Good day Mr Lee \n”); printf(“With format command but without any modifier:\n”); printf(“[%s]\n”, ”Good day Mr Lee.”); printf(“With digit string as modifier:\n”); printf(“[%4s]\n”, ”Good day Mr Lee.”); printf(“With digit string 19 as modifier: \n”); printf(“[%19s]\n”, ”Good day Mr Lee.”); printf(“With digit string 23 as modifier: \n”); printf(“[%23s]\n”, ”Good day Mr Lee.”); printf(“With digit string 25.4 as modifier: \n”); printf(“[%25.4s]\n”, ”Good day Mr.Lee.”); printf(“With – and digit string 25.4 as modifiers:\n”); printf(“[%-25.4s]\n”, ”Good day Mr.shroff.”); } Kết sau: A string in various forms: Without any format command: Good day Mr Lee With format command but without any modifier: [Good day Mr Lee.] With digit string as modifier: 78 Smith.N - Lập trình C Nguyen Dinh Phuong [Good day Mr Lee.] With digit string 19 as modifier: [ Good day Mr Lee.] With digit string 23 as modifier: [ Good day Mr Lee.] With digit string 25.4 as modifier: [ Good] With - and digit string 25.4 as modifiers: [Good ] Những ký tự ta nhập bàn phím khơng lưu dạng ký tự Thật chúng lưu theo dạng số dạng mã ASCII (Bộ mã chuẩn Mỹ cho việc trao đổi thông tin - American Standard Code for Information Interchange) Các giá trị biến thông dịch dạng ký tự hay số tùy vào kiểu biến Ví dụ sau mơ tả điều này: Ví dụ 6.5: #include void main() { int a = 80; char b= ‘C’; printf(“\nThis is the number stored in ‘a’ %d”,a); printf(“\nThis is a character interpreted from ‘a’ %c”,a); printf(“\nThis is also a character stored in ‘b’ %c”,b); printf(“\nHey! The character of ‘b’ is printed as a number! %d“, b); } Kết đây: This is the number stored in `a’ 80 This is a character interpreted from `a’ P This is also a character stored in `b’ C Hey! The character of `b' is printed as a number!67 Smith.N - Nhập Xuất C Ma$ter.P Studio E-book - 79 King.P Kết mô tả việc dùng đặc tả định dạng việc thông dịch mã ASCII Mặc dù biến a b khai báo biến kiểu int char, chúng in ký tự số nhờ vào việc dùng định dạng khác Ðặc điểm C giúp việc xử lý liệu linh hoạt Khi dùng câu lệnh printf() chuỗi dài 80 ký tự dòng, xuống dòng ta phải ngắt dòng ký hiệu \ trình bày ví dụ đây: Ví dụ 6.6: /* Chương trình trình bày cách dùng chuỗi dài ký tự*/ #include void main() { printf(“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\aaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\aaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\aaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\aaaaaaaaaaaaaaaa aaaaaaaaaaaaa”); } Kết sau: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaa Trong ví dụ trên, chuỗi câu lệnh printf() có 252 ký tự Trong dịng văn chứa 80 ký tự, chuỗi mở rộng thành hàng kết 6.2.2 scanf() Hàm scanf() sử dụng để nhập liệu Khuôn dạng chung hàm scanf() sau: scanf(, ); Ðịnh dạng sử dụng bên câu lệnh printf() sử dụng cú pháp câu lệnh scanf() Những lệnh định dạng, bao gồm bổ từ danh sách tham số bàn luận cho printf() hợp lệ cho scanf(), chúng tuân theo số điểm khác biệt sau: Sự khác danh sách tham số printf() scanf() Hàm printf() dùng tên biến, số, chuỗi biểu thức, scanf() sử dụng trỏ tới biến Một trỏ tới biến mục liệu chứa đựng địa nơi mà biến cất giữ nhớ Những trỏ bàn luận chi tiết chương sau Khi sử dụng scanf() cần tuân theo quy tắc cho danh sách tham số: 80 Smith.N - Lập trình C Nguyen Dinh Phuong Nếu ta muốn nhập giá trị cho biến có kiểu liệu bản, gõ vào tên biến với ký hiệu & trước Khi nhập giá trị cho biến thuộc kiểu liệu dẫn xuất (không phải thuộc bốn kiểu char, int, float, double), không sử dụng & trước tên biến Sự khác lệnh định dạng printf() scanf() Khơng có tùy chọn %g Mã định dạng %f %e có hiệu tác động Cả hai nhận ký hiệu tùy chọn, chuỗi số có hay khơng có dấu chấm thập phân trường số mũ tùy chọn Cách thức hoạt động scanf() scanf() sử dụng ký tự không in ký tự khoảng trắng, ký tự phân cách (tab), ký tự xuống dòng để định trường nhập kết thúc bắt đầu Có tương ứng lệnh định dạng với trường danh sách tham số theo thứ tự xác định, bỏ qua ký tự khoảng trắng bên Do đó, đầu vào trải dịng, miễn có ký tự phân cách, khoảng trắng hay hàng trường nhập vào Nó bỏ qua khoảng trắng ranh giới hàng để thu liệu Ví dụ 6.7: Chương trình sau mơ tả việc dùng hàm scanf() #include void main() { int a; float d; char ch, name[40]; printf(“Please enter the data\n”); scanf(“%d %f %c %s”, &a, &d, &ch, name); printf(“\nThe values accepted are: %d, %f, %c, %s”, a, d, ch, name); } Kết sau: Please enter the data 12 67.9 F MARK The values accepted are:12, 67.900002, F, MARK Dữ liệu đầu vào là: 12 67.9 F MARK như: 12 67.9 F MARK Smith.N - Nhập Xuất C Ma$ter.P Studio E-book - 81 King.P nhận vào biến a, d, ch, name Xem ví dụ khác: Ví dụ 6.8: #include void main() { int i; float x; char c; scanf(“%3d %5f %c”, &i, &x, &c); } Nếu liệu nhập vào là: 21 10.345 F Khi chương trình thực thi, 21 gán tới i, 10.34 gán tới x ký tự gán cho c Cịn lại đặc tính F bị bỏ qua Khi ta rõ chiều rộng trường bên scanf(), thí dụ %10s, sau scanf() thu nhận tối đa 10 ký tự tới ký tự khoảng trắng (bất ký tự đầu tiên) Ðiều áp dụng cho kiểu int, float double Ví dụ mô tả việc sử dụng hàm scanf() để nhập vào chuỗi gồm có ký tự viết hoa khoảng trắng Chuỗi có chiều dài khơng xác định bị giới hạn 79 ký tự (thật ra, 80 ký tự bao gồm ký tự trống (null) thêm vào nơi cuối chuỗi) Ví dụ 6.9: #include void main() { char line[80]; /* line[80] mảng lưu 80 ký tự */ scanf(“%[ ABCDEFGHIJKLMNOPQRSTUVWXYZ]”, line); } Mã khn dạng %[] có nghĩa ký tự định nghĩa bên [] chấp nhận ký tự chuỗi hợp lệ Nếu chuỗi BEIJING CITY nhập vào từ thiết bị nhập chuẩn, chương trình thực thi, tồn chuỗi gán cho mảng chuỗi toàn ký tự viết hoa khoảng trắng Nếu chuỗi viết Beijing city, ký tự đơn B gán cho mảng, ký tự viết thường (trong trường hợp ‘e’) thơng dịch ký tự bên ngồi chuỗi Ðể chấp nhận ký tự đến gặp ký tự xuống dòng, sử dụng mã định dạng %[^\n], điều ngụ ý chuỗi chấp nhận ký tự trừ “\n” (ký tự xuống dòng) Dấu mũ (^) ngụ ý tất ký tự trừ ký tự nằm sau dấu mũ chấp nhận ký tự hợp lệ 82 Smith.N - Lập trình C Nguyen Dinh Phuong Ví dụ 6.10: #include void main() { char line[80]; …………… scanf(“%[^\n]”, line); ……… } Khi hàm scanf() thực thi, chuỗi có chiều dài không xác định (nhưng không 79 ký tự) nhập vào từ thiết bị nhập chuẩn gán cho mảng Sẽ khơng có giới hạn ký tự chuỗi, ngoại trừ tất chúng nằm hàng Ví dụ chuỗi sau: All’s well that ends well! Có thể nhập vào từ bàn phím gán cho mảng Bổ từ * cho kết khác scanf() Dấu * dùng để trường bỏ qua ln hay tạm bỏ qua Ví dụ xét chương trình: #include void main() { char item[20]; int partno; float cost; scanf(“%s %*d %f”, item, &partno, &cost); } Nếu mục liệu tương ứng là: battery 12345 0.05 battery gán cho item 0.05 gán cho cost 12345 khơng gán cho partno dấu * ngăn chặn việc gán Bất ký tự khác scanf() mà không mã định dạng chuỗi điều khiển phải nhập vào xác khơng phát sinh lỗi Ðặc điểm dùng để chấp nhận dấu phân cách phẩy (,) Ví dụ chuỗi liệu 10, 15, 17 lệnh nhập vào scanf(“%d, %f, %c”, &intgr, &flt, &ch); Smith.N - Nhập Xuất C Ma$ter.P Studio E-book - 83 King.P Chú ý dấu phẩy chuỗi chuyển đổi tương ứng dấu phẩy chuỗi nhập có chức dấu phân cách Ký tự khoảng trắng chuỗi điều khiển thường bỏ qua phát sinh trở ngại dùng với mã định dạng %c Nếu dùng định dạng %c khoảng trắng xem ký tự hợp lệ Xét đoạn mã sau: int x, y; char ch; scanf(“%2d %c %d”,&x, &ch, &y); printf(“%d %d %d\n”,x, ch, y); ta nhập vào: 14 c 14 gán cho x, ký tự ch nhận ký tự khoảng trắng (số 32 hệ thập phân), y gán giá trị ký tự ‘c’ tức số 99 hệ thập phân Xét đoạn mã sau: #include void main() { char c1, c2, c3; ………… scanf(“%c%c%c”,&c1, &c2, &c3); ……………… } Nếu liệu nhập vào là: a b c (với khoảng trắng ký tự), kết phép gán: c1 = a, c2 = , c3 = b Ở thấy c2 chứa khoảng trắng chuỗi nhập có chứa ký tự khoảng trắng Ðể bỏ qua ký tự khoảng trắng đọc ký tự ký tự khoảng trắng, ta nên dùng tập chuyển đổi %1s scanf(“%c%1s%1s”,&c1, &c2, &c3); Khi kết khác với liệu nhập vào trước kết ý định ta: c1 = a, c2 = b, c3 = c 84 Smith.N - Lập trình C Nguyen Dinh Phuong 6.3 Bộ nhớ đệm Nhập Xuất (Buffered I/O) Ngơn ngữ C thân khơng định nghĩa thao tác nhập xuất Tất thao tác nhập xuất thực hàm có sẵn thư viện hàm C Thư viện hàm C chứa hệ thống hàm riêng mà điều khiển thao tác Ðó là: Bộ nhớ đệm Nhập Xuất – dùng để đọc viết ký tự ASCII Một vùng đệm nơi lưu trữ tạm thời, nằm nhớ máy tính thẻ nhớ điều khiển thiết bị (controller card) Các ký tự nhập vào từ bàn phím đưa vào nhớ đợi đến người dùng nhấn phím return hay enter chúng thu nhận khối cung cấp cho chương trình Bộ nhớ đệm nhập xuất phân thành: Thiết bị nhập/xuất chuẩn (Console I/O) Tập tin đệm nhập/xuất (Buffered File I/O) Thiết bị nhập/xuất chuẩn liên quan đến hoạt động bàn phím hình máy tính Tập tin đệm nhập/xuất liên quan đến hoạt động thực đọc viết liệu vào tập tin Chúng ta nói Thiết bị nhập/xuất Trong C, Thiết bị nhập/xuất chuẩn thiết bị luồng Các hàm Thiết bị nhập/xuất chuẩn hướng thao tác đến thiết bị nhập xuất chuẩn hệ thống Các hàm đơn giản Thiết bị nhập/xuất chuẩn là: getchar() – Ðọc ký tự từ bàn phím putchar() – Xuất ký tự đơn hình 6.3.1 getchar() Hàm getchar() dùng để đọc liệu nhập vào, ký tự thời điểm từ bàn phím.Trong hầu hết việc thực thi C, dùng getchar(), ký tự nằm vùng đệm người dùng nhấn phím xuống dịng Vì đợi phím Enter gõ Hàm getchar() khơng có tham số, phải có cặp dấu ngoặc đơn Nó đơn giản lấy ký tự sẵn sàng đưa cho chương trình Chúng ta nói hàm trả giá trị có kiểu ký tự Chương trình sau trình bày cách dùng hàm getchar() Ví dụ 6.11: /* Chương trình trình bày cách dùng getchar() */ #include void main() { char letter; printf(“\nPlease enter any character: “); letter = getchar(); printf(“\nThe character entered by you is %c “, letter); } Smith.N - Nhập Xuất C Ma$ter.P Studio E-book - 85 King.P Kết sau: Please enter any character: S The character entered by you is S Trong chương trình ‘letter’ biến khai báo kiểu char nhận vào ký tự Một thơng báo: Please enter any character: xuất hình Ta nhập vào ký tự, ví dụ S, qua bàn phím nhấn Enter Hàm getchar() nhận ký tự gán cho biến có tên letter Sau hiển thị hình ta có thơng báo The character entered by you is S 6.3.2 putchar() putchar() hàm xuất ký tự C, xuất ký tự lên hình vị trí trỏ hình Hàm yêu cầu tham số Tham số hàm putchar() thuộc loại sau: Hằng ký tự đơn Ðịnh dạng (Escape sequence) Một biến ký tự Nếu tham số phải bao đóng dấu nháy đơn Bảng 6.5 trình bày vài tùy chọn cho putchar() tác động chúng Tham số Hàm Tác dụng Biến ký tự putchar(c) Hiện thị nội dung biến ký tự c Hằng biến ký tự putchar(‘A’) Hiển thị ký tự A Hằng số putchar(‘5’) Hiển thị số Ðịnh dạng (escape sequence) putchar(‘\t’) Chèn ký tự khoảng cách (tab) vị trí trỏ hình Ðịnh dạng (escape sequence) putchar(‘\n’) Chèn mã xuống dịng vị trí trỏ hình Bảng 6.5: Những tùy chọn cho putchar() tác dụng chúng Chương trình sau trình bày hàm putchar(): 86 Smith.N - Lập trình C Nguyen Dinh Phuong Ví dụ 6.12: /* Chương trình trình bày việc sử dụng định dạng hàm putchar() */ #include void main() { putchar(‘H’); putchar(‘\n’); putchar(‘\t’); putchar(‘E’); putchar(‘\n’); putchar(‘\t’); putchar(‘\t’); putchar(‘L’); putchar(‘\n’); putchar(‘\t’); putchar(‘\t’); putchar(‘\t’); putchar(‘L’); putchar(‘\n’); putchar(‘\t’); putchar(‘\t’); putchar(‘\t’); putchar(‘\t’); putchar(‘O’); } Kết sau: H E L L O Khác getchar() putchar() putchar() yêu cầu tham số getchar() khơng Ví dụ 6.13: /* Chương trình trình bày getchar() putchar() */ #include void main() { char letter; printf(“You can enter a character now: ”); letter = getchar(); putchar(letter); } Kết sau: You can enter a character now: F F Smith.N - Nhập Xuất C Ma$ter.P Studio E-book - 87 King.P Tóm tắt học Trong C, Nhập Xuất thực cách dùng hàm Bất chương trình C có quyền truy cập tới ba tập tin chuẩn Chúng tập tin nhập chuẩn (stdin), tập tin xuất chuẩn (stdout) lỗi chuẩn (stderr) Thông thường tập tin nhập chuẩn bàn phím (keyboard), tập tin xuất chuẩn hình (screen) tập tin lỗi chuẩn hình Tập tin tiêu đề chứa macro nhiều hàm nhập xuất (input/output function) dùng C Thiết bị nhập/xuất chuẩn (Console I/O) liên quan đến hoạt động bàn phím hình máy tính Nó chứa hàm định dạng không định dạng Hàm nhập xuất định dạng printf() scanf() Hàm nhập xuất không định dạng getchar() putchar() Hàm scanf() dùng cho liệu nhập vào có định dạng, hàm printf() dùng để xuất liệu theo định dạng cụ thể Chuỗi điều khiển printf() scanf() phải tồn bên dấu nháy kép “” Chuỗi chứa tập lệnh định dạng Mỗi lệnh định dạng chứa ký hiệu %, tùy chọn bổ từ dạng kiểu liệu xác định Sự khác printf() scanf() hàm scanf() dùng địa biến tên biến Hàm getchar() đọc ký tự từ bàn phím Hàm putchar(ch) gởi ký tự ch hình Sự khác getchar() putchar() putchar() có tham số getchar() khơng 88 Smith.N - Lập trình C Nguyen Dinh Phuong Kiểm tra tiến độ học tập Các hàm nhập xuất có định dạng _ A printf() scanf() C puts() gets() B getchar() putchar() D Không câu Hàm scanf() dùng _ tới biến không dùng tên biến A Hàm C Mảng B Con trỏ D Không câu _ xác định định dạng cho giá trị biến nhập in A Văn C Tham số B Bộ định dạng D Không câu _ dùng hàm printf() để xác định đặc tả chuyển đổi A % C * B & D Không câu getchar() hàm khơng có tham số (True/False) Một _ nơi lưu trữ tạm nhớ A ROM (Bộ nhớ đọc) C Vùng đệm B Thanh ghi D Khơng câu Ðịnh dạng (Escape sequence) đặt bên chuỗi điều khiển printf() (True/False) Smith.N - Nhập Xuất C Ma$ter.P Studio E-book - 89 King.P Bài tập tự làm A Hãy dùng câu lệnh printf() để : a) Xuất giá trị biến số nguyên sum b) Xuất chuỗi văn "Welcome", dòng c) Xuất biến ký tự letter d) Xuất biến số thực discount e) Xuất biến số thực dump có vị trí phần thập phân B Dùng câu lệnh scanf() thực hiện: a) Ðọc giá trị thập phân từ bàn phím vào biến số nguyên sum b) Ðọc giá trị số thực vào biến discount_rate Viết chương trình xuất giá trị ASCII ký tự ‘A’ ‘b’ Xét chương trình sau: #include void main() { int breadth; float length, height; scanf(“%d%f%6.2f”, breadth, &length, height); printf(“%d %f %e”, &breadth, length, height); } Sửa lỗi chương trình Viết chương trình nhập vào name, basic, daper (phần trăm D.A), bonper (phần trăm lợi tức) loandet (tiền vay bị khấu trừ) cho nhân viên Tính lương sau: salary = basic + basic * daper/100 + bonper * basic/100 - loandet Bảng liệu: name MARK basic 2500 daper 55 bonper 33.33 loandet 250.00 Tính salary xuất kết đầu đề sau (Lương in gần dấu đôla ($)): Name Basic Salary Viết chương trình yêu cầu nhập vào tên, họ bạn sau xuất tên, họ theo dạng họ, tên 90 Smith.N - Lập trình C ... Thiết bị nhập/ xuất Trong C, Thiết bị nhập/ xuất chuẩn thiết bị luồng C? ?c hàm Thiết bị nhập/ xuất chuẩn hướng thao t? ?c đến thiết bị nhập xuất chuẩn hệ thống C? ?c hàm đơn giản Thiết bị nhập/ xuất chuẩn... nguyên x? ?c định độ rộng nhỏ trường liệu C? ?c liệu c? ? độ rộng nhỏ cho kết canh phải trường liệu C? ?c liệu c? ? kích thư? ?c lớn in c? ?ch dùng thêm vị trí cho đủ yêu c? ??u.Ví dụ, %10f lệnh định dạng cho m? ?c liệu... đ? ?c ký tự ký tự khoảng trắng, ta nên dùng tập chuyển đổi %1s scanf(“ %c% 1s%1s”, &c1 , &c2 , &c3 ); Khi kết kh? ?c với liệu nhập vào trư? ?c kết ý định ta: c1 = a, c2 = b, c3 = c 84 Smith.N - Lập trình C