程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c語言scanf()停止接受輸入及scanf("%c",&c)吃掉回車或者空格字符的問題

c語言scanf()停止接受輸入及scanf("%c",&c)吃掉回車或者空格字符的問題

編輯:關於C語言

c語言scanf()停止接受輸入及scanf("%c",&c)吃掉回車或者空格字符的問題


scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,並按回車後結束)。
① 遇空格、“回車”、“跳格”鍵。
② 遇寬度結束。
③ 遇非法輸入。 問題二:scanf()函數不能正確接受有空格的字符串?如: I love you!
#include
int main()
{
char str[80];

scanf("%s",str);
printf("%s",str); return 0;
} 輸入:I live you!
輸出:I scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,並按回車後結束)。
① 遇空格、“回車”、“跳格”鍵。
② 遇寬度結束。
③ 遇非法輸入。 所以,上述程序並不能達到預期目的,scanf()掃描到"I"後面的空格就認為對str的賦值結束,並忽略後面的"love you!".這裡要注意是"love you!"還在鍵盤緩沖區(關於這個問題,網上我所見的說法都是如此,但是,我經過調試發現,其實這時緩沖區字符串首尾指針已經相等了,也就是說緩沖區清空了,scanf()函數應該只是掃描stdin流,這個殘存信息是在stdin中)。我們改動一下上面的程序來驗證一下: #include
int main()
{
char str[80];
char str1[80];
char str2[80];

scanf("%s",str);/*此處輸入:I love you! */
printf("%s",str);
sleep(5);/*這裡等待5秒,告訴你程序運行到什麼地方*/
scanf("%s",str1);/*這兩句無需你再輸入,是對鍵盤盤緩沖區再掃描 */
scanf("%s",str2);/*這兩句無需你再輸入,是對鍵盤盤緩沖區再掃描 */
printf("/n%s",str1);
printf("/n%s",str2);
return 0;
} 輸入:I love you!
輸出:I
love
you! 好了,原因知道了,那麼scanf()函數能不能完成這個任務?回答是:能!別忘了scanf()函數還有一個 %[] 格式控制符(如果對%[]不了解的請查看本文的上篇),請看下面的程序: #include "stdio.h"
int main()
{
char string[50];

/*scanf("%s",string);不能接收空格符*/
scanf("%[^/n]",string);
printf("%s/n",string);
return 0;
} 問題三:鍵盤緩沖區殘余信息問題
#include
int main()
{
int a;
char c; do
{
scanf("%d",&a);
scanf("%c",&c);
printf("a=%d c=%c/n",a,c);
/*printf("c=%d/n",c);*/
}while(c!='N');
} scanf("%c",&c);這句不能正常接收字符,什麼原因呢?我們用printf("c=%d/n",c);將C用int表示出來,啟用printf("c=%d/n",c);這一句,看看scanf()函數賦給C到底是什麼,結果是 c=10 ,ASCII值為10是什麼?換行即/n.對了,我們每擊打一下"Enter"鍵,向鍵盤緩沖區發去一個“回車”(/r),一個“換行"(/n),在這裡/r被scanf()函數處理掉了(姑且這麼認為吧^_^),而/n被scanf()函數“錯誤”地賦給了c. 解決辦法:可以在兩個scanf()函數之後加個fflush(stdin);,還有加getch(); getchar();也可以,但是要視具體scanf()語句加那個,這裡就不分析了,讀者自己去摸索吧。但是加fflush(stdin);不管什麼情況都可行。 函數名: fflush
功 能: 清除一個流
用 法: int fflush(FILE *stream); #include
int main()
{
int a;
char c; do
{
scanf("%d",&a);
fflush(stdin);
scanf("%c",&c);
fflush(stdin);
printf("a=%d c=%c/n",a,c); }while(c!='N');
} 這裡再給一個用“空格符”來處理緩沖區殘余信息的示例: 運行出錯的程序: #include
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf("%c",&j);/*這裡%前沒有空格*/
}
} 使用了空格控制符後: #include
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf(" %c",&j);/*注意這裡%前有個空格*/
}
} 可以運行看看兩個程序有什麼不同。 問題四 如何處理scanf()函數誤輸入造成程序死鎖或出錯? #include
int main()
{
int a,b,c; /*計算a+b*/ scanf("%d,%d",&a,&b);
c=a+b;
printf("%d+%d=%d",a,b,c);
} 如上程序,如果正確輸入a,b的值,那麼沒什麼問題,但是,你不能保證使用者每一次都能正確輸入,一旦輸入了錯誤的類型,你的程序不是死鎖,就是得到一個錯誤的結果,呵呵,這可能所有人都遇到過的問題吧? 解決方法:scanf()函數執行成功時的返回值是成功讀取的變量數,也就是說,你這個scanf()函數有幾個變量,如果scanf()函數全部正常讀取,它就返回幾。但這裡還要注意另一個問題,如果輸入了非法數據,鍵盤緩沖區就可能還個有殘余信息問題。 正確的例程: #include
int main()
{
int a,b,c; /*計算a+b*/

while(scanf("%d,%d",&a,&b)!=2)fflush(stdin);
c=a+b;
printf("%d+%d=%d",a,b,c);
}

#include
void main(){
 int a;
 char b;
 printf("input a integer\n");
 scanf("%d",&a);
 //這裡需要吸收 回車符  下面有種方法,第二種我沒看懂 誰能改下代碼 告訴我第二種怎麼用
 printf("input a char\n");
 scanf("%c",&b);
 printf("%d,%c\n",a,b);
 
}
/*
(1)用getchar()清除
(2)用"%1s"來限制
(3)用格式串中空格或"%*c"來"吃掉"
(4)用函數fflush(stdin)清除全部剩余內容
*/
#include
int main(){ 
 
 int a;
 char b;

 printf("input a integer\n");
 scanf("%d",&a);
 //這裡需要吸收 回車符  下面有種方法,第二種我沒看懂 誰能改下代碼 告訴我第二種怎麼用
 printf("input a char\n");
 scanf("%1s",&b);

 printf("%d %c\n",a,b);
 system("pause");
 return 0;
 
}
環境(dev c++)

測試結果

\\

可以看出a的值異常了,為什麼呢?<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+CtXi06a4w7rNseDS68b309C52M+1o6zS8s6qJTFztcTK5Mjrt73KvbXEzsrM4qGjPC9wPgo8cD4KveK+9re9t6jT0MG91tajujwvcD4KPHA+CrXa0rujujwvcD4KPHA+CjwvcD4KCgoKPHN0cm9uZz5bY3BwXTwvc3Ryb25nPiB2aWV3CiBwbGFpbmNvcHkKCgoKCjxvbCBzdGFydD0="1" class="dp-cpp">

  • char b;
  • int a;
    將這兩個變量的聲明換一下,哈哈,以前老師說過。但我感覺著不是解決方法,如果還有其他的變量,這種方式是不是還會危害其他呢。

    第二:

    [cpp] view plaincopy
    1. #include
    2. int main(){
    3. int a;
    4. char b[2];
    5. printf("input a integer\n");
    6. scanf("%d",&a);
    7. //這裡需要吸收 回車符 下面有種方法,第二種我沒看懂 誰能改下代碼 告訴我第二種怎麼用
    8. printf("input a char\n");
    9. scanf("%1s",&b);
    10. printf("%d %c\n",a,b[0]);
    11. system("pause");
    12. return 0;
    13. }
      b聲明成字符創的形式,哈哈,這個好。。。。

      結果為:



    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved