Ошибка алфавитного порядка в C-коде - PullRequest
0 голосов
/ 30 апреля 2018

Я создал программу, которая читает последовательность строк из файла .txt, и после компиляции создается новый файл .txt, где строки должны быть в алфавитном порядке. Проблема в том, что я не могу написать больше 10 слова компилятор просто останавливается / вылетает, ПОЧЕМУ? Зависит ли это от типа компилятора? В настоящее время я использую Code-Bloks. Как я могу оптимизировать код для более плавной работы?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void arrange(int n, char *x[])
{
    char *temp;
    int i,str;
    for(str = 0; str < n-1; ++str)
    {
        for(i = str+1; i < n; ++i)
        {
            if(strcmp(x[str],x[i]) > 0)
            {
                temp = x[str];
                x[str] = x[i];
                x[i] = temp;
            }
        }
    }
    return;
}
int  number_of_lines = 0;
void countOfLinesFromFile(char *filename){
FILE* myfile = fopen(filename, "r");
int ch;
do
{
    ch = fgetc(myfile);
    if(ch == '\n')
        number_of_lines++;
}
while (ch != EOF);
if(ch != '\n' && number_of_lines != 0)
    number_of_lines++;
    fclose(myfile);
return number_of_lines;
}
int main()
{
    int i , ts=0;
    char *x[10];
    char *fileName = "WORDS.txt";
    countOfLinesFromFile(fileName);
    printf("%d",number_of_lines);
    FILE * fp;
    fp = fopen ("WORDS.txt", "r");
    for(i = 0; i < number_of_lines; i++)
    {
        x[i] = (char*) malloc (1200*sizeof(char));
        fscanf(fp, "%s", x[i]);
    }
    FILE *fPointer;
    fPointer=fopen("Alphabetical.txt","w+");
    arrange(i,x);
    for(i = 0; i < number_of_lines; i++)
    {
        fprintf(fPointer,"%s\n",x[i]);
    }
    fclose(fPointer);
    fclose(fp);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Эти две строки определяют, сколько информации вы можете хранить

char *x[10];                               // 10 strings
x[i] = (char*) malloc (1200*sizeof(char)); // 1200 characters each

Как написано сейчас, вы можете хранить не более 10 строк, каждая из которых не длиннее 1200 символов.


Сбой возникает, когда number_of_lines >= 11 в следующем цикле for:

for(i = 0; i < number_of_lines; i++)
{
    x[i] = (char*) malloc (1200*sizeof(char));
    fscanf(fp, "%s", x[i]);
}

Когда i равно 11, вы пишете в x[11], который заканчивается после x.

0 голосов
/ 30 апреля 2018

символ * х [10];

Размер буфера слишком мал

...