好的,我在这里有这段代码:
struct Computer
{
char name[20];
float hdd;
int price;
int ram;
};
struct Computer list[7];
int n = 0;
for(n; n < 7; n++)
{
printf("\nEnter PC name, 20 characters:");
/* here should be name entry for list[n].name */
}
许多方法都不起作用。我尝试了fgets()
,getch()
,scanf()
以及其他许多内容,但它要么无效,要么没有足够的功能。
fgets(list[n].name, 20, stdin)
无法识别入场时的EOF,这是必要的。
list[n].name[counterChar] = getch()
只有一些奇怪的行为,并且有许多常规的回声。
scanf("%c", &list[n].name[counterChar])
让用户在每个符号后按Enter键。
我需要的是:名称限制为20个字符,包括空格,如果EOF
,则突破循环。
答案 0 :(得分:0)
这样的事情会起作用:
int ret;
...
{
ret = scanf(" %19[^\n]", list[n].name);
if(ret == EOF)
break;
澄清此代码的作用:
这将读取19个字符(为空终止符留下1个空格)。如果您在name[20]
中阅读了完整的20,那么您将填充数组并且不会为scanf()
留出空间来附加空终结符('\0'
)。如果你真的想要20个字符,那么你需要将数组提升到name[21]
。
格式字符串利用negated scanset并告诉scanf()
停止换行符而不是&#34;所有空格&#34;字符。这意味着它将读取空格,但也会读取其他空格字符(例如制表符,换行符等)。
如果这不是你可以通过添加更多&#34;停止&#34;来调整扫描设置。那里的人物。例如,如果您希望它停留在换行符或标签上,您可以执行以下操作:" %19[^\n\t]"
格式字符串在初始"
和%
之间也有一个空格,这是故意的。它告诉scanf()
忽略stdin
缓冲区上留下的任何空格。在循环中使用scanf()
会将上一个换行符('\n'
)保留在缓冲区中。
最后,检查scanf()
的返回值,以便从您获得EOF
的循环中断开。如果遇到EOF
而不是来自man page的字符串,您可以看到这是您将获得的:
如果在第一次成功转换或匹配失败发生之前达到输入结束,则返回值EOF。
答案 1 :(得分:0)
您应该使用格式字符串scanf
中的最大字段宽度来防止缓冲区溢出,并检查scanf
的{{1}}的返回值,以确定调用是否成功。< / p>
1