从 C++ 函数返回一个字符串

Posted

技术标签:

【中文标题】从 C++ 函数返回一个字符串【英文标题】:returning a string from a c++ function 【发布时间】:2011-11-08 14:33:36 【问题描述】:

我是一个初学者,我正在阅读一本关于 C++ 的书,我正在阅读关于函数的一章。我写了一个来反转一个字符串,将它的副本返回给 main 并输出它。

字符串反向输入(字符串输入);

int main()

    string input="Test string";
    //cin>>input;
    cout<<reverseInput(input);
    return 0;


string reverseInput(string input)

    string reverse=input;
    int count=input.length();
    for(int i=input.length(), j=0; i>=0; i--, j++)
        reverse[j]=input[i-1];
    
    return reverse;

上述方法似乎有效。当我更改以下代码时出现问题:

string input="Test string";

到:

string input;
cin>>input;

在此更改后,reverse 函数仅返回第一个输入单词的反转,而不是整个字符串。我不知道哪里出错了。

最后,有没有一种更优雅的方式来做到这一点,即使用引用,而不复制输入,从而修改输入变量本身?

【问题讨论】:

您的反向函数有错误。对于for 条件,您应该使用i&gt;0。在最后一次迭代中,i==0j==input.length() 产生了 reverse[input.length()]=input[-1],两者都超出了范围。 【参考方案1】:

问题在于cin。读取第一个空格字符后停止读取。

请参阅本教程的“cin 和字符串”部分:http://www.cplusplus.com/doc/tutorial/basic_io/

你可以使用getline(cin, input);做你想做的事。

【讨论】:

【参考方案2】:

cin&gt;&gt;input; 读取的是一个单词,而不是一行。

使用例如getline(cin, input);读一行

【讨论】:

【参考方案3】:

cin &gt;&gt; input 读取一个单词。要阅读整行,您应该使用 getline

getline(cin, input);

在这种情况下,调试器非常有用,您可以看到逐步执行程序的变量的值。

一个简单的 cout

【讨论】:

感谢您的意见。我将开始使用调试器。【参考方案4】:

试试这个:istream&amp; getline ( istream&amp; is, string&amp; str );

它从您提供的流中提取一整行,例如cin 并将其保存到 string 变量中。示例:

getline(cin, input);

cin.getline(...) 适用于 C 风格的字符缓冲区。

【讨论】:

【参考方案5】:

就地反向功能已经在这里详细回答了:

How do you reverse a string in place in C or C++?

【讨论】:

这对他没有帮助,因为他仍然错误地读取了字符串。 同意,但只得到第一个单词已经回答了好几次了 :-) 抱歉,我读错了,他明确要求提供就地版本。【参考方案6】:

您的代码的问题是std::cin 读取字符直到遇到std::isspace(c) 返回true 的字符。所以空格和换行符都是这样的字符,它们在传递给std::isspace时会返回true

所以你需要的基本上是std::getline:

std::string input;
if ( std::getline(std::cin, input))

    std::cout << reverseInput(input);

else

    std::cout <<"error while reading from standard input stream";

【讨论】:

【参考方案7】:

关于参考和复制的问题:

string& reverseInput(string& input)

    for (i = 0, j = input.length()-1; i < j; i++, j--) 
    
         char c = input[i];
         input[i] = input[j];
         input[j] = c;
    
    return input;

您将参数作为引用传递,然后返回一个引用。不涉及复制,并且在正文中,您没有定义任何新字符串,您正在处理同一个实例。

【讨论】:

【参考方案8】:

这不是您的反向函数中的错误,而是istream::operator&gt;&gt; 的标准行为,它只读取到第一个空白字符。

【讨论】:

【参考方案9】:

需要使用cin.getline(),cin >> s只会读取第一个单词(空格分隔)

【讨论】:

以上是关于从 C++ 函数返回一个字符串的主要内容,如果未能解决你的问题,请参考以下文章

C++ 从函数调用的多次返回中构建字符串向量的最佳方法

C ++:从函数、返回类型或引用中使用和返回字符数组?

如何从 C++ 中的函数返回字符串值

C++ 函数返回一个向量/字符串,但不是一个数组

字符串函数不返回字符串? c++ [关闭]

将字符串的引用从 C# 传递给 C++ 函数