代码立即停止响应(c,指针,文件I / O)

时间:2015-03-21 22:21:05

标签: c function loops pointers file-io

我正在为家庭作业编写代码,该代码使用函数和指针来读取文件并修复其中的大小写错误。

目标是读取预先写好的文件并修复它,在每行的开头添加行号。 (即,tiTle - > 1. Title)

我认为我已经掌握了基本逻辑,但肯定有一个我没有看到的错误,因为它在编译运行后立即停止响应。

这是我的main()函数。

FILE *casefixer;

casefixer = fopen("casefixer.txt", "r+");

char* ch;
int* char_in_word;
int* line_num;
*char_in_word = 0;
*line_num = 1;

while((fscanf(casefixer, "%c", ch)) != EOF){

    fscanf(casefixer, "%c", ch);

    fprintf(casefixer, "%d. ", *line_num);

    if(fix_caps(ch, char_in_word, line_num))
        fprintf(casefixer, "\n");

    fix_caps(ch, char_in_word, line_num);

    fprintf(casefixer, "%c", *ch);
}
fclose(casefixer);

2 个答案:

答案 0 :(得分:2)

char* ch;          // uninitialized
int* char_in_word; // -||-
int* line_num;     // -||-
*char_in_word = 0; // dereferencing uninitialized pointer - undefined behavior
*line_num = 1;     // -||-

在函数声明中看到它们时,不必使用指针。如果您确定该函数不会存储它们或尝试为它们分配新内存,请使用常规变量的地址:

char ch;
fscanf(casefixer, "%c", &ch) // ch is on stack longer than fscanf, everything's OK

答案 1 :(得分:0)

  1. 通过使用“%c”,您只能读取单个字符而不是行。我建议你在这里使用fgets
  2. 应该删除循环中fscanf的调用,因为你已经在while((fscanf(casefixer, "%c", ch)) != EOF)中调用了它。
  3. 在阅读时写作并不容易,特别是当你想重写之前阅读的内容时。您需要重新定位流位置指示器。所以我认为更好的方法是将新文件存储到缓冲区中,然后将缓冲区写入文件中。
  4. 在这两行中:

    if(fix_caps(ch, char_in_word, line_num))
        fprintf(casefixer, "\n");
    

    如果我理解正确,你应该在这个if语句中使用“continue”。

  5. 在您的代码中,变量line_num始终为1.您应该在循环结束时执行增量。