[問題] 使用指標宣告字串的問題

看板C_and_CPP作者 (~睿~)時間11年前 (2013/05/01 19:13), 編輯推噓3(3024)
留言27則, 12人參與, 最新討論串1/1
初學者在不知道有 #include <cstring> 的情況下 一般我們宣告一個字串的方式是 char str[] = "Hello"; //字元陣列 或是使用 指標來宣告字串 char *str = "Hello"; Q1. 以上應該沒有理解錯誤吧? ============================================ 我使用 strcat 串接兩個字串 char str1[] = "Hello"; char str2[] = "World"; strcat(str1, str2); cout << str1 << endl; // 印出HelloWorld Q2. 以上應該也沒有問題吧? ============================================= 後來我把字串改成用指標宣告 char *str1 = "Hello"; char *str2 = "World"; strcat(str1, str2); cout << str1 << endl; 一編譯程式就當掉了! Q3. 到底是出了什麼問題?? ============================================= 我又使用 strcpy 玩玩看 char str1[] = "America"; char str2[] = "Taiwan"; strcpy(str1, str2); cout << str1 << endl; // 印出Taiwan Q4. 這裡也沒有錯吧? ============================================== 換成用指標宣告str2字串 char str1[] = "America"; char *str2 = "Taiwan"; strcpy(str1, str2); cout << str1 << endl; // 印出Taiwan Q5. 這裡應該也是正確的吧? =============================================== 我不死心又做了另一個測試 char *str1 = "America"; char *str2 = "Taiwan"; strcpy(str1, str2); cout << str1 << endl; Q6. 程式又掛掉了? 為什麼... =============================================== 我自己得到一個結論 好像用指標宣告的字串 你不能對它改變作任何修改 其實 應該就是對指標的概念不夠清楚 還請各位成是先進指點迷津... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.201.200

05/01 19:17, , 1F
置底文有你要的答案
05/01 19:17, 1F

05/01 19:22, , 2F
Q2理解就有問題了後面懶得看
05/01 19:22, 2F

05/01 19:28, , 3F
雙引號括起來的叫做字串常數, 型態是 const char *
05/01 19:28, 3F

05/01 19:28, , 4F
你去更動唯讀的記憶體 那當然就出錯
05/01 19:28, 4F

05/01 19:29, , 5F
4. 不要試圖用 char* 去更改一個"字串常數"
05/01 19:29, 5F

05/01 19:30, , 6F
請問 jaclace大大 Q2哪裡有問題? 指點一下好讓小弟擺脫
05/01 19:30, 6F

05/01 19:31, , 7F
錯誤的觀念...
05/01 19:31, 7F

05/01 19:43, , 8F
如果置底看不懂 把所有關鍵字google一遍 提示你 常數(const)
05/01 19:43, 8F

05/01 19:46, , 9F
Q2會有問題吧 array沒那麼長啊
05/01 19:46, 9F

05/01 19:47, , 10F
是說都用C++了,好string不用嗎?
05/01 19:47, 10F

05/01 19:52, , 11F
Q2會炸掉,沒炸掉是運氣好
05/01 19:52, 11F

05/01 19:54, , 12F
你用char* 指向的都是const,你不應該去修改const
05/01 19:54, 12F

05/01 19:55, , 13F
你Q2的寫法意思是 偷偷的在不屬於自己的空間放東西
05/01 19:55, 13F

05/01 19:56, , 14F
偷偷放不一定會炸掉 所以你的決果剛好沒有錯
05/01 19:56, 14F

05/01 20:39, , 15F
to xvid: 剛剛很認真看了置底文第四點 已經懂了 謝謝!
05/01 20:39, 15F

05/01 20:40, , 16F
to tjh89017, diabloevagto, prismwu 原來要初始
05/01 20:40, 16F

05/01 20:42, , 17F
化 str1的 長度 char str1[80] ={'\0'};
05/01 20:42, 17F

05/01 22:51, , 18F
怎麼大家都唉唉叫 Q2 會炸, 明明從 Q1 起就通通炸光光了啊XD
05/01 22:51, 18F

05/01 23:03, , 19F
Q1怎麼會炸掉?最後會自動加上\0不是嗎
05/01 23:03, 19F

05/01 23:13, , 20F
Q1 被cat上去的那個array空間會炸:)
05/01 23:13, 20F

05/01 23:14, , 21F
Q1的str1空間不夠來裝
05/01 23:14, 21F

05/01 23:15, , 22F
其實樓上們講的是Q2. 不過原po的排版實在是...
05/01 23:15, 22F

05/01 23:15, , 23F
忽然發現我中文有問題, 講str1比較清楚....XD
05/01 23:15, 23F

05/01 23:18, , 24F
原來題號是放在問題下耶
05/01 23:18, 24F

05/02 00:25, , 25F
囧rz
05/02 00:25, 25F

05/02 02:00, , 26F
這排版有很大的進步空間
05/02 02:00, 26F

05/02 02:01, , 27F
哈哈 真的很抱歉 == 今天真的學到很多!
05/02 02:01, 27F
文章代碼(AID): #1HWFZMH9 (C_and_CPP)