我正在使用windows visual studio中的UDP套接字程序。 我收到了sprintf语句的错误。怎么纠正呢? 我的代码是:
for (i = 0; i < 30;i++) //take-off
{
printf("send AT*REF:take off\n");
sprintf(command, "AT*REF=%d,290718208\r", seq++);
rc = sendto(sd, command, strlen(command) + 1, flags, (struct sockaddr *) &droneAddr, sizeof(droneAddr));
if (rc<0) {
printf("%s: can not send data\n", argv[0]);
return(1);
}
}
我得到的错误是:
Error 1 error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
Error 1 error LNK2019: unresolved external symbol __imp__bind@12
Error 2 error LNK2019: unresolved external symbol __imp__htonl@4 referenced in function _main
Error 3 error LNK2019: unresolved external symbol __imp__htons@4
Error 4 error LNK2019: unresolved external symbol __imp__sendto@24
Error 5 error LNK2019: unresolved external symbol __imp__socket@12
Error 6 error LNK2019: unresolved external symbol __imp__gethostbyname@4
Error 7 error LNK1120: 6 unresolved externals
答案 0 :(得分:23)
printf
及其姐妹函数sprintf
被视为不安全,因为如果使用不当,它们会发出未定义的行为。
Visual Studio默认禁用这些功能。
但是,由于它们是C ++标准库的一部分,因此可以使用它们。但是,如果包含行
,Visual Studio将只允许您这样做#define _CRT_SECURE_NO_WARNINGS
在包含相关标准库标题之前。
或者,在项目预处理器设置中包含_CRT_SECURE_NO_WARNINGS
(这就是我所做的)。
(顺便说一句,在这种情况下,Visual Studio会发出一个非常有用的错误消息。请尝试学习解释它们。)
答案 1 :(得分:3)
对于您问题中的大多数错误,您需要将ws2_32.lib
添加到项目链接到的库中(在VS项目的Linker | Input | Additional Dependencies
属性中)。
其他答案/评论解决了sprintf()
问题:要么定义宏_CRT_SECURE_NO_WARNINGS
,要么使用Microsoft认为安全的sprintf()
版本,例如sprintf_s()
。我希望MSVC有一个标准版本的snprintf()
可以使用(可能很快 - 他们会在工具链中添加相当多的C99内容)。