• 2

(請教) 同一支C語言小程式,在不同的IDE環境,Compile & Run 輸出結果卻大不相同

#include <stdio.h>

main() {
int count;
printf("123%n\n", &count);
printf("count = %d\n", count);
}

Dev-C++, Compile & Run 輸出結果只有底下一列
123count=0

Replit, Compile & Run 輸出結果是底下兩列
123
count=3


都沒有任何錯誤訊息,有人知道哪一個才是正確解答嗎? Thanks a lot........</stdio.h>
2024-01-11 18:47 發佈
應該第二個結果才是正確的

沒用過Dev-C++,不太清楚為什麼會得到這個結果
感覺有點像是它的C library不支援%n
實際可能要看它的文件對printf()函式的說明吧
魚與熊掌不可兼得,小孩子才做選擇。 我. 全. 都. 要.
向柳 wrote:
應該第二個結果才是正...(恕刪)


我又嘗試用了兩個free web IDE去run,結果都是指向第二個,google後有人提到因為Dev-C++覺得%n有某種程式邏輯漏洞,所以會將它視為特殊作法,也就是不會去計算之前有多少字元,同時會將同一列雙引號從%n之後的資料或跳行等訊息忽略掉。
你好:全域變數會初始化為0,所以為0,這是全域變數所以印出來是0
%n 是把 "123" 長度傳給後面的那個變數,好像很少人這樣用

我沒用過 Dev-C++

你試著把 %n 後面的 \n 刪除,看會不會是 3
有興趣在「我們家」參與留言討論的朋友,歡迎私訊索取註冊邀請碼
ailaug2

123 長度就是 3 啊,你可以改成 1234%n 看會不會是 4

2024-01-11 20:54
CONA24

你好:真的欸,這個conversion specification 我還真沒用過。[吃驚]printf竟然還可以用來賦值!

2024-01-11 21:00
unl7911 wrote:
有人提到因為Dev-C++覺得%n有某種程式邏輯漏洞

確實有可能,函式說明裡有提到這點
例如
printf(abc);
而abc這個字串中剛好有帶%n符號,就會引發記憶體寫入造成安全漏洞
魚與熊掌不可兼得,小孩子才做選擇。 我. 全. 都. 要.
Grandiel

雖然工作寫C的人應該很少會把printf留在上版的專案內就是了,頂多測試的時候寫給自己看而已。

2024-01-11 21:09
Grandiel

順便給樓主一個建議,C可以當作軟體入門語言,但要能夠寫韌體或演算法不是只懂軟體就夠的,硬體方面電子電機這些也要會才有機會。

2024-01-11 21:12
剛剛我用C99編譯了一下,確實也是後者。
MinGW 的問題

你在程式最前面加這行就正常了

#define __USE_MINGW_ANSI_STDIO 1
unl7911 wrote:
有人知道哪一個才是正確解答嗎?


what is use of %n in printf()?
第二個結果才正確

printf("123%n\n", &count);
這一行會印出來“123”並把在%n印前的出來的長度(“123”的長度為3)存在count裏。還有\n會導致換行

printf("count = %d\n", count);
這一行則將列印count内所存的值(3)
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?