【问题标题】:Why is printf printing more than size of array?为什么 printf 打印的大小超过数组的大小?
【发布时间】:2019-11-21 02:28:14
【问题描述】:
char ad[8];
char ct[40];

printf("postal code: ");
scanf(" %[^\n]7s", ad);
printf("city: ");
scanf(" %[^\n]40s", ct);
printf("Address: |%s|%s\n", ad, ct);

广告输入示例:m2r 3r3 t4t。 输出应该是:m2r 3r3。 但 输出为:m2r 3r3 t4t

【问题讨论】:

  • 您是否认为[^\n]7%s 的修饰符?
  • @Barmar 就是要捕获空格
  • 但它不是修饰符。 %[^\n]是整个格式,7s后面跟它无关。
  • 我见过很多人把s放在%[^\n]之后,我不知道你们从哪里知道他们是有联系的。
  • 用户输入最好不要使用scanf()。使用fgets() 读取整行,然后使用sscanf() 从该行中提取您想要的内容。

标签: c printf scanf


【解决方案1】:

我使用fgetc 比使用scanf 幸运得多,虽然它需要一些额外的代码才能顺利运行,但这只是强调了用户输入的麻烦:

char ad[8];
int maxlen = 7;       //must be 1 less than array size for terminator
char a = '0';
int count = 0;
while (a != '\n' && count < maxlen) {   //read until newline or size limit
    a = fgetc(stdin);
    ad[count] = a;
    count++;
}
if (a == '\n') {                   //case: user entry < maxlen
    buffer[count - 1] = '\0';      //get rid of newline char
}
else {                            //case: user entry >= maxlen
    buffer[count] = '\0';         //terminate the string
    do {
        a = fgetc(stdin);
    } while (a != '\n')           //safely flush stdin so next entry works
}

当然,这看起来像是一堆荒谬的代码,但你可以将它放在一个可重用的 ```getEntry`` 函数中。此外,尽可能避免用户输入,尤其是在构建代码时。至少到目前为止,上述内容似乎相当万无一失。这是我现在使用的,所以任何错误发现都非常受欢迎。

【讨论】:

  • 从现在开始试试这个
【解决方案2】:

如果您的意图是读取 7 个字符并丢弃其余输入,您可以这样做:

char ad[8];
char ct[40];

printf("postal code: ");
scanf("%7s%*[^\n]", ad);
printf("city: ");
scanf("%40s%*[^\n]", ct);
printf("Address: |%s|%s\n", ad, ct);

%7s 将读取 7 个字符。而%*[^\n] 将读取到行尾并丢弃结果。

为了强调,我不提倡使用scanf(),但如果你真的想要上面的代码就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    相关资源
    最近更新 更多