我写了一个用于对人名进行排序的程序,并且我要求用户给出他想要的人数,并且我使用下面给出的行存储它并且它正常工作但是,我不明白确切的工作。任何人都可以清楚地解释清楚吗?
scanf("%d%*c",&n);
答案 0 :(得分:3)
%*c
用于忽略换行符或任何其他特殊字符。
所以在输入整数之后的这个scanf()
中,假设你在缓冲区中有一个换行符,这个换行符将被这个%*c
吞噬。
如果你没有这样做,只是在这个scanf()之后,如果你说
scanf("%c",&c); /* where c is a char */
然后你会想知道scanf()永远不会等你输入一个字符,而是选择一个换行符。
答案 1 :(得分:0)
从这里: scanf format string
“百分比符号后面的可选星号(*)表示此格式说明符读取的数据不存储在变量中。对于此删除的变量,不应包含格式字符串后面的参数。” p>
答案 2 :(得分:0)
%*c
会消耗该号码后的第一个char
(如果有的话),可以是'\n'
,其他一些空格,alpha,任何包括'\0'
。
'*'
中的%*c
指示scanf()
消费,但不保存char
。
如果没有通过"%d"
扫描号码,可能是由于输入无效,则"%*c"
不会执行任何操作,因为前一指令失败且未评估"%*c"
。
使用scanf("%d%*c",&n);
的错误处理很弱。对于健壮的代码,请使用辅助函数。毋庸置疑,这要复杂得多,但不幸的是,C不提供简单的和强大的阅读,即使是简单的事情,如int
。
// Read 1 line, decode an `int`, save in *n
// Return EOF, 0:Invalid, 1:Success
int ReadInt(int *n) {
int i;
char buf[50];
if (fgets(buf, sizeof buf, stdin) == NULL) {
return EOF; // EOF occurred
}
char *endptr;
errno = 0;
long num = strtol(buf, &endptr, 10);
if (buf == endptr || (*endptr != '\n' && *endptr != '\0')) {
return 0; // failed conversion
}
if (errno || num < INT_MIN || num > INT_MAX) {
return 0; // range error
}
if (n != NULL) {
*n = (int) num;
}
return 1;
}
即使这样也可以扩展到过长的行。