【问题标题】:Alphabetical order error in C codeC代码中的字母顺序错误
【发布时间】:2018-04-30 18:37:06
【问题描述】:

我创建了一个程序,它从 .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;
}

【问题讨论】:

  • 这是 C,不是 C#。
  • 编译器警告是防止简单逻辑错误的第一道防线。例如,您应该收到来自void countOfLinesFromFile(char *filename) 的“警告:'return' with a value, in function return void”
  • @AestheticCode 如果您的问题得到充分回答,您可以通过单击您认为最有用的答案旁边的复选标记将其标记为已解决。

标签: c crash compiler-warnings alphabetical-sort


【解决方案1】:

字符 *x[10];

缓冲区太小

【讨论】:

    【解决方案2】:

    这两行定义了你可以存储多少信息

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

    按照现在的写法,你最多只能保存 10 个字符串,每个字符串不超过 1200 个字符。


    number_of_lines &gt;= 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 的结尾。

    【讨论】:

    • 基本上x[i] = malloc(1200 * sizeof(char)) 表明x[i] 是一个字符串,而x[i] = malloc(1200) 是模糊的,让读者需要额外的工作来确定x[i] 实际包含的内容。
    • 如果您可以选择或多或少地明确而很少或没有额外费用,不妨选择更明确。
    • 是的,但这是错误的二分法。存在更好的解决方案,但所有魔术数字都很糟糕。 x[i] = malloc(MAX_LINE_LEN);优于 (1200) 和 (1200 * sizeof(char);
    • 我同意有更好的解决方案,但malloc(n * sizeof(char)) > malloc(n).
    • 但是 malloc(MAX_LINE_LEN) > malloc(MAX_LINE_LEN * sizeof(char)) ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2023-02-18
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多