2016-08-13 231 views
-4

我是一名编程初学者,被朋友给了一个项目来反转用户输入的字符串的顺序,但是当我运行这段代码时,程序只是反复打印输入的字符串很多时间结束,我不知道什么是错的。如何反转字符串

例如,我输入"hi",它只是多次打印"hi"。我一直在使用cingetlinescanf(如朋友推荐的)尝试过,但都无济于事......

#include <iostream> 

using namespace std; 

int main() 
{ 
    char arr[5]; 
    getline(cin, arr); 
    for(int x=4; x>=0; x--){ 
     cout << arr << endl; 
    } 
    return 0; 
} 
+2

以相反的顺序打印一个字符串,实际上反转一个字符串是两回事。您的标题询问实际上反转字符串,但您试图以相反的顺序打印。你究竟在努力实现什么? – taskinoor

+0

如果您删除循环并保留'cout << arr << endl;',它会打印什么?如果你把它放在循环中,为什​​么还要打印其他内容? – molbdnilo

+0

在一个不相关的说明中,事实上你的第一个程序有一个bug,你的直觉是检查所有的东西*除了你的逆转方法的逻辑不是一个好兆头。 – molbdnilo

回答

0

此行是错误的:

cout << arr << endl; 

你必须使用索引操作[]像这样:

cout << arr[x]; 

请注意,没有endl,因为这会打印新行中的每个字符。

使用arr [x]在索引x处给出数组的元素(或字符串,如果您愿意的话)。请注意,C++中的元素索引从0开始。因此,第一个元素是arr [0],第二个元素是arr [1],依此类推。

此外,为什么使用只有5号大小的C风格字符数组?你可以像使用C++ std :: string一样有效,它可以用于更大的字符串:

string x; 
getline(cin, x); 

for (int i = x.size() - 1; i >= 0; i--) 
{ 
    cout << x[i]; 
} 

cout << endl; 

希望这有助于。

0

当您编写cout << arr << endl;时,您将在循环的每次迭代中打印整个字符串。相反,您希望在索引x处打印该字符,因此您应该将其编写为cout << arr[x];如果在循环中使用endl,则每个字符后都会有一个新行。另外,在C++中,使用字符串库有一种更简单的方法来处理字符串。然后,您无需事先指定字符串中的字符数,并且在用户需要输入4个以上字符时有所帮助。

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string arr; 
    getline(cin, arr); 
    for(int x=arr.size()-1; x>=0; x--){ 
     cout << arr[x]; 
    } 
    cout << endl; 
    return 0; 
} 
+0

因此,通过包含字符串库,代码可以通过各个字符读取字符串?反过来,这又允许我把这个字符串看作是一个数组? –

+0

@ClovisNyu你可以像数组一样引用字符串的任何索引,而不用担心用户输入的时间长短。 – GoodDeeds

0

发生了什么事是你发送的arr全部内容cout 5倍。你想要的是反向打印每个字符;要做到这一点,你需要一次发送的arr只有一个字符,你for循环内:

cout << arr[x] // This sends the character at index x to cout 
cout << arr // This sends the entire array to cout 

此外,的for循环之后,你应该有cout << endl;否则,您将在每封信后打印一个换行符。

1

由于问题标记为C++,因此应该使用C++构造,如std::stringstd::reverse。这将会产生更易于理解的代码。

#include <string> 
#include <iostream> 
#include <algorithm> 

int main() 
{ 
    std::string input; 
    std::getline(std::cin, input); 
    std::reverse(input.begin(), input.end()); 
    std::cout << input << std::endl; 
    return 0; 
} 
0

交替使用的解决方案的迭代器:

#include <iostream> 
#include <iterator> 
#include <algorithm> 
#include <string> 

int main() 
{ 
    std::string input; 
    getline(std::cin, input); 

    for (std::string::reverse_iterator rit=input.rbegin(); rit!=input.rend(); ++rit) 
    std::cout << *rit; 

    return 0; 
} 
0

感谢您的帮助。为了回应Bart和Fang,我很抱歉,但我完全不明白你在说什么。什么是std :: do?什么是迭代器?坦率地说,我还没有搜索到它,所以我并不真的希望任何人在这里提供饲料。只是在阅读GoodDeeds和syntax_error的其他答案之后,我发现了一个有趣的发现。

指出的错误是我玩弄代码看结果是否有影响的结果。我原本写了arr [x],而不是arr(诚然,最终的东西是我的错)。让我感到意外的是,将GoodDeed的代码粘贴到我自己的代码上仍然没有解决问题。我开始怀疑这个软件,所以我删除了整个代码,并且简单地写了cout < < hello ;.令我惊讶的是,它仍然要求输入并多次打印该输入。

谷歌搜索了一下之后,我发现了关于“构建”。不太明白,但显然每次修改代码时都不会构建代码,代码块将无法识别这些更改。

感谢您的帮助!