2013-11-14 2 views
0

Эта программа предназначена для сортировки слов в алфавитном порядке, либо вложенных в нее слов, либо из текстового файла. Он компилируется просто отлично, но когда я его запускаю, я получаю большую массу текста. Вот небольшой пример: :*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36: v=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
Это похоже на некоторые форматы файлов или что-то в этом роде?
За этим следуют слова:
Segmentation fault (core dumped)
Я комментирую GCC на Ubuntu.
Программа:Ошибка сегментации с большой непонятной ошибкой?

#include <stdio.h> 
#include <string.h> 

#define MO 109 // 109 is ASCII for "m". 
#define FO 102 // 102 is ASCII for "f". 
#define OO 101 // 101 is ASCII for "e" and denotes an error. 

int main() // Main part of program. 
{ 
     int i, j; // Counter integer assignment. 
     int n = 100; // assignment of integer for the number of strings. 
     char a; // For the m/f (manual or file) option. 
     char str[100][100]; // Str is the main string to be sorted. 
     char temp[100]; // Temp is to switch the values for bubble sorting. 
     for(i = 0; i < 1; a = OO) 
     { 
       printf("To input text manually, press m. To sort a file, press f. \n"); 
       // M/f option. 
       scanf("%c", &a); // Gets m/f option. 
       if(a == MO || a == FO) // Checks for valid input. 
       { 
         i = 2; // Escape from loop with valid input. 
       } 
       if(a != MO && a != FO) // Invalid input. 
       { 
         printf("Please insert a valid response. "); 
         i = 0; // Continue loop until a valid input is reached. 
       } 
     } 
     if(a == MO) // Manual insert option. 
     { 
       puts("Enter the number of strings to be sorted."); 
       scanf("%d", &n); // Gets number of strings. 
       for(i = 0; i <= n; i++) 
       { 
         gets(str[i]); // Gets strings from user. 
       } 
     } 
     if(a == FO) // File option. 
     { 
       char b[100]; // File address of text file to be sorted. 
       FILE * f; // Text file. 
       printf("Enter file path of file to be sorted."); 
       scanf("%c", b); // Gets file path. 
       f = fopen(b, "r"); // Opens file. 
       fgets(*str, 100, f); // Coverts file into string str. 
       fclose(f); // Closes file. 
     } 
     for(i = 0; i <= n; i++) // Begin bubble sort. 
     { 
       for(j = i + 1; j <= n; j++) 
       { 
         if(strcmp(str[i], str[j]) > 0) // Checks alphabetical value. 
         { 
           strcpy(temp, str[i]); // Switch two strings. 
           strcpy(str[i], str[j]); 
           strcpy(str[j], temp); 
         } 
       } 
     } 
     printf("The sorted string:"); 
     for(i = 0; i <= n; i++) 
     { 
       puts(str[i]); // Prints final output. 
     } 
     return 0; // End of main. 
} 

Поиск Google сказал мне, что ошибка сегментации обычно означает, что я имею в виду место в памяти, не существует. Но я не мог найти никаких советов о том, как это исправить, или даже о том, что проблема конкретно. Если кто-то может мне помочь, я бы очень признателен. Благодарю.

+1

Есть много вещей неправильно с этим кодом. –

+0

Не могли бы вы рассказать мне, что в этом плохого? Я не очень хорош в этом. – user2973526

+0

@ user2973526 Для начала используйте '' m'', '' f'' и '' e'' вместо этих #defines. –

ответ

0

В одном из комментариев к вашему вопросу, говорит, есть много вещей неправильно с кодом ...

Например

for(i = 0; i < 1; a = OO) 
{ 
    // ... 
} 

В конце этого цикла, a == OO всегда, потому что вы скажите ему равную OO в последней части инструкции for. Поэтому вся ваша работа по установке значения a внутри «петли» теряется.

Но вернемся к вопросу о проблеме seg-fault: вы правы, что это вызвано ссылкой на память, которую ваша программа не имеет. В вашем случае это, вероятно, из-за этого:

int n = 100; // assignment of integer for the number of strings. 
    // ... 
    char str[100][100]; // Str is the main string to be sorted. 
    // ... 

    for(i = 0; i <= n; i++) // Begin bubble sort. 
    { 
      for(j = i + 1; j <= n; j++) 
      { 
        if(strcmp(str[i], str[j]) > 0) // Checks alphabetical value. 

str [100] за пределами вашего массива. Массив со 100 элементами будет использовать знаки от 0 до 99. str [100] получит доступ к элементу «101st», который выходит за рамки и, следовательно, может вызвать ошибку seg.

0

я сделал небольшие изменения в свой алгоритм, и это работает для меня:

#include <stdio.h> 
#include <string.h> 

#define MO 109 // 109 is ASCII for "m". 
#define FO 102 // 102 is ASCII for "f". 
#define OO 101 // 101 is ASCII for "e" and denotes an error. 

int main() // Main part of program. 
{ 
    int i, j; // Counter integer assignment. 
    int n = 100; // assignment of integer for the number of strings. 
    char a; // For the m/f (manual or file) option. 
    char str[100][100]; // Str is the main string to be sorted. 
    char temp[100]; // Temp is to switch the values for bubble sorting. 
    a = OO; 
    i=0; 
    while(i < 1) 
    { 
     printf("To input text manually, press m. To sort a file, press f. \n"); 
     // M/f option. 
     scanf("%c", &a); // Gets m/f option. 
     if(a == MO || a == FO) // Checks for valid input. 
     { 
      i = 2; // Escape from loop with valid input. 
     } 
     if(a != MO && a != FO) // Invalid input. 
     { 
      printf("Please insert a valid response. "); 
      i = 0; // Continue loop until a valid input is reached. 
     } 
    } 
    if(a == MO) // Manual insert option. 
    { 
     puts("Enter the number of strings to be sorted."); 
     scanf("%d", &n); // Gets number of strings. 
     for(i = 0; i <= n; i++) 
     { 
      gets(str[i]); // Gets strings from user. 
     } 
    } 
    if(a == FO) // File option. 
    { 
     char b[100]; // File address of text file to be sorted. 
     FILE * f; // Text file. 
     printf("Enter file path of file to be sorted."); 
     scanf("%c", b); // Gets file path. 
     f = fopen(b, "r"); // Opens file. 
     fgets(*str, 100, f); // Coverts file into string str. 
     fclose(f); // Closes file. 
    } 
    for(i = 0; i < n; i++) // Begin bubble sort. 
    { 
     for(j = i + 1; j <= n; j++) 
     { 
      if(strcmp(str[i], str[j]) > 0) // Checks alphabetical value. 
      { 
       strcpy(temp, str[i]); // Switch two strings. 
       strcpy(str[i], str[j]); 
       strcpy(str[j], temp); 
      } 
     } 
    } 
    printf("The sorted string:"); 
    for(i = 0; i < n; i++) 
    { 
     puts(str[i]); // Prints final output. 
    } 
    return 0; // End of main. 
} 
Смежные вопросы