C++學習-scanf,printf
printf和scanf的常見用法
僅滿足個人作為大一學生的需求。(保命)
1 printf
printf格式控制字串組成:
%[flags][width][.prec][length]type
即%[標誌][最小寬度][.精度][型別長度]型別。
型別type:
字元 | 對應資料型別 | 含義 |
---|---|---|
d | int | 輸出十進位制有符號整數 |
f/F | float,double | 輸出浮點數(printf單精度雙精度可都用f,但scanf不行),大寫F只不過infinity和nan輸出為大寫形式 |
e/E | float,double | 科學記數法輸出浮點數,大寫E只不過輸出時‘e’會變成‘E’ |
g/G | float,double | 根據數值長度選擇最短方式出,%f或%e,大寫同理 |
c | char | 輸出字元 |
s | char* | 輸出字串 |
- bool型的輸出用 %d 就好
- 輸出不會自動型別轉換,可以用%c來輸出int,但絕不能用%e,%g,%f來直接輸出int,也不能用%c,%d來直接輸出double和float。可以強制型別轉換後輸出。
- 對於string,若用%d輸出,需要用&去首位地址,如
string str;...; printf("%s",&str[0]);
型別長度:
下面只介紹兩種
型別長度 | d的對應型別 | e,E,f,F,g,G的對應型別 |
---|---|---|
ll | long long | |
l | long double(這個我不太理解,因為lf也可以double) |
- 同樣%lld,不能直接輸出double(float),%lf不能直接輸出long long,int,char。還有一點,%lld不能直接輸出int,char。要輸出可以可以強制型別轉換。
還有一點,對於long long,win下應該為%I64d
:
linux下為: 1 long long a = 60122; 2 printf("%lld %lld %lld", a,a,a); windows下為: 1 printf("%I64d %I64d %I64d", a,a,a); long 和 int 都是4位元組 long long 是8位元組
精度(.precision)
精度格式符一"."開頭,後跟十進位制整數。可取值如下。
.precision | 描述 |
---|---|
數值 | 十進位制整數。 (1)對於整型(d),precision表示輸出的最小的數字個數,不足補前導零,超過不截斷。 (2)對於浮點型(a, e, f ),precision表示小數點後數值位數,預設為六位,不足補後置0,超過則截斷。 (3)對於型別說明符g或G,表示可輸出的最大有效數字。 (4)對於字串(s),precision表示最大可輸出字元數,不足正常輸出,超過則截斷。 precision不顯示指定,則預設為0 |
* | 以星號代替數值,類似於width中的*,在輸出引數列表中指定精度。 |
示例
printf("%.8d\n",1000); //不足指定寬度補前導0,效果等同於%06d
printf("%.8f\n",1000.123456789);//超過精度,截斷
printf("%.8f\n",1000.123456); //不足精度,補後置0
printf("%.8g\n",1000.123456); //最大有效數字為8位
printf("%.8s\n",“abcdefghij”); //超過指定長度截斷
輸出
00001000
1000.12345679
1000.12345600
1000.1235
abcdefgh
輸出最小寬度(width)
用十進位制整數來表示輸出的最少位數。若實際位數多於指定的寬度,則按實際位數輸出,若實際位數少於定義的寬度則補以空格
width | 描述 | 示例 |
---|---|---|
數值 | 十進位制整數 | printf("%6d",1000);輸出: 1000 |
* | 星號。還可以控制浮點型數字保留的位數 | printf("%.*f", x, a); x是位數控制 |
標誌
字元 | 名稱 | 說明 |
---|---|---|
- | 減號 | 結果左對齊,右邊填空格(搭配width)。預設右對齊,左邊填空格 |
+ | 加號 | 輸出符號(一般都是正號) |
space | 空格 | 輸出為正是加上空格,為負加上負號 |
0 | 數字0 | 輸出的前面補0,知道佔滿列寬位置(不可以搭配-使用) |
對於0,舉個例子
printf("%06d",1000);輸出:001000
其他的一些操作:
C 語言中常用的多行字串寫法。
列印馬里奧,相鄰兩個字串之間沒有換行也行。
#include<stdio.h>
int main() {
printf(
" ********\n"
" ************\n"
" ####....#.\n"
" #..###.....##....\n"
" ###.......###### ### ###\n"
" ........... #...# #...#\n"
" ##*####### #.#.# #.#.#\n"
" ####*******###### #.#.# #.#.#\n"
" ...#***.****.*###.... #...# #...#\n"
" ....**********##..... ### ###\n"
" ....**** *****....\n"
" #### ####\n"
" ###### ######\n"
"##############################################################\n"
"#...#......#.##...#......#.##...#......#.##------------------#\n"
"###########################################------------------#\n"
"#..#....#....##..#....#....##..#....#....#####################\n"
"########################################## #----------#\n"
"#.....#......##.....#......##.....#......# #----------#\n"
"########################################## #----------#\n"
"#.#..#....#..##.#..#....#..##.#..#....#..# #----------#\n"
"########################################## ############\n"
);
return 0;
}
2 scanf
字元 | 對應資料型別 | 含義 |
---|---|---|
d | int | 輸入十進位制有符號整數 |
f/F/e/E/g/E | float | 輸入單精度浮點數 |
上面前面加一個l | double | 輸入雙精度浮點數 |
c | char | 輸入字元 |
s | char* | 輸出字串 |
I64d | long long | 輸入long long |
- bool型的輸入用 %d 就好
- %c不會跳過空格換行製表符,其他都會跳過
- 用scanf給string賦值時,必須宣告長度,用例如下。
#include <stdio.h>
#include <string>
using namespace std;
int main()
{
string a;
a.resize(100); //需要預先分配空間
scanf("%s", &a[0]);
puts(a.c_str());
return 0;
}
其他
空白字元
空白字元會使scanf()函式在讀操作中略去輸入中的一個或多個空白字元,空白符可以是space,tab,newline等等,直到第一個非空白符出現為止。
非空白字元
一個非空白字元會使scanf()函式在讀入時剔除掉與這個非空白字元相同的字元。但在輸入時必須輸入這些字元。否則就會出錯。
用於while
while(scanf("%d,&n)!=EOF)和while(~scanf("%d",&n)
功能:當讀到檔案結尾時終止迴圈
最後
感覺自己寫得稀爛,畢竟後面開始煩躁了,等自己正式學的時候進行改造好了。
資料來源:
printf:https://blog.csdn.net/sugarbliss/article/details/80230710
scanf:https://www.cnblogs.com/vanishfan/archive/2013/03/04/2942492.html
其他一些:
https://blog.csdn.net/huqiaolong/article/details/83106652
https://blog.csdn.net/weiwjacsdn/article/details/90452667?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-2.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-2.not_use_machine_learn_pai