目錄:
- 0.前言【精簡版】:
- 時間少的看這里:
- 1.【紳士淑女止步!!!!】
- 0.必備入門小知識:
- 1.正題1:scanf
- (1) %*d 被槍斃了:
- (2) 【%.*d 】的隊友被槍斃了:
- 2.正題2:printf就不講了,前面的【前言】似乎講得很明白了吧,
0.前言【精簡版】:
其實網上也有很多關于這方面的解釋,但是總會讓新手甚至小老手有些迷茫,比如網上有一種解釋就說:忽略……
你忽略啥啊你…
時間少的看這里:
%\*和\*.*的形式,一般只有整數%和字串%s的情況下才比較有用,但是為了方便大家理解,這里我列出全部的基礎情況:
請注意:scanf和printf中的情況是不一樣的!
<1>
scanf:
注意:在scanf里只有%*d和%.*d有意義,
其他的%*f,%*lf,%*c和%*s等等都是沒有意義的,編譯器會報錯,所以千萬別亂寫,
(1) %*d(僅它有意義:忽略掉它本身,并重新匹配:)
int a=0,b=0,c=0;
scanf("%*d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
輸入:12 34 56
輸出:a=34,b=56,c=0
相當于:忽略掉第一個輸入12(它本身),
并將a與第二個數匹配,b與第三個數,
所以c沒有匹配的輸入,故c還是原來的值0.
下面的2種情況給你參考:
/****************************************/
scanf("%d%*d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
輸入:12 34 56
輸出:a=12,b=56,c=0
相當于:忽略掉第二個輸入34(它本身)
scanf("%d%d%*d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
輸入:12 34 56
輸出:a=12,b=34,c=0
相當于:忽略掉第三個輸入56(它本身)
(2) %.*d(僅它有意義:忽略%*d的下一個輸入,并重新匹配)
scanf("%.*d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
輸入:12 34 56
輸出:a=12,b=34,c=0
相當于:忽略掉第二個輸入34(它的下一個)
所以a和第一個輸入匹配,b和第三個輸入匹配,
中間那個輸入被忽略了,所以c也就沒有匹配上,
下面的2種情況給你參考:
/****************************************/
scanf("%d%.*d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
輸入:12 34 56
輸出:a=12,b=34,c=0
相當于:忽略掉第三個輸入56(它的下一個)
scanf("%d%d%.*d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
輸入:12 34 56
輸出:a=12,b=34,c=56
相當于:忽略掉第四個輸入(它的下一個:空氣)
所以最后這種沒有意義!和沒有加.*一樣,
<2>
printf:
注意:在printf里沒有限制,%c,%d,%s,%f,%lf都可以加*或.*,都有意義,
但是,他們的意義卻不相同:
(1) %*d(意義:肯定會輸出全部,根據實際情況補空格)
int a=123;
printf("a=%*d",2,a);
輸出:a=123
(輸出全部123,長度>2,不需要補空格)
跟沒指定一樣!
printf("a=%*d",10,a);
輸出:a=空格空格空格空格空格空格空格123
(往前補7個空格,補夠總共10個位)
(2) %.*d(意義:肯定會輸出結果,根據實際在前面補0)
printf("a=%.*d",2,a);
輸出:a=123
(輸出全部123,長度>2,不需要補0)
跟沒指定一樣!
printf("a=%.*d",10,a);
輸出:a=0000000123
(往前補7個0,補夠總共10個位)
很顯然這種情況意義不大,因為我們很少需要補0.
所以基本不用這種寫法,
(3) %*f(意義:肯定會輸出全部,根據實際補空格)
注意,%f默認小數點后面6位數:小數點也算一位!
float a=12;
printf("a=%*f",3,a);
輸出:a=123.000000
默認小數點后面6位,而且肯定會輸出全部,
所以10位>指定的3位,跟沒指定一樣!
printf("a=%*f",13,a);
輸出:a=空格空格空格123.000000
默認小數點后面6位,而且肯定會輸出全部10位,
剩下3位,所以在前面填3個空格(小數點也算一位)
(4) %.*f(意義:指定小數點后面幾位,跟%.nf是一樣的)
你懂的
(5)%*s(意義:也是根據實際情況在前面加空格)
char *a="123456";
printf("a=%*s",5,a);
輸出:a=123456;因為5<6,所以跟沒指定的一樣
printf("a=%*s",10,a);
輸出:a=空格空格空格空格123456
(6)%.*s(意義:指定截取前面幾位數)
char *a="123456";
printf("a=%.*s",4,a);
輸出:a=1234;
截取前面4位數
printf("a=%.*s",10,a);
輸出:a=123456
截取前面10位數,因為只有6位,
所以跟沒指定的一樣!
1.【紳士淑女止步!!!!】
時間充裕的可以看我下面的啰嗦:
0.必備入門小知識:
為方面您食用后面我所講的理論,請你先閱讀下面這個你可能從未思考過的小知識:

這是什么意思呢?
意思就是:你需要吧scanf的將部分引數拆分成兩部分看!
很多初學者都會忘記添加尋址符&,
因為沒人告訴過他第二部分的引數用的是地址
例子1:
scanf("%d%d%d");
這樣其實是可以的,
表示:你可以輸入三個值,
但是因為第二部分的引數為空,即沒有地址,(如&,指標),
所以輸入的值并不會被保存到記憶體中
例子2:
int a,b,c;
scanf("",&a,&b,&c);
這樣也是可以的,
表示:你可以輸入0個數,因為第一部分的引數沒有%,
所以連輸入的機會都沒有,怎么存?
所以后面都是寫了個寂寞,
例子3:1+2
上面兩個例子加起來才真正有用,
所以你就經常看到這樣的形式:
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
這樣的形式你實在是太熟悉了!
表示:從左到右:
第一個%d輸入的數存放在記憶體地址a
第二個%d輸入的數存放在記憶體地址b
第三個%d輸入的數存放在記憶體地址c
1.正題1:scanf
用例子講道理:
(1) %*d 被槍斃了:

如圖所示,如果出現了%*,就會拉攏后面一個%跟她非法組隊,然后跟&a匹配,
但是《國家婚姻法》規定,一人只能要一個,所以,這里規定:非法組隊的發起者%*d被舉報拉出去槍斃了,最后留下第二個與&a匹配(因為是從左往右匹配),所以c就沒了物件了,
也就是說:原來是a的老婆被槍斃了
所以:
原來是b的老婆就嫁給了a
原來是c的老婆就嫁給了b
最終導致c沒了老婆,c哭了,
所以,你輸入 12 34 56
然后輸出a,b,c,結果:
a=34,b=56,c=0(默認值0)
請問:下面這種形式,是哪個和哪個非法組隊?
int a=0,b=0,c=0;
① ② ③
scanf("%d%*d%d",&a,&b,&c);
答案:②③非法組隊,因為*出現以后
才拉攏她的后一個組隊!
(2) 【%.*d 】的隊友被槍斃了:
承上:上面的例子講解了%*d的情況,我們知道了他們內部秘密的非法組隊,即:
int a=0,b=0,c=0;
① ② ③
scanf("%*d%d%d"):①②組隊,①被槍斃
scanf("%d%*d%d"):②③組隊,②被槍斃
scanf("%d%d%*d"):③和空氣組隊,③被槍斃
啟下:這種情況:%.*d又是怎么回事?
其實道理還是一樣的,都是非法組隊,但是這次這個.*不簡單,所以它不會被槍斃,而是她的隊友被槍斃了:
int a=0,b=0,c=0;
① ② ③
scanf("%.*d%d%d"):①②組隊,②被槍斃
scanf("%d%.*d%d"):②③組隊,③被槍斃
scanf("%d%d%.*d"):③和空氣組隊,空氣被槍斃
所以第三種就是相當于沒加.*,完全等價于:
scanf("%d%d%d");
這兩種隨便你用哪種咯,
但是明智的你,應該會選擇最簡便的第二種,
2.正題2:printf就不講了,前面的【前言】似乎講得很明白了吧,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/236580.html
標籤:其他
上一篇:大資料殺熟!我被美團會員割了韭菜
