Problème de conversion non valide en C ++
Question
J'ai l'extrait suivant:
string base= tag1[j];
Cela donne l'erreur de conversion non valide.
Quel est le problème avec mon code ci-dessous? Comment puis-je le surmonter.
Le code complet est ici:
#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;
}
Pourquoi est-ce que je reçois une conversion non valide de char
à const char*
lors d'une boucle sur une chaîne?
La solution
Le std::string operator []
retourne un seul caractère. la chaîne ne peut pas être instanciée avec un seul caractère.
Utiliser:
string base = string( 1, tag1[j] )
à la place
Autres conseils
Changez-le en
char base = tag1[j];
chaîne tag1 = arg_vec [1];
tag1 est un littéral de chaîne.
string base = tag1[j];
est initialisé avec un char
au lieu de char *
.
Essayez, char base = tag1[j];
Il n'y a pas de constructeur pour string
qui prend juste un char
(qui est ce que tag1[j]
est). Vous avez plusieurs options:
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
ou
string base( 1, tag1[j]); // create a string with a single char
Ou sous la forme Josh a mentionné , vous pouvez définir base
comme DNA
car vous n’effectuez aucune opération sur la chaîne. Si vous décidez de le faire, vous devrez changer vector<char>
pour devenir un <=> (et modifier l'initialisation de <=> pour utiliser des caractères au lieu de chaînes).
Un problème est que le message d'erreur indique que le programme attend un argument alors qu'il en a réellement besoin de deux. Vous devriez probablement suivre les conventions Unix et montrer l’utilisation requise (ou à la place):
if (arg_count != 3) {
cerr << "Usage: " << arg_vec[0] << " tag1 tag2";
return EXIT_FAILURE;
}
Les noms "argc" et "argv" sont très classiques (et la seule alternative majeure que j'ai vue est "ac" et "av"). Cela vaut peut-être la peine de s'en tenir à cela.