【问题标题】:C File I/O - Need to compare different stdin char with every lineC 文件 I/O - 需要将不同的标准输入字符与每一行进行比较
【发布时间】:2014-12-27 06:25:42
【问题描述】:

所以,我在这里有这个练习,它是一个写在文件中的测验,每个问题有 2 个答案,每个问题都在一行中,换行符之前的最后一个字符是正确答案。给出的答案和正确的答案用“$”分隔。示例文件如下所示:

Koja zemja koristi najmnogu elektrichestvo?$а)SAD$b)Kina$b
Koe e najchesto ime vo svetot?$a)Li$b)Muhamed$b

因此,程序需要打印出一个问题以及两个给出的答案,等待标准输入的答案,然后检查答案是否正确。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) {
    //if(argc!=2) {printf("Upotreba: ./2 <vlezna datoteka>"); return -1;}
    FILE *read=fopen("kviz.txt", "r");
    //if((read=fopen(argv[1], "r"))==NULL) {printf("Ne postoi takva datoteka."); return -1;}
    int i=0;
    int j;
    char answer;
    char string[200];
    while(fgets(string, 200, read)!=NULL)
    {
        string[strlen(string)-1]='\0'; //remove newline
        for(i=0;i<strlen(string);i++)
        {
            if(string[i]=='$') string[i]=' ';
        }
        for(i=0;i<strlen(string)-1;i++)
        {
            printf("%c", string[i]);
        }
        answer=getchar();
        if(answer==string[strlen(string)-1]) {printf("Correct answer.\n"); continue;}
        else {printf("Incorrect answer.\n"); continue;}
    }
    fclose(read);
    return 0;
}

现在程序适用于第一个问题,但它只能让我输入一次答案。我得到的输出是:

Koja zemja koristi najmnogu elektrichestvo? а)SAD b)Kina b
Correct answer.
Koe e najchesto ime vo svetot? a)Li b)Muhamed Incorrect answer.

如果您注意到,在第二个问题之后我没有插入答案,它只是将我首先输入的答案进行比较,并且比较也很糟糕,因为问题 2 的答案也是 b 并且它打印出来是不正确的。有什么帮助吗?

【问题讨论】:

  • answer=getchar(); 当您输入该答案时,您认为 afterward 输入的换行符发生了什么?它仍然位于输入缓冲区中,下一个getchar() 将拾取它(这是您阅读的下一个答案,显然ab 都不是)。
  • 这是我目前还不知道的。谢谢。
  • 您应该始终检查 I/O 语句(如 fopen() )返回的值,以确保操作成功
  • 声明:'继续;'不需要,因为代码已经在 while 循环的末尾
  • 嗨, continue 语句只是我测试一些东西,看看我是否能让代码工作。并且检查 fopen() 在那里,我只是将其注释掉以用于该程序的测试目的

标签: c file input


【解决方案1】:

getchar() 一次会得到一个字符。

当用户输入答案并按下回车键时,'\n' 字符在缓冲区中。

这样getchar() 在第二个答案时得到'\n' 字符。

为了避免这种情况,

在这一行之后再放一个getchar()。喜欢,

answer=getchar();
getchar();

它需要换行,程序会正常工作。

【讨论】:

  • 这将处理 OP 的特定情况,但通常不能作为纠错机制工作。这假设用户总是输入一个字符,然后输入可以忽略的内容(实际上是任何内容)。像a \nabc\n\n\n 等输入都会以无效数据继续前进。一旦输入超出预期的字符换行符交错。在某些时候,OP 也需要考虑到这一点。但是对于直接“这就是为什么会发生这个问题”这个答案是准确的,并相应地打勾。
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多