gets()接受C语言的参数

时间:2013-10-27 15:17:49

标签: c gets

我在程序中使用了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.

2 个答案:

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