0

我将一个整数作为字符串 s 的输入。我想以“-”和“|”的形式在 s 中写入整数。我确信我的逻辑是正确的。问题是字符串 s 在代码中自动被修改。当我最初打印字符串 s 时,它返回完整的 12345(我的输入是“2 12345”)但是当我之后尝试打印它时,它会被截断或其他东西。我该如何解决这个问题?

#include <iostream>
#include <string>
using namespace std;
int main(){
    int n;
    std::string s;
    cin >> n;
    cin >> s;
    cout << s.at(3) <<endl;
    while(n!=0){
        for (int l=0;l<3+2*n;l++){
            //  for (int i=0;i<s.length();i++){
            if (l==0){
                for (int j=0;j<s.length();j++){
                    if (s.at(j)=='1'||s.at(j)=='4'){
                        cout << " ";
                        for (int k=0;k<n;k++){
                            cout << " ";
                        }
                        cout << " ";
                    }
                    else if (s.at(j)=='0'||s.at(j)=='2'||s.at(j)=='3'||s.at(j)=='5'||s.at(j)=='6'||s.at(j)=='7'||s.at(j)=='8'||s.at(j)=='9'){
                        cout << " ";
                        for (int k=0;k<n;k++){
                            cout << "-";
                        }
                        cout << " ";
                    }
                    cout << " ";
                } 
            }

            else if (l==n+1){
                for (int j=0;j<s.length();j++){
                    if (s.at(j)=='1'||s.at(j)=='7'||s.at(j)=='0'){
                        cout << " ";
                        for (int k=0;k<n;k++){
                            cout << " ";
                        }
                        cout << " ";

                    }
                    else if (s.at(j)=='2'||s.at(j)=='3'||s.at(j)=='4'||s.at(j)=='5'||s.at(j)=='6'||s.at(j)=='8'||s.at(j)=='9'){
                        cout << " ";
                        for (int k=0;k<n;k++){
                            cout << "-";

                        }
                        cout << " ";
                    }
                    cout << " ";
                }
            }
            else if (l==2*n+2){
                for (int j=0;j<s.length();j++){
                    if (s.at(j)=='1'||s.at(j)=='4'||s.at(j)=='7'){
                        cout << " ";
                        for (int k=0;k<n;k++){
                            cout << " ";
                        }
                        cout << " ";
                    }
                    else if (s.at(j)=='0'||s.at(j)=='2'||s.at(j)=='3'||s.at(j)=='6'||s.at(j)=='8'||s.at(j)=='9'||s.at(j)=='5'){
                        cout << " ";
                        for (int k=0;k<n;k++){
                            cout << "-";
                        }
                        cout << " ";
                    }
                    cout << " ";
                }
            }
            else if ((l>0) && (l<n+1)){
                for (int j=0;j<s.length();j++){
                    if (s.at(j)=='1'||s.at(j)=='2'||s.at(j)=='3'||s.at(j)=='7'){
                        cout << " ";
                        for (int k=0;k<n;k++){
                            cout << " ";
                        }
                        cout << "|";
                    }
                    else if(s.at(j)='4'||s.at(j)=='8'||s.at(j)=='9'||s.at(j)=='0') {
                        cout << "|";
                        cout << "s "<< s<< endl;
                        cout << "check 2";
                        for (int k=0;k<n;k++){
                            cout << " ";
                        }
                        cout << "|";
                    }
                    else if(s.at(j)=='5'||s.at(j)=='6'){
                        cout << "|";
                        cout << "check";
                        for (int k=0;k<n;k++){
                            cout <<" ";
                        }
                        cout << " ";

                    }
                    cout << " ";
                }
            }
            else if ((l>n+1) && (l<2*n+2)){
                for (int j=0;j<s.length();j++){
                    if (s.at(j)=='1'||s.at(j)=='3'||s.at(j)=='5'||s.at(j)=='7'||s.at(j)=='9'||s.at(j)=='4'){
                        cout << " ";
                        for (int k=0;k<n;k++){
                            cout << " ";
                        }
                        cout << "|";
                    }
                    else if(s.at(j)='6'||s.at(j)=='8'||s.at(j)=='0') {
                        cout << "|";
                        for (int k=0;k<n;k++){
                            cout << " ";
                        }
                        cout << "|";
                    }
                    else if(s.at(j)=='2'){
                        cout << "|";
                        for (int k=0;k<n;k++){
                            cout <<" ";
                        }
                        cout << " ";
                    }
                    cout << " ";
                }
            }
            cout << s << endl;
            cout << endl;
}
            cin >> n;
            cin >> s;

        }
    }
4

3 回答 3

10

else if(s.at(j)='4'||

您忘记了 = 符号。

于 2013-09-09T19:01:06.007 回答
9

快速浏览一下就会发现s.at(j)='6's.at(j)='4'修改你的字符串。您可以通过使用Yoda 条件来避免这种情况。

这里有一些编译器可能会警告你一个赋值。(看评论)。

另请参阅 Mats Petersson 的回答,我认为这是最好的建议:如果您不想在特定情况下更改内容,请使用 const 对象、引用或指向 const 内存的指针。

如果你使用一个接受std::string const &s参数的函数,做这项工作,你最终会得到

  • 更简洁的代码结构和
  • 更改参数时的编译器错误s
于 2013-09-09T19:00:06.983 回答
9

如果您想避免无意中修改变量(例如字符串),您可以将相关代码分解为一个函数并将 a 传递const string& x给该函数,或者您可以创建一个本地 const 引用。在您的代码中,可以执行以下操作:

std::string ms;
cin >> n;
cin >> ms;
const &std::string s = ms;

现在,每当您尝试对 进行更改时都会收到错误消息s,因为它是const.

于 2013-09-09T19:03:58.833 回答