为什么我的字符串在此代码中被修改?

时间:2013-09-09 18:54:31

标签: c++ string

我在字符串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;

        }
    }

3 个答案:

答案 0 :(得分:10)

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

你忘记了=符号。

答案 1 :(得分:9)

快速查看显示s.at(j)='6's.at(j)='4'会修改您的字符串。您可以使用Yoda Conditions来避免这种情况。

在这里,有些编辑可能会警告你有关任务。 (见评论)。

另请参阅Mats Petersson的回答,我认为这是最好的补充:如果您不想在某种情况下改变内容,请使用const对象,引用或指向const内存的指针。

如果您使用的函数需要std::string const &s的参数,那么就完成这项工作,你最终会有

  • 更清晰的代码结构和
  • 更改参数s时的编译器错误。

答案 2 :(得分:9)

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

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

现在,只要您尝试对s进行更改,就会收到错误消息,因为它是const