[問題] 關於讀入指標字串

看板C_and_CPP (C/C++)作者 (FreedomKnight)時間15年前 (2011/05/10 00:06), 編輯推噓0(0053)
留言53則, 5人參與, 最新討論串1/1
不好意思 我以前其實沒有用過指標字串 我讀字串的方法很神秘 先 typedef char Str50[50]; //代表說做一個字元陣列的型別長度為50 Str50 string = {0};// 後面那個0試初始化讓他全部都塞滿NULL scanf("%s", &string); //這樣就可以讀到字串而前面因為初始化塞滿NULL //所以結尾一定也是NULL 照樣可以用string.h做特殊動作 但是呀 我邊看書發現 好像大家都是用指標字串 char *string = (char*) malloc(sizeof(char)); scanf("%s", string); //這邊我有弄懂為什麼不用& 應該是因為string存的是*string的位置 //有錯請糾正 但是我的問題來了 malloc的時候呀 不是只有給他一個char大小的記憶體嗎 但是呀 為什麼可以印出一串字呀 還是在scanf的時候 %s就有一個特殊機制了呢 還有呀 書上說 C字串 是個 const char * 但是呀 我對string輸入兩次不同的字 輸入hello就印hello 輸入fun就印fun 都是對string輸入 一點也不像const的感覺 的猜測 是他還是const 但是整串換掉 也就是string放的*string位置換掉了 做了一個新的const char 給string 不知我的想法對不對 最後就是呀 為什麼我有辦法pringf("%s", string); string不是存位置的嗎 我是有google過指標字串這一塊 但是都沒有人對讀入這塊做很好的解釋 希望能在這裡有人能為小弟解惑 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.57.127.44

05/10 00:14, , 1F
scanf與gets並不是一個安全讀字串的作法....
05/10 00:14, 1F

05/10 00:22, , 2F
還有呀 如果我的推測正確 同一字串輸入第二次的話
05/10 00:22, 2F

05/10 00:22, , 3F
前一個 會被free掉嗎
05/10 00:22, 3F

05/10 00:42, , 4F
如果你有再malloc則不會被free因為記憶體位置不同
05/10 00:42, 4F

05/10 00:43, , 5F
反之則是之前的會被覆蓋掉
05/10 00:43, 5F

05/10 00:43, , 6F
而且是printf 不是pringf
05/10 00:43, 6F

05/10 00:57, , 7F
scanf("%s",&string) 是非法用法...
05/10 00:57, 7F

05/10 01:48, , 8F
printgf那是打錯字 不好意思
05/10 01:48, 8F

05/10 01:58, , 9F
我總覺得你的書怪怪的...XD
05/10 01:58, 9F

05/10 02:00, , 10F
有一些是google看到的
05/10 02:00, 10F

05/10 02:01, , 11F
不好意思 我剛剛試了一printf("%s",*stirng);反而錯耶
05/10 02:01, 11F

05/10 02:02, , 12F
*string不是才是被指到的字串嗎
05/10 02:02, 12F

05/10 02:13, , 13F
printf 看到 %s 就會在後面找 char *
05/10 02:13, 13F

05/10 02:13, , 14F
你用 *string 反而會變成 char
05/10 02:13, 14F

05/10 02:13, , 15F
試試用 printf("%c", *string); 應該是印出第一個字元
05/10 02:13, 15F

05/10 02:28, , 16F
原來如此 那我以前%s的那種方式呀 不是用指標做的
05/10 02:28, 16F

05/10 02:28, , 17F
遇到%s也行得通 這是什麼原因呀
05/10 02:28, 17F

05/10 02:31, , 18F
意思就是優先找指標 再來才是找字元陣列的意思嗎
05/10 02:31, 18F

05/10 02:32, , 19F
真是不好意思 問這種刁鑽的問題
05/10 02:32, 19F

05/10 02:36, , 20F
char string[50] = {0}; 這樣的東西傳進函式會被轉成指標
05/10 02:36, 20F

05/10 02:43, , 21F

05/10 09:01, , 22F
那個不好意思,你誤解malloc那段,你只給他一個字元的大小
05/10 09:01, 22F

05/10 09:02, , 23F
(char*) malloc(sizeof(char) * size)才對.
05/10 09:02, 23F

05/10 09:04, , 24F
簡略的說c/c++的字串是字元陣列,你用malloc給予一個空間
05/10 09:04, 24F

05/10 09:06, , 25F
然後用char *去指向此空間,並且對他做操作.
05/10 09:06, 25F

05/10 16:32, , 26F
恩 那個我只給他一個字元大小 他還是有辦法印出一串字
05/10 16:32, 26F

05/10 16:33, , 27F
我也覺得很神秘 我看書上也是這樣做
05/10 16:33, 27F

05/10 16:33, , 28F
他是不是有用什麼動態的方式呀
05/10 16:33, 28F

05/10 16:36, , 29F
不,那只是單純的運氣好
05/10 16:36, 29F

05/10 16:37, , 30F
你租了一間房間卻用了三間 隔壁剛好沒人住的話就沒關係
05/10 16:37, 30F

05/10 17:04, , 31F
樓上的很貼切。只是剛好程式沒做什麼事才印得出來
05/10 17:04, 31F

05/10 22:24, , 32F
所以指標字串 還是必須去猜測讀入的字大小
05/10 22:24, 32F

05/10 22:25, , 33F
指標字串有辦法動態嗎
05/10 22:25, 33F

05/10 22:26, , 34F
malloc(sizeof(char) * size); 那個 size 就是動態決定的
05/10 22:26, 34F

05/10 22:26, , 35F
如果太大或太小,還可以用 realloc 去調整
05/10 22:26, 35F

05/10 23:29, , 36F
size是compiler有的嗎 還是要自己想辦法得知
05/10 23:29, 36F

05/10 23:29, , 37F
所以是要自己想辦法猜接下來 使用者會輸入多長的字嗎
05/10 23:29, 37F

05/10 23:30, , 38F
然後再realloc嗎
05/10 23:30, 38F

05/10 23:36, , 39F
嗯,如你所說,其實還挺麻煩的 XD
05/10 23:36, 39F

05/10 23:36, , 40F
不過像 char string[50]; 這樣就是寫死,完全無法改變了
05/10 23:36, 40F

05/10 23:37, , 41F
malloc & realloc 至少還有動態配置、調整大小的機會
05/10 23:37, 41F

05/10 23:48, , 42F
原來如此 所以C沒有真正的動態配置囉 還要自己去改
05/10 23:48, 42F

05/11 00:02, , 43F
如果你說要全自動伸縮的動態配置的話...C應該沒有
05/11 00:02, 43F

05/11 00:08, , 44F
小弟我剛剛去查了一下 array的部分
05/11 00:08, 44F

05/11 00:09, , 45F
發現不宣告長度 會自動配置適當的大小
05/11 00:09, 45F

05/11 00:09, , 46F
所以這會是我過的原因嗎
05/11 00:09, 46F

05/11 00:10, , 47F
電腦自動當成 char string[]這樣
05/11 00:10, 47F

05/11 00:17, , 48F
你指的是 char str[] = "Hello World"; 這種情況嗎?
05/11 00:17, 48F

05/11 01:30, , 49F
恩 我以為
05/11 01:30, 49F

05/11 08:14, , 50F
我比較建議你先去把13誡看一遍,嚴重發現你沒有這方面的
05/11 08:14, 50F

05/11 08:16, , 51F
觀念.一開始說c/c++的字串是字元陣列,你要從這方面去想
05/11 08:16, 51F

05/11 08:18, , 52F
而且你的問題其實是分好幾個小節來問,這樣大家也要分好
05/11 08:18, 52F

05/11 08:19, , 53F
幾段來回你,除非你觀念清晰,不然可能會有懂沒有進去
05/11 08:19, 53F
文章代碼(AID): #1Do13tYf (C_and_CPP)
文章代碼(AID): #1Do13tYf (C_and_CPP)