printf的%s與&問題

看板C_and_CPP作者 (LaLaLand)時間4年前 (2019/08/18 10:04), 4年前編輯推噓8(8021)
留言29則, 7人參與, 4年前最新討論串1/1
各位大大好! 小弟無意間遇到一個問題,如下 char a[]="hello"; printf("%s", &a[0]); 輸出為hello,但是不是應該要是取a陣列第一個元素的位址嗎?怎麼會是輸出為hello呢? 請各位大大指點指點! 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.12.145.232 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1566093892.A.BE8.html

08/18 10:08, 4年前 , 1F
因為妳餵的是%s %s拿到記憶體位置就會一直吐字直到\0
08/18 10:08, 1F

08/18 10:15, 4年前 , 2F
對了 如果你要吐字元的話要給int 不能給記憶體位置
08/18 10:15, 2F

08/18 11:19, 4年前 , 3F
printf("%s",&a[0]); 等效於 printf("%s",a);
08/18 11:19, 3F

08/18 11:20, 4年前 , 4F
改這樣吧 printf("%08x", &a[0]);
08/18 11:20, 4F

08/18 13:15, 4年前 , 5F
printf("%p\n",a);
08/18 13:15, 5F

08/18 13:40, 4年前 , 6F
眼瞎沒看到你在問位置.. %p是專門顯示位置用的
08/18 13:40, 6F

08/18 13:41, 4年前 , 7F
用%p就不用擔心超過4byte的記憶體位置被截斷(truncated)
08/18 13:41, 7F

08/18 13:44, 4年前 , 8F
%x本身用於顯示hex 不像%p會自動補0x 比較直觀
08/18 13:44, 8F

08/18 13:47, 4年前 , 9F
不應該説擔心.. 用%x結果輸出被截斷是自己出錯
08/18 13:47, 9F
大概瞭解了!感謝各位! 不過有一點還是不太懂,就是d大一開始說的如果要吐字元的話就應該要給int,想問的是如 果吐字元不就是用%c,後面要給陣列元素嗎?int是什麼意思? 謝謝各位大大! ※ 編輯: OnlyCourage (101.12.145.232 臺灣), 08/18/2019 16:02:44

08/18 18:23, 4年前 , 10F
我是指後面給的元素要是int啦xd 因為%c要接的是int
08/18 18:23, 10F

08/18 18:54, 4年前 , 11F
%c 是輸出字元吧?
08/18 18:54, 11F

08/18 23:09, 4年前 , 12F
你應該先弄清楚矩陣a與a[0]的差異
08/18 23:09, 12F

08/18 23:12, 4年前 , 13F
阿,當我沒說,我看錯你的問題了
08/18 23:12, 13F

08/19 01:11, 4年前 , 14F
是字元沒錯 妳這句話讓我想到char,其實我是看到編譯器
08/19 01:11, 14F

08/19 01:14, 4年前 , 15F
的警告(expects argument of type int..),現在想想為
08/19 01:14, 15F

08/19 01:17, 4年前 , 16F
什麼不是char呢?是說給它大於1byte的變數它會自動截斷
08/19 01:17, 16F

08/19 19:47, 4年前 , 17F
大概是可變參數的關係: printf 這種可變參數函式
08/19 19:47, 17F

08/19 19:48, 4年前 , 18F
若傳不到 int 等級的整數會升成 int 再傳, 所以對編譯器
08/19 19:48, 18F

08/19 19:48, 4年前 , 19F
來說那裡是一個 int 參數; 但 printf 內部會看到你寫 %c
08/19 19:48, 19F

08/19 19:49, 4年前 , 20F
所以傳進去的東西會截斷到適當大小再輸出
08/19 19:49, 20F
沒想到感覺很基本的printf, %c, %s原來背後的意義這麼多0.0,小弟我還太淺了 哈哈哈 ※ 編輯: OnlyCourage (101.12.145.232 臺灣), 08/20/2019 00:44:14

08/20 01:04, 4年前 , 21F
順帶一提 float 會被轉成 double 喔
08/20 01:04, 21F

08/20 09:47, 4年前 , 22F
printf其實不是什麼很基本的東西 它技術的水很深的XD
08/20 09:47, 22F

08/20 09:49, 4年前 , 23F
只是初學者需要有一個直觀的手段去驗證寫的程式對不對
08/20 09:49, 23F

08/20 09:50, 4年前 , 24F
學C語言才會開頭都先帶他
08/20 09:50, 24F
你說的沒錯! 關於printf %c的觀念,我想請各位大大幫我做個確認。 char a='s'; printf("%c", a); s的ascii是73,所以%c需要一個int傳入,所以a得值是73傳入%c,所以才會printf出s字元 。這樣的說法不知道是不是有問題?還請各問指教了 謝謝 ※ 編輯: OnlyCourage (101.12.145.232 臺灣), 08/21/2019 12:16:33

08/21 15:21, 4年前 , 25F
沒問題, 但你可以把你這段話裡的 73 換成 's'
08/21 15:21, 25F

08/21 15:22, 4年前 , 26F
因為對電腦來說 's' == (char)73 的關係
08/21 15:22, 26F

08/21 15:22, 4年前 , 27F
至於是傳 int 進去這一點其實算是技術細節
08/21 15:22, 27F

08/21 15:23, 4年前 , 28F
這種技術細節理論上就算你是可變參數實作方也可以不用知道
08/21 15:23, 28F

08/21 15:23, 4年前 , 29F
(va_arg 會幫你處理掉這件事)
08/21 15:23, 29F
大致上瞭解了!謝謝各位! ※ 編輯: OnlyCourage (49.217.196.134 臺灣), 08/22/2019 00:45:33
文章代碼(AID): #1TMB94le (C_and_CPP)