2015-06-17 8 views
0

У меня проблема с этой программой. Когда я пытаюсь запустить его на своем Mac, он возвращает «Abort trap: 6». Я не могу понять причину.«Прерывание ловушки: 6» работает программа C на Mac

Ниже приведено содержимое файла, которое я использовал для тестирования программы.

aaabccdegags
bbbbbbbcados
vbaiusbyabtd
aisybavsitvc
asindvsivati ​​
ammaccabanan

Вы просто должны скопировать эти бессмысленные строки в текстовый файл file.txt и называют его в командной строке с синтаксисом:

program.exe file.txt r

где file.txt содержит бессмысленные строки и r - это буква, которую он должен искать в текстовом файле.

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#define R 24 
#define C 71 

int main(int argc, char * argv[]) { 

if (argc!=3){ 
    printf("Errore acquisizione parametri\n"); 
    return -1; 
} 

FILE*fp; 
char m[R][C],c,posizione[10]; 
int i,j,lstr,numrighe,quante,quantemax,posiz,x,y,maxmax; 

maxmax=0; 

//posiz=1 se orizzontale 

quantemax=0; 

sscanf(argv[2],"%c",&c); 

fp=fopen(argv[1],"r"); 

if (fp==NULL){ 
    printf("Errore apertura file\n"); 
    return -3; 
} 

for (i=0;i<R && (!feof(fp));i++){ 
    fgets(m[i],C,fp); 
} 

fclose(fp); 

lstr=strlen(m[0]); 

numrighe=i; 

for (i=0;i<lstr;i++){ 

    quante=0; 

    for (j=0;j<numrighe;j++) { 
     if (m[i][j]==m[i][j+1]){ 
      quante++; 
      if (quante>quantemax){ 
       quantemax=quante; 
       if (quantemax>maxmax){ 
       y=i; 
       x=j; 
       posiz=1; 
       } 
      } 
     } 
    } 
} 

for (i=0;i<lstr;i++){ 

    quante=0; 

    for (j=0;j<numrighe;j++) { 
     if (m[i][j]==m[i+1][j]){ 
      quante++; 
      if (quante>quantemax){ 
       quantemax=quante; 
       if (quantemax>maxmax){ 
       y=i; 
       x=j; 
       posiz=0; 
       } 
      } 
     } 
    } 
} 

if (posiz==1){ 
    strcpy(posizione,"orizzontale"); 
} 

else { 
    if (posiz==0){ 
     strcpy(posizione,"verticale"); 
    } 
} 


printf("La stringa con il maggior numero di %c consecutive, si trova in %s a partire dalla posizione %d,%d",c,posizione,x,y); 

return 0; 
} 
+1

Предложение: '! Feof (fp)' имеет тенденцию быть ошибочным. –

+1

Можете ли вы использовать отладчик, чтобы точно определить точную ошибочную инструкцию? –

ответ

2

Я не запустить свой код с заданными входами, но без этого, похоже, вы столкнулись с UB в вашем коде. В случае заявления

strcpy(posizione,"orizzontale"); 

Исходная строка имеет большую длину, чем может быть назначена адресата. Он пытается записать мимо выделенной памяти, которая, в свою очередь, вызывает undefined behaviour.