gpt4 book ai didi

c - C scanf() 格式化的行为

转载 作者:行者123 更新时间:2023-12-05 09:37:21 35 4
gpt4 key购买 nike

免责声明。我见过很多问题,包括几乎完全相同的代码片段,但似乎没有一个能回答这个问题。

对于入门级 CS 类(class),我们的任务是制作一个简单的程序,从用户那里获取 ID、姓名和年龄输入并将其保存到文件中。这很简单,我很快就让它工作了。问题是,为了让其中一部分(名称输入)正常工作,我不得不“作弊”解决我遇到的一个问题。
有问题的代码片段。

int id, age;
char name[40]={0};
printf("ID: ");
scanf("%i",&id);
printf("Name: ");
scanf("%*c");
scanf("%[^\n]%*c",name);
printf("Age: ");
scanf("%i",&age);

这很好用。但是这条线让我很烦; scanf("%*c"); 它的唯一目的是处理潜伏在流中的 '\n' 字符,可能来自之前的输入。出于某种原因,我觉得这是作弊,或者如果我必须使用此解决方法,我会做错什么。任何提示表示赞赏。

最佳答案

But this line annoys me; scanf("%*c"); Its only purpose is disposingof a '\n' character lurking in the stream, probably from the previousinput.

scanf() 对于读取单个字符来说是非常重量级的。我通常会为此使用 getchar(),如果您不关心它是什么,就忽略它。

但是,对于您的特定情况,我会采纳@OlafDietsche 在评论中提出的建议:在下一个 scanf 的格式字符串的开头插入一个空格(或换行符或制表符) >:

scanf(" %[^\n]%*c",name);

这将匹配任何零个或多个空白字符的运行,因此会吃掉你的换行符,加上任何后续空白行和下一行有任何非空白的任何前导空白。无论如何,这是大多数其他字段指令的标准行为,这就是为什么你的数字字段没有同样的问题,但它是有意%[%c 字段,以便它们可以读取并返回空格。

这也意味着您不需要显式使用名称行末尾的换行符,或者...

scanf(" %[^\n]",name);

...因为它将在随后的 scanf() 调用中被 %i 指令自动使用。

关于c - C scanf() 格式化的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64233273/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com