如何从函数返回一个字符串?

时间:2014-07-26 15:40:14

标签: c++ string function pointers pass-by-reference

我制作这个小程序只是为了更好地理解处理字符串。但我遇到了一个小问题。这是代码。

#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 =

我在引用变量时遇到问题,将字符串作为引用传递并返回字符串。 谁能帮助我?

3 个答案:

答案 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]后,长度仍为零。你很幸运,不会产生访问冲突!