0

文字列 s である文字列の入力として整数を使用しています。「-」と「|」の形式で整数をsに書きたいと思います。私の論理は正しいと確信しています。問題は、 string 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 Conditionsを使用すると、これを回避できます。

ここには、割り当てについて警告するコンパイラがあります。(コメントを参照)。

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;

に変更を加えようとすると、エラーが発生するようになりましsconst

于 2013-09-09T19:03:58.833 に答える