C ++中的转换问题无效

时间:2009-03-05 05:15:27

标签: c++ string char

我有以下代码段:

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*无效转化?

5 个答案:

答案 0 :(得分:7)

std::string operator []返回一个字符。 string不能用单个char实例化。

使用:

string base = string( 1, tag1[j] )而不是

答案 1 :(得分:4)

将其更改为

char base = tag1[j];

答案 2 :(得分:3)

string tag1 = arg_vec [1];

tag1是一个字符串文字。

string base = tag1[j];初始化为char而不是char *

尝试,char base = tag1[j];

答案 3 :(得分: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 mentioned,您可以将base定义为char,因为您无论如何都不会对其执行任何字符串操作。如果您决定这样做,则需要将DNA更改为vector<char>(并将DNA的初始化更改为使用字符而不是字符串。)

答案 4 :(得分:1)

一个问题是错误消息表明程序在实际需要两个时需要一个参数。你应该遵循Unix惯例并显示所需的用法(或者代之以):

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

名称'argc'和'argv'非常传统(我见过的唯一主要替代品是'ac'和'av')。可能值得坚持。