C 用户在结构中的有限输入

C 用户在结构中的有限输入,c,function,input,scanf,fflush,C,Function,Input,Scanf,Fflush,请帮帮我,这工作不正常 输入 omayma.firstname:aaaaaaaaaaaaaaaaaaaaaaa omayma.lastname:bbbbbbbbbbbbbbbbbb 输出: omayma.firstname:aaaaaaaaaaaabbbbbbbb omayma.lastname:bbbbbbbb 预期输出: omayma.firstname:aaaaaaa(准确地说是10a) omayma.lastname:BBBBBB(10) 使代码按您可能预期的方式工作的建议 首先,为名字

请帮帮我,这工作不正常

输入
omayma.firstname:aaaaaaaaaaaaaaaaaaaaaaa
omayma.lastname:bbbbbbbbbbbbbbbbbb
输出:
omayma.firstname:aaaaaaaaaaaabbbbbbbb
omayma.lastname:bbbbbbbb
预期输出:
omayma.firstname:aaaaaaa(准确地说是10a)
omayma.lastname:BBBBBB(10)


使代码按您可能预期的方式工作的建议

首先,为名字提供更多的空间。空间很便宜。在结构中变大(足够大):

typedef struct
{
    char firstname[50];
    char lastname[50];
} person;
其次,如果必须使用
scanf()
,请对较大的缓冲区进行后续调整

scanf("%49s", omayma.firstname);// adds room for long names, 
或者,您可以使用可能更好的替代方法,完全摆脱
scanf()

fgets(omayma.firstname, sizeof omayma.firstname, stdin);
omayma.firstname[strcspn(omayma.firstname, "\n")] = 0;//remove newline
fgets(omayma.lastname, sizeof omayma.lastname, stdin);
omayma.lastname[strcspn(omayma.lastname, "\n")] = 0;//remove newline

printf("%s %s", omayma.lastname, omayma.lastname);



           
第三,仅用于输出流:

fflush(stdin);//delete this statement (everywhere)

scanf(“%10s”,omayma.firstname)->
scanf(“%9s”,omayma.firstname)
,为
“\0”
保存1个字符。另外,
fflush(stdin)
是未定义的行为,它可能不会做你想让它做的事情。@mediocrevegetable1对不起,但是你不能在同一句话中使用
“%*[^\n]]%*c”和“clean”。@mediocrevegetable1如果你发现自己使用
%[^\n]
来修复一些
scanf
-使用代码,事实证明,
scanf
实际上是无用的
scanf
的唯一优点是它对新手来说很快很容易使用。但是如果你必须使用
%[]
,那就不再是一件容易的事了,你最好完全放弃
scanf
,使用更好的东西。@OmaymaBenali,你要知道:
fflush(stdin)
是错误的。它今天解决了您的问题,所以这很好,但很快,您就会想停止使用它——同时也停止使用
scanf
。(如果您不调用
scanf
,您将永远不需要
fflush(stdin)
)您可以使用
fgets()
和一个漂亮的大缓冲区,并将一个正确长度的名称复制到数组中。如果人们想胡闹,输入一个比漂亮的大缓冲区长的愚蠢的名字,谁会在乎程序是否会截断这个名字,并将剩下的用于下一次输入呢。不要使用
get()
gets()
不是更糟:.
fgets()
是一个更好的替代-UV。然而,读入
.firstname
然后删除潜在的
'\n'
并不能很好地读取名为49个字符(最多48个字符)的行。不幸的是,C并没有提供一个简单的替代方法。@chux-monica-谢谢你的这些想法。这个网站上的专有名称长度是一个很常见的话题。但实际需要多久将所有数据输入硬编码缓冲区?无论保存限制(48、49、50、…、666、…)如何,我倾向于为输入缓冲区2x编码,以消耗整行数据,并在修剪后的输入超过目标时发出良好的警报。对于超过2倍的行输入,有点类似于注释,输入是敌意的,应该得到更严厉的响应。
fflush(stdin);//delete this statement (everywhere)