關於eof和scanf返回值
EOF不是一個字元或者數字什麼的,而是scanf()函式的一個返回值。
所以scanf("%c",&c);再判斷(c==EOF)的做法是無效的,因為scanf()根本不會把EOF當作一個字元寫進c;
正確的判斷條件應該寫作以下形式
(scanf("%c",&c)==EOF)
可以看出EOF就是scanf()的返回值
下面提供用getchar()和scanf()寫的兩種版本的程式碼
1.
#include <stdio.h>
void main()
{
char c[1000];
int cpoint=0;
while (scanf("%c",&c[cpoint])!=EOF)
{
.....
}
2.
#include <stdlib.h>
#include <stdio.h>
void main()
{
char c[1000];
int cpoint=0;
while ((c=getchar())!=EOF)
{
.....
}
關於要按兩次ctrl+Z的問題
這和scanf的讀取機制有關:就是在輸入流中如果存在有可讀的字元,Ctrl+z就不會存放進輸入緩衝區。
這個暫時沒有辦法解決,不過應該不是大問題
2 scanf返回值的問題
scanf("%d%d", &a, &b);
如果a和b都被成功讀入,那麼scanf的返回值就是2
如果只有a被成功讀入,返回值為1
如果a和b都未被成功讀入,返回值為0
如果遇到錯誤或遇到end of file,返回值為EOF。
不經意中發現scanf()的返回值問題,自己試驗和了解了一下,一些所知與各位分享;
void main()
{
int a;
int b;
int c;
int x;
printf("請輸入三個整數:\n");
int x=scanf("%d%d%d",&a,&b,&c);
printf("%d\n%d\n",a,x);
}
1.scanf()函式有返回值且為int型。
2.scanf()函式返回的值為:正確按指定格式輸入變數的個數;也即能正確接收到值的變數個數。
從上邊的例子中可以得到驗證,這裡用變數x接收scanf()函式的返回值,並輸出顯示出來。當執行中輸入三個整數:5 6 7則x的值為3;如果輸入5 6 d(即給c 賦值不正確)則x的值為2;如果輸入5 t d(即給b和c 賦值不正確)則x的值為1;如果輸入d 5 2 則輸出-858993460和0,也就是說第一個字元d輸入錯誤,整個scanf沒有收到輸入值。
其實scanf()的返回值對我們來說也很有用的,比如我們在使用這個函式進行接收值時,我們很必要知道對要給賦值的變數是否正確的賦值成功了,所以可以使用if(scanf("%d,%d",&a,&b)==2)這樣語句來判斷是否正確的給所有的變數賦值了,正確的話才能使用這個變數參與運算,這樣才能提高我們程式碼的安全性,所以這個返回值也是大有用途的
文章出處:DIY部落(http://www.diybl.com/course/3_program/c++/cppxl/20090319/163398.html)