c++ - sprintf_s() 失败并出现 "debug assertion failed"错误

标签 c++

问题可能很简单,但经过数小时的研究和编辑后我无法让它工作,所以我在这里发布我的问题。

我正在尝试创建一个函数,它接收单个数字整数或两个数字整数,并将其转换为两个整数格式(例如 7 到 07)后将其作为字符串返回。

char *to_two_digits(int num) {

    char num_str[4];

    sprintf(num_str, "%d", num);

    int length = sizeof(*num_str) / sizeof(char);

    static char *return_string;

    if (length == 1) {

        sprintf_s(return_string, "0%d", num);

        return return_string;
    }
    else if (length == 2) {
        *return_string = *num_str;
        return return_string;
    }
    else {
        printf("Error! Number cannot be represented as a two-digit.");
        exit(1);
    }
}

运行 sprintf_s() 函数时该函数失败,并显示错误:

--------------------------- Microsoft Visual C++ Runtime Library-----------

Debug Assertion Failed!

File: minkernel\crts\ucrt\src\appcrt\stdio\output.cpp

Line: 261

Expression: format != nullptr

问题是什么,如何解决?预先感谢您。

最佳答案

您正在向 sprintf_s 函数传递一个空指针。您在此行中声明的指针

static char *return_string;

从未被初始化为指向任何东西。由于它被声明为静态,因此它被预先初始化为零(而不仅仅是具有不确定的值)。

这就是该消息要告诉您的内容。 sprintf_s 代码中有一个 assert,用于检查您是否未传递空指针,这就是触发的内容。

您应该传递一个指向函数可以写入的缓冲区的指针。但由于您使用的是 C++,因此实际上应该使用 std::string 来实现此目的,然后您可以从函数返回它,而不需要静态变量。

关于c++ - sprintf_s() 失败并出现 "debug assertion failed"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37885388/

相关文章:

C++ 无符号 Shorts 除法结果为 int

c++ - SunCC 5.12 到 5.14 和 "Types cannot be declared in anonymous union"

c++ - 读取文本文件时如何在每行中找到的最后一个数字之后跳到下一行?

c++ - 未初始化的变量整数 'A'占用了哪个内存段?

c++ - Borland C++ Builder 6 调整输出可执行文件的大小以适应屏幕

c++ - 给定基类方法的编译时覆盖

c++ - 与 LLVM JIT 代码共享 C++ 指针

c++ - 信号、槽和其他类

c++ - 在 Windows 10/DirectX 上仅在全屏模式下使用 VSYNC 撕裂(窗口模式工作正常)

c++ - 为什么我不能在 c++0x 的 lambda 中声明一个结构变量?