0

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.
4

2 回答 2

3

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 小节,它需要生成诊断消息,因为它是一个约束。

于 2013-10-27T15:21:53.800 回答
1

在 C 语言中,您可以向函数传递任意数量的参数。

(例如,请参阅printf,它可以采用任意数量的参数)

这并不意味着您调用的函数将使用这些参数。
每个函数将只处理它记录的要处理的参数。

额外的参数被忽略

因此,继续,将更多参数传递给gets. 它不会改变任何东西。
gets仍将仅使用第一个参数,因为它记录在.

于 2013-10-27T16:19:57.487 回答