青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 19,  comments - 21,  trackbacks - 0

 

摘要:

本文闡述了基于ANSIWin 95Win NT上的 C/C++語言中scanf()函數的用法,以及在實際使用中常見錯誤及對策。

關鍵詞

scanf()

 

一、             序言

CSDN論壇的C/C++版塊,我時常見到“對于scanf()函數的用法、及出現的各種錯誤而迷惑”的帖子,萌發了我寫這篇文章的念頭。文中結合自身在學習和編程中對它的認識和體會,以具體示例闡述問題,目的在于使得初學者能夠正確使用scanf()函數,少走不必要的彎路。

二、             scanf()函數的用法

scanf()函數是格式化輸入函數,它從標準輸入設備(鍵盤) 讀取輸入的信息。

 

其調用格式為:      scanf("<格式化字符串>"<地址表>);

 

格式化字符串包括以下三類不同的字符;

1、  格式化說明符:

格式化說明符與printf()函數中的格式說明符基本相同。但和printf()函數中格式字符串的用法有一些小區別。我們來看下面這個表。
 

格式字符

說明

%d

從鍵盤輸入十進制整數

%o

從鍵盤輸入八進制整數

%x

從鍵盤輸入十六進制整數

%c

從鍵盤輸入一個字符

%s

從鍵盤輸入一個字符串

%f

從鍵盤輸入一個實數

%e

%f的作用相同

附加格式說明字符表

字符

說明

L

輸入"長"數據

H

輸入"短"數據

M

指定輸入數據所占寬度

*

空讀一個數據

 

2、    空白字符: 空白字符會使scanf()函數在讀操作中略去輸入中的一個或多個空白字符。

3、    非空白字符: 一個非空白字符會使scanf()函數在讀入時剔除掉與這個非空白字符相同的字符。

 

地址表是需要讀入的所有變量的地址,而不是變量本身。這與printf()函數完全不同,要特別注意。各個變量的地址之間同","分開。

例如:

#include <stdio.h>

void main()

{

       int i, j;

       printf("i, j=?\n");

       scanf("%d, %d", &i, &j);

}

上例中的scanf()函數先讀一個整型數,然后把接著輸入的逗號剔除掉,最后讀入另一個整型數。如果","這一特定字符沒有找到,scanf()函數就終止。若參數之間的分隔符為空格,則參數之間必須輸入一個或多個空格。

說明:

(1)          對于字符串數組或字符串指針變量,由于數組名和指針變量名本身就是地址,因此使用scanf()函數時,不需要在它們前面加上"&"操作符。

例如:

#include <stdio.h>

void main()

{

       char *p, str[20];

      

                p = new char[20];

               

          scanf("%s", p); /*從健盤輸入字符串*/

          scanf("%s", str);

          printf("%s\n", p); /*向屏幕輸出字符串*/

          printf("%s\n", str);

}

 

(2)          可以在格式化字符串中的"%"各格式化規定符之間加入一個整數,表示任何讀操作中的最大位數。

如上例中若規定只能輸入10字符給字符串指針p,則第一條scanf() 函數語句變為:scanf("%10s", p);

程序運行時一旦輸入字符個數大于10p就不再繼續讀入,而后面的一個讀入函數即scanf("%s", str)就會從第11個字符開始讀入。

(3)             scanf()函數中沒有精度控制。

如: scanf("%5.2f",&a); 是非法的。不能企圖用此語句輸入小數為2位的實數。

(4)             scanf中要求給出變量地址,如給出變量名則會出錯

scanf("%d",a);是非法的,應改為scnaf("%d",&a);才是合法的。

(5)          在輸入多個數值數據時,若格式控制串中沒有非格式字符作輸入數據之間的間隔則可用空格,TAB或回車作間隔。

C編譯在碰到空格,TAB,回車或非法數據(如對“%d”輸入“12A”時,A即為非法數據)時即認為該數據結束。

(6)          在輸入字符數據(%c)時,若格式控制串中無非格式字符,則認為所有輸入的字符均為有效字符。

例如:scanf("%c%c%c",&a,&b,&c);

輸入為:

d e f

則把'd'賦予a, ' (空格)'賦予b,'e'賦予c。因為%c 只要求讀入一個字符,后面不需要用空格作為兩個字符的間隔,因此把' '作為下一個字符送給b。

只有當輸入為:def 時,才能把'd'賦于a,'e'賦予b,'f'賦予c。 如果在格式控制中加入空格作為間隔,

scanf ("%c %c %c",&a,&b,&c);則輸入時各數據之間可加空格。

我們用一些例子來說明一些規則:

#include <stdio.h>

void main()

{

       char a,b;

       printf("input character a,b\n");

       scanf("%c%c",&a,&b);  /*注意兩個%c之間沒有任何符號*/

       printf("%c%c\n",a,b);

}

由于scanf函數"%c%c"中沒有空格,輸入M N,結果輸出只有M。而輸入改為MN時則可輸出MN兩字符,見下面的輸入運行情況: input character a,b

MN    (你輸入的值)

MN    (屏幕上顯示的值)

#include <stdio.h>

void main()

{

       char a,b;

       printf("input character a,b\n");

       scanf("%c %c",&a,&b); /*注意兩個%c之間有個空格*/

       printf("\n%c%c\n",a,b);

}本例表示scanf格式控制串"%c %c"之間有空格時, 輸入的數據之間可以有空格間隔。

(7)             如果格式控制串中有非格式字符則輸入時也要輸入該非格式字符。

例如:

scanf("%d,%d,%d",&a,&b,&c); 其中用非格式符“ , ”作間隔符,故輸入時應為: 5,6,7 (scanf 雙引號之間的格式必須一樣)

又如: scanf("a=%d,b=%d,c=%d",&a,&b,&c);

則輸入應為 a=5,b=6,c=7

如輸入的數據與輸出的類型不一致時,雖然編譯能夠通過,但結果將不正確。

 

#include <stdio.h>

void main()

{

       int a;

       printf("input a number");

       scanf("%d",&a);

       printf("%ld",a);

}

由于輸入數據類型為整型, 而輸出語句的格式串中說明為長整型,因此輸出結果和輸入數據不符。輸出并不是輸入的值。

如將Scanf("%d",&a); 語句改為 scanf("%ld",&a);

輸入數據為長整型,輸入輸出數據才相等。

三、             常見錯誤及對策

問題1

我初學C程序,所以提的問題很淺,希望您不要見笑。我自己編了一個程序,但運行的結果與我預期的不一樣。

#include<stdio.h>

void  main()

{

       static int a[2][3]={{1,3,4},{7,9,6}};

       int i,j,k;

       for(k=1;k<=2;k++)

       {printf("Please input num:");

       scanf("%d %d",&i,&j);

       if(i<2&&j<3)

              printf("num=%d\n",a[i][j]);

       else printf("Input is error,\n");

       }

       printf("programm is complete.\n");

}

我想將第8行改為

scanf("i=%d j=%d",&i,&j);

則程序運行結果變成

please input num:i=1 j=2

num=6

num=6(我原本希望能重復第一行再讓我輸入)

Programm is complete.

為什么第二次不能輸入?

答復:

我使用Turbo C 2.0證實存在你說的問題。象scanf("i=%d j=%d",&i,&j);這樣的輸入方式比較特別,TC 2.0顯然在第一次輸入后沒有象正常情況一樣清楚輸入緩沖區,這樣第二次執行scanf時,程序并沒有讓你輸入而是直接讀入上次輸入的結果。如果你一定要這么做,應該在scanf之前加上:

fflush(stdin);

這樣清楚掉鍵盤緩沖區。

 

問題2

為什么要把scanf("%c",varname)一定改成scanf(" %c")才可以正確接收字符?

答復:

類似上題,在%c的前面必須有一個空格,否則系統會將你前面輸入別的值之后鍵入的回車符讀入該變量,造成死循環。當然,如果scanf("%c",&varname)是第一條讀入語句,就可以不需要空格。

 

問題3(輸入變量時忘記加地址運算符“&”)

int a,b;

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

答復:

這是不合法的。Scanf函數的作用是:按照a、b在內存的地址將a、b的值存進去。“&a”指a在內存中的地址。

 

問題4(輸入數據的方式與要求不符)

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

輸入時,不能用逗號作兩個數據間的分隔符,如下面輸入不合法:

34

輸入數據時,在兩個數據之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。

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

C規定:如果在“格式控制”字符串中除了格式說明以外還有其它字符,則在輸入數據時應輸入與這些字符相同的字符。下面輸入是合法的:

34

此時不用逗號而用空格或其它字符是不對的。

3 4 34

又如:

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

輸入應如以下形式:

a=3,b=4

 

問題5(輸入字符的格式與要求不一致)

在用“%c”格式輸入字符時,“空格字符”和“轉義字符”都作為有效字符輸入。

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

如輸入a b c

字符“a”送給c1,字符“ ”送給c2,字符“b”送給c3,因為%c只要求讀入一個字符,后面不需要用空格作為兩個字符的間隔。

 

問題6.輸入輸出的數據類型與所用格式說明符不一致)

例如,a已定義為整型,b定義為實型

a=3;b=4.5;

printf("%f%d\n",a,b);

編譯時不給出出錯信息,但運行結果將與原意不符。這種錯誤尤其需要注意。

 

問題7(輸入數據時,企圖規定精度)

scanf("%7.2f",&a);

這樣做是不合法的,輸入數據時不能規定精度。

 

問題8(在不應加地址運算符&的位置加了地址運算符)

scanf("%s",&str);

C語言編譯系統對數組名的處理是:數組名代表該數組的起始地址,且scanf函數中的輸入項是字符數組名,不必要再加地址符&。應改為:scanf("%s",str);

四、             結論

本文主要講述了C/C++中的scanf()函數的用法,重點闡述使用scanf()函數過程中出現的常見錯誤及對策。當然,文中某些解決方法,均可以采用其他函數和方法來更好地解決,但本文僅限討論scanf()函數本身。文中難免存在一些不足之處,歡迎讀者批評指正。

posted on 2005-11-25 22:19 halCode 閱讀(1056) 評論(0)  編輯 收藏 引用 所屬分類: 算法/數據結構

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(7)

隨筆分類

隨筆檔案

文章分類

文章檔案

相冊

編程資源

不務正業

找工作

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩另类字幕中文| 亚洲午夜91| 欧美伊人久久| 欧美中文字幕精品| 国产日韩一级二级三级| 欧美日韩一区在线观看| 日韩一级黄色大片| 亚洲一区美女视频在线观看免费| 亚洲欧美成人网| 久久一二三四| 欧美午夜a级限制福利片| 国产精品你懂得| 在线欧美一区| 亚洲一二三区精品| 久久精品国产99| 亚洲大片一区二区三区| 99视频在线观看一区三区| 亚洲在线视频免费观看| 久久久女女女女999久久| 欧美黄色aaaa| 国产一级久久| 亚洲一区二区毛片| 欧美大片免费久久精品三p | 亚洲成色777777在线观看影院| 亚洲精品视频中文字幕| 欧美亚洲在线观看| 欧美精品九九99久久| 国产亚洲精品福利| 亚洲午夜精品| 欧美成人视屏| 亚洲欧美制服中文字幕| 欧美激情免费在线| 国产中文一区二区| 亚洲专区免费| 亚洲国产天堂久久综合| 久久99在线观看| 国产精品大全| 夜夜狂射影院欧美极品| 美国十次成人| 欧美在线观看一区二区| 国产精品久久久久久久久免费| 亚洲黄网站黄| 美女久久一区| 欧美一区二区三区免费视| 欧美视频在线一区二区三区| 亚洲欧洲日本国产| 欧美国产亚洲精品久久久8v| 欧美在线日韩精品| 国产精品视频一区二区三区| 亚洲一区二区欧美| 亚洲精品欧美日韩专区| 男人的天堂成人在线| 在线播放中文一区| 久久亚洲国产成人| 亚洲欧美一区二区精品久久久| 欧美日韩一卡| 亚洲综合日韩中文字幕v在线| 亚洲毛片一区| 国产精品久久久久7777婷婷| 欧美日韩国产二区| 国产欧美日韩免费看aⅴ视频| 日韩亚洲视频| 亚洲国产成人久久综合| 美女被久久久| 日韩视频免费在线| 亚洲精选视频免费看| 欧美久久综合| 亚洲欧美在线aaa| 亚洲欧美国产一区二区三区| 国产精品视频专区| 久久人91精品久久久久久不卡| 久久九九国产精品怡红院| 尤物精品在线| 亚洲日本在线视频观看| 欧美视频免费| 久热成人在线视频| 欧美chengren| 亚洲一区区二区| 久久成人精品电影| 亚洲国产精品成人久久综合一区| 亚洲国产精品va在线看黑人| 欧美日韩专区| 久久久久久黄| 欧美激情精品久久久久久免费印度 | 国产精品激情电影| 久久免费99精品久久久久久| 麻豆freexxxx性91精品| 亚洲视频免费在线| 久久国产免费| 中文亚洲欧美| 久久久国产亚洲精品| 在线视频精品一| 性亚洲最疯狂xxxx高清| 亚洲精品免费网站| 亚洲影院免费观看| 最新亚洲激情| 欧美在线三区| 亚洲私人影院在线观看| 久久精品一二三区| 亚洲天堂网在线观看| 久久蜜桃香蕉精品一区二区三区| 日韩一级免费观看| 久久国产福利国产秒拍| 一级成人国产| 久久亚洲欧洲| 久久国产日本精品| 欧美视频在线看| 亚洲欧洲日本mm| 亚洲国产精品成人综合色在线婷婷| 亚洲永久精品国产| 99国内精品久久| 麻豆av一区二区三区| 久久久久免费视频| 国产日韩欧美综合在线| 一区二区三区导航| 日韩一级黄色av| 裸体歌舞表演一区二区| 久久精品夜夜夜夜久久| 亚洲一级在线观看| 日韩视频一区二区三区| 亚洲人成亚洲人成在线观看| 蜜桃av综合| 亚洲欧美日韩一区二区三区在线观看 | 欧美激情在线| 国产亚洲激情| 亚洲影音一区| 亚洲欧美视频| 国产精品白丝jk黑袜喷水| 亚洲国产黄色片| 亚洲黄色精品| 欧美jizzhd精品欧美喷水| 欧美二区在线播放| 亚洲激情电影在线| 欧美成在线观看| 亚洲激情在线| 日韩视频免费观看高清在线视频| 蜜桃av一区二区| 最新日韩精品| 一本色道久久综合精品竹菊 | 亚洲欧美www| 亚洲综合电影一区二区三区| 欧美午夜免费影院| 一区二区三区四区五区精品| 亚洲欧美电影院| 国产女人精品视频| 久久精品中文字幕一区| 噜噜爱69成人精品| 亚洲国产影院| 欧美日韩一区在线| 午夜在线视频一区二区区别| 欧美一区二区三区在线观看视频| 国产午夜久久久久| 久久亚洲欧美国产精品乐播| 亚洲国产日韩欧美在线99| 亚洲视频精选在线| 国产婷婷97碰碰久久人人蜜臀| 久久久久久国产精品一区| 欧美激情中文不卡| 亚洲自拍另类| 揄拍成人国产精品视频| 欧美日韩国产黄| 欧美一区二区三区男人的天堂 | 亚洲专区国产精品| 久久视频一区二区| 99国产精品久久久久老师 | 久久综合精品国产一区二区三区| 亚洲国产高清视频| 亚洲专区一区| 亚洲激情自拍| 国产精品视频一| 蜜臀91精品一区二区三区| 在线视频免费在线观看一区二区| 欧美日韩在线播放一区| 欧美一区二区成人| 91久久精品www人人做人人爽| 先锋亚洲精品| 亚洲区免费影片| 国产欧美激情| 欧美国产亚洲精品久久久8v| 亚洲欧美日韩天堂| 亚洲三级免费观看| 久久综合成人精品亚洲另类欧美 | 欧美高清不卡| 午夜精品久久久久久99热软件| 在线观看亚洲| 国产农村妇女毛片精品久久莱园子| 久热re这里精品视频在线6| 亚洲一区尤物| 日韩一区二区久久| 亚洲国产日本| 女女同性精品视频| 久久高清免费观看| 亚洲欧美日韩国产成人精品影院| 亚洲人成久久| 亚洲第一天堂av| 国产日韩精品视频一区| 欧美午夜精品久久久久久超碰| 欧美成人性生活| 久久精品在线观看| 欧美一区二区三区免费看|