我制作这个小程序只是为了更好地理解处理字符串。但我遇到了一个小问题。这是代码。
#include<iostream>
#include<string>
using namespace std;
string& add( string&x ){
string t; // <= Is this the problem???Declaring local string variable
cout <<"Size of String :" <<x.size() << endl;
for(int i=0; i<x.size();i++){
int n = x[i] - '0';
t[i] = n + 2 + '0';
}
for(int i=0;i<x.size();i++)
cout <<"t["<<i<<"]="<<t[i]<<endl; //This line is showing output as I wanted
cout <<"\nt = " << t << endl; // <=why the output of this line is blank?
cout <<"size of t="<<t.size() << endl; // <=and why the size of string t is zero?
return t;
}
int main(){
string a;
cin >> a ;
string b = add(a);
cout << "b =" << b << endl;
system("pause");
return 0;
}
I / p:123
O / P:
字符串大小:3
t [0] = 3 t [1] = 4 t [2] = 5
T =
大小t = 0
b =
我在引用变量时遇到问题,将字符串作为引用传递并返回字符串。 谁能帮助我?
答案 0 :(得分:4)
是的,这是一个问题。你最终得到了悬空参考。在函数的退出处,本地string t
被销毁,返回的引用最终引用恰好位于t
所在内存位置的任何内容。稍后使用它将导致未定义的行为。
只需按值返回字符串
string add( /* const */ string&x ) // should use `const` probably if you don't modify x
编译器足够聪明,可以避免不必要的副本(参见copy elision)。
PS:您应该使用+=
运算符将char
附加到字符串,即t[i] = n + 2 + '0';
替换t[i] += n + 2 + '0';
。 std::string
是一个类,[]
运算符用于从INITIALIZED字符串读取/写入(不能通过递增计数器超过字符串结尾来附加,并且初始字符串的长度为0)。使用其重载的运算符+=
进行追加。
答案 1 :(得分:0)
我相信使用像itoa和atoi这样的有用函数是在整数和字符串之间进行转换的最佳方式,而且它也很容易。
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
string add( char * x ){
int n = atoi(x) + 2;
char m[10];
itoa(n, m, 10);
return m;
}
int main(){
char a[10];
cin >> a ;
string b = add(a);
cout << "b =" << b << endl;
system("pause");
return 0;
}
答案 2 :(得分:0)
在string t;
声明之后,t
是空字符串。因此,您不能将值分配给t[0],t[1]
等 - 它们不存在。 (从技术上讲,t[0]
作为t.cstr()
的空终止符存在,但是不要去那里。)
非法转让t[i]
后,长度仍为零。你很幸运,不会产生访问冲突!