[問題] 在輸出字串時在前面加上&

看板C_and_CPP (C/C++)作者 (朝聞到,SEX可以)時間10年前 (2016/04/04 15:47), 10年前編輯推噓5(5052)
留言57則, 6人參與, 最新討論串1/1
今天在做一些網路上的練習題的時候 做到一半,發生一個意外發現的東西 (可能對大家來說不怎麼意外) 就是像這樣 http://i.imgur.com/9evArsJ.jpg
程式執行完成 http://i.imgur.com/oAnF4m2.jpg
我想請教的是,在倒數第二行程式碼 cout << &code [i]; 這樣的寫法是正常的寫法,還是我運氣好,如果是正常的,那他代表的是什麼意思呢?? 我想要的用這樣的用意是把string裡面的"+"去除,還是有其他更簡便或是更好的方式? 另外再請教一個問題,string的記憶體位址是不是只有一個,因為string看作一個整體,跟字元的每個元素都有一個記憶體位址是不一樣的? 謝謝大家 補上code: #include <iostream> #include <string> #include <math.h> #include <cstring> using namespace std; void code(){ //未完成,無須介意 } int main() { string code,decode,originalcode; int i=0 ; cout << "If you wanna coding,add '+' in the title" << endl << endl ; cout << "If you wanna decoding , please add '-' int the title" << endl <<endl ; cout << "Please type your content : " << endl << endl ; getline(cin,originalcode); if (originalcode[0]== '+') { for(i=0;i<originalcode.length();i++) { originalcode[i] = originalcode[i]+3; //註1 } code = originalcode; } else if (originalcode[0]== '-') { decode = originalcode; //這部份還未完成 } else { cout << "wrong content"; } cout << &code[1]; //註2 return 0; } --------------------------------------------------- 這個程式是網路上看到的練習題,內容是類似加密跟解密 當字串[0]="+"時加密 or ="-"時解密,其實就是英文數字往後加3位拉呵呵= =" 所以當我輸入"+fire"的時候,cout必須是"iluh",字串內的每個字元都向後移三位 同時把加號去除,我原本是在"註1"的地方用code[i] = originalcode[i+1],但是編譯 不過,而且好像是犯了十誡裡面某一條,類似不能i=i++的樣子,然後又嘗試了strcpy strnpy等等分割字串的函式,又因為函式裡面所需要輸入的數值必須是常數 所以想說先從cout下手,也就是"註2"的地方,運氣好變成現在的code 所以想上來請教一下,這樣子cout << &code[1] 這個部份 不是輸出code[1]的記憶體位址所儲存的值嗎? 但是我尚未宣告任何指標呀? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.215.51.59 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1459756038.A.BD6.html

04/04 15:48, , 1F
寫錯了code裡面不是i,而是1
04/04 15:48, 1F

04/04 16:55, , 2F
你不會C++
04/04 16:55, 2F

04/04 16:58, , 3F
連英文也不行...
04/04 16:58, 3F

04/04 16:58, , 4F
連截圖也
04/04 16:58, 4F

04/04 16:59, , 5F
不會
04/04 16:59, 5F

04/04 16:59, , 6F
版規也沒看
04/04 16:59, 6F

04/04 16:59, , 7F
換好吧
04/04 16:59, 7F

04/04 16:59, , 8F
換行吧
04/04 16:59, 8F
我當然不會啊XDDDD,想學才自己找資料看,自己試,見笑了

04/04 17:01, , 9F
應該說置底文才對
04/04 17:01, 9F
我有看過置底文,但是不太確定我犯了什麼錯誤,能否請教一下呢?

04/04 17:13, , 10F
樓上中文也打錯
04/04 17:13, 10F
※ 編輯: tmdggyygan (49.215.51.59), 04/04/2016 18:41:01 ※ 編輯: tmdggyygan (49.215.51.59), 04/04/2016 18:46:20

04/04 20:58, , 11F
就如你想的是把 + 去除, 類似 string.at(1)
04/04 20:58, 11F

04/04 20:59, , 12F
1.建議你把code貼上來 不要只有圖 2.看不懂你想幹嘛
04/04 20:59, 12F

04/04 21:00, , 13F
3.&string會丟給你string[0]的記憶體位置,但每個字元都
04/04 21:00, 13F

04/04 21:01, , 14F
有自己的記憶體位置
04/04 21:01, 14F

04/04 21:02, , 15F
由於回傳的是 reference, 取 & 就會變成 char*
04/04 21:02, 15F

04/04 21:02, , 16F
你寫&code[1]就是把那個字串的第二個字記憶體位置show出
04/04 21:02, 16F

04/04 21:14, , 17F
這個 char* 指向 string 儲存資料的空間
04/04 21:14, 17F

04/04 21:14, , 18F
所以你就可以像在用 char array 那樣使用它
04/04 21:14, 18F
謝謝大家的回答,我開電腦把code放上來 ※ 編輯: tmdggyygan (49.215.51.59), 04/04/2016 22:04:57 ※ 編輯: tmdggyygan (49.215.51.59), 04/04/2016 22:35:46

04/04 22:40, , 19F
wei大你好,所以無論我是否有宣告指標,只要我程式中有
04/04 22:40, 19F

04/04 22:41, , 20F
用到& 系統會自動視我的字串為指標嗎?還是字串本身
04/04 22:41, 20F

04/04 22:41, , 21F
就有這個特性呢?
04/04 22:41, 21F

04/04 22:46, , 22F
wei大,在請教一下,為何各位前輩都說是char呢?
04/04 22:46, 22F

04/04 22:46, , 23F
我宣告的是字串呀@@
04/04 22:46, 23F

04/04 22:47, , 24F
我知道字串是一串字元,但是各位前輩這樣的講法是通用
04/04 22:47, 24F

04/04 22:47, , 25F
的嗎?
04/04 22:47, 25F

04/04 22:50, , 26F
ko大您好,對於您剛剛的解釋我又做了一次測試
04/04 22:50, 26F

04/04 22:50, , 27F
cout << &code[1] << "\t" << &code << "\t" << &code
04/04 22:50, 27F

04/04 22:51, , 28F
cout << &code[1] << "\t" << &code << "\t" << &code
04/04 22:51, 28F

04/04 22:52, , 29F
[0] << "\t" << &code[1] << "\t" << &code[2];
04/04 22:52, 29F

04/04 22:53, , 30F
結果出來的結果是
04/04 22:53, 30F

04/04 22:54, , 31F
iluh 0x6afee8 .iluh iluh luh
04/04 22:54, 31F

04/04 22:54, , 32F
sorry,電腦板用不太習慣= ="蠻雜亂的
04/04 22:54, 32F

04/05 00:49, , 33F
sorry我回答錯了 解釋:goo.gl/GySmGn
04/05 00:49, 33F

04/05 00:53, , 34F
<<運算元重載到const char* 所以變成字串從[n]個開始往後
04/05 00:53, 34F

04/05 01:13, , 35F
另外你想消除+字元的話 你可以參考assign函式的用法
04/05 01:13, 35F
感謝解答,對我幫助很大,受教了

04/05 02:23, , 36F
&code[1] 是你i的記憶體位子,std輸出把他判為 %s,然
04/05 02:23, 36F

04/05 02:25, , 37F
後他會他會讀到 /n為止
04/05 02:25, 37F

04/05 02:30, , 38F
抱歉更正 ,是\0
04/05 02:30, 38F

04/05 02:44, , 39F
你會覺得奇怪是因為 cout會自動把字串指標,直接轉印
04/05 02:44, 39F

04/05 02:45, , 40F
成字串
04/05 02:45, 40F
對!因為我想說&這個取址運算子應該只有我有用指標才會用得到,怎麼會在我沒有宣告指標的情況下出現不一樣的功能,感謝解答

04/05 04:40, , 41F
指標就是記憶體位址, 所以你可以宣告 char *p = &code[1]
04/05 04:40, 41F

04/05 04:41, , 42F
我想你搞不懂的地方應該是 std::string 怎麼運作的
04/05 04:41, 42F

04/05 04:44, , 43F
string內部會管理一塊記憶體位址用來儲存資料
04/05 04:44, 43F

04/05 04:48, , 44F
在不支援string的地方,你需要有辦法將string變成char*
04/05 04:48, 44F

04/05 04:49, , 45F
例如用到某些 C 語言實作的 API, 就不會支援 string
04/05 04:49, 45F

04/05 05:02, , 46F
所以會用到 .c_str .data .at 或陣列運算子
04/05 05:02, 46F

04/05 05:03, , 47F
c++11以前,string內部的記憶可能不連續,或非null ending
04/05 05:03, 47F

04/05 05:04, , 48F
所以 .c_str 用來確保你拿到合法的 char array
04/05 05:04, 48F

04/05 05:04, , 49F
而後面三個方法你會直接拿到string內部那塊記憶體
04/05 05:04, 49F

04/05 05:05, , 50F
所以 string[0] 是內部的第一個字元(by reference)
04/05 05:05, 50F

04/05 05:06, , 51F
&string[0] 就是取得內部記憶體第一個字元的指標
04/05 05:06, 51F

04/05 05:13, , 52F
你可以用來代替 .c_str 但是風險自負
04/05 05:13, 52F

04/05 05:14, , 53F
c++11之後就可以很安全的用 &string[0] 代替 .c_str
04/05 05:14, 53F

04/05 05:15, , 54F
因為c++標準規定string內部應該是連續且null terminated
04/05 05:15, 54F

04/05 05:15, , 55F
上面那句更正, 是c++11標準
04/05 05:15, 55F

04/05 05:20, , 56F
我們用 std::string 來幫我們管理字串的 malloc 及 free
04/05 05:20, 56F

04/05 05:22, , 57F
然後又對 string 取得的記憶體區塊上下其手,就是這樣了
04/05 05:22, 57F
另外再次感謝回答的ko大以及tw大,受益良多,人間有溫暖,處處有溫情XDDDD amazing!!wei大解決了另外的一個問題,又幫我科普了字串的一些運作模式,這些寶貴的經驗是書上跟網路上查不到的,謝謝您 ※ 編輯: tmdggyygan (49.215.51.59), 04/05/2016 07:45:54 ※ 編輯: tmdggyygan (49.215.51.59), 04/05/2016 07:46:56 ※ 編輯: tmdggyygan (49.215.51.59), 04/05/2016 07:52:08 ※ 編輯: tmdggyygan (49.215.51.59), 04/05/2016 07:53:35
文章代碼(AID): #1N0Xm6lM (C_and_CPP)
文章代碼(AID): #1N0Xm6lM (C_and_CPP)