gets()
只接受一个论点。
可能发生的情况是因为你没有 include<stdio.h>
,编译器不知道它的原型是什么,没有发现编译错误,它恰好可以工作。
整个程序的正确形式应该是(即使我仍在使用gets()
):
#include <stdio.h>
int main() {
char str[10];
printf("Enter the String...:");
gets(str,5,5,5,5,5);
puts(str);
}
当我在 GCC 下测试时,它会弹出一个错误:
error: too many arguments to function 'gets'
并且不要使用gets()
,它很危险,已在 C11 中删除。改用fgets()
:
fgets(str, sizeof(str), stdin);
编辑:感谢@abelenky 的回答和@chux 的评论,我证实了我的猜测。
在 C11 6.5.2.2函数调用第 2 小节(在Constraints中):
**如果表示被调用函数的表达式具有包含原型的类型,则参数的数量应与参数的数量一致。**每个参数都应具有一个类型,以便可以将其值分配给具有其相应参数类型的非限定版本的对象。
在第 6 小节(在语义中):
如果表示被调用函数的表达式的类型不包含原型,则对每个参数执行整数提升,并将具有类型的参数float
提升为double
. 这些称为默认参数提升。如果参数的数量不等于参数的数量,则行为未定义。...
所以发生的事情是,没有标头stdio.h
,编译器不知道 的原型gets()
,行为是未定义的,遵循上面的第 6 小节。
通过标头,编译器知道原型,根据上面的第 2 小节,它需要生成诊断消息,因为它是一个约束。