C語言的scanf語句格式
例:使用scanf函數輸入數據。
#include
這里注意:如果scanf中%d是連著寫的如“%d%d%d”,在輸入數據時,數據之間不可以用逗號分隔。 只能用空白字符(空格或tab鍵或者回車鍵)分隔——“2 (空格)3(tab) 4” 或 “2(tab)3(回車)4”等。
若是“%d,%d,%d”,則在輸入數據時需要加“,”,如“2,3,4”。 (在有一些實現中,printf函數與scanf函數在使用時可以不使用預編譯命令#include
它是格式輸入函數,即按用戶指定的格式從鍵盤上把數據輸入到指定的變量之中。 scanf 是 scan format 的縮寫,意思是格式化掃描,也就是從鍵盤獲得用戶輸入,和 printf 的功能正好相反。
擴展資料: 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函數輸入數據。
#include <stdio.h>
int main(void)
{
int a,b,c;
printf("Give me the value of a,b,c seperated with whitespaces:\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
&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 的功能正好相反。
擴展資料:
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("7.2f",&a);是一個合法的scanf函數
首先,這個語句顯然是有問題的,但是能編譯通過,說明是合法的。
那么我們就需要弄清楚編譯器是怎么理解這條語句的,以及運行時這條語句做了什么。 原問題是“C語言,語句scanf("7.2f",&a);是一個合法的scanf函數?”,我猜測這里"7.2f"應該問的是"%7.2f",但是也可能就是"7.2f",所以對這兩種情況均進行分析。
網上說“使用scanf函數對實型變量進行賦值時,在格式%f中不得控制小數位的精度,但在printf函數中可以使用,并且經常使用”,因此"%7.2f"用在scanf里面,肯定是不對的。 問題1:百分號要用"%%"表示,那么單獨一個"%"有什么作用呢? 測試1: #include
說明單獨一個"%"是沒有作用的,會被自動忽略。 但是,這個單獨的"%"是否會對后面產生影響呢? 測試2: #include
但是進行到這里,好像不知道再從何入手了,所以我們換一個角度研究。 我們知道: scanf("%f", &a)如果正常運行,返回值是成功賦值的變量數,即1。
編譯scanf("%f", &a, &b)不會報錯,但是多余的變量b無法正常得到值,返回值也是1。scanf("%f,%f", &a, &b)是要求兩個浮點數中間有一個逗號。
問題2:scanf("123")有沒有用? 因為沒有給任何變量賦值,所以看起來這條語句不起任何作用,好像有沒有都一樣,但是下面一個程序就可以證明,這條語句的有無會對運行結果產生影響。 測試3: 輸入為"123" #include
這時候我們就可以回答scanf("7.2f", &a)的作用了。如果緩沖區下一個字符是'7',那么就繼續向后讀'.'、'2'等。
雖然讀出來了,但是不賦給任何一個變量,所以&a是多余的。不過雖然多余,但是編譯器不用它就行了,所以對編譯器來說是合法的,最多只是給出警告。
問題3:編譯器如何理解scanf("%7.2f") 上面的討論給了我們啟示。所以雖然這里我沒有什么好的想法,但是因為百分號是多出來的,根據排列組合,編譯器可能有以下幾種理解方式: A:"%7.2f"作為一個整體,是有作用的字符串B:"%"被忽略,“7.2f”是有作用的字符串C:"%7"被忽略,".2f"是有作用的字符串D:"%7."被忽略,"2f"是有作用的字符串E:"%7.2"被忽略,"f"是有作用的字符串F:"%7.2f"作為一個整體,被編譯器自動忽略根據上面的討論提供的方法,我們可以逐個測試。
對于代碼: #include
它的作用是一個字符一個字符地匹配,將緩沖區里的'7'、'.'、'2'、'f'依次讀出來。 語句scanf("%7.2f", &a)也是合法的,而且也是有實際意義的。
其中"%7.2f"相當于".2f",它的作用是一個字符一個字符地匹配,將緩沖區里的'.'、'2'、'f'依次讀出來。 上述兩條語句中,&a都是合法的,但是是沒有作用的。
-------------------------------------------- P.S.:C語言有平臺差異,不同平臺運行結果可能不一樣。 以上。