1

我是一个初学者,我一直在阅读一本关于 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 函数仅返回第一个输入单词的反转,而不是整个字符串。我不知道我哪里出错了。

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

4

9 回答 9

7

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

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

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

于 2011-11-08T14:36:51.697 回答
4

cin >> input读一个词。要阅读整行,您应该使用 getline

getline(cin, input);

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

一个简单的 cout << 输入;也会对您有所帮助,但是如果您仍然没有带有集成调试器的良好 IDE,我建议您使用一个。Eclipse 很好而且是开源的。如果您在 Windows 上,Visual Studio 2010 express 很好而且免费。

于 2011-11-08T14:35:36.917 回答
4

cin>>input; 读取一个单词,而不是一行。

使用 eggetline(cin, input);读取一行

于 2011-11-08T14:36:17.217 回答
2

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

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

getline(cin, input);

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

于 2011-11-08T14:35:55.637 回答
1

就地反向功能已在此处详细回答:

如何在 C 或 C++ 中反转字符串?

于 2011-11-08T14:39:29.167 回答
1

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

所以你需要的基本上是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";
}
于 2011-11-08T14:41:23.103 回答
1

至于您关于参考和复制的问题:

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;
}

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

于 2011-11-08T14:49:24.940 回答
0

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

于 2011-11-08T14:38:13.957 回答
0

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

于 2011-11-08T14:46:02.287 回答