Mô tả chức năng Scanf C
Mô tả chức năng Scanf C

Video: Mô tả chức năng Scanf C

Video: Mô tả chức năng Scanf C
Video: Chương 5 phân khúc thị trường, lựa chọn thị trường mục tiêu, định vị trong thị trường(marketing CB) 2024, Có thể
Anonim

Trong bài viết này, hàm scanf () được xem xét ở dạng tổng quát mà không tham chiếu đến một tiêu chuẩn cụ thể, vì vậy dữ liệu từ bất kỳ tiêu chuẩn C99, C11, C ++ 11, C ++ 14 nào đều được đưa vào đây. Có lẽ, trong một số tiêu chuẩn, chức năng hoạt động với sự khác biệt so với tài liệu được trình bày trong bài báo.

chức năng scanf C - mô tả

scanf () là một hàm nằm trong tệp tiêu đề stdio.h (C) và cstdio (C ++), còn được gọi là đầu vào chương trình được định dạng. scanf đọc các ký tự từ luồng đầu vào chuẩn (stdin) và chuyển đổi chúng theo định dạng, sau đó ghi chúng vào các biến được chỉ định. Định dạng - có nghĩa là dữ liệu được chuyển đổi sang một dạng nhất định khi nhận. Do đó, hàm scanf C được mô tả:

scanf ("% định dạng", & biến1 [, & biến2, […]), trong đó các biến được chuyển dưới dạng địa chỉ. Lý do cho cách truyền các biến cho một hàm là rất rõ ràng: do kết quả của công việc, nó trả về một giá trị cho biết sự hiện diện của lỗi, vì vậycách duy nhất để thay đổi giá trị của các biến là chuyển theo địa chỉ. Ngoài ra, nhờ phương pháp này, hàm có thể xử lý dữ liệu thuộc bất kỳ loại nào.

Một số lập trình viên coi các hàm như scanf () hoặc printf () là các thủ tục vì sự tương tự với các ngôn ngữ khác.

Scanf cho phép nhập tất cả các kiểu ngôn ngữ cơ bản: char, int, float, string, v.v. Trong trường hợp các biến kiểu chuỗi, không cần chỉ định dấu địa chỉ - "&", vì biến kiểu chuỗi là một mảng và tên của nó là địa chỉ của phần tử đầu tiên của mảng trong bộ nhớ máy tính.

Sử dụng C trong C ++
Sử dụng C trong C ++

Định dạng nhập dữ liệu hoặc chuỗi điều khiển

Bắt đầu bằng cách xem ví dụ về hàm scanf C từ mô tả.


gồm int main () {int x; while (scanf ("% d", & x)==1) printf ("% d / n", x); trả về 0; // yêu cầu đối với hệ thống linux}

Định dạng đầu vào bao gồm bốn tham số sau: loại% [width] [modifier]. Trong trường hợp này, dấu "%" và kiểu là các tham số bắt buộc. Đó là, định dạng tối thiểu trông giống như sau: “% s”, “% d”, v.v.

Nói chung, các ký tự tạo nên chuỗi định dạng được chia thành:

  • định dạng định dạng - bất kỳ thứ gì bắt đầu bằng%;
  • ký tự phân cách hoặc khoảng trắng - chúng là dấu cách, tab ( t), dòng mới ( n);
  • ký tự ngoài khoảng trắng.

Chức năng có thể không an toàn.

Sử dụng scanf_s () thay vì scanf ().

(tin nhắn từ Visual Studio)

Loại, hoặc từ định dạng, hoặc ký tự chuyển đổi, hoặc ký tự điều khiển

mã nhị phân
mã nhị phân

Một khai báo scanf C phải chứa ít nhất một định dạng định dạng, được chỉ định ở cuối các biểu thức bắt đầu bằng "%". Nó cho chương trình biết loại dữ liệu mong đợi khi nhập, thường là từ bàn phím. Danh sách tất cả các từ định dạng trong bảng bên dưới.

Loại Có nghĩa là
1 % c Chương trình đang đợi nhập ký tự. Biến được viết phải có kiểu ký tự char.
2 % d Chương trình yêu cầu đầu vào là một số thập phân kiểu số nguyên. Biến phải có kiểu int.
3 % i Chương trình yêu cầu đầu vào là một số thập phân kiểu số nguyên. Biến phải có kiểu int.
4 % e,% E Chương trình dự kiến nhập một số dấu phẩy động (dấu phẩy) ở dạng hàm mũ. Biến phải thuộc loại float.
5 % f Chương trình mong đợi một số dấu phẩy động (dấu phẩy). Biến phải thuộc loại float.
6 % g,% G Chương trình mong đợi một số dấu phẩy động (dấu phẩy). Biến phải thuộc loại float.
7 % a Chương trình mong đợi một số dấu phẩy động (dấu phẩy). Biến phải thuộc loại float.
8 % o Chương trình mong đợi một số bát phân. Biến phải có kiểu int.
9 % s Chương trình đang đợi một chuỗi được nhập. Chuỗi là một tập hợp bất kỳ ký tự nào cho đến ký tự phân tách đầu tiên gặp phải. Biến phải thuộc loại chuỗi.
10

% x,% X

Chương trình đang chờ một số thập lục phân. Biến phải có kiểu int.
11 % p Biến mong đợi đầu vào con trỏ. Biến phải thuộc loại con trỏ.
12 % n Ghi cho một biến một giá trị số nguyên bằng số ký tự được đọc cho đến nay bởi hàm scanf.
13 % u Chương trình đọc một số nguyên không dấu. Loại biến phải là số nguyên không dấu.
14 % b Chương trình đang chờ một số nhị phân. Biến phải có kiểu int.
15 % Bộ ký tự quét. Chương trình đang đợi các ký tự được nhập.từ nhóm giới hạn được chỉ định giữa các dấu ngoặc vuông. scanf sẽ hoạt động miễn là có các ký tự từ tập hợp đã chỉ định trên luồng đầu vào.
16 %% Ký "%".

Các ký tự trong chuỗi định dạng

Mã C ++
Mã C ++

Biểu tượng ngôi sao ()

Dấu hoa thị () là một cờ chỉ ra rằng thao tác gán sẽ bị chặn. Dấu hoa thị được đặt ngay sau dấu "%". Ví dụ:


scanf ("% d%c% d", & x, &y); // bỏ qua ký tự giữa hai số nguyên. scanf ("% s%d% s", str, str2); // bỏ qua số nguyên giữa hai chuỗi.

Tức là nếu bạn nhập dòng "45-20" trong bảng điều khiển, chương trình sẽ thực hiện như sau:

  1. Biến "x" sẽ được gán giá trị 45.
  2. Biến "y" sẽ được gán giá trị 20.
  3. Và dấu trừ (gạch ngang) "-" sẽ bị bỏ qua nhờ "%c".

Chiều rộng (hoặc chiều rộng trường)

Đây là một số nguyên giữa dấu "%" và định dạng chỉ định số ký tự tối đa để đọc trong thao tác đọc hiện tại.


scanf ("% 20s", str); // đọc 20 ký tự đầu tiên từ luồng đầu vào

Có một số điều quan trọng cần ghi nhớ:

  1. scanf sẽ kết thúc nếu nó gặp ký tự phân tách, ngay cả khi nó không đếm 20 ký tự.
  2. Nếu nhập hơn 20 ký tự thì chỉ 20 ký tự đầu tiên sẽ được ghi vào str.

Modifiergõ (hoặc độ chính xác)

mã giật gân
mã giật gân

Đây là các cờ đặc biệt sửa đổi loại dữ liệu được mong đợi cho đầu vào. Cờ được chỉ định ở bên trái của bộ chỉ định loại:

  • L hoặc l (L nhỏ) Khi "l" được sử dụng với các từ xác định d, i, o, u, x, cờ báo cho chương trình biết rằng đầu vào int dài được mong đợi. Khi sử dụng "l" với từ chỉ định e hoặc f, cờ cho chương trình biết rằng nó sẽ có giá trị gấp đôi. Việc sử dụng "L" cho chương trình biết rằng một đôi dài được mong đợi. Việc sử dụng "l" với các ký hiệu "c" và "s" cho chương trình biết rằng các ký tự hai byte như wchar_t được mong đợi. Ví dụ: "% lc", "% ls", "% l [asd]".
  • h là cờ chỉ loại ngắn.
  • hh - chỉ ra rằng biến là một con trỏ đến giá trị char có dấu hoặc không dấu. Cờ có thể được sử dụng với các từ chỉ định d, i, o, u, x, n.
  • ll (hai chữ L nhỏ) - chỉ ra rằng biến là một con trỏ đến một giá trị kiểu có dấu long dài int hoặc int dài không dấu. Cờ được sử dụng với các từ chỉ định: d, i, o, u, x, n.
  • j - chỉ ra rằng biến là một con trỏ đến kiểu intmax_t hoặc uintmax_t từ tệp tiêu đề stdint.h. Được sử dụng với các từ chỉ định: d, i, o, u, x, n.
  • z - chỉ ra rằng biến là một con trỏ đến kiểu size_t, định nghĩa của kiểu này trong stddef.h. Được sử dụng với các từ chỉ định: d, i, o, u, x, n.
  • t - chỉ ra rằng biến là một con trỏ đến kiểu ptrdiff_t. Định nghĩa trênloại này nằm trong stddef.h. Được sử dụng với các từ chỉ định: d, i, o, u, x, n.

Rõ ràng hơn, hình ảnh có bổ ngữ có thể được biểu diễn dưới dạng bảng. Mô tả như vậy về scanf C đối với các lập trình viên sẽ rõ ràng hơn.

Nhập Các chỉ định và Bổ ngữ
Nhập Các chỉ định và Bổ ngữ

Các ký tự khác

Mọi ký tự gặp phải trong định dạng sẽ bị loại bỏ. Đồng thời, cần lưu ý rằng sự hiện diện của khoảng trắng hoặc ký tự phân cách (dòng mới, dấu cách, tab) trong chuỗi điều khiển có thể dẫn đến các hành vi khác nhau của hàm. Trong một phiên bản, scanf () sẽ đọc mà không lưu bất kỳ số lượng dấu phân tách nào cho đến khi nó gặp một ký tự không phải là dấu phân tách và trong một phiên bản khác, dấu cách (chỉ chúng) không đóng vai trò và biểu thức "% d +% d" tương đương với "% d +% d".

Ví dụ về mã C ++
Ví dụ về mã C ++

Ví dụ

Hãy xem một số ví dụ để giúp bạn suy nghĩ và hiểu rõ hơn về cách hoạt động của hàm.


scanf ("% 3s", str); // nếu bạn nhập chuỗi "1d2s3d1; 3" trong bảng điều khiển, chỉ "1d2" sẽ được ghi vào str scanf ("% dminus% d", & x, &y); // các ký tự trừ giữa hai số sẽ bị loại bỏ scanf ("% 5 [0-9]", str); // các ký tự sẽ được nhập vào str cho đến khi đủ 5 ký tự và các ký tự là số từ 0 đến 9. scanf ("% lf", &d); // mong đợi đầu vào kép scanf ("% hd", &x); // dự kiến số kiểu short scanf ("% hu", &y); // mong đợi số không có dấu short scanf ("lx", &z); // số kiểu mong đợi của kiểu long int

TừCác ví dụ dưới đây cho thấy số dự kiến thay đổi như thế nào khi sử dụng các ký hiệu khác nhau.

scanf C - mô tả cho người mới bắt đầu

Phần này sẽ hữu ích cho người mới bắt đầu. Thông thường, bạn không cần phải có quá nhiều mô tả đầy đủ về scanf C cũng như chi tiết về cách hoạt động của chức năng.

  • Tính năng này đã lỗi thời. Có một số cách triển khai khác nhau trong các thư viện của các phiên bản khác nhau. Ví dụ: chức năng scanf S C được cải tiến, bạn có thể tìm thấy mô tả về chức năng này trên trang web của microsoft.
  • Số lượng từ chỉ định trong định dạng phải khớp với số lượng đối số được truyền vào hàm.
  • Các phần tử dòng đầu vào chỉ được phân tách bằng các ký tự phân cách: dấu cách, tab, dòng mới. Dấu phẩy, dấu chấm phẩy, dấu chấm, v.v. - những ký tự này không phải là dấu phân cách cho hàm scanf ().
  • Nếu scanf gặp ký tự phân tách, quá trình nhập sẽ bị dừng. Nếu có nhiều hơn một biến để đọc, thì scanf sẽ chuyển sang đọc biến tiếp theo.
  • Sự không nhất quán nhỏ nhất trong định dạng dữ liệu đầu vào dẫn đến kết quả không thể đoán trước của chương trình. Chà, nếu chương trình chỉ kết thúc với một lỗi. Nhưng thường thì chương trình vẫn tiếp tục hoạt động và làm sai.
  • scanf ("% 20 giây…",…); Nếu luồng đầu vào vượt quá 20 ký tự, thì scanf sẽ đọc 20 ký tự đầu tiên và hủy bỏ hoặc chuyển sang đọc biến tiếp theo, nếu một biến được chỉ định. Trong trường hợp này, lệnh gọi tới scanf tiếp theo sẽ tiếp tục đọc luồng đầu vào từ điểm mà công việc của lệnh gọi scanf trước đó đã dừng lại. Nếu khi đọc 20 đầu tiênký tự, ký tự phân tách gặp phải, scanf sẽ hủy bỏ hoặc tiếp tục đọc biến tiếp theo, ngay cả khi nó không đọc 20 ký tự cho biến đầu tiên. Trong trường hợp này, tất cả các ký tự chưa đọc sẽ được gắn vào biến tiếp theo.
  • Nếu tập hợp các ký tự được quét bắt đầu bằng dấu "^", thì scanf sẽ đọc dữ liệu cho đến khi nó gặp ký tự phân tách hoặc một ký tự từ tập hợp. Ví dụ: "% [^ A-E1-5]" sẽ đọc dữ liệu từ luồng cho đến khi gặp một trong các ký tự tiếng Anh viết hoa từ A đến E hoặc một trong các số từ 1 đến 5.
  • Hàm scanf C, như được mô tả, trả về một số bằng số lần ghi thành công vào các biến. Nếu scanf ghi 3 biến, thì kết quả thành công của hàm sẽ trả về số 3. Nếu scanf không thể viết bất kỳ biến nào, thì kết quả sẽ là 0. Và cuối cùng, nếu scanf không thể bắt đầu vì một số lý do, kết quả sẽ là EOF.
  • Nếu hàm scanf () kết thúc không chính xác. Ví dụ: scanf ("% d", & x) - một số được mong đợi, nhưng các ký tự được nhận làm đầu vào. Cuộc gọi scanf () tiếp theo sẽ bắt đầu tại điểm trong luồng đầu vào nơi lệnh gọi hàm trước đó đã kết thúc. Để khắc phục vấn đề này, cần phải loại bỏ các ký tự vấn đề. Điều này có thể được thực hiện, chẳng hạn, bằng cách gọi scanf ("%s"). Tức là, hàm sẽ đọc một chuỗi ký tự và ném nó đi. Bằng cách khó này, bạn có thể tiếp tục nhập dữ liệu cần thiết.
  • Trong một số triển khai scanf (), "-" không được phép trong bộ ký tự được quét.
  • Bộ chỉ định "% c" đọc từng ký tự từ luồng. Nghĩa là, nó cũng đọc ký tự phân cách. Để bỏ qua ký tự phân tách và tiếp tục đọc ký tự mong muốn, bạn có thể sử dụng "% 1s".
  • Khi sử dụng thông số "c", được phép sử dụng chiều rộng "% 10c", nhưng sau đó một mảng các phần tử kiểu char phải được chuyển làm biến cho hàm scanf.
  • “% [a-z]” có nghĩa là “tất cả các chữ cái nhỏ trong bảng chữ cái tiếng Anh” và “% [z-a]” chỉ có 3 ký tự: ‘z’, ‘a’, ‘-’. Nói cách khác, ký tự "-" chỉ có nghĩa là một phạm vi nếu nó nằm giữa hai ký tự theo đúng thứ tự. Nếu "-" ở cuối một biểu thức, ở đầu hoặc không đúng thứ tự của các ký tự ở hai bên của chúng, thì đó chỉ là một ký tự gạch nối, không phải là một phạm vi.
Mã C ++
Mã C ++

Kết

Điều này kết thúc mô tả của scanf C. Đây là một tính năng tiện dụng tuyệt vời để làm việc trong các chương trình nhỏ và khi sử dụng phương pháp lập trình thủ tục. Tuy nhiên, nhược điểm chính là số lượng lỗi không thể đoán trước có thể xảy ra khi sử dụng scanf. Vì vậy, mô tả của scanf C khi lập trình tốt nhất nên để trước mắt bạn. Trong các dự án chuyên nghiệp lớn, iostream được sử dụng, do thực tế là chúng có khả năng cấp cao hơn, chúng có khả năng bắt và xử lý lỗi tốt hơn, đồng thời cũng hoạt động với lượng thông tin đáng kể. Cũng cần lưu ý rằng mô tả của scanf C bằng tiếng Nga có sẵn trên nhiều nguồn mạng, cũng như các ví dụ về nósử dụng, do tuổi của chức năng. Do đó, nếu cần, bạn luôn có thể tìm thấy câu trả lời trên các diễn đàn chuyên đề.

Đề xuất: