为什么printf打印比数组大小更多?

时间:2019-11-21 02:28:14

标签: c printf scanf

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

2 个答案:

答案 0 :(得分:0)

如果您打算读取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(),但是如果您确实想使用上述代码,则可以解决问题。

答案 1 :(得分:0)

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”函数中。另外,请尽可能避免用户输入,尤其是在构建代码时。到目前为止,至少到目前为止,以上内容似乎相当简单。这就是我现在正在使用的,因此任何发现错误都值得欢迎。