变量循环的每次迭代都没有销毁变量?

时间:2017-11-21 02:44:54

标签: c

#include <stdio.h>
#define IN 1
#define OUT 0

int main()
{
  while (1)
  {
    FILE *fptr1;
    char filename[100];
    printf("Enter the filename to open for reading \n");
    scanf("%s", filename); 
    fptr1 = fopen(filename, "r");

    int c, nl, nw, nc, state; // These variables aren't being reset.

    while ((c = fgetc(fptr1)) != EOF) 
    {
      ++nc;
      if (c == '\n') ++nl;
      if (c == '\t' || c == '\n' || c == ' ') state = OUT;
      else if (state == OUT)
      {
        state = IN;
        ++nw;
      }
    };
    printf("Lines: %d Words: %d Characters: %d\n", nl, nw, nc);
  }
  return 0;
}

这是一个简单的程序,用于解析文件并输出它有多少行,单词和字符。当检测到新的行,单词和字符时,nl,nw,nc递增。输出:

  

输入要打开的文件名以供阅读

     

data.txt中

     

行:6个字:15个字符:81

     

输入要打开的文件名以供阅读

     

data.txt

     

行数:12个字:30个字符:162

     

输入要打开的文件名以供阅读

它第一次正常工作,但是当while循环结束并且只是不断添加它们时它不会破坏nl,nw,nc。为什么呢?

5 个答案:

答案 0 :(得分:1)

你是&#34; 幸运&#34;它曾经工作过,你必须将它们全部初始化

1 XBT = 185,416,429.63 VND
1 VND = 0.00000000539327 XBT
也许是在宣布之后。重要的是它们必须在内部nl = nw = nc = state = 0; 循环之前初始化。

答案 1 :(得分:1)

您正在通过访问未初始化的变量来调用未定义的行为。

在每次迭代中,他们会获得一组新的变量。这意味着您不能依赖前一次迭代中的变量值。

ReferenceError: InfiniteScroll is not defined

很少有其他笔记将int c, nl = 0, nw = 0, nc = 0, state = OUT; 更改为scanf

完成使用后,也请关闭文件。否则,如果您在不关闭文件的情况下使用太多文件,则可能会耗尽资源。

scanf("%99s",filename);

在这种情况下,即使您不关闭它,它也会在退出流程时关闭,但仍然是释放您使用的资源的好习惯。这是良好做法

答案 2 :(得分:0)

  

这些变量未被重置。

while循环的每次迭代中,您需要在使用它们之前手动重置它们,如下所示:

c = 0; 
nl = 0; 
nw = 0; 
nc = 0; 
state = OUT;

此外,请确保在每次循环迭代中关闭要打开的文件 -

fclose(fptr1);

答案 3 :(得分:0)

代码有效,因为你很幸运它没有崩溃。您从未初始化其值,因此在每个循环中,它们的值将重置为 indeterminate 。幸运的是,它们只是最后一个循环的值,但无人保证

还有潜在的泄漏,您从未使用fclose(fptr1)关闭文件句柄。在几个循环中,您可能会开始收到损坏的文件或无法打开更多文件。

答案 4 :(得分:0)

这段代码中有几个问题。 首先,您的所有计数器都没有初始值。在内部循环开始之前,nl, nw, nc, and state可以有任意随机值。它们在堆栈上分配,“c”语言不会为您初始化它们。你真的很幸运,它第一次工作。因此,您需要将它们初始化为“0”,如其他答案所示。

但你也有更多的问题。首先,您的scanf不会检查输入的大小。您假设文件名的长度不能超过100,但实际上并不一定如此。因此,您需要使用%99s或类似内容来确保数组没有溢出。

其次,您在第一个lop的开头打开文件并且从不关闭它,您需要在循环结束时执行它以释放资源,否则您可能会耗尽所有系统资源用于打开的文件。