C ++在某些编译器中获取运行时错误

时间:2013-06-01 05:33:02

标签: c++ compiler-construction runtime-error

我为uva问题找到了解决方案5355 Link:  https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=3356&mosmsg=Submission+received+with+ID+1242500

我制作了解决方案并且它在我的电脑上运行正常,我使用了整体开发c ++ IDE,但是当我在uva网站上提交程序时,他们给了我一个消息运行时错误。继承人寄给我的是什么

“您提交的问题编号为1242500,问题5355 - Baudot数据通信代码失败,判决运行时错误。

这意味着您的程序执行没有正确完成。请记住始终使用退出代码0终止代码。“

我检查了我的程序,它在我的电脑上运行正常,所以为了检查我去了http://www.compileonline.com/并尝试在线编译。

在抛出'std :: out_of_range'的实例后,它给了我一个运行时错误的终止   what():basic_string :: substr

请你检查我的程序有什么问题,我正在粘贴源代码。

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<stdio.h>

using namespace std ;

int main(){
  char check ;
  int i = 0 ;
  struct forbinary{
    char ds;
    char us;
    char bin[20];

  }b[35] ;


  char type = 'd' ;

  strcpy(b[0].bin,"00000");
  strcpy(b[1].bin,"00001");
  strcpy(b[2].bin,"00010");
  strcpy(b[3].bin,"00011");
  strcpy(b[4].bin,"00100");
  strcpy(b[5].bin,"00101");
  strcpy(b[6].bin,"00110");
  strcpy(b[7].bin,"00111");
  strcpy(b[8].bin,"01000");
  strcpy(b[9].bin,"01001");
  strcpy(b[10].bin,"01010");
  strcpy(b[11].bin,"01011");
  strcpy(b[12].bin,"01100");
  strcpy(b[13].bin,"01101");
  strcpy(b[14].bin,"01110");
  strcpy(b[15].bin,"01111");
  strcpy(b[16].bin,"10000");
  strcpy(b[17].bin,"10001");
  strcpy(b[18].bin,"10010");
  strcpy(b[19].bin,"10011");
  strcpy(b[20].bin,"10100");
  strcpy(b[21].bin,"10101");
  strcpy(b[22].bin,"10110");
  strcpy(b[23].bin,"10111");
  strcpy(b[24].bin,"11000");
  strcpy(b[25].bin,"11001");
  strcpy(b[26].bin,"11010");
  strcpy(b[27].bin,"11011");
  strcpy(b[28].bin,"11100");
  strcpy(b[29].bin,"11101");
  strcpy(b[30].bin,"11110");
  strcpy(b[31].bin,"11111");    


  FILE *fp ;
  fp = fopen("inp.txt","r");
  char str[401] ;
  string temp , temp2;


  fgets(str,80,fp);
  int j = strlen(str) ;

  for(i=0;i<j-1;i++){
    b[i].ds = str[i] ; 
  }


  fgets(str,80,fp);

  for(i=0;i<j-1;i++){
    b[i].us = str[i] ;
  }

  int x = 0 , y = 0,z=0, size , s;
  while(fgets(str,400,fp)!=NULL){
    type = 'd' ;
    temp = str ;
    size = temp.size();
    s = size ;
    x = 0 ;
    y = 5 ;

    while(size){

      temp2 = temp.substr(x,y) ;


      if(temp2=="11011")
        type = 'd' ;
      else if(temp2=="11111") 
        type = 'u' ;

      for(i=0;i<j-1;i++){

        if(temp2==b[i].bin){
          if(type=='d')
            cout << b[i].ds;
          else if(type=='u')
            cout << b[i].us;     
        }
      }

      if(s==x+6){
        break ;
      }

      x += y ;
      size-=5;
    }

    temp="";
    strcpy(str,"");
    cout << endl ;
  }
  fclose(fp) ;
  return 0 ;
}

inp.txt文件包含这四行

<T*O HNM=LRGIPCVEZDBSYFXAWJ UQK 
>5@9 %,.+)4&80:;3"$?#6!/-2' 71( 
100100110011000010011111101110000111110111101
001100001101111001001111100001001100010001100110111100000111

我无法找到问题,请帮忙

1 个答案:

答案 0 :(得分:1)

要解决的一些问题:

FILE * InputFile = fopen("input.txt", "r") // fails if the file doesn't exist

您应该检查它是否正在打开:

if (!InputFile){
    cerr << "Couldn't open input file" << endl; 
    // alternatively: perror ("Couldn't open input file");
    return 0;
}

由于您未在代码中检查此内容,因此很容易在代码的其余部分中导致一系列运行时错误(例如对fgets的所有调用)。它可以使它看起来像导致错误的其他函数之一,当它真的是这个。


这是一个问题:

for(i=0;i<j-1;i++){
    b[i].ds = str[i] ; 
}

这是一个问题,因为b[]仅上升到35,但您的代码建议字符串可能长达80个字符 - 这也可能导致分段错误。也许你应该在进入循环之前检查j - 1是否大于零:

if ((j -1) < 0){
    cout << "Oops!" << endl;
    return 0;
}

在第二个fgets中,在进入循环之前不计算字符串长度。除了向其添加strlen之外,您还应该再次检查以确保(j - 1) > 0


在致电之前:

 temp2 = temp.substr(x,y) ;

选中以确保temp包含大于y的字符串,否则您可能会遇到分段错误。这是因为您可以使用大于源字符串的子字符串。使用此:

if (temp2.size() < y){
    cout << "Oops, string was too small" << endl;
    return 0;
}