網站首頁 編程語言 正文
問題描述
我們經常在C語言輸入的時候,會發現scanf講空格或者回車“吃掉”了,導致程序的運行結果與預期不一致
以下面一個簡單例子為例
#include<stdio.h>
char str[10];
int main()
{
int i;
for(i=0;i<10;i++)
{
scanf("%c",&str[i]);
}
for(i=0;i<10;i++)
{
printf("%c",str[i]);
}
return 0;
}
這個程序,獲取10個數,然后打印出來
如果我們正常的輸入10個字符,打印正常
如果我們輸入a,然后回車,再輸入b,再回車… ,結果只能輸入5個字符,這就是我們經常說的Scanf吃掉了你的回車
那么我們首先來了解一下scanf語句:
scanf
scanf()函數是格式輸入函數,即按用戶指定的格式從標準輸入設備(鍵盤) 上把數據輸入到指定地址的變量中。
讀取方式:
一般格式為:scanf(格式控制,地址列表) 也就是scanf("%?",&?); 可以讀取相對于類型的數值并且存儲到制定變量,并且可以讀取多個數值,如數字,字符,字符串等 ,每次用到scanf‘時,他都會從數據緩存區讀取一個或多個字符,并存入相對應的變量中
注意:
- scanf()在讀取數字時會跳過空格、制表符和換行符!
- %c只能輸出或輸入一個字符,%s輸出的是一串字符還有就是char a; string s;輸入的時候scanf("%c",&a);這里的&不能少,而scanf("%s",s);這里不能有&符號
重點:
scanf遇到 回車(enter),空格,TAB 就會結束一次輸入,空格不會接收
并且, scanf在一次輸入結束后,不會舍棄最后的回車符(即回車符會殘留在數據緩沖區中)
看下方程序
#include <stdio.h>
int main(){
char c1,c2;
scanf("%c %c",&c1,&c2); //這里有一個空格
printf("%d %d\n",c1,c2);
scanf("%c%c",&c1,&c2); //這里沒有空格
printf("%d %d\n",c1,c2);
return 0;
}
第一次輸入a和b正常,沒有問題,但是第二次就出現問題了,
scanf單字符輸入時規定只接收一個字符,所以第一次輸入a b 時 ,第一個scanf("%c %c")之間有一個空格,所以在輸入字符a之后,我們可以輸入空格,enter,,scanf都會自動忽略它(那個空格會讀取停止字符并釋放掉),所以第一次輸入正常,但它卻把回車符也作為字符對待的。
在我們輸入完b之后按回車(Enter),這個回車符是放在緩沖區的,并且不會舍棄最后的回車符,此時的數據緩存區中還殘存著一個回車符,
第二次調用scanf("%c%c",&c1,&c2);是從緩沖區中取兩個字符,首先把第一次調用scanf("%c%c",&c1,&c2);后輸入的回車當作輸入字符賦值給c1 ,之后把a賦值給了c2
這就在輸入邏輯上造成了混亂。
我們這樣改一下
#include <stdio.h>
int main(){
char c1,c2;
scanf("%c %c",&c1,&c2); //這里有一個空格
printf("%d %d\n",c1,c2);
scanf(" %c %c",&c1,&c2); //這里也有了空格
printf("%d %d\n",c1,c2);
return 0;
}
在第二個scanf中添加了兩個空格 然后我們正常輸入
scanf(" %c",&c)前面這個空格(換成\n或者\t也可以),這樣就把緩沖區中的回車當成第一個字符,讀取后丟掉?
可以很好理解scanf中 空格的作用
空格( )即為讀取一個結束字符然后丟掉,而普通的字符不受影響
用好之后可以避免很多程序BUG
那么現在各位應該知道上方的程序怎么改了
在對應位置加好空格就可以了,
這個問題的解決雖然簡單,但是整個問題出現與解決的原因,才是我們需要學習的,不能只拘束與添加一個空格,而應該清楚的明白其內部的原理,這是我們學習所必須的一個品質。
原文鏈接:https://blog.csdn.net/as480133937/article/details/102625223
相關推薦
- 2022-08-10 如何利用SQL語句創建數據庫詳解_數據庫其它
- 2022-09-26 Go并發同步Mutex典型易錯使用場景_Golang
- 2022-05-27 C++?超詳細深入分析單例模式_C 語言
- 2022-08-15 使用volatile保證多線程之間實例變量的可見性
- 2022-07-09 Android同步異步任務與多線程和Handler消息處理機制
- 2022-04-21 MongoDB高效讀寫海量數據的方法_MongoDB
- 2022-09-07 解析react?函數組件輸入卡頓問題?usecallback?react.memo_React
- 2022-09-09 Python?OpenCV?Hough直線檢測算法的原理實現_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支