2013-03-19 18 views
0

我從我的編譯器「段錯誤:核心轉儲」收到此錯誤。我假設它來自我寫的函數,但不完全確定函數的錯誤。使用輸入文件流的分段錯誤

該程序從輸入文件中讀取,並在屏幕上輸出結果(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

你可以一步一步調試找出發生錯誤的位置嗎? – Andrey 2013-03-19 22:15:40

+3

分段故障發生在哪裏? (在哪條線上?) – Jean 2013-03-19 22:15:51

+0

您可以從修復不一致的縮進開始,以便更好地理解代碼 – 2013-03-19 22:16:10

回答

3

我猜這是因爲你忘記了return東西在你的功能。因此可能會發生seg故障。另外,確保你的警告級別高,一個好的編譯器通常會讓你知道這個。

這裏是C++標準6.6.3:

流動關閉的功能的端部是相當於沒有 值的回報;這會導致在返回值 函數中出現未定義的行爲。

+0

爲了清楚起見,忘記這樣做是未定義的行爲,並且等同於'return;'。 – chris 2013-03-19 22:18:38

+0

@chris:謝謝,我添加了標準的引用。 – 2013-03-19 22:22:59

+0

謝謝!它工作 – user2188311 2013-03-19 22:23:59

0

如果您不返回函數rna_complement中的任何內容,則應爲void。 分段錯誤來自std::string的析構函數調用。 或者,您可以返回line,因爲它是副本。如果要對字符串進行就地修改,則可以將引用傳遞給它(string &line),並且它將修改在參數中傳遞的字符串。

+0

sheesh。犯了一個愚蠢的小錯誤。無論如何感謝你 – user2188311 2013-03-19 22:23:37

+0

奇怪的是,我從來沒有使用過一個沒有給出'警告:控制已達到非void函數結束'的編譯器或類似的情況。 – 2013-03-19 22:30:41

+0

'鐺'會默認抱怨沒有任何標誌。沒有任何標誌的'gcc'不會抱怨。 'gcc -Wall'會。奇怪的'gcc -pedantic'似乎也不在乎。 – Thibaut 2013-03-19 22:45:08