【问题标题】:code immediately stops responding (c, pointers, file I/O)代码立即停止响应(c、指针、文件 I/O)
【发布时间】:2015-03-21 22:21:05
【问题描述】:

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

目标是读取预先写入的文件并修复它,将行号添加到每行的开头。 (即,标题 -> 1. 标题)

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

这是我的 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);

【问题讨论】:

    标签: c function loops pointers file-io


    【解决方案1】:
    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
    

    【讨论】:

    • 好的,我发现了崩溃的问题,我将 fopen 更改为 w+ 而不是 r+。但是,现在它只是清除文件并且不打印任何内容。我没有更改任何其他内容。
    • 嗯,你想阅读文件,不是吗?使用"r""r+"。当然,如果您没有修复我写的内容,这是未定义的行为。
    • 是的,但我还必须重新编写文件以使其正确。因此,“w+”。
    • while 循环有问题,我想不通。你还能提供什么额外的智慧珍珠?
    • 您有两个 fscanf,但只在其中一个之后查看 ch。
    【解决方案2】:
    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 语句中使用“继续”。

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

    【讨论】:

    • 当传入的字符为'\n'时,它在函数内部递增
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2012-07-03
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多