Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
get()接受C语言中的参数_C_Gets - Fatal编程技术网

get()接受C语言中的参数

get()接受C语言中的参数,c,gets,C,Gets,我在程序中使用了gets()函数从用户处获取字符串。 当我用多个参数检查get()时,我感到震惊。 gets()接受许多参数,但我不知道gets()接受的参数数量,以及这些参数的实际用途 void main() { char str[10]; printf("Enter the String...:"); gets(str,5,5,5,5,5); puts(str); } 代码没有错误,但它将显示作为输入提供的相同参数 input String : This i

我在程序中使用了
gets()
函数从用户处获取字符串。 当我用多个参数检查
get()
时,我感到震惊。
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.
gets()
只接受一个参数

可能发生的情况是,因为没有包含
,编译器不知道它的原型是什么,没有发现编译错误,它恰好工作

整个程序的正确形式应该是(即使我仍在使用
gets()
):

不要使用
gets()
,它很危险,并且已在C11中删除。改用
fgets()

fgets(str, sizeof(str), stdin);

编辑:感谢@abelenky的回答和@chux的评论,我确认了我的猜测

在C11 6.5.2.2中,函数调用第2小节(约束中):

**如果表示被调用函数的表达式具有包含原型的类型,则参数的数量应与参数的数量一致**每个论点都应 具有一个类型,使其值可以分配给具有非限定版本的对象 其相应参数的类型

在第6小节(语义上):

如果表示被调用函数的表达式的类型不包含 原型中,对每个参数执行整数提升,并且 have type
float
升级为
double
。这些被称为默认参数如果参数的数量不等于参数的数量,则 行为未定义。

因此,如果没有标题
stdio.h
,编译器就不知道
get()
的原型,行为是未定义的,遵循上面的第6小节

根据上面的第2小节,编译器通过头知道原型,需要生成诊断消息,因为它是一个约束。

gets()
只接受一个参数

可能发生的情况是,因为没有包含
,编译器不知道它的原型是什么,没有发现编译错误,它恰好工作

整个程序的正确形式应该是(即使我仍在使用
gets()
):

不要使用
gets()
,它很危险,并且已在C11中删除。改用
fgets()

fgets(str, sizeof(str), stdin);

编辑:感谢@abelenky的回答和@chux的评论,我确认了我的猜测

在C11 6.5.2.2中,函数调用第2小节(约束中):

**如果表示被调用函数的表达式具有包含原型的类型,则参数的数量应与参数的数量一致**每个论点都应 具有一个类型,使其值可以分配给具有非限定版本的对象 其相应参数的类型

在第6小节(语义上):

如果表示被调用函数的表达式的类型不包含 原型中,对每个参数执行整数提升,并且 have type
float
升级为
double
。这些被称为默认参数如果参数的数量不等于参数的数量,则 行为未定义。

因此,如果没有标题
stdio.h
,编译器就不知道
get()
的原型,行为是未定义的,遵循上面的第6小节


根据上面第2小节的规定,编译器通过头知道原型,需要生成诊断消息,因为它是一个约束。

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

(例如,请参见
printf
,它可以接受任意数量的参数)

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

额外的参数被忽略

因此,继续,将更多参数传递给
get
。它不会改变任何事情。

获取
仍将只使用第一个参数。

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

(例如,请参见
printf
,它可以接受任意数量的参数)

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

额外的参数被忽略

因此,继续,将更多参数传递给
get
。它不会改变任何事情。

get
仍然只使用第一个参数,因为它是这样。

我建议在编译器中打开警告,并在运行代码之前修复它们。如果没有收到任何警告或错误,请将编译器扔掉。
int
main()
…我不确定(至少它是如何链接的),但请始终包含“读取函数的文档”命令,这样您就可以了解函数应该接受的参数数量。@alk我已经在“帮助”中阅读了此函数文档。但是没有针对多个参数的规范。我建议在编译器中打开警告,并在运行代码之前修复它们。如果没有收到警告或错误,请将编译器扔掉。
int
main()
…我不确定(至少它是如何链接的),但始终包含读取
fgets(str, sizeof(str), stdin);