簡體   English   中英

使用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'。

輸出:

盒子輸出

我究竟做錯了什么?

  1. 標准C ++不允許您將變量用作數組的大小。
  2. 字符串由\\0字符終止。
  3. 不要使用字符數組,而是使用std::string
  4. 你的循環永遠不會終止,因為i>=0總是為真,因為i是無符號的(其中i將是你的無符號在0迭代后可以保存的最大值)。

不要問字符串的大小。 除了沒有必要之外,它使您的程序非標准,因為可變長度數組構造char charray3[sizeOfString]是編譯器擴展。

使用std::getline ,它將根據需要分配讀取多個字符。 之后,以與上面相同的方式反向打印字符串,或者根據需要將字符串反轉。 小心無符號減法! 但是,您的編譯器應該警告您。

注意:如果您想知道為什么程序不起作用,讀取int后,緩沖區中會有一個剩余的'\\n' 由於緩沖字符,只要調用cin>>charray3 ,程序就會返回一個空字符串。

你正在重新發明輪子:)使用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;
}

這是一個有效的在線示例。

你可以輕松使用類字符串:

#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] = '\0';
    //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] = '\0';

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

謝謝你的意見和答案。 我將嘗試各種替代代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM