正如您从下面的代码片段中看到的,我声明了一个char变量和一个int变量.当编译代码时,它必须标识变量stri的数据类型.

为什么我需要在扫描变量时通过指定%s%dscanf再次告诉它是字符串或整数变量?当我声明变量时,编译器还不够成熟,不能识别出这一点吗?

#include <stdio.h>

int main ()
{
  char str [80];
  int i;

  printf ("Enter your family name: ");
  scanf ("%s",str);  
  printf ("Enter your age: ");
  scanf ("%d",&i);

  return 0;
}

推荐答案

因为像scanfprintf这样的变量参数函数没有可移植的方法来知道变量参数的类型,甚至不知道传递了多少个参数.

请参阅C常见问题解答:How can I discover how many arguments a function was actually called with?


这就是为什么必须至少有一个固定参数来确定变量参数的数量或类型的原因.并且该参数(标准称其为parmN,参见C11(ISO/IEC 9899:201x)§7.16 Variable arguments )扮演这个特殊角色,并且将被传递给宏va_start.换言之,在标准C中不能使用这样的原型函数:

void foo(...);

C++相关问答推荐

在x86汇编中,为什么当分子来自RDRAND时DIV会引发异常?

数组元素的编号索引

理解C中的指针定义

与unions 的未定义行为

如何解决C中的严格别名?

轮询libusb_pollfd struct 列表的正确方式是什么?

获取每个循环迭代结束时的当前时间

ifdef __cplusplus中的整数文字单引号

如何只获取字符串的第一个单词,然后将其与c中的另一个单词进行比较?

如何使用唯一数字对整型进行分区

按长度对argv中的单词进行排序

用C++构建和使用DLL的困惑

如何在C中定义指向函数的指针并将该指针赋给函数?

&stdbool.h&q;在嵌入式系统中的使用

模仿 memmove 的行为

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

SSE 向量与 Epsilon 的比较

UEFI 应用程序中的计时器回调仅在 AMI BIOS 中挂起

C 中从 Unix 纪元时间转换的损坏

当 a 是代码块时使用逗号运算符 (a, b)