任何人都可以解释这是做什么的:' scanf("%d%* c",& n)'

时间:2014-12-08 16:08:13

标签: c scanf

我写了一个用于对人名进行排序的程序,并且我要求用户给出他想要的人数,并且我使用下面给出的行存储它并且它正常工作但是,我不明白确切的工作。任何人都可以清楚地解释清楚吗?

scanf("%d%*c",&n);

3 个答案:

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

即使这样也可以扩展到过长的行。