我在程序中使用了gets()
函数来获取用户的字符串。
当我用多个参数检查gets()
时,我感到很震惊。
gets()
需要多个参数,但我不知道gets()
所采用的参数数量,以及这些参数的实际使用情况。
void main()
{
char str[10];
printf("Enter the String...:");
gets(str,5,5,5,5,5);
puts(str);
}
代码没有错误,但它将显示与输入相同的参数。
input String : This is a Tesing.
output String : This is a Tesing.
答案 0 :(得分:3)
gets()
只接受一个参数。
可能会发生的是因为你没有包含<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小节(在约束中):
**如果表示被调用函数的表达式具有包含原型的类型,则参数数量应与参数数量一致。 **每个论点都应该 具有一个类型,使其值可以分配给具有非限定版本的对象 其相应参数的类型。
在第6小节( Semantics )中:
如果表示被调用函数的表达式具有不包含a的类型 原型,对每个参数执行整数提升,并对其进行参数化 将类型
float
提升为double
。这些被称为默认参数促销。 如果参数的数量不等于参数的数量,则 行为未定义。 ......
所以发生的事情是,如果没有标题stdio.h
,编译器就不知道gets()
的原型,行为是未定义的,遵循上面的第6小节。
使用标题,编译器知道原型,根据上面的第2小节,它需要生成诊断消息,因为它是一个约束。
答案 1 :(得分:1)
在C语言中,您可以根据需要将多个参数传递给函数。
(例如,参见printf
,它可以采用任意数量的参数)
不 意味着您调用的函数将完全使用这些参数。
每个函数只处理记录的参数。
额外参数 忽略 。
所以,继续,并将更多参数传递给gets
。它不会改变任何东西
gets
仍将仅使用第一个参数,因为它是documented to。