① 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]!='