1. 程式人生 > 實用技巧 >C++學習-scanf,printf

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