2024 Pengarang: Howard Calhoun | [email protected]. Diubah suai terakhir: 2024-01-17 19:02
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.
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
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
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:
- Pembolehubah "x" akan diberikan nilai 45.
- Pembolehubah "y" akan diberikan nilai 20.
- 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:
- scanf akan ditamatkan jika ia menemui aksara pemisah, walaupun ia tidak mengira 20 aksara.
- Jika lebih daripada 20 aksara dimasukkan, hanya 20 aksara pertama akan ditulis ke str.
Pengubah suaijenis (atau ketepatan)
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.
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
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.
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:
Teknologi pengeluaran: penerangan konsep, pembangunan, pembangunan, fungsi
Di bawah istilah "teknologi pengeluaran" terdapat tafsiran yang berbeza. Selalunya konsep ini dikaitkan dengan proses pengeluaran yang berat, industri. Tetapi sebenarnya, teknologi adalah terutamanya kemahiran, kemahiran, kaedah. Jika kita menterjemah perkataan "technos" daripada bahasa Yunani, pilihan tambahan untuk mentafsir konsep ini akan terbuka: seni dan logik. Akibatnya, teknologi pengeluaran adalah satu set cara, teknik dan kaedah untuk mencipta produk, produk
Sharapovo, pusat pengisihan: di mana ia, penerangan, fungsi
Hari ini, kebanyakan orang lebih suka membeli-belah dalam talian. Bungkusan dihantar melalui Pos Rusia. Kesemua mereka melalui pusat pengedaran khas. Untuk mel antarabangsa, terdapat pusat pengisihan di Sharapovo. Mana taknya, hari ni kita bincang
Proses pengurusan - penerangan, objektif, fungsi dan definisi
Semua sistem perusahaan mempunyai struktur organisasi mereka sendiri, yang mana terdapat proses pengurusan. Setiap orang yang telah memilih kerjaya sebagai pengurus dan ingin mencapai prestasi tinggi di dalamnya perlu mengetahui tentang proses pengurusan
Pegangan media Rusia: senarai, penerangan, ciri fungsi
Perniagaan media Rusia secara amnya berkembang mengikut senario Barat, jadi sejak akhir abad ke-20 terdapat penyatuan pasaran yang kukuh dan kemunculan pegangan media utama Rusia. Mari kita bercakap tentang di tangan siapa kuasa "keempat" tertumpu hari ini, dan bagaimana syarikat media berbeza berbeza
Pengkelasan fungsi pengurusan: definisi konsep, intipati dan fungsi
Pengurusan ialah proses yang kompleks dan pelbagai aspek. Mengapa ia diperlukan dan apakah intipatinya? Mari kita bincangkan tentang konsep dan klasifikasi fungsi kawalan, pertimbangkan pendekatan untuk masalah ini dan cirikan fungsi utama