使用 for 循环 C++ 反转字符串

reversing a string using a for loop C++

我尝试使用以下代码反转字符串,但得到的是永无止境的小框输出。 (每行 1 个)

代码:

#include <iostream>
#include <math.h>
#include <iomanip>
#include <sstream>



int main() {


     // Reversing A String
    cout<<"welcome to string reverser"<<endl;
    int sizeOfString;
    cout<<"please input size of string"<<endl;
    cin>>sizeOfString;
    char charray3[sizeOfString];
    cin>>charray3;

    for(unsigned int i=sizeOfString-1; i>=0; i--){

    cout<<charray3[i]<<endl;
    }
return 0;
}

在我的尝试中,我将 sizeOfString 设置为 3,并将 charray3 设置为 'abc'。

输出:

box output

我做错了什么?

  1. 标准 C++ 不允许您使用变量作为数组的大小。
  2. 字符串以 [=10=] 字符结束。
  3. 不要使用字符数组,而是 std::string
  4. 你的循环永远不会终止,因为 i>=0 总是正确的,因为 i 是无符号的(其中 i 将是你的无符号在 0 之后可以保持的最大价值迭代)。

不要询问字符串的大小。除了不必要之外,它还会使您的程序不标准,因为可变长度数组构造 char charray3[sizeOfString] 是编译器扩展。

改用std::getline,它将根据需要分配读取的字符数。之后,按照与上面相同的方式反向打印字符串,或者如果您愿意,可以原地反转字符串。小心无符号减法!不过,您的编译器应该警告您。

注意:如果您想知道为什么您的程序无法运行,在读取 int 后缓冲区中还有剩余的 '\n' .由于该缓冲字符,一旦您调用 cin>>charray3.

,程序 returns 就会带有一个空字符串

您正在重新发明轮子:) 使用 std::stringstd::reverse:

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

int main() {
    std::string str{"Hello, World!"};
    std::reverse(str.begin(), str.end());
    std::cout << str << std::endl;
}

Here's a working online example.

您可以轻松使用 class 字符串:

#include <iostream>
#include <string>


int main()
{

    std::string s1 = "Hello", s2;

    for(int i(s1.length() - 1 ); i >= 0; i--)
        s2+= s1[i];

    std::cout << s1 << std::endl;
    std::cout << s2 << std::endl;

    return 0;
}
  • 要使用字符数组以您的方式解决问题,请考虑:

1- 您输入了 sizeOfString 一题: cin 的输入溢出或下溢输入大小(更小或更大)怎么办???

例如:

sizeOfString = 5;
cin >> charray3; // "ab" now the size is only 3 (+ null terminator)

这样写:

charray3[sizeOfString - 1] = 'c'; // charray3[5 - 1] // charray[4]

虽然没有输入 charray4,因为您只输入了 charray3[0]charray3[1],因此出现段错误。

要更正它,您必须做一些额外的工作:

#include <iostream>
using namespace std;


int main() 
{
     // Reversing A String
    cout << "welcome to string reverser" << endl;
    int sizeOfString;

    cout << "please input size of string" << endl;
    cin >> sizeOfString; // you specified size

    cin.ignore(1, '\n'); // clean the input buffer

    char* charray3 = new char[sizeOfString + 1];
    //cin>>charray3; use getline instead to get whitespaces

    cout << "enter text: " << endl;
    cin.getline(charray3, sizeOfString); // what if the user enter a text smaller or bigger than sizeOfString???
    charray3[sizeOfString] = '[=13=]';
    //to correct it:

    // take effects of input on sizeOfString
    sizeOfString = strlen(charray3);

    cout << "before reversing: " << endl;
    cout << charray3 << endl;
    // to reverse it create a temporary array:

    char* pTmp = new char[sizeOfString + 1];

    for(int i(sizeOfString-1), j = 0; i >= 0; i--, j++)
       pTmp[j] = charray3[i];
    pTmp[sizeOfString] = '[=13=]';

    cout << "after reversing: " << endl;
    cout << pTmp << endl;

    // don't forget to clean:
    delete[] charray3;
    delete[] pTmp;

return 0;
}
// First method
const int MAXLENGTH = 100;
char s[MAXLENGTH];
cin >> s;
int len = strlen(s);
for(int i = 0; i < len/2; i++) {
    char temp = s[i];
    s[i] = s[len-1-i];
    s[len-1-i] = temp;
}
cout << s;

// Second
string s;
cin >> s;
for(int i = 0, len = s.length(); i < len/2; i++) {
    char t = s[i];
    s[i] = s[len-1-i];
    s[len-1-i] = t;
}
cout << s;

代码现在神秘地工作了。 1)我改变了循环,使它成为一个前向循环并且它起作用了 2) 我恢复到问题代码并删除了无符号类型。

#include <iostream>
#include <math.h>
#include <iomanip>
#include <sstream>



int main() {


 cout<<"welcome to string reverser"<<endl;
    int sizeOfString;
    cout<<"please input size of string"<<endl;
    cin>>sizeOfString;
    char charray3[sizeOfString];
    cin>>charray3;

    for(int i=sizeOfString-1; i>=0; i--){

    cout<<charray3[i]<<endl;
    }
return 0;
}

谢谢大家的评论和回答。我将尝试提供的各种替代代码。