當前位置:首頁 » 編程語言 » c語言scanf語句
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言scanf語句

發布時間: 2022-02-07 12:11:57

c語言中scanf語句問題以及數據類型的關系,詳細見問題補充。

事實上不應是scanf("%d",&x);而是scanf("%d\n",&x); 否則a[0]讀入的是回車符,即\n;

在用c語言編寫輸入語句的時候常用到scanf函數,初學者在剛用scanf函數輸入時,經常會遇到各種各樣的輸入錯誤,最重要的是一定要記住scanf函數的輸入格式,scanf函數里包含了哪些東西,輸入的時候就必須有哪些東西,比如:scanf("%c%c%c"),那麼輸入的時候就必須連續輸入3個字元,中間不能有任何空格逗號或者回車符等分開,而如果是scanf("%c,%c,%c"),那麼輸入3個字元的時候中間就必須用一個逗號分隔。
scanf函數最常用的兩種輸入方式%d整數輸入方式,以及%c字元輸入方式。
用%d方式輸入整數時,輸入一串數字然後按回車符,輸入就完成了。而用%c方式輸入字元時,就稍微復雜一點。一般來說用%c輸入字元時,當輸完以後,都習慣按一下回車,這時回車符就成了一個問題。
【例1】:
scanf("%c",&a); /*此時輸入一個字元,並按下回車,那麼變數a將會正確接收輸入的字元*/
scanf("%c",&b); /*但是變數b將會接收到回車符,其值為10,或者說ASCII碼為10*/
【例2】:
scanf("%d",&x); /*此時輸入一串數字並回車,變數x將正常接收到輸入的整數*/
scanf("%d",&y); /*變數y不會接收到回車符,需要用戶繼續輸入數字,並回車,正常接收到整數*/
【例3】:
scanf("%d",&x); /*此時輸入一串數字並回車,變數x將正常接收到輸入的整數*/
scanf("%c",&a); /*但是變數a將會接收到回車符,其值為10,或者說ASCII碼為10*/
【例4】:
scanf("%d",&x); /*此時輸入一串數字並回車,變數x將正常接收到輸入的整數*/
scanf("%d",&y); /*若此時輸入的是字母而不是數字,比如輸入「s」並回車*/
/*那麼變數y將不會接收到任何字元或數字,其值保持原樣,不發生任何改變*/
scanf("%c",&a); /*此時變數a將接收到上一步輸入的字母*/
/*即變數a中存儲的字元將是"s",而不是回車符*/
【結論】:
當輸入完整數或字元時,後面還需要輸入字元時,為了避免輸入的字元變成回車符,可以在輸入字元前多加一條scanf語句來吃掉前面的回車符。此時用來吃掉回車符的scanf輸入可以用%c方式,也可以用%d方式。當用%c方式來吃掉回車符時,回車符被讀進了char類型變數中,當用%d方式來吃掉回車符時,回車符並沒有被送進int類型變數中,而是在異常的字元輸入後,被自動清除了。

② C語言scanf()

有逗號.
你在輸入數據的時候,就必須輸入逗號,
scanf("%d,%d",&a,&b);
應該輸入:
1,2
scanf("%d%d",&a,&b);
這個有點問題吧.
沒試過,一般情況下,是需要在中間加一個空格,
類似這樣scanf("%d
%d",&a,&b);
然後兩個整型以空格為分界.
輸入:
1
2(注:中間有空格)
其實這個是scanf本身的一種對字元串的處理.
具體你可以熟悉一下sprintf
sscanf.
他們的原理都是一樣的.

③ C語言的scanf語句格式

例:使用scanf函數輸入數據。

#include<stdio.h>

intmain(void)

{

inta,b,c;

printf("Givemethevalueofa,b,cseperatedwithwhitespaces: ");

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

printf("a=%d,b=%d,c=%d ",a,b,c);

return0;

}

&a,&b,&c中的&是定址操作符,&a表示對象a在內存中的地址[3],是一個右值。變數a,b,c的地址是在編譯階段分配的(存儲順序由編譯器決定)。

這里注意:如果scanf中%d是連著寫的如「%d%d%d」,在輸入數據時,數據之間不可以用逗號分隔。

只能用空白字元(空格或tab鍵或者回車鍵)分隔——「2 (空格)3(tab) 4」 或 「2(tab)3(回車)4」等。若是「%d,%d,%d」,則在輸入數據時需要加「,」,如「2,3,4」。

(在有一些實現中,printf函數與scanf函數在使用時可以不使用預編譯命令#include <stdio.h>。)它是格式輸入函數,即按用戶指定的格式從鍵盤上把數據輸入到指定的變數之中。

scanf 是 scan format 的縮寫,意思是格式化掃描,也就是從鍵盤獲得用戶輸入,和 printf 的功能正好相反。

(3)c語言scanf語句擴展閱讀:

scanf函數使用注意問題:

(1)在高版本的 Visual Studio 編譯器中,scanf 被認為是不安全的,被棄用,應當使用scanf_s代替 scanf。

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

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

(4) scanf函數中沒有類似printf的精度控制。

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

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

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

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

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

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

參考資料來源:網路-scanf

④ c語言 scanf語句

scanf("%d",&a);//這個語句要求你按10進制輸入a的值,A不是10進制。 相當於沒有輸入,a的值不確定。

⑤ C語言中的Scanf的用法

scanf 函數最主要的用法是:

scanf("輸入控制符", 輸入參數);

函數原型:intscanf(constchar*restrictformat,...);

函數 scanf() 是從標准輸入流stdin (標准輸入設備,一般指向鍵盤)中讀內容的通用子程序,可以說明的格式讀入多個字元,並保存在對應地址的變數中。


(5)c語言scanf語句擴展閱讀:

函數的第一個參數是格式字元串,它指定了輸入的格式,並按照格式說明符解析輸入對應位置的信息並存儲於可變參數列表中對應的指針所指位置。每一個指針要求非空,並且與字元串中的格式符一一順次對應。

發展:

使用scanf函數進行輸入,必須指定輸入的數據的類型和格式,不僅繁瑣復雜,而且很容易出錯。C++保留scanf只是為了和C兼容。

以便過去用C語言寫的程序可以在C++的環境下運行。C++的編程人員都願意使用cin進行輸入,很少使用scanf。

但是scanf有一個明顯的優點,速度比cin函數快。

⑥ C語言scanf語句導致無法進入循環

問題已經解決,還是比較簡單的。。。一個小問題而已。是scanf函數的問題。

我先貼圖好吧,我運行的結果。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define SIZE 50

#define RAT 5

struct movie{

char name[SIZE];

int rating;

};

void * s_gets(char *,int n);

int main()

{

int i=0,j,k;

struct movie *mov;

printf("輸入你想錄入的影片數量 ");

scanf("%d",&k);

mov=(struct movie *) malloc(k*sizeof(struct movie));

printf("輸入你想錄入的第一部影片名稱 ");

while(i<k&&s_gets(mov[i].name,SIZE)!=NULL&&mov[i].name[0]!='')

{


printf("輸入影片序號:");

scanf("%d",&mov[i++].rating);

while(getchar()!=' ')

continue;

puts("輸入下一部影片名稱:(empty line to stop):");

}//printf("%s ",mov[0].name);

if(i==0)

printf("No data entered ");

else

printf("Here is the movie list: ");


for(j=0;j<i;j++)

{

printf("Movie: %s Rating: %d ",mov[j].name,mov[j].rating);


}printf("Bye ");

return 0;

}


void * s_gets(char *ch,int n)

{

char *ret_val;

char *find;

fflush(stdin); //getchar();可選,最好用fflush函數;

ret_val=fgets(ch,n,stdin);

if(ret_val)

{

find=strchr(ch,' ');

if(find)

*find='';

else

while(getchar()!=' ')

continue;

}

return ret_val;

}

然後貼我的源碼,就多了一行代碼而已,在你的s_get函數里的fgets函數前面加了個fflush函數,位置,我已經加粗標明出來了。。。問題也很簡單,就是在第一個scanf函數的時候,你是按了回車的,所以第二次使用scanf的時候,fgets直接吃掉了回車,這是我們不需要的,所以在這個之前,我們必須先把stdin輸入流里的回車,清理掉,使用fflush函數一次清理了stdin輸入流,等stdin輸入流干凈了之後,再調用fgets就不會出錯了,當然也可以使用getchar函數把回車吃掉,不過比較麻煩,我一般喜歡用fflush函數,反正輸入前,那些臟東西,我們不關心,也不需要,而且萬一有多個呢,getchar只能清理一個臟東西,而fflush函數,直接全部沖掉,來的簡單方便。。。。

問題解決,請採納!不懂再問。

⑦ C語言scanf語句的問題。

除了三樓說的,建議樓主以後一個scanf就針對一個變數。否則兩個變數之間用空格或者逗號隔開,輸入的時候也需要輸入空格或逗號。同時在輸入char型時注意,之前最後一次使用scanf或printf的時候,如果你使用了回車作為結束確認,回車符就直接被你這次的scanf給讀取了。像樓主原來的寫法,按照意圖應該是輸入一個整數回車、再整數再回車、再字元再回車。但是實際上第二個整數後的回車在被按下後就直接作為字元傳給原本想賦再輸入的字元的變數了。解決的方法就是要不用「%d%d\n」,要不輸入字元前額外用一次scanf,把回車讀掉。其中後者最保險:對於printf也可以使用
另外VC(之外的不清楚)中%d%d這樣的也不是分不出來,你輸入一個整數加空格或回車再整數就行了。
以上這些問題,你保持原來兩個連續%d,輸入的數據是:整數+空格或回車+整數+任意字元,然後Debug中Watch一下a、b、d。這樣就至少知道什麼操作導致什麼現象。細究有些麻煩,所以一個scanf只對應一個變數時最不可能處岔子的方法。同時注意輸入單字元注意的問題。

⑧ 關於c語言scanf語句的問題

你沒有「省略」一個值,在標准輸出內的值,只要你沒有讀,下次自然要讀進來

⑨ c語言scanf語句

int a;float b;
scanf ("2d%%f",&a,&b);
printf("%d,%f",a,b);}

中的scanf ("2d%%f",&a,&b);
寫錯了吧。。。
我試驗的是87,6543.000000
在int a float b 之間不用: ; 用 ,是不可以的

⑩ C語言,語句scanf("7.2f",&a);是一個合法的scanf函數

scanf("%7.2F",&2);

不合法:

%7.2F 可以用 %f 或 %F, 不能加 場定義。(編譯通過,輸入值會錯)

&2錯,因為 2 是常量,這里必須是變數,而且必須是 float 型。

合法:

float Z;

scanf("%f",&Z);

printf("%7。2f",Z);

scanf("%f", &a)如果正常運行,返回值是成功賦值的變數數,即1。

編譯scanf("%f", &a, &b)不會報錯,但是多餘的變數b無法正常得到值,返回值也是1。

scanf("%f,%f", &a, &b)是要求兩個浮點數中間有一個逗號。

函數原型

函數 scanf() 是從標准輸入流stdin(標准輸入設備,一般指向鍵盤)中讀內容的通用子程序,可以說明的格式讀入多個字元,並保存在對應地址的變數中。

函數的第一個參數是格式字元串,它指定了輸入的格式,並按照格式說明符解析輸入對應位置的信息並存儲於可變參數列表中對應的指針所指位置。每一個指針要求非空,並且與字元串中的格式符一一順次對應。

以上內容參考:網路-scanf