[问题] 在输出字串时在前面加上&

楼主: 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