從鍵盤到內存
鍵盤輸入“a b c abc回車”
會將鍵盤輸入內容緩存至鍵盤緩存區,等待程序中scanf() 讀取
a | 空格 | b | 空格 | c | 空格 | a | b | c | 回車 |
---|
scanf原型
int scanf(const char * restrict format,...);
返回值爲成功讀取數據個數
例:
#include<stdio.h>
int main()
{
int a,b,c;
printf("%d",scanf("%d %d %d",&a,&b,&c));
}
運行環境:win7、 Dev-C++ 5.11
在用“%c”格式輸入字符時,空白字符(space,tab,newline)和“轉義字符”都作爲有效字符輸入。
輸入:12 w d 回車
運行結果:
scanf中參數中 不屬於格式指令的字符 的作用
空白字符
空白字符會使scanf函數在讀操作中略去輸入中的一個或多個空白字符;
常見使用scanf()賦多值時使用
例(程序讀取時沒有跳過空白字符):
#include<stdio.h>
int main()
{
char a,b,c;
static int num;
scanf("%c%c%c",&a,&b,&c);
printf("讀取到的字符爲:%c,%c,%c;",a,b,c);
}
輸入“a b c回車”
例(程序讀取時使用空白字符做分割):
#include<stdio.h>
int main()
{
char a,b,c;
static int num;
scanf("%c %c %c",&a,&b,&c);
printf("讀取到的字符爲:%c,%c,%c;",a,b,c);
}
輸入:“a b c回車”
a,b之間一個空格,b,c之間兩個空格
輸入“ a b c回車”:
a前面有空格
第一個讀取到的字符爲"空格",讀取到的“空格”後面沒有跟其他空格,所以不需要剔除空格,之間開始第二個字符“a”的讀取,第二個字符後面跟着空格,剔除空格後繼續讀取第三個字符"d"。
可參考 非空白字符在格式說明符後面 部分
非空白字符
一個非空白字符會使scanf()函數在讀入時剔除掉與這個非空白字符相同的字符。
非空白字符在格式說明符後面
讀取到一個字符時,檢測後面是否有參數中的非空白字符,如果有,則剔除掉該字符(只能剔除一次該字符,不能像空白字符一樣可以剔除發多次)。 ``` #include輸入:“atbtct回車”
輸出:
輸入:“ttttttt回車” //輸入7個t
輸出:
t | t | t | t | t | t | t | 回車 |
---|---|---|---|---|---|---|---|
讀取 | 刪除 | 讀取 | 刪除 | 讀取 | 刪除 | 讀取 | 回車 |
非空白字符在格式說明符前面
讀取字符時得先檢測到非空白字符纔會讀取字符(以 t 爲例)。
#include<stdio.h>
int main()
{
char ch;
char chs[100];
static int num;
while(scanf("t%c",&ch))//此處讀取
{
num++;
printf("%c\t",ch);
printf("%d\n",num);
}
scanf("%s",&chs);
printf("剩餘在鍵盤緩衝區的未被讀取的字符爲:\n");
printf("%s\n",chs);
}
輸入:“abcdefg回車”
輸出:
輸入:“tatbcdef回車”
輸出:
補充:
在用“%c”格式輸入字符時,空白字符和“轉義字符”都作爲有效字符輸入。
在用“%s”格式輸入字符時,輸入的字符串中含有空白字符,字符串讀取結束。
參考網址:
關於C/C++ stdin緩衝區以及對字符輸入的一些經驗和心得
https://blog.csdn.net/ShannonNansen/article/details/76090172
百度百科:scanf()
https://baike.baidu.com/item/scanf/10773316?fr=aladdin
scanf函數詳解與緩衝區
https://blog.csdn.net/c_base_jin/article/details/24135463