2

次のスニペットがあります。

string base= tag1[j];

これにより、無効な変換エラーが発生します。

以下のコードの何が問題になっていますか? どうすればそれを克服できますか。

完全なコードは次のとおりです。

#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <time.h>
using namespace std;


int main  ( int arg_count, char *arg_vec[] ) {
    if (arg_count < 3 ) {
        cerr << "expected one argument" << endl;
        return EXIT_FAILURE;
    }

    // Initialize Random Seed
    srand (time(NULL));

    string line;
    string tag1     = arg_vec[1];
    string tag2     = arg_vec[2];

    double SubsRate = 0.003;
    double nofTag   = static_cast<double>(atoi(arg_vec[3])); 

    vector <string> DNA;
      DNA.push_back("A");
      DNA.push_back("C");
      DNA.push_back("G");
      DNA.push_back("T");


      for (unsigned i=0; i < nofTag ; i++) {

          int toSub = rand() % 1000 + 1;

          if (toSub <= (SubsRate * 1000)) {
              // Mutate
              cout << toSub << " Sub" << endl;

              int mutateNo = 0;
              for (int j=0; j < tag1.size(); j++) {

                  mutateNo++;


                  string base = tag1[j]; // This fail

                  int dnaNo = rand() % 4;

                  if (mutateNo <= 3) {
                     // Mutation happen at most at 3 position
                        base = DNA[dnaNo];
                  }

                  cout << tag1[j] << " " << dnaNo << " " << base  <<  endl;
                  //cout << base;

              }
               cout << endl;

          }
          else {
              // Don't mutate
              //cout << tag1 << endl;
          }

      }
    return 0;
}

文字列をループするときにからcharへの変換が無効になるのはなぜですか?const char*

4

5 に答える 5

7

std::string operator []は単一の文字を返します。string は単一の char でインスタンス化できません。

使用する:

string base = string( 1, tag1[j] )代わりは

于 2009-03-05T05:24:09.357 に答える
4

に変更します

char base = tag1[j];
于 2009-03-05T05:22:36.443 に答える
3

文字列 tag1 = arg_vec[1];

tag1 は文字列リテラルです。

string base = tag1[j];charの代わりに で初期化されchar *ます。

試す、char base = tag1[j];

于 2009-03-05T05:21:50.720 に答える
2

(これが何であるか)stringだけを取るためのコンストラクターはありません。いくつかのオプションがあります。chartag1[j]

string base;  // construct a default string
base  = tag1[j]; // set it to a char (there is an 
                 //   assignment from char to string, 
                 //   even if there's no constructor

また

string base( 1, tag1[j]);  // create a string with a single char 

または、Josh が述べたように、とにかく文字列操作を実行していないためbase、 a として定義できます。charこれを行うことにした場合は、 に変更DNAする必要がありますvector<char>(また、 の初期化をDNA文字列の代わりに文字を使用するように変更します)。

于 2009-03-05T05:25:44.067 に答える
1

問題の 1 つは、実際には 2 つの引数が必要な場合に、プログラムが 1 つの引数を想定しているとエラー メッセージが示すことです。おそらく Unix の規則に従い、必要な使用法も (または代わりに) 表示する必要があります。

if (arg_count != 3) {
    cerr << "Usage: " << arg_vec[0] << " tag1 tag2";
    return EXIT_FAILURE;
}

名前 'argc' と 'argv' は非常に伝統的です (そして、私が見た唯一の主要な代替物は 'ac' と 'av' です)。それに固執する価値があるかもしれません。

于 2009-03-05T05:23:00.233 に答える