2011-11-08 58 views
1

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

string reverseInput(string input);

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; 

此更改后,反向函数返回,而不是整个字符串只有第一输入的单词的反向。我无法弄清楚我错在哪里。

最后,有没有一种更优雅的方式来做到这一点,通过使用引用,而不做一个输入的副本,以便输入变量本身被修改?

+0

你的反向函数有一个bug。你应该使用'i> 0'作为'for'的条件。在最后一次迭代'i == 0'和'j == input.length()'导致'reverse [input.length()] = input [-1]',这两者都超出了界限。 – IronMensan

回答

4

cin >> input读一个字。要阅读一整行,你应该使用函数getline

getline(cin, input); 

调试器在这个情况下是非常有用的,你可以只看到变量步进通过程序的值。

A simple cout < < input;也会帮助你,但如果你还没有一个好的集成调试器的IDE,我会建议你使用一个。 Eclipse是很好的开源软件。如果你在windows上,Visual Studio 2010 express是很好的免费的。

+0

感谢您的意见。我将开始使用调试器。 – Zubizaretta

4

cin>>input;读一个字,而不是一行。

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

0

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

1

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

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

+1

这对他的情况没有帮助,因为他仍然错误地读取了字符串。 –

+0

同意,但只得到第一个字已被回答几次:-) – pointer

+0

对不起,我重读他明确要求一个就地版本。 –

1

与您的代码的问题是,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"; 
} 
0

您需要使用cin.getline(),CIN >> S将只读取第一个字(用空格分隔)

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

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