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

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

Links booklink

Contact Us: admin [ a t ] ucptt.com