【问题标题】:scanf() not working in file handling?scanf() 在文件处理中不起作用?
【发布时间】:2014-03-05 01:01:08
【问题描述】:

我的代码是

struct bat
    {
      char name[20];
      int runs;
    }b1;
void main()
    {
      char ch='y';
      FILE *p;
      p=fopen("details.dat","wb");
      if(p==NULL)
        {
          printf("unable");
          exit(0);
        }
       else
         {
             while ( ch == 'y' )
                   {
                       printf("enter details");
                       scanf("%s%d",b1.name,&b1.runs);
                       fwrite(&b1,sizeof(b1),1,p);
                       printf("do you want to eneter more");
                       scanf("%c",&ch);//it is not working 
                    }   
          }
  return 0;
   }

如果我使用 getche() 代替 scanf,则代码可以完美运行并具有所需的输出。 但为什么它不能与 scanf() 一起使用?

【问题讨论】:

  • 您声明了char c = 'y',但您的其余代码引用了ch。这是一个错字吗? ch 是否在其他地方定义,而不是初始化为 y
  • "%c" 改为" %c"

标签: c file struct scanf


【解决方案1】:

scanf() 以一种特殊的方式工作。当您使用它扫描字符时,用户输入的所有击键都存储在缓冲区中,并在变量中反复覆盖。 因此,如果您输入 'y' 然后按 'Enter key',scanf() 将首先将 'y' 的 ascii 值存储在字符变量 ch 中,然后立即用 'Enter key' 的 ascii 值覆盖它。

所以您的条件 ch=='y' 失败,因为 ch 不再持有 'y' 但持有 'Enter key',导致您的代码失败。

getch() 或 getche() 非常适合在您的情况下使用。因为它只接受键盘的一次击键并将其存储到分配的变量中,而无需按 Enter 键。这两个函数之间的唯一区别是 getche() 会在屏幕上回显字符,但 getch() 不会。

希望这会有所帮助..

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多