我从编译器“分段错误:核心转储”中收到此错误。我认为它来自我写的函数,但不完全确定函数是错误的。
程序从输入文件中读取并在屏幕上输出结果(cout)。
string rna_complement(string line)
{
for(int i = 0; i < line.length(); i++)
{
switch (line[i])
{
case 'A': line[i] = 'U'; break;
case 'C': line[i] = 'G'; break;
case 'G': line[i] = 'C'; break;
case 'U': line[i] = 'A'; break;
}
}
cout <<"Complement: " <<line <<endl;
}
int main()
{
string line1, line2, line3, line4, line5, line6;
ifstream genesacid;
genesacid.open("genes.txt");
if(!genesacid.is_open())
{
cerr <<"Error: File cannot be opened"<<endl;
return 0;
}
else
{
getline(genesacid, line1);
getline(genesacid, line2);
getline(genesacid, line3);
getline(genesacid, line4);
getline(genesacid, line5);
getline(genesacid, line6);
}
cout << "Fragment 1: " <<line1 <<endl;
rna_complement(line1);
cout << "Fragment 2: " <<line2 <<endl;
genesacid.close();
return 0;
}
我不擅长C ++,所以如果你看到的任何错误很明显,请注意这一点。我正在慢慢学习!
答案 0 :(得分:3)
我猜这是因为你在功能上忘了return
。因此可能发生seg故障。另外,请确保您的警告级别很高,一个好的编译器通常会让您知道这一点。
这是C ++标准6.6.3:
离开函数末尾相当于没有返回 值;这会导致值返回时出现未定义的行为 功能
答案 1 :(得分:0)
如果您未在函数rna_complement
中返回任何内容,则应为void
。
分段错误来自std::string
的析构函数的调用。
或者,您可以返回line
,因为它是副本。如果你想要对字符串进行就地修改,你可以传递对它的引用(string &line
),它将修改参数中传递的字符串。