固定带有空格键和EOF检查的字符串

时间:2014-03-26 17:30:07

标签: c string pointers struct char

好的,我在这里有这段代码:

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,则突破循环。

2 个答案:

答案 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