我有以下代码段:
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*
无效转化?
答案 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
没有构造函数只需要char
(tag1[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')。可能值得坚持。