Scanf C функцийн тайлбар
Scanf C функцийн тайлбар

Видео: Scanf C функцийн тайлбар

Видео: Scanf C функцийн тайлбар
Видео: #9. Функция scanf() для форматированного ввода | Язык C для начинающих 2024, May
Anonim

Энэ өгүүлэлд scanf() функцийг тодорхой стандартад хамааралгүйгээр ерөнхий хэлбэрээр авч үзсэн тул C99, C11, C++11, C++14 стандартын өгөгдлийг энд оруулсан болно. Магадгүй, зарим стандартад уг функц нь нийтлэлд үзүүлсэн материалаас ялгаатай ажилладаг.

scanf C функц - тайлбар

scanf() нь stdio.h(C) болон cstdio(C++) толгой файлуудад байрладаг функц бөгөөд форматлагдсан програмын оролт гэгддэг. scanf нь стандарт оролтын урсгалаас (stdin) тэмдэгтүүдийг уншиж, форматын дагуу хөрвүүлж, дараа нь заасан хувьсагчдад бичдэг. Формат - өгөгдлийг хүлээн авсны дараа тодорхой хэлбэрт шилжүүлнэ гэсэн үг юм. Тиймээс scanf C функцийг тайлбарлав:

scanf("%format", &variable1[, &variable2, […]), хувьсагчдыг хаяг болгон дамжуулдаг. Функцэд хувьсагчдыг дамжуулах ийм аргын шалтгаан нь ойлгомжтой: ажлын үр дүнд алдаа байгаа эсэхийг харуулсан утгыг буцаадаг. Хувьсагчийн утгыг өөрчлөх цорын ганц арга бол хаягаар дамжих явдал юм. Мөн энэ аргын ачаар функц нь ямар ч төрлийн өгөгдлийг боловсруулах боломжтой.

Зарим программистууд scanf() эсвэл printf() зэрэг функцуудыг бусад хэлтэй адилтгаж байгаа тул процедур гэж нэрлэдэг.

Scanf нь char, int, float, string гэх мэт бүх үндсэн хэлийг оруулахыг зөвшөөрдөг. string төрлийн хувьсагчийн хувьд "&" гэсэн тэмдэгтийг зааж өгөх шаардлагагүй, учир нь string төрлийн хувьсагч нь массив бөгөөд түүний нэр нь компьютерийн санах ой дахь массивын эхний элементийн хаяг юм..

C++ хэл дээр С ашиглах
C++ хэл дээр С ашиглах

Өгөгдөл оруулах формат эсвэл хяналтын мөр

Тайлбараас scanf C функцийн жишээг харж эхэл.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); буцаах 0; //linux системд тавигдах шаардлага }

Оролтын формат нь дараах дөрвөн параметрээс бүрдэнэ: %[өргөн][өөрчлөгч] төрөл. Энэ тохиолдолд "%" тэмдэг ба төрөл нь заавал байх ёстой параметрүүд юм. Өөрөөр хэлбэл, хамгийн бага формат нь дараах байдалтай харагдана: “%s”, “%d” гэх мэт.

Ерөнхийдөө форматын мөрийг бүрдүүлдэг тэмдэгтүүдийг дараах байдлаар хуваадаг:

  • формат тодорхойлогч - %-аар эхэлсэн бүх зүйл;
  • тусгаарлах эсвэл зайтай тэмдэгтүүд - тэдгээр нь зай, таб(t), шинэ мөр (n);
  • хоосон зайнаас бусад тэмдэгт.

Функц аюулгүй биш байж магадгүй.

Scanf()-ын оронд scanf_s()-г ашигла.

(Visual Studio-с ирсэн мессеж)

Төрөл, формат тодорхойлогч, хөрвүүлэх тэмдэгт эсвэл хяналтын тэмдэгт

хоёртын код
хоёртын код

Scanf C мэдэгдэлд дор хаяж "%"-аар эхэлсэн илэрхийллийн төгсгөлд заасан формат тодорхойлогч байх ёстой. Энэ нь програмд нэвтрэх үед ямар төрлийн өгөгдлийн хүлээж байгааг хэлж өгдөг, ихэвчлэн гарнаас. Доорх хүснэгтэд байгаа бүх формат тодорхойлогчдын жагсаалт.

Төрөл Утга
1 %c Програм тэмдэгт оруулахыг хүлээж байна. Бичих хувьсагч нь тэмдэгтийн төрлийн байх ёстой.
2 %d Хөтөлбөр нь бүхэл тооны аравтын тооны оролтыг хүлээж байна. Хувьсагч нь int төрлийн байх ёстой.
3 %i

Хөтөлбөр нь бүхэл тооны аравтын тооны оролтыг хүлээж байна. Хувьсагч нь int төрлийн байх ёстой.

4 %e, %E Хөтөлбөр нь экспоненциал хэлбэрээр хөвөгч цэг (таслал) тоог оруулахаар төлөвлөж байна. Хувьсагч нь float төрлийн байх ёстой.
5 %f Хөтөлбөр нь хөвөгч цэгийн тоог (таслал) хүлээж байна. Хувьсагч нь float төрлийн байх ёстой.
6 %g, %G Хөтөлбөр нь хөвөгч цэгийн тоог (таслал) хүлээж байна. Хувьсагч нь float төрлийн байх ёстой.
7 %a Хөтөлбөр нь хөвөгч цэгийн тоог (таслал) хүлээж байна. Хувьсагч нь float төрлийн байх ёстой.
8 %o Хөтөлбөр нь наймтын тоог хүлээж байна. Хувьсагч нь int төрлийн байх ёстой.
9 %s Хөтөлбөр нь мөр оруулахыг хүлээж байна. Мөр гэдэг нь тааралдсан эхний тусгаарлах тэмдэгт хүртэлх дурын тэмдэгтүүдийн багц юм. Хувьсагч нь string төрлийн байх ёстой.
10 %x, %X Хөтөлбөр 16-тын тоог хүлээж байна. Хувьсагч нь int төрлийн байх ёстой.
11 %p Хувьсагч нь заагч оруулахыг хүлээж байна. Хувьсагч нь заагч төрлийн байх ёстой.
12 %n Хувьсагч руу scanf функцээр уншсан тэмдэгтүүдийн тоотой тэнцүү бүхэл тоо бичнэ.
13 %u Програм нь тэмдэггүй бүхэл тоог уншдаг. Хувьсагчийн төрөл нь тэмдэггүй бүхэл тоо байх ёстой.
14 %b Хөтөлбөр хоёртын тоог хүлээж байна. Хувьсагч нь int төрлийн байх ёстой.
15 %

Сканнердсан тэмдэгтийн багц. Програм тэмдэгтүүдийг оруулахыг хүлээж байна.дөрвөлжин хаалтанд заасан хязгаарлагдмал сангаас. scanf нь оролтын урсгал дээр заасан олонлогийн тэмдэгтүүд байгаа л бол ажиллах болно.

16 %% "%" гэж тэмдэглээрэй.

Формат тэмдэгтүүд

C++ код
C++ код

Одны тэмдэг ()

Од () нь даалгаврын үйлдлийг дарах шаардлагатайг илтгэх туг юм. "%" тэмдгийн дараа нэн даруй одыг байрлуулна. Жишээ нь,


scanf("%d%c%d", &x, &y); //хоёр бүхэл тооны хоорондох тэмдэгтийг үл тоомсорлодог. scanf("%s%d%s", str, str2); //хоёр мөр хоорондын бүхэл тоог үл хэрэгснэ.

Өөрөөр хэлбэл, хэрэв та консол дээр "45-20" гэсэн мөрийг оруулбал программ дараах зүйлийг хийх болно:

  1. "x" хувьсагчид 45 утга онооно.
  2. "y" хувьсагчид 20 утга онооно.
  3. Мөн хасах тэмдэг (зураас) "-"-г "%c"-ын ачаар үл тоомсорлох болно.

Өргөн (эсвэл талбайн өргөн)

Энэ нь "%" тэмдэг ба формат тодорхойлогчийн хоорондох бүхэл тоо бөгөөд одоогийн унших үйлдлээр унших тэмдэгтийн дээд хэмжээг зааж өгнө.


scanf("%20s", str); //оролтын урсгалын эхний 20 тэмдэгтийг унших

Хэд хэдэн чухал зүйлийг санаж байх хэрэгтэй:

  1. scanf нь 20 тэмдэгт тоолоогүй байсан ч тусгаарлах тэмдэгттэй тулгарвал дуусгавар болно.
  2. Хэрэв 20-оос дээш тэмдэгт оруулсан бол зөвхөн эхний 20 тэмдэгтийг str.-д бичнэ.

Өөрчлөгчтөрөл (эсвэл нарийвчлал)

цацрах код
цацрах код

Эдгээр нь оруулахад хүлээгдэж буй өгөгдлийн төрлийг өөрчилдөг тусгай тугууд юм. Төрөл тодорхойлогчийн зүүн талд туг зааж өгсөн:

  • L эсвэл l (жижиг L) "l"-г d, i, o, u, x тодорхойлогчтой ашиглах үед туг нь програмд урт оролт оруулахыг хэлнэ. "l"-г e эсвэл f тодорхойлогчтой ашиглах үед туг нь програмд давхар утгыг хүлээх ёстойг хэлдэг. "L"-ийн хэрэглээ нь програмд урт давхар хүлээгдэж буйг хэлдэг. "c" болон "s" тодорхойлогчтой "l"-г ашиглах нь wchar_t гэх мэт хоёр байт тэмдэгтүүд байх ёстойг програмд хэлдэг. Жишээлбэл, "%lc", "%ls", "%l[asd]".
  • h нь богино төрлийг харуулсан туг юм.
  • hh - хувьсагч нь тэмдэгт тэмдэгт эсвэл тэмдэггүй тэмдэгтийн утгын заагч болохыг заана. Тус тугийг d, i, o, u, x, n тодорхойлогчтой ашиглаж болно.
  • ll (хоёр жижиг L) - хувьсагч нь signed long long int эсвэл unsigned long long int төрлийн утгын заагч болохыг заана. Туг нь тодорхойлогчтой хэрэглэгддэг: d, i, o, u, x, n.
  • j - хувьсагч нь stdint.h толгой файлаас intmax_t эсвэл uintmax_t төрлийн заагч болохыг заана. Тодорхойлогчтой ашигладаг: d, i, o, u, x, n.
  • z - хувьсагч нь stddef.h-д байгаа size_t төрлийн заагч болохыг заана. Тодорхойлогчтой ашигладаг: d, i, o, u, x, n.
  • t - хувьсагч нь ptrdiff_t төрлийн заагч болохыг заана. Тодорхойлолт асаалттайЭнэ төрөл нь stddef.h-д байдаг. Тодорхойлогчтой ашигладаг: d, i, o, u, x, n.

Өөрчлөгчтэй зургийг хүснэгт хэлбэрээр харуулах боломжтой. Програмистуудад зориулсан scanf C-ийн ийм тайлбар илүү ойлгомжтой байх болно.

Төрөл тодорхойлогч ба өөрчлөгч
Төрөл тодорхойлогч ба өөрчлөгч

Бусад дүрүүд

Форматад таарсан тэмдэгтүүдийг устгах болно. Үүний зэрэгцээ хяналтын мөрөнд хоосон зай эсвэл тусгаарлах тэмдэгтүүд (шинэ мөр, хоосон зай, таб) байгаа нь функцийг өөр өөр үйлдэлд хүргэж болзошгүйг анхаарах хэрэгтэй. Нэг хувилбарт scanf() нь тусгаарлагчаас өөр тэмдэгттэй тулгарах хүртэл ямар ч тооны тусгаарлагчийг хадгалахгүйгээр унших бөгөөд өөр хувилбарт хоосон зай (зөвхөн тэдгээр нь) үүрэг гүйцэтгэдэггүй бөгөөд "%d + %d" илэрхийлэл байдаг. "% d+%d"-тай тэнцэнэ.

C++ кодын жишээ
C++ кодын жишээ

Жишээ

Функц хэрхэн ажилладаг талаар бодох, илүү сайн ойлгоход туслах хэдэн жишээг харцгаая.


scanf("%3s", str); //хэрэв та консолд "1d2s3d1;3" мөрийг оруулбал str scanf("%dminus%d", &x, &y);-д зөвхөн "1d2" бичигдэнэ; //хоёр тооны хоорондох хасах тэмдэгтүүдийг устгах болно scanf("%5[0-9]", str); // str-д 5 тэмдэгт байх ба тэмдэгтүүд нь 0-ээс 9 хүртэлх тоо байх хүртэл тэмдэгтүүдийг оруулна. scanf("%lf", &d); //давхар оролтыг хүлээж байна scanf("%hd", &x); //хүлээгдэж буй тоо short scanf("%hu", &y); //гараагүй тоо хүлээж байна short scanf("lx", &z); // long int төрлийн хүлээгдэж буй тоо

ХэнээсДоорх жишээнүүд нь хүлээгдэж буй тоо өөр тэмдэгт ашиглан хэрхэн өөрчлөгдөж байгааг харуулж байна.

scanf C - эхлэгчдэд зориулсан тайлбар

Энэ хэсэг нь эхлэгчдэд хэрэгтэй болно. Ихэнхдээ танд scanf C-ийн бүрэн тайлбар биш, функц хэрхэн ажилладаг талаарх дэлгэрэнгүй мэдээлэл байх шаардлагатай.

  • Энэ функц бага зэрэг хуучирсан. Төрөл бүрийн хувилбаруудын номын санд хэд хэдэн өөр өөр хэрэгжүүлэлт байдаг. Жишээлбэл, сайжруулсан scanf S C функц, тайлбарыг нь microsoft вэб сайтаас авах боломжтой.
  • Формат дахь тодорхойлогчдын тоо нь функцэд дамжуулсан аргументуудын тоотой тохирч байх ёстой.
  • Оролтын урсгалын элементүүдийг зөвхөн тусгаарлах тэмдэгтээр тусгаарлах ёстой: зай, таб, шинэ мөр. Таслал, цэг таслал, цэг гэх мэт - эдгээр тэмдэгтүүд нь scanf() функцийн тусгаарлагч биш юм.
  • Хэрэв scanf тусгаарлах тэмдэгттэй тулгарвал оролт зогсох болно. Унших нэгээс олон хувьсагч байгаа бол scanf дараагийн хувьсагчийг уншихад шилжинэ.
  • Оролтын өгөгдлийн форматын өчүүхэн зөрчил нь програмын таамаглашгүй үр дүнд хүргэдэг. За, хэрэв програм зүгээр л алдаагаар дуусвал. Гэхдээ ихэнхдээ програм үргэлжлүүлэн ажиллаж, буруу үйлдэл хийдэг.
  • scanf("%20s …", …); Хэрэв оролтын урсгал 20 тэмдэгтээс хэтэрсэн бол scanf нь эхний 20 тэмдэгтийг уншиж, цуцлах эсвэл заасан бол дараагийн хувьсагчийг уншихад шилжих болно. Энэ тохиолдолд scanf руу дараагийн дуудлага нь scanf руу өмнөх дуудлагын ажил зогссон цэгээс оролтын урсгалыг үргэлжлүүлэн унших болно. Хэрэв эхний 20-ийг уншиж байхдаатэмдэгтүүд байвал, эхний хувьсагчийн хувьд 20 тэмдэгт уншаагүй байсан ч scanf нь дараагийн хувьсагчийг зогсоох буюу үргэлжлүүлэн унших болно. Энэ тохиолдолд уншаагүй бүх тэмдэгтүүдийг дараагийн хувьсагчд хавсаргана.
  • Хэрэв сканнердсан тэмдэгтүүдийн багц "^"-ээр эхэлсэн бол scanf нь тухайн багцын тэмдэгт эсвэл хязгаарлагч тэмдэгттэй тулгарах хүртэл өгөгдлийг уншина. Жишээлбэл, "%[^A-E1-5]" нь А-аас Е хүртэлх англи хэлний том үсгийн аль нэг эсвэл 1-ээс 5 хүртэлх тооны аль нэгтэй тулгарах хүртэл дамжуулалтын өгөгдлийг унших болно.
  • Scanf C функц нь тайлбарласны дагуу хувьсагчид амжилттай бичигдсэн тоотой тэнцэх тоог буцаана. Хэрэв scanf 3 хувьсагч бичвэл функцийн амжилтын үр дүн 3-ын тоог буцаана. Хэрэв scanf ямар нэгэн хувьсагч бичиж чадаагүй бол үр дүн 0 болно. Эцэст нь хэрэв scanf ямар нэг шалтгаанаар огт ажиллаж чадахгүй бол үр дүн EOF байх болно.
  • Хэрэв scanf() функц буруу төгссөн бол. Жишээ нь, scanf("%d", &x) - тоог хүлээж байсан ч тэмдэгтүүдийг оролт болгон хүлээн авсан. Дараагийн scanf() дуудлага нь өмнөх функцийн дуудлага дууссан оролтын урсгалын цэгээс эхэлнэ. Энэ асуудлыг даван туулахын тулд асуудлын дүрүүдээс салах хэрэгтэй. Үүнийг жишээ нь scanf("%s") руу залгах замаар хийж болно. Өөрөөр хэлбэл, функц нь тэмдэгтүүдийн мөрийг уншиж, түүнийг хаях болно. Ийм төвөгтэй аргаар та шаардлагатай өгөгдлийг үргэлжлүүлэн оруулах боломжтой.
  • Scanf()-н зарим хувилбаруудад сканнердсан тэмдэгтийн багцад "-"-г зөвшөөрдөггүй.
  • "%c" тодорхойлогч нь урсгалын тэмдэгт бүрийг уншдаг. Энэ нь мөн тусгаарлагч тэмдэгтийг уншдаг гэсэн үг юм. Хязгаарлагч тэмдэгтийг алгасаад хүссэн тэмдэгтээ үргэлжлүүлэн уншихын тулд "%1s"-г ашиглаж болно.
  • "c" тодорхойлогчийг ашиглахдаа "%10c" өргөнийг ашиглахыг зөвшөөрөх боловч дараа нь char төрлийн элементийн массивыг scanf функцэд хувьсагч болгон дамжуулах ёстой.
  • “%[a-z]” нь “Англи цагаан толгойн бүх жижиг үсэг”, “%[z-a]” нь ердөө 3 тэмдэгт: ‘z’, ‘a’, ‘-’ гэсэн үг. Өөрөөр хэлбэл, "-" тэмдэгт нь зөв дарааллаар байгаа хоёр тэмдэгтийн хооронд байгаа тохиолдолд л мужийг хэлнэ. Хэрэв "-" нь илэрхийллийн төгсгөлд, эхэнд эсвэл тэмдэгтүүдийн аль нэг талд нь буруу дарааллаар байвал энэ нь хүрээ биш зүгээр л зураас тэмдэгт болно.
C++ код
C++ код

Дүгнэлт

Үүгээр scanf C-ийн тайлбарыг дуусгаж байна. Энэ нь жижиг программ дээр ажиллах болон процедурын програмчлалын аргыг ашиглахад тохиромжтой сайхан функц юм. Гэсэн хэдий ч гол сул тал нь scanf ашиглах үед гарч болох урьдчилан таамаглах боломжгүй алдааны тоо юм. Тиймээс програмчлалын үед scanf C-ийн тайлбарыг таны нүдний өмнө хамгийн сайн хадгалдаг. Мэргэжлийн томоохон төслүүдэд iostreams-ийг ашигладаг бөгөөд тэдгээр нь илүү өндөр түвшний чадвартай, алдааг олж илрүүлэх, зохицуулах, мөн их хэмжээний мэдээлэлтэй ажиллах чадвартай байдаг. Орос хэл дээрх scanf C-ийн тайлбарыг олон сүлжээний эх сурвалжаас авах боломжтой, түүнчлэн жишээнүүд нь байгааг тэмдэглэх нь зүйтэй.функцийн насжилтаас шалтгаалан ашиглах. Тиймээс, хэрэв шаардлагатай бол та сэдэвчилсэн форумаас хариултаа олох боломжтой.

Зөвлөмж болгож буй: