บันทึกการบรรยาย ? - . fail() clear() ? ? , , . . eof() และ strchr()
1 และมา . fail() cin . eof()
ส่วนของ C input การประมวลผลฟังก์ชันซิน . fail() . นี้จะไม่เป็นศูนย์ ( จริง ) ถ้ามาสั่งสุดท้ายล้มเหลว และเป็นศูนย์ ( เท็จ ) มิฉะนั้น เมื่อคุณถึงจุดสิ้นสุดของไฟล์และพยายามที่จะอ่านอะไร นี่คือช่วงเวลาที่คลาสสิกสำหรับซิน . fail() . เห็นโปรแกรม cinfail . cpp :
>
< iostream #รวมใช้ namespace std ;
สาย int main() { ;
1 I ;
i = 0 ;
ในขณะที่ ( 1 ) {
i ;
cin > > S ;
( ถ้ามา . fail() ) กลับ 0 ;
" สตริง เคาท์ < < " < < < < " : " < < s < < Endl ;
}
}
คุณจะทราบว่าเมื่อคุณเรียกใช้นี้จะสิ้นสุดลงเมื่อสิ้นสุดของแฟ้มที่ได้รับถึงเพราะ ? . fail() ผลตอบแทนที่แท้จริงที่นี่ :
Unix > G cinfail . cpp
Unix > แมว input-1 . txt
แมวเท้ากรงเล็บเหล็ก ประสาทศัลยแพทย์ กรี๊ดมาก
paranoias ยาพิษที่ประตู schizoid
ผู้ชายศตวรรษที่ 21 a.out
Unix > < input-1 . txt สตริงสตริงแมว
1 : 2 : 3 : เหล็กเชือกเท้า
สาย 4 สาย 5 :
: กรงเล็บ ประสาทศัลยแพทย์
6
: ร้องสตริงสตริง 7 :
8
9 : สตริงสตริง : ที่ 10 : paranoias
สตริงสตริงสตริง 12 : 11 : ยาพิษ
13 ประตู สตริงสตริงสตริงศตวรรษที่ 21
14 : 15 : schizoid
สาย 16 : ผู้ชาย >
.
UNIX มา .fail() ยังกลับ 1 ถ้าคุณลองอ่านจำนวนเต็มและได้รับบางสิ่งบางอย่างที่ไม่สามารถแปลงเป็นจำนวนเต็ม ตัวอย่างเช่น เห็น cinfail2 . cpp :
< >
#รวมถึง iostream ใช้ namespace std ;
1 main()
{
1 J ;
1 I ;
i = 0 ;
ในขณะที่ ( 1 ) {
i ;
cin > > J ;
( ถ้ามา . fail() ) กลับ 0 ;
" จำนวนเต็ม เคาท์ < < " < < < < " " < < < < Endl J ;
}
}
เมื่อเราเรียกใช้มันบน input-2.txt ,คุณเห็นว่า มันลาออกหลังจากอ่านคำที่เจ็ด เพราะนั่นไม่ใช่จำนวนเต็ม :
Unix > G cinfail2 . cpp
Unix > แมว input-2 . txt
30 40 50 60 70 - 100 เฟรด 99 88 77 66
Unix > a.out < input-2 . txt
จำนวนเต็มจำนวนเต็ม 1 : 30 : 40 2 3 : 50
จำนวนเต็มจำนวนเต็ม 4 : 60
จำนวนเต็มจำนวนเต็ม 5 : 6 : 70 - 100
Unix >
ดังนั้น คุณทราบได้อย่างไรถ้าคุณอ่านคำที่ป้อนไม่ถูกต้อง หรือ ถ้าคุณกำลังที่ส่วนท้ายของแฟ้มนี้คือเมื่อคุณใช้ ? และ . eof() cin . clear() . ก่อนมา . eof() กลับ 1 ถ้าคุณพยายามที่จะอ่านอะไร แต่ที่ส่วนท้ายของไฟล์ ? 2 . clear() ใช้ชัดเจน " รัฐ " ข้อผิดพลาดของซิน . ในคำอื่น ๆเมื่อมีการป้อนข้อมูลความล้มเหลวเกิดขึ้นมา . fail() ส่งกลับจริง บัฟเฟอร์ ( ? ) อยู่ในรัฐ " ข้อผิดพลาด "และการประมวลผลข้อมูลเพิ่มเติมจะไม่ทำงานจนกว่าคุณจะล้างสถานะ โดยเรียกมา . clear() . ใช้ร่วมกับซิน . fail() cin , และ . eof() cin . clear() ให้คุณกระบวนการและข้อผิดพลาดการตรวจสอบความหลากหลายของการป้อนข้อมูล ตัวอย่างเช่น cinfail3.cpp ด้านล่างอ่านจำนวนเต็มในแฟ้มและพิมพ์พวกเขาออก มันใช้ fail() / ? ? . . clear() เพื่อตรวจสอบ และละเว้นไม่เต็ม และใช้ cin .eof() ค้นพบที่จุดสิ้นสุดของแฟ้ม :
< >
#รวมถึง iostream ใช้ namespace std ;
1 main()
{
1 J ;
1 I ;
สตริงโง่ ;
ฉัน = 0 ;
ในขณะที่ ( 1 ) {
cin > > J ;
( ถ้า ! ซิน . fail() ) {
i ;
" จำนวนเต็ม เคาท์ < < " < < < < " " < < < < Endl J ;
} อีก ถ้าซิน . eof() ) {
} อื่น { 0 กลับ ;
ซิน . clear() ;
cin > > หุ่น
} }
; }
เมื่อเราเรียกใช้มันบน input-3.txt , คุณจะเห็นว่ามันเป็นสัญญา :
ยูนิกซ์ > G cinfail3 . cpp
Unix > แมว input-3 . txt
ดำ 100 เป็น 50 25 มืด 12 กลางคืน - เธอ 0 - 500
Unix > a.out < input-3 . txt
จำนวนเต็มจำนวนเต็ม 1 : 100 2 : 50 : 25
3
จำนวนเต็มจำนวนเต็ม 4 : 12
จำนวนเต็ม 5 : - 5
0
จำนวนเต็มจำนวนเต็ม 6 : 7 : - 500
Unix >
2 strchr() เพื่อตรวจสอบหนึ่งของพวงของตัวละคร
ที่นี่เป็นเคล็ดลับที่ดี สมมติว่าคุณต้องการที่จะทราบว่าตัวละครเป็นหนึ่งในตัวละคร ' 0 ' , ' ' ,' B ' , ' ' , ' ' หรือ ' / ' ดีวิธีหนึ่งในการทดสอบนี้คือการทำพวงของถ้างบ วิธีอื่น ๆคือการใช้ strchr() . จำได้ว่า strchr ( s , c ) จะชี้ไปยังอินสแตนซ์แรกของ C ใน s และมันกลับ null ถ้า c ไม่ . ดังนั้น , ถ้าคุณต้องการที่จะดำเนินการทดสอบข้างต้น คุณสามารถพูดได้ :
( ถ้า strchr ( " 0ab : / " c ) = null )
ถ้ากลับมาจริง แล้ว C เป็นหนึ่งในที่ต้องการอักขระ มิฉะนั้นมันไม่ได้ .
ตัวอย่างเช่น สมมติว่า เราต้องการที่จะเขียนโปรแกรมที่ผู้ใช้ระบุบัตรที่พิมพ์ยศและชุด เช่น " อา " Ace ของหัวใจและ " 2C " สำหรับสองของคลับ แล้วรหัสคำนวณการ์ดในเด็ค อันดับที่ 2 คือ 0 และเป็นบัตรเป็นบัตร 51 นี่คือวิธีที่จะทำมัน ( ใน readcard . cpp ) :
#รวม < iostream >
< >
#รวมถึงซีสตริงค์ใช้ namespace std นะ
;การจัดอันดับ Const char * = " 23456789tjqka " ;
Const char * ชุด = " cdhs " ;
Const char * longranks [ 13 ] = / / เรย์ของ char * สตริง ( c-style )
{ " สอง " , " สาม " , " 4 " , 5 " , 6 " , " เจ็ด " " แปด " , " เก้า "
" สิบ " , " แจ็ค " , " ราชินี " , " King " , " เอซ " } ;
Const char * longsuits [ 4 ] = / / เรย์ของ char * สตริง ( c-style )
{ " คลับ " , " เพชร " , " หัวใจ " " เสียม " } ;
1 main()
{
สาย ;Const char * STR ; / / STR จะชี้ไปที่ c-style สาย int cnum
;
ตอนที่ ( 1 ) {
< " ใส่การ์ด เคาท์ " ;
cin > > S ;
c_str() STR = S ;
( ถ้า strlen ( STR ) = 2 ) {
เคาท์ < < " การ์ดจะเหมาะกับรูปแบบ ' อันดับ ' เช่น ' อา ' หรือ ' 2 C ' n " ;
} อื่นถ้า ( strchr ( ตำแหน่ง STR [ 0 ] ) = = null ) { / / เช็คอันดับ เคาท์ < <
" ตำแหน่งต้อง อันดับหนึ่งของ " < < < < Endl ;
} อื่นถ้า ( strchr ( ชุดSTR [ 1 ] ) = = null ) { / / ตรวจสอบ เคาท์ชุด
< < " ชุดคงเป็นชุด " < < < < Endl ; } อื่น {
cnum = ( strchr ( ชุด STR [ 1 ] ) - ชุด ) * 13
( strchr ( STR [ 0 ตำแหน่ง การจัดอันดับ ) ;
- ] ) < < " ดี เคาท์การ์ด# cnum " < < < < " : " < <
longranks cnum % [ 13 ] < < " " < < longsuits [ cnum / 13 ] < < " N " } ;
}
}
หมายเหตุ ใช้ตัวชี้ตำแหน่งและจำนวนที่จะได้รับชุด การศึกษานั้นอย่างระมัดระวังมันเป็นเคล็ดลับที่ดีที่จะรู้
นี่คือตัวอย่างของมันวิ่ง :
Unix > G readcard . cpp
Unix > a.out
ใส่บัตร : อ่า
ดีบัตร : # 38 : Ace ของหัวใจ
ใส่บัตร : 2c
ดีบัตร : # 0 : 2 แห่ง คลับ
ใส่บัตร : 7s
ดีบัตร : # 44 : เจ็ดโพดำ
ดีใส่บัตร : TD บัตร : 21 # : สิบข้าวหลามตัด
ใส่บัตร : YS
ยศต้องเป็นหนึ่งใน 23456789tjqka
ใส่บัตร : ไทชุดจะต้องเป็นหนึ่งใน cdhs
ใส่บัตร : เฟร็ด
การ์ดต้องรูปแบบ ' ชุด ' อันดับเช่น ' อา ' หรือ ' 2 C '
ใส่บัตร :
c
Unix >
การแปล กรุณารอสักครู่..
