讀古今文學網 > C語言解惑 > 2.6 字符輸入要搞特殊化 >

2.6 字符輸入要搞特殊化

在例2.7中的語句


scanf
("%d%d%d"
,&a
,&b
,&c
);
  

中,只要不在最後留有空格,都不影響數字輸入。如果要按格式輸入,可以在格式說明中給出,例如在語句


scanf
("%d%d%d"
,&a
,&b
,&c
);
  

中,要求輸入數據用「,」隔開。對於字符而言,語句


scanf
("%c%c%c"
,&c1
,&c2
,&c3
);
  

則要求三個字符之間不能用空格隔開,但對於語句


scanf
("%c %c %c"
,&c1
,&c2
,&c3
);
  

而言,既可以連續輸入,也可以用空格隔開,即輸入


abc
  

和使用空格隔離的輸入


a b c 
(包括ab c
和a bc
)
  

是等效的。最有意義的是:還可以用回車一個一個地輸入,即


a
b
c
  

但是在一行輸入時,第1個輸入不能留空格,即「abc」將會得到輸出「a,b」。

試想一想,下面的語句會出現何種現象?


scanf
(" %c %c %c"
,&c1
,&c2
,&c3
);
  

這個語句非常有意義,它不僅能適應上述4種輸入形式,還可以有第5種方式,即可以先按回車,然後再使用4種方式的任意一種輸入。下面這個程序將體現它這個非常有用的特點。

【例2.8】分析下面的程序是否正確。


#include <stdio.h>
void main
()
{
          char c1
;
          for
(;;){
               printf
("
繼續則輸入Y
:"
);
               scanf
("%c"
,&c1
);
               if
(c1
!='Y'
) break
;
               printf
("go on\n"
);
        }
           printf
("go out\n"
);
  }
  

【分析】程序語法沒有錯誤,能通過編譯,但運行結果有時正確有時錯誤,例如:


繼續則輸入Y
:
Y
go on
繼續則輸入Y
:go out
  

第2次詢問,不等用戶輸入就錯誤地結束循環,輸出go out。這就是這兩條語句相遇碰到的問題,但利用空格就能解決,即改為


scanf
("  %c"
,&c1
);
  

能得到正確的結果。運行示例如下。


繼續則輸入Y
:Y
go on
繼續則輸入Y
:Y
go on
繼續則輸入Y
:a
go out
  

由此可見,用空格能很好地解決這個問題。