2010-05-02 57 views
0

爲什麼這個節目給了我一個「調試斷言失敗」錯誤信息,同時運行什麼「調試斷言失敗」的意思和如何解決它,C++?

#include "stdafx.h" 
#include "iostream" 
#include "fstream" 
#include "string" 
using namespace std; 

int conv_ch(char b) 
{ 
    int f; 
    f=b; 
    b=b+0; 
    switch(b) 
    { 
    case 48: 
     f=0; 
     break; 
    case 49: 
     f=1; 
     break; 
    case 50: 
     f=2; 
     break; 
    case 51: 
     f=3; 
     break; 
    case 52: 
     f=4; 
     break; 
    case 53: 
     f=5; 
     break; 
    case 54: 
     f=6; 
     break; 
    case 55: 
     f=7; 
     break; 
    case 56: 
     f=8; 
     break; 
    case 57: 
     f=9; 
     break; 
    default: 
     f=0; 
    } 
    return f; 
} 

class Student 
{ 
public: 
    string id; 
    size_t id_len; 
    string first_name; 
    size_t first_len; 
    string last_name; 
    size_t last_len; 
    string phone; 
    size_t phone_len; 
    string grade; 
    size_t grade_len; 
    void print(); 
    void clean(); 
}; 
void Student::clean() 
{ 
    id.erase (id.begin()+6, id.end()); 
    first_name.erase (first_name.begin()+15, first_name.end()); 
    last_name.erase (last_name.begin()+15, last_name.end()); 
    phone.erase (phone.begin()+10, phone.end()); 
    grade.erase (grade.begin()+2, grade.end()); 
} 
void Student::print() 
{ 
    int i; 
    for(i=0;i<6;i++) 
    { 
     cout<<id[i];    
    } 
    cout<<endl; 
    for(i=0;i<15;i++) 
    { 
     cout<<first_name[i];    
    } 
    cout<<endl; 
    for(i=0;i<15;i++) 
    { 
     cout<<last_name[i];   
    } 
    cout<<endl; 
    for(i=0;i<10;i++) 
    { 
     cout<<phone[i];   
    } 
    cout<<endl; 
    for(i=0;i<2;i++) 
    { 
     cout<<grade[i];   
    } 
    cout<<endl; 

} 


int main() 
{ 
    Student k[80]; 
    char data[1200]; 
    int length,i,recn=0; 
    int rec_length; 
    int counter = 0; 
    fstream myfile; 
    char x1,x2; 
    char y1,y2; 
    char zz; 
    int ad=0; 
    int ser,j; 
    myfile.open ("example.txt",ios::in); 
    int right; 
    int left; 
    int middle; 
    string key; 
    while(!myfile.eof()){ 
      myfile.get(data,1200); 
      char * pch; 
      pch = strtok (data, "#"); 
      printf ("%s\n", pch); 
      j=0; 
      for(i=0;i<6;i++) 
      { 
       k[recn].id[i]=data[j]; 
       j++; 
      } 
      for(i=0;i<15;i++) 
      { 
       k[recn].first_name[i]=data[j]; 
       j++; 
      } 
      for(i=0;i<15;i++) 
      { 
       k[recn].last_name[i]=data[j]; 
       j++; 
      } 
      for(i=0;i<10;i++) 
      { 
       k[recn].phone[i]=data[j]; 
       j++; 
      } 
      for(i=0;i<2;i++) 
      { 
       k[recn].grade[i]=data[j]; 
       j++; 
      } 
      recn++; 
      j=0; 
    } 


    //cout<<recn; 
    string temp1; 
    size_t temp2; 
    int temp3; 
    for(i=0;i<recn-1;i++) 
    { 
     for(j=0;j<recn-1;j++) 
     { 
      if(k[i].id.compare(k[j].id)<0) 
      { 
       temp1 = k[i].first_name; 
       k[i].first_name = k[j].first_name; 
       k[j].first_name = temp1; 

       temp2 = k[i].first_len; 
       k[i].first_len = k[j].first_len; 
       k[j].first_len = temp2; 

       temp1 = k[i].last_name; 
       k[i].last_name = k[j].last_name; 
       k[j].last_name = temp1; 

       temp2 = k[i].last_len; 
       k[i].last_len = k[j].last_len; 
       k[j].last_len = temp2; 

       temp1 = k[i].grade; 
       k[i].grade = k[j].grade; 
       k[j].grade = temp1; 

       temp2 = k[i].grade_len; 
       k[i].grade_len = k[j].grade_len; 
       k[j].grade_len = temp2; 

       temp1 = k[i].id; 
       k[i].id = k[j].id; 
       k[j].id = temp1; 

       temp2 = k[i].id_len; 
       k[i].id_len = k[j].id_len; 
       k[j].id_len = temp2; 

       temp1 = k[i].phone; 
       k[i].phone = k[j].phone; 
       k[j].phone = temp1; 

       temp2 = k[i].phone_len; 
       k[i].phone_len = k[j].phone_len; 
       k[j].phone_len = temp2; 

      } 
     } 
    } 
    for(i=0;i<recn-1;i++) 
    { 
    k[i].clean(); 
    } 
    char z; 
    string id_sear; 
    cout<<"Enter 1 to display , 2 to search , 3 to exit:"; 
    cin>>z; 
    while(1){ 
     switch(z) 
     { 
     case '1': 
      for(i=0;i<recn-1;i++) 
      { 
       k[i].print(); 
      } 
      break; 
     case '2': 
      cin>>key; 
      right=0; 
      left=recn-2; 
      while(right<=left) 
      { 
       middle=((right+left)/2); 
       if(key.compare(k[middle].id)==0){ 
        cout<<"Founded"<<endl; 
        k[middle].print(); 
        break; 
       } 
       else if(key.compare(k[middle].id)<0) 
       { 
        left=middle-1; 
       } 
       else 
       { 
        right=middle+1; 
       } 
      } 
      break; 
     case '3': 
      exit(0); 
      break; 

     } 
     cout<<"Enter 1 to display , 2 to search , 3 to exit:"; 
     cin>>z; 

    } 

    return 0; 
} 

程序從文件中讀取example.txt中

313121crewwe   matt   0114323111A # 
433444cristinaee  john  0113344325A+# 
324311matte   richee   3040554032B # 

的想法是讀取固定大小的場結構文本編輯器記錄結構

+0

雖然這裏的人通常都很有幫助,但您必須讓我們變得輕鬆。證明你至少已經完成了一些關於自己解決問題的事情。不要只是給我們所有的代碼,讓我們通過它來爲你調試。 如果您需要幫助,請執行以下操作:如gf所示,在調試器中運行程序以查明哪一行是問題。然後擺脫所有其他代碼行,直到你剩下一個小程序來演示你的bug。 *我們會繼續努力並幫助你理解它有什麼問題。但是你發佈的代碼,我們不會去觸及它。 – Karmastan 2010-05-02 23:48:33

+0

此代碼是可怕的寫入。您需要更好地使用對象,結構和函數以及循環。 – AustinWBryan 2016-01-17 22:03:55

回答

6

斷言失敗是由您使用無效參數調用的標準C++庫函數之一引發的。在調試器中運行它,你應該看到確切的調用。

一兩件事,看起來可疑的:在Student::clean做個像電話:

first_name.erase (first_name.begin()+15, first_name.end()); 

如果first_name的長度小於15,這很可能造成一個斷言失敗或其他錯誤。