从 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>0
。在最后一次迭代中,i==0
和 j==input.length()
产生了 reverse[input.length()]=input[-1]
,两者都超出了范围。
【参考方案1】:
问题在于cin
。读取第一个空格字符后停止读取。
请参阅本教程的“cin 和字符串”部分:http://www.cplusplus.com/doc/tutorial/basic_io/
你可以使用getline(cin, input);
做你想做的事。
【讨论】:
【参考方案2】:cin>>input;
读取的是一个单词,而不是一行。
使用例如getline(cin, input);
读一行
【讨论】:
【参考方案3】:cin >> input
读取一个单词。要阅读整行,您应该使用 getline
getline(cin, input);
在这种情况下,调试器非常有用,您可以看到逐步执行程序的变量的值。
一个简单的 cout
【讨论】:
感谢您的意见。我将开始使用调试器。【参考方案4】:试试这个:istream& getline ( istream& is, string& 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>>
的标准行为,它只读取到第一个空白字符。
【讨论】:
【参考方案9】:需要使用cin.getline(),cin >> s只会读取第一个单词(空格分隔)
【讨论】:
以上是关于从 C++ 函数返回一个字符串的主要内容,如果未能解决你的问题,请参考以下文章