【问题标题】:sprintf error in visual studioVisual Studio中的sprintf错误
【发布时间】:2014-04-09 06:48:05
【问题描述】:

我正在 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 

【问题讨论】:

  • 你试过按照编译器告诉你的去做吗?
  • 是的,我试过了。它给出了很多错误。错误 1 ​​错误 LNK2019:无法解析的外部符号 __imp__bind@12 错误 2 错误 LNK2019:无法解析的外部符号 __imp__htonl@4 在函数 _main 中引用 错误 3 错误 LNK2019:无法解析的外部符号 __imp__htons@4 错误 4 错误 LNK2019:无法解析的外部符号 __imp__sendto@24 错误 5错误 LNK2019:未解析的外部符号 __imp__socket@12 错误 6 错误 LNK2019:未解析的外部符号 __imp__gethostbyname@4 错误 7 错误 LNK1120:6 个未解析的外部
  • 一个不相关的提示:当一个函数返回一个错误时(比如当sendto返回rc &lt; 0),那么告诉用户what可能是个好主意错误是。它肯定会帮助您了解出了什么问题。阅读WSAGetLastError
  • 编译器错误,和你的链接器错误无关。实际上请尝试使用 sprintf_s 代替。
  • 另一个不相关的事情:你确定只有回车会被接受为换行符吗?不是回车换行序列"\r\n"?

标签: c++ visual-studio printf


【解决方案1】:

printf 及其姊妹函数 sprintf 被认为是不安全的,因为如果使用不当,它们会发出大量的未定义行为

Visual Studio 默认禁用这些功能。

但是,由于它们是 C++ 标准库的一部分,您可以使用它们。但是 Visual Studio 只允许你这样做,如果你包括行

#define _CRT_SECURE_NO_WARNINGS

在包含相关标准库头文件之前。

或者,在您的项目预处理器设置中包含_CRT_SECURE_NO_WARNINGS(我就是这样做的)。

(顺便说一下,Visual Studio 在这种情况下会发出一条非常有用的错误消息。请尝试学习解释它们。)

【讨论】:

  • 我已经在我的回答中阐明了放置位置。现在,破坏它:把它放在stdafx.h
  • 我认为定义该宏是一个坏主意。警告是有原因的。 @wireless_lab 请阅读有关sprintf_s 的信息,您无需进行太多更改即可使其正常工作。
  • @JoachimPileborg 在这里提出了重要的一点。一定要尝试使用 C++ 的更安全的特性。我也倾向于服从编译器并使用更安全的sprintf_s
  • 为我的调试配置定义 _CRT_SECURE_NO_WARNINGS 指令有效,它可以编译,但为我的发布版本定义它会导致错误持续存在。知道为什么吗?
  • printf 有什么不安全/未定义的?
【解决方案2】:

对于您问题中的大多数错误,您需要将 ws2_32.lib 添加到项目链接到的库中(在 VS 项目的 Linker | Input | Additional Dependencies 属性中)。

其他答案/cmets 已解决 sprintf() 问题:要么定义宏 _CRT_SECURE_NO_WARNINGS,要么使用 Microsoft 认为安全的 sprintf() 版本,例如 sprintf_s()。我希望 MSVC 有一个标准版本的 snprintf() 可以使用(可能很快 - 他们正在向工具链中添加相当多的 C99 内容)。

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 2020-02-05
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多