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);