1、對于scanf("%lf%c%lf",number_1,operition,number_2);,注意格式串中沒有(也不能有)空格,輸入響應(yīng)時,要連續(xù)輸入三個量,中間也不能有空格,否則,必然會造成誤讀。鍵入三個量后,接下來的回車鍵表示本次輸入已經(jīng)結(jié)束,回車鍵不會被認為是數(shù)值的一部分,而會被“吃掉”,輸入緩沖區(qū)中沒有任何遺留。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的農(nóng)安網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
2、函數(shù)isdigit(char)的參數(shù)ASCII字符,或0 -- 127 的整形數(shù),用double類型作為參數(shù)是錯誤的。
首先scanf是以字符型輸入的,所以1會被a接收,2被b接收,而回車后邊有g(shù)etchar(),getchar()會把回車當字符接收,所以第一個getchar()接收的是回車,第二個getchar()接收的是3
所以最終的結(jié)果是::a=1,b=2,c=\n,d=3
即
12
3
注意下判斷語句,其實是在拿scanf的返回值在和EOF或\n比較。
scanf的返回值類型為int,值由后面的參數(shù)決定,返回值表示成功讀入的數(shù)據(jù)的個數(shù)。
如:scanf("%d%d", a, b);
如果a和b都被成功讀入,那么scanf的返回值就是2。
如果只有a被成功讀入,返回值為1。
如果a和b都未被成功讀入,返回值為0。
如果遇到錯誤或遇到end of file,返回值為EOF。
擴展資料:
注意事項
scanf 的各種格式中,%d、%c、%s三種最常用,通常都是以回車作為一次輸入的結(jié)束。由于對字符解析方式及字符特點不同(如數(shù)字中一般不會出現(xiàn)空格回車等特殊字符)不同,%d格式一般不會在連續(xù)輸入時,遇到問題。而%s和%c卻會出現(xiàn)各種各樣的問題,比如回車問題,空格問題等。
scanf()函數(shù)返回的值為:正確按指定格式輸入變量的個數(shù);也即能正確接收到值的變量個數(shù)。在類型匹配錯誤的時候,以非正常的方式退出??梢岳胹canf函數(shù)的返回值判斷輸入是否正確,并進行流程控制:
int i = 0; ? ? char c1[15]; ? ? while((scanf("%c", c1[i])!=EOF) i14)
{
i++;
}
scanf()是不會把回車拷貝到字符竄里面的。
這里是一段英文定義:?the function will read and ignore any whitespace characters encountered before the next non-whitespace character (whitespace characters include spaces, newline and tab characters -- see?isspace).
除了回車,空格也不會拷貝到字符竄中。
再來看下gets(),英文定義是這樣的:Reads characters from the?standard input?(stdin) and stores them as a C string into?str?until a newline character or the?end-of-file?is reached.?The newline character, if found, is not copied into?str.
好了。這里寫的很清楚了。gets()雖然可以把輸入都拷貝到字符竄里,比如空格,但是不包含回車。
如果需要回車,可以用fgets()。英文是這樣定義的:Reads characters from?stream?and stores them as a C string into?str?until (num-1) characters have been read or either a newline or the?end-of-file?is reached, whichever happens first. A newline character makes?fgets?stop reading, but it is considered a valid character by the function and included in the string copied to?str.
最后一句話說了,回車作為結(jié)束,不過會拷貝到字符竄中。
那么文檔說的對不對呢?寫一段代碼測試一下。
#include?stdio.h
int?main()
{
int?i?=?0;
printf("scanf...\n");
char?scanf_content[256]?=?{0};
scanf("%s",?scanf_content);
printf("value:?%s\n",?scanf_content);
while?(scanf_content[i])?
{
if?(scanf_content[i]?==?'\n')
printf("\\n");
else
printf("%d\n",?(int)scanf_content[i]);
++i;
}
i?=?0;
printf("gets...\n");
char?gets_content[256]?=?{0};
gets(gets_content);?//?unsafe
printf("value:?%s\n",?gets_content);
while?(gets_content[i])?
{
if?(gets_content[i]?==?'\n')
printf("\\n");
else
printf("%d\n",?(int)gets_content[i]);
++i;
}
i?=?0;
printf("fgets...\n");
char?fgets_content[256]?=?{0};
fgets(fgets_content,?256,?stdin);
printf("value:?%s\n",?fgets_content);
while?(fgets_content[i])?
{
if?(fgets_content[i]?==?'\n')
printf("\\n");
else
printf("%d\n",?(int)fgets_content[i]);
++i;
}
return?0;?
}
輸入“123 123”,你會發(fā)現(xiàn)scanf只會得到123,而gets可以得到空格123。最后fgets可以得到'\n'。這里為了看到空格和回車,可以把字符竄轉(zhuǎn)成int打印出來。
最后的結(jié)論就是,如果需要回車,就使用fgets。