0

我正在尝试一些基于 C 的问题,并陷入了这个特定的问题。根据我的说法,old.out 文件应该用我们使用 scanf 输入的任何内容写入,因为 fprintf 将输入分配给文件指针,但令我惊讶的是,我看到没有任何内容被写入 old.out,因为后面的 while 循环是没有被执行。这是怎么回事?这与我对 fprintf 函数的误解有关吗?我已经粘贴了下面的代码。

#include<stdio.h>
main()
{
    FILE *fp;
    char a;
    fp=fopen("old.out","w");
    if(fp==0)
        printf("File opening error");
    else
    {
        for(scanf("%c",&a);a!=EOF;scanf("%c",&a))
            fprintf(fp,"%c",a);
        fclose(fp);
        fp=fopen("old.out","r");
        while(!feof(fp))
            putchar(getc(fp));
    }
    return 0;
}
4

2 回答 2

6

scanf()EOF没有更多字符要读取时,不会将其参数设置为。所以你的for循环是一个无限循环。有两点要改变:

  1. 不要做出假设,而是阅读文档。

  2. 使用fgets()而不是scanf(). (算了scanf(),毕竟它并没有像你想象的那样做,有很多更好和友好的功能,特别是对于初学者。)


“好吧,好吧,但我可以攻击密码?”

你可以:

#include <stdio.h>
#include <limits.h>
#include <assert.h>

int main()
{
    char buf[LINE_MAX];
    fgets(buf, sizeof(buf), stdin);

    FILE *fp = fopen("old.out", "w");
    assert(fp);
    fputs(buf, fp);
    fclose(fp);

    fp = fopen("old.out", "r");
    assert(fp);
    if (fgets(buf, sizeof(buf), fp))
        puts(buf);
    fclose(fp); 

    return 0;
}
于 2013-06-28T07:35:32.523 回答
3

有相当多的问题。

一方面,scanf()不会分配 EOF,它会 *return * EOF。此外,EOF不适合 a char(它是一个int值),所以a != EOF很危险。此外,feof()在执行 I/O 之前进行检查也不是一个好主意。

于 2013-06-28T07:35:59.760 回答