Menghantar ke Unsigned Char Sebelum Memanggil Fungsi Manipulasi Watak
Dalam C , persoalan timbul sama ada perlu membuang argumen char ke unsigned char sebelum menggunakan fungsi seperti toupper() dan tolower() daripada
Sesetengah pakar berpendapat bahawa pemutus adalah penting untuk mengelakkan tingkah laku yang tidak ditentukan. Menurut piawaian C, hujah yang dihantar kepada toupper() mesti boleh diwakili sebagai aksara tidak bertanda atau sama dengan EOF. Jika hujah itu mempunyai nilai lain, gelagat itu tidak ditentukan.
Acara biasa boleh mempunyai sama ada perwakilan yang ditandatangani atau tidak ditandatangani, dan jika ia ditandatangani, nilai aksara negatif boleh menyebabkan gelagat yang tidak ditentukan apabila diserahkan kepada toupper(). Ini berlaku kerana toupper() menjangkakan hujah int dan penukaran tersirat bagi aksara bertanda negatif kepada int menghasilkan nilai negatif.
Sebagai contoh, diberikan permulaan:
string name = "Niels Stroustrup";
The ungkapan toupper(nama[0]) adalah berisiko jika aksara biasa ditandatangani kerana nama[0] mungkin negatif. Untuk mengelakkan perkara ini, penghantaran ke aksara yang tidak ditandatangani disyorkan:
char c = name[0]; c = toupper((unsigned char)c);
Pakar lain berpendapat bahawa penghantaran tidak diperlukan. Mereka menunjukkan bahawa piawaian C menjamin nilai bukan negatif untuk ahli set aksara asas. Oleh itu, untuk rentetan yang dimulakan dengan aksara yang sah, tiada risiko kelakuan yang tidak ditentukan.
Bjarne Stroustrup sendiri menunjukkan cara menggunakan toupper() tanpa menghantar dalam bukunya, "The C Programming Language." Dia nampaknya menganggap bahawa char tidak ditandatangani, tetapi ini tidak selalu berlaku.
Dalam
Akhirnya, pendekatan yang betul bergantung pada platform dan pelaksanaan pengkompil. Jika ragu-ragu, menghantar ke unsigned char ialah amalan yang selamat dan konservatif untuk mengelakkan tingkah laku yang tidak ditentukan apabila memanggil fungsi manipulasi aksara seperti toupper() dan tolower().
Atas ialah kandungan terperinci Sekiranya Anda Menghantar `char` ke `unsigned char` Sebelum Menggunakan `toupper()` dan `tolower()` dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!