0

我知道这个问题被问了一百遍,我已经搜索了所有的可能性,但我想我还不够熟练,不知道这个问题在哪里。我正在编写一个程序,我需要用数据(整数和字符串)填充结构。我第一次尝试它时,它跳过了除第一个之外的所有内容,但我并没有惊慌,因为我记得在课堂上我需要用它fflush(stdin)来克服这个问题。我搜索过的网站投票反对使用fflush(stdin),因为它具有未定义的行为。他们说使用getchar()会吃掉额外的换行符,从而解决问题。因此我的代码:

int manNode(){
Item *p;
int helper;
p = (Item*)malloc(sizeof(Item));
printf("Welk type? (Taak:1, Examen:2, Voordracht:3)\n");
scanf("%u",&helper);                           //selecting an itemtype
if (helper < 1 || helper > 3)
{
    printf("wrong value, please try again");
    return 0;
}
getchar();                                     //I've just put getchars everywhere for safety.
p->entrytype = helper-1;
helper = 0;
printf("Vul een naam in:\n");
scanf("%s", p->name);                          //this one fills in fine
getchar();
printf("Vul een vaknaam in: \n");
scanf("%s", p->course);                        //this one gets skipped if I type more than one letter in the last scanf()                
getchar();
printf("Vul een starttijd in:\n");             //From here on out everything gets skipped
p->start = getTijd();
checkTijd(p->start);                           
printf("Vul een eindtijd in: \n");
p->end = getTijd();
checkTijd(p->end);

我知道这有点乱,但专注于 scanfs 和 getchars。getTijd()其中还有几个扫描整数的scanfs,它们也会被跳过。我不知道从这里去哪里。(代码并不完整,其余的只是无关紧要)

4

2 回答 2

0

你可以定义一个新的getchar

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

#define getchar(x) (scanf("%c", x))

int main ()
{
    char x, y[10];
    getchar(&x);
    scanf("%s", y);
    printf("got %s\n", y);
    return 0;
}

更新:这可能是一个更好的方法

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

void work_to_do()
{
#define getchar(x) (scanf("%c", x))
    char x, y[10];
    getchar(&x);
    scanf("%s", y);
    printf("got %s\n", y);
#undef getchar
}
int main ()
{
    work_to_do();
    return 0;
}

解决 scanf 换行无知和 getchar (但仍然 scanf 忽略空格)

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

#define __getchar() (read(2, NULL, 1)) // 2 stands for standard error, we can make the user enter a character.

void work_to_do()
{   
    char y[10];
    __getchar();
    scanf("%s", y);
    printf("got %s\n", y);
    __getchar();
}
int main ()
{
    work_to_do();
    return 0;
}

看看这个很好: Read space-separated values from file

于 2013-08-04T03:02:44.577 回答
0

scanf按记录工作。scanf此外,只要了解其功能,就没有错。

我创建了您的代码副本并将其提炼以突出您想要做的事情。您需要自己填写其余部分。

在此代码中,您需要输入一个数字并按 Enter。然后输入一个字符串并按回车等。注意。该fflush(stdout)语句是每个 K&R 标准 C 实现的一部分。将fflush缓冲区的内容强制输出到控制台。这种刷新有助于合理的用户/计算机对话。

#include <stdio.h>
main()
{
    char string[100];
    int  helper;

    printf("Welk type? (Taak:1, Examen:2, Voordracht:3)\n");
    fflush(stdout);

    scanf("%d",&helper);    //select an itemtype
    if (helper < 1 || helper > 3)
    {
        printf("wrong value, please try again");
        return 0;
    }

    printf("Vul een naam in:\n");
    fflush(stdout);

    scanf("%s", &string[0]);
    printf("\n%s\n", string);

    printf("Vul een vaknaam in: \n");
    fflush(stdout);

    scanf("%s", &string[0]);
    printf("\n%s\n", string);

    printf("Vul een starttijd in:\n");
    fflush(stdout);
    scanf("%s", &string[0]);
    printf("\n%s\n", string);

    printf("Vul een eindtijd in: \n");
    fflush(stdout);
    scanf("%s", &string[0]);
    printf("\n%s\n", string);
}

此代码使用 Microsoft C 编译器在 Eclipse 上运行。

另外,我要强调的是,如果您输入:1 AAA BBB CCC DDD 并按回车,scanf则将执行五次。在此示例中,代码将运行完成!

因此,您需要跟踪您的代码逻辑(在本例中为一条直线),以查看如何根据输入的数据调用 scanfs。

希望这可以帮助。请询问是否有更多问题。

于 2013-08-04T23:05:01.183 回答