C代码中的字母顺序错误

时间:2018-04-30 18:37:06

标签: c crash compiler-warnings alphabetical-sort

我创建了一个程序,它从.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 :(得分:2)

char * x [10];

缓冲区大小太小

答案 1 :(得分:1)

这两行定义了您可以存储的信息量

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

现在写的,你最多只能容纳10个字符串,每个字符串不超过1200个字符。

在以下for循环中number_of_lines >= 11时发生崩溃:

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的结尾。