看板 C_and_CPP 關於我們 聯絡資訊
今天在做一些網路上的練習題的時候 做到一半,發生一個意外發現的東西 (可能對大家來說不怎麼意外) 就是像這樣 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
tmdggyygan: 寫錯了code裡面不是i,而是1 04/04 15:48
TobyH4cker: 你不會C++ 04/04 16:55
TobyH4cker: 連英文也不行... 04/04 16:58
TobyH4cker: 連截圖也 04/04 16:58
TobyH4cker: 不會 04/04 16:59
TobyH4cker: 版規也沒看 04/04 16:59
TobyH4cker: 換好吧 04/04 16:59
TobyH4cker: 換行吧 04/04 16:59
我當然不會啊XDDDD,想學才自己找資料看,自己試,見笑了
TobyH4cker: 應該說置底文才對 04/04 17:01
我有看過置底文,但是不太確定我犯了什麼錯誤,能否請教一下呢?
celen99: 樓上中文也打錯 04/04 17:13
※ 編輯: tmdggyygan (49.215.51.59), 04/04/2016 18:41:01 ※ 編輯: tmdggyygan (49.215.51.59), 04/04/2016 18:46:20
weiclin: 就如你想的是把 + 去除, 類似 string.at(1) 04/04 20:58
ko27tye: 1.建議你把code貼上來 不要只有圖 2.看不懂你想幹嘛 04/04 20:59
ko27tye: 3.&string會丟給你string[0]的記憶體位置,但每個字元都 04/04 21:00
ko27tye: 有自己的記憶體位置 04/04 21:01
weiclin: 由於回傳的是 reference, 取 & 就會變成 char* 04/04 21:02
ko27tye: 你寫&code[1]就是把那個字串的第二個字記憶體位置show出 04/04 21:02
weiclin: 這個 char* 指向 string 儲存資料的空間 04/04 21:14
weiclin: 所以你就可以像在用 char array 那樣使用它 04/04 21:14
謝謝大家的回答,我開電腦把code放上來 ※ 編輯: tmdggyygan (49.215.51.59), 04/04/2016 22:04:57 ※ 編輯: tmdggyygan (49.215.51.59), 04/04/2016 22:35:46
tmdggyygan: wei大你好,所以無論我是否有宣告指標,只要我程式中有 04/04 22:40
tmdggyygan: 用到& 系統會自動視我的字串為指標嗎?還是字串本身 04/04 22:41
tmdggyygan: 就有這個特性呢? 04/04 22:41
tmdggyygan: wei大,在請教一下,為何各位前輩都說是char呢? 04/04 22:46
tmdggyygan: 我宣告的是字串呀@@ 04/04 22:46
tmdggyygan: 我知道字串是一串字元,但是各位前輩這樣的講法是通用 04/04 22:47
tmdggyygan: 的嗎? 04/04 22:47
tmdggyygan: ko大您好,對於您剛剛的解釋我又做了一次測試 04/04 22:50
tmdggyygan: cout << &code[1] << "\t" << &code << "\t" << &code 04/04 22:50
tmdggyygan: cout << &code[1] << "\t" << &code << "\t" << &code 04/04 22:51
tmdggyygan: [0] << "\t" << &code[1] << "\t" << &code[2]; 04/04 22:52
tmdggyygan: 結果出來的結果是 04/04 22:53
tmdggyygan: iluh 0x6afee8 .iluh iluh luh 04/04 22:54
tmdggyygan: sorry,電腦板用不太習慣= ="蠻雜亂的 04/04 22:54
ko27tye: sorry我回答錯了 解釋:goo.gl/GySmGn 04/05 00:49
ko27tye: <<運算元重載到const char* 所以變成字串從[n]個開始往後 04/05 00:53
ko27tye: 另外你想消除+字元的話 你可以參考assign函式的用法 04/05 01:13
感謝解答,對我幫助很大,受教了
twitcha101: &code[1] 是你i的記憶體位子,std輸出把他判為 %s,然 04/05 02:23
twitcha101: 後他會他會讀到 /n為止 04/05 02:25
twitcha101: 抱歉更正 ,是\0 04/05 02:30
twitcha101: 你會覺得奇怪是因為 cout會自動把字串指標,直接轉印 04/05 02:44
twitcha101: 成字串 04/05 02:45
對!因為我想說&這個取址運算子應該只有我有用指標才會用得到,怎麼會在我沒有宣告指標的情況下出現不一樣的功能,感謝解答
weiclin: 指標就是記憶體位址, 所以你可以宣告 char *p = &code[1] 04/05 04:40
weiclin: 我想你搞不懂的地方應該是 std::string 怎麼運作的 04/05 04:41
weiclin: string內部會管理一塊記憶體位址用來儲存資料 04/05 04:44
weiclin: 在不支援string的地方,你需要有辦法將string變成char* 04/05 04:48
weiclin: 例如用到某些 C 語言實作的 API, 就不會支援 string 04/05 04:49
weiclin: 所以會用到 .c_str .data .at 或陣列運算子 04/05 05:02
weiclin: c++11以前,string內部的記憶可能不連續,或非null ending 04/05 05:03
weiclin: 所以 .c_str 用來確保你拿到合法的 char array 04/05 05:04
weiclin: 而後面三個方法你會直接拿到string內部那塊記憶體 04/05 05:04
weiclin: 所以 string[0] 是內部的第一個字元(by reference) 04/05 05:05
weiclin: &string[0] 就是取得內部記憶體第一個字元的指標 04/05 05:06
weiclin: 你可以用來代替 .c_str 但是風險自負 04/05 05:13
weiclin: c++11之後就可以很安全的用 &string[0] 代替 .c_str 04/05 05:14
weiclin: 因為c++標準規定string內部應該是連續且null terminated 04/05 05:15
weiclin: 上面那句更正, 是c++11標準 04/05 05:15
weiclin: 我們用 std::string 來幫我們管理字串的 malloc 及 free 04/05 05:20
weiclin: 然後又對 string 取得的記憶體區塊上下其手,就是這樣了 04/05 05:22
另外再次感謝回答的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