Penerangan fungsi Scanf C
Penerangan fungsi Scanf C

Video: Penerangan fungsi Scanf C

Video: Penerangan fungsi Scanf C
Video: Pengiraan cukai pendapatan 2024, November
Anonim

Dalam artikel ini, fungsi scanf() dianggap dalam bentuk umum tanpa merujuk kepada standard tertentu, jadi data daripada mana-mana piawaian C99, C11, C++11, C++14 disertakan di sini. Mungkin, dalam sesetengah piawai, fungsi berfungsi dengan perbezaan daripada bahan yang dibentangkan dalam artikel.

fungsi scanf C - penerangan

scanf() ialah fungsi yang terletak dalam fail pengepala stdio.h(C) dan cstdio(C++), juga dikenali sebagai input program berformat. scanf membaca aksara daripada aliran input standard (stdin) dan menukarnya mengikut format, kemudian menulisnya kepada pembolehubah yang ditentukan. Format - bermaksud bahawa data ditukar kepada bentuk tertentu setelah diterima. Oleh itu, fungsi scanf C diterangkan:

scanf("%format", &variable1[, &variable2, […]), di mana pembolehubah dihantar sebagai alamat. Sebab untuk cara ini menghantar pembolehubah kepada fungsi adalah jelas: sebagai hasil kerja, ia mengembalikan nilai yang menunjukkan kehadiran ralat, jadisatu-satunya cara untuk menukar nilai pembolehubah adalah dengan melalui alamat. Selain itu, terima kasih kepada kaedah ini, fungsi ini boleh memproses data dalam apa jua jenis.

Sesetengah pengaturcara merujuk kepada fungsi seperti scanf() atau printf() sebagai prosedur kerana analogi dengan bahasa lain.

Scanf membenarkan input semua jenis bahasa asas: char, int, float, rentetan, dsb. Dalam kes pembolehubah rentetan jenis, tidak perlu menyatakan tanda alamat - "&", kerana pembolehubah rentetan jenis ialah tatasusunan, dan namanya ialah alamat elemen pertama tatasusunan dalam memori komputer.

Menggunakan C dalam C++
Menggunakan C dalam C++

Format kemasukan data atau rentetan kawalan

Mulakan dengan melihat contoh fungsi scanf C daripada penerangan.


termasuk int main() { int x; manakala (scanf("%d", &x)==1) printf("%d\n", x); pulangan 0; //keperluan untuk sistem linux }

Format input terdiri daripada empat parameter berikut: jenis %[width][modifiers]. Dalam kes ini, tanda "%" dan jenis adalah parameter wajib. Iaitu, format minimum kelihatan seperti ini: “%s”, “%d” dan seterusnya.

Secara amnya, aksara yang membentuk rentetan format dibahagikan kepada:

  • penentu format - apa-apa sahaja bermula dengan %;
  • aksara memisahkan atau ruang - ia ialah ruang, tab(t), baris baharu (n);
  • aksara selain ruang kosong.

Fungsi mungkin tidak selamat.

Gunakan scanf_s() dan bukannya scanf().

(mesej daripada Visual Studio)

Jenis, atau penentu format, atau aksara penukaran, atau aksara kawalan

kod binari
kod binari

Perisytiharan scanf C mesti mengandungi sekurang-kurangnya penentu format, yang dinyatakan pada akhir ungkapan bermula dengan "%". Ia memberitahu program jenis data yang diharapkan apabila memasuki, biasanya dari papan kekunci. Senarai semua penentu format dalam jadual di bawah.

Jenis Maksud
1 %c

Atur cara sedang menunggu input aksara. Pembolehubah yang hendak ditulis mestilah daripada jenis aksara char.

2 %d Atur cara menjangkakan input nombor perpuluhan jenis integer. Pembolehubah mestilah daripada jenis int.
3 %i Atur cara menjangkakan input nombor perpuluhan jenis integer. Pembolehubah mestilah daripada jenis int.
4 %e, %E Program ini menjangkakan untuk memasukkan nombor titik terapung (koma) dalam bentuk eksponen. Pembolehubah mestilah jenis apungan.
5 %f Program ini menjangkakan nombor titik terapung (koma). Pembolehubah mestilah jenis apungan.
6 %g, %G Program ini menjangkakan nombor titik terapung (koma). Pembolehubah mestilah jenis apungan.
7 %a Program ini menjangkakan nombor titik terapung (koma). Pembolehubah mestilah jenis apungan.
8 %o Program ini menjangkakan nombor perlapanan. Pembolehubah mestilah daripada jenis int.
9 %s Atur cara sedang menunggu rentetan untuk dimasukkan. Rentetan ialah set mana-mana aksara sehingga aksara pemisah pertama ditemui. Pembolehubah mestilah daripada jenis rentetan.
10 %x, %X Program sedang menunggu nombor perenambelasan. Pembolehubah mestilah daripada jenis int.
11 %p Pembolehubah mengharapkan input penuding. Pembolehubah mestilah daripada jenis penunjuk.
12 %n Menulis kepada pembolehubah nilai integer yang sama dengan bilangan aksara yang dibaca setakat ini oleh fungsi scanf.
13 %u

Atur cara membaca integer yang tidak ditandatangani. Jenis pembolehubah mestilah integer tidak ditandatangani.

14 %b Program sedang menunggu nombor perduaan. Pembolehubah mestilah daripada jenis int.
15 % Set aksara yang diimbas. Program sedang menunggu watak untuk dimasukkan.daripada kolam terhad yang ditentukan antara kurungan segi empat sama. scanf akan berfungsi selagi terdapat aksara daripada set yang ditentukan pada aliran input.
16 %% Tandatangani "%".

Watak dalam rentetan format

Kod C++
Kod C++

Simbol bintang ()

Asterisk () ialah bendera yang menunjukkan bahawa operasi tugasan harus ditindas. Asterisk diletakkan sejurus selepas tanda "%". Contohnya,


scanf("%d%c%d", &x, &y); //abaikan aksara antara dua integer. scanf("%s%d%s", str, str2); //abaikan integer antara dua rentetan.

Iaitu, jika anda memasukkan baris "45-20" dalam konsol, program akan melakukan perkara berikut:

  1. Pembolehubah "x" akan diberikan nilai 45.
  2. Pembolehubah "y" akan diberikan nilai 20.
  3. Dan tanda tolak (sempang) "-" akan diabaikan terima kasih kepada "%c".

Lebar (atau lebar medan)

Ini ialah integer antara tanda "%" dan penentu format yang menentukan bilangan maksimum aksara untuk dibaca dalam operasi baca semasa.


scanf("%20s", str); //baca 20 aksara pertama daripada aliran input

Terdapat beberapa perkara penting yang perlu diingat:

  1. scanf akan ditamatkan jika ia menemui aksara pemisah, walaupun ia tidak mengira 20 aksara.
  2. Jika lebih daripada 20 aksara dimasukkan, hanya 20 aksara pertama akan ditulis ke str.

Pengubah suaijenis (atau ketepatan)

kod percikan
kod percikan

Ini ialah bendera khas yang mengubah suai jenis data yang dijangkakan untuk input. Bendera ditentukan di sebelah kiri penentu jenis:

  • L atau l (L kecil) Apabila "l" digunakan dengan penentu d, i, o, u, x, bendera memberitahu program bahawa input int panjang dijangka. Apabila menggunakan "l" dengan penentu e atau f, bendera memberitahu program bahawa ia sepatutnya mengharapkan nilai berganda. Penggunaan "L" memberitahu program bahawa gandaan panjang dijangka. Penggunaan "l" dengan penentu "c" dan "s" memberitahu program bahawa aksara dua bait seperti wchar_t dijangka. Contohnya, "%lc", "%ls", "%l[asd]".
  • h ialah bendera yang menunjukkan jenis pendek.
  • hh - menunjukkan bahawa pembolehubah ialah penunjuk kepada nilai aksara yang ditandatangani atau aksara yang tidak ditandatangani. Bendera boleh digunakan dengan penentu d, i, o, u, x, n.
  • ll (dua L kecil) - menunjukkan bahawa pembolehubah ialah penunjuk kepada nilai jenis int panjang panjang yang ditandatangani atau int panjang panjang yang tidak ditandatangani. Bendera digunakan dengan penentu: d, i, o, u, x, n.
  • j - menunjukkan bahawa pembolehubah ialah penunjuk kepada jenis intmax_t atau uintmax_t daripada fail pengepala stdint.h. Digunakan dengan penentu: d, i, o, u, x, n.
  • z - menunjukkan bahawa pembolehubah ialah penunjuk kepada jenis size_t, yang takrifannya dalam stddef.h. Digunakan dengan penentu: d, i, o, u, x, n.
  • t - menunjukkan bahawa pembolehubah ialah penunjuk kepada jenis ptrdiff_t. Definisi padajenis ini dalam stddef.h. Digunakan dengan penentu: d, i, o, u, x, n.

Lebih jelas lagi, gambar dengan pengubah suai boleh diwakili sebagai jadual. Perihalan scanf C sedemikian untuk pengaturcara akan lebih jelas.

Jenis Penentu dan Pengubahsuai
Jenis Penentu dan Pengubahsuai

Watak lain

Sebarang aksara yang ditemui dalam format akan dibuang. Pada masa yang sama, perlu diperhatikan bahawa kehadiran ruang putih atau aksara pemisah (baris baharu, ruang, tab) dalam rentetan kawalan boleh membawa kepada tingkah laku fungsi yang berbeza. Dalam satu versi, scanf() akan membaca tanpa menyimpan sebarang bilangan pemisah sehingga ia menemui watak selain daripada pemisah, dan dalam versi lain, ruang (hanya mereka) tidak memainkan peranan dan ungkapan "%d + %d" adalah bersamaan dengan "% d+%d".

Contoh kod C++
Contoh kod C++

Contoh

Mari lihat beberapa contoh untuk membantu anda berfikir dan lebih memahami cara fungsi tersebut berfungsi.


scanf("%3s", str); //jika anda memasukkan rentetan "1d2s3d1;3" dalam konsol, hanya "1d2" akan ditulis ke str scanf("%dminus%d", &x, &y); //tolak aksara antara dua nombor akan dibuang scanf("%5[0-9]", str); // aksara akan dimasukkan ke dalam str sehingga terdapat 5 aksara dan aksara adalah nombor dari 0 hingga 9. scanf("%lf", &d); //jangkakan input berganda scanf("%hd", &x); //jangkaan bilangan jenis short scanf("%hu", &y); //expect unsigned number short scanf("lx", &z); //jangkaan bilangan jenis int panjang

DariContoh di bawah menunjukkan cara nombor yang dijangka berubah menggunakan simbol yang berbeza.

scanf C - penerangan untuk pemula

Bahagian ini berguna untuk pemula. Selalunya anda tidak perlu mempunyai huraian lengkap scanf C tetapi butiran cara fungsi berfungsi.

  • Ciri ini agak usang. Terdapat beberapa pelaksanaan berbeza dalam perpustakaan versi berbeza. Contohnya, fungsi scanf S C yang dipertingkatkan, penerangan mengenainya boleh didapati di tapak web microsoft.
  • Bilangan penentu dalam format mesti sepadan dengan bilangan argumen yang dihantar ke fungsi.
  • Elemen strim input mesti dipisahkan hanya dengan aksara pemisah: ruang, tab, baris baharu. Koma, koma bertitik, noktah, dsb. - aksara ini bukan pemisah untuk fungsi scanf().
  • Jika scanf menemui aksara pemisah, input akan dihentikan. Jika terdapat lebih daripada satu pembolehubah untuk dibaca, maka scanf akan meneruskan membaca pembolehubah seterusnya.
  • Sedikit ketidakselarasan dalam format data input membawa kepada keputusan program yang tidak dapat diramalkan. Nah, jika program itu hanya berakhir dengan ralat. Tetapi selalunya program ini terus berfungsi dan melakukan kesalahan.
  • scanf("%20s …", …); Jika aliran input melebihi 20 aksara, maka scanf akan membaca 20 aksara pertama dan sama ada membatalkan atau meneruskan membaca pembolehubah seterusnya, jika satu dinyatakan. Dalam kes ini, panggilan seterusnya ke scanf akan meneruskan membaca aliran input dari titik di mana kerja panggilan sebelumnya ke scanf berhenti. Jika apabila membaca 20 yang pertamaaksara, aksara pembatas ditemui, scanf akan membatalkan atau meneruskan membaca pembolehubah seterusnya, walaupun ia tidak membaca 20 aksara untuk pembolehubah pertama. Dalam kes ini, semua aksara yang belum dibaca akan dilampirkan pada pembolehubah seterusnya.
  • Jika set aksara yang diimbas bermula dengan "^", maka scanf akan membaca data sehingga ia menemui aksara pembatas atau aksara daripada set. Contohnya, "%[^A-E1-5]" akan membaca data daripada strim sehingga salah satu aksara Inggeris huruf besar dari A hingga E atau salah satu nombor dari 1 hingga 5 ditemui.
  • Fungsi scanf C, seperti yang diterangkan, mengembalikan nombor yang sama dengan bilangan penulisan yang berjaya kepada pembolehubah. Jika scanf menulis 3 pembolehubah, maka hasil kejayaan fungsi akan mengembalikan nombor 3. Jika scanf tidak dapat menulis sebarang pembolehubah, maka hasilnya akan menjadi 0. Dan, akhirnya, jika scanf tidak dapat dimulakan sama sekali atas sebab tertentu, hasilnya ialah EOF.
  • Jika fungsi scanf() berakhir dengan salah. Contohnya, scanf("%d", &x) - nombor telah dijangkakan, tetapi aksara telah diterima sebagai input. Panggilan scanf() seterusnya akan bermula pada titik dalam aliran input di mana panggilan fungsi sebelumnya ditamatkan. Untuk mengatasi masalah ini, perlu menyingkirkan watak masalah. Ini boleh dilakukan, sebagai contoh, dengan memanggil scanf("%s"). Iaitu, fungsi akan membaca rentetan aksara dan membuangnya. Dengan cara yang rumit ini, anda boleh terus memasukkan data yang diperlukan.
  • Dalam sesetengah pelaksanaan scanf(), "-" tidak dibenarkan dalam set aksara yang diimbas.
  • Penentukan "%c" membaca setiap aksara daripada strim. Iaitu, ia juga membaca watak pemisah. Untuk melangkau aksara pembatas dan meneruskan membaca aksara yang diingini, anda boleh menggunakan "%1s".
  • Apabila menggunakan penentu "c", adalah dibenarkan untuk menggunakan lebar "%10c", tetapi kemudian tatasusunan unsur jenis aksara mesti dihantar sebagai pembolehubah kepada fungsi scanf.
  • “%[a-z]” bermaksud “semua huruf kecil abjad Inggeris”, dan “%[z-a]” bermaksud hanya 3 aksara: ‘z’, ‘a’, ‘-’. Dalam erti kata lain, aksara "-" bermaksud julat hanya jika ia berada di antara dua aksara yang berada dalam susunan yang betul. Jika "-" berada di penghujung ungkapan, pada permulaan atau dalam susunan aksara yang salah pada kedua-dua belahnya, maka ia hanyalah aksara sempang, bukan julat.
Kod C++
Kod C++

Kesimpulan

Ini menyimpulkan perihalan scanf C. Ini adalah ciri berguna yang bagus untuk bekerja dalam program kecil dan apabila menggunakan kaedah pengaturcaraan prosedur. Walau bagaimanapun, kelemahan utama ialah bilangan ralat yang tidak dapat diramalkan yang boleh berlaku apabila menggunakan scanf. Oleh itu, perihalan scanf C apabila pengaturcaraan sebaiknya disimpan di depan mata anda. Dalam projek profesional yang besar, iostreams digunakan, kerana fakta bahawa mereka mempunyai keupayaan tahap yang lebih tinggi, mereka lebih mampu menangkap dan mengendalikan ralat, dan juga berfungsi dengan sejumlah besar maklumat. Perlu juga diperhatikan bahawa perihalan scanf C dalam bahasa Rusia tersedia pada banyak sumber rangkaian, serta contoh-contohnyapenggunaan, kerana umur fungsi. Oleh itu, jika perlu, anda sentiasa boleh mencari jawapan di forum tematik.

Disyorkan: