- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题可能很简单,但经过数小时的研究和编辑后我无法让它工作,所以我在这里发布我的问题。
我正在尝试创建一个函数,该函数接收一位整数或两位整数,并在将其转换为两位整数格式(例如 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/
我想写入数据到一个字符缓冲区。因此,我有一个格式化我的数据的功能。例如,我只是像这样将一个 int 值传递给函数: using namespace std; #include char* write
Visual Studio 提示我将 sprintf 替换为 sprintf_s,而不是 snprintf。 sprintf_s 不需要长度参数,它如何避免缓冲区溢出问题? 最佳答案 有两个版本。一种
我在使用 C/C++ 程序的 Windows 上的 Visual Studio 中收到“0xC0000005:访问冲突读取位置错误”,并尝试简化以说明我的问题。下面的代码运行得很好: char tmp
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有一个使用 sprintf_s 的 C 程序。它在 Windows 中工作正常,但是当我在 Linux 中编译代码时,出现以下错误: sprintf_s was not declared in th
我在 sprintf_s 中偶尔执行以下代码时发生崩溃。这段代码工作了很多年,没有任何问题。当我按照下面的语句在 strcat_s 和 sprintf_s 中给出大小时,不会出现崩溃。这可能是什么原因
我遇到了问题。示例: try { char strMes[6]; sprintf_s(strMes, sizeof(strMes), "%s", "012345678"); p
我在使用这个函数时遇到了一个有趣的问题。我使用它如下: int nSeq = 1; char cBuf[8]; int j = sprintf_s(cBuf, sizeof(cBuf), "%08d"
包含 banned.h(微软安全工具之一)后,编译器警告我 sprintf() 函数不安全,MSDN 中心给了我使用 的建议sprintf_s,因为我的项目是跨平台的,所以我写了一个sprintf函数
以下代码会导致错误并终止我的应用程序。这是有道理的,因为缓冲区只有 10 个字节长,而文本有 22 个字节长(缓冲区溢出)。 char buffer[10]; int length = spri
我有一个使用 sprintf_s 的 C 程序。它在 Windows 中运行良好,但是当我在 Linux 中编译我的代码时出现此错误: sprintf_s was not declared in th
对于新项目,我应该更喜欢哪个功能?来自 strsafe.h 或 sprintf_s 的 StringCchVPrintf 最佳答案 我建议使用 snprintf如果您使用 C 编写代码(因为 snpr
我正在尝试创建一个类,比如说 MyClass,在以下条件下工作: MyClass name = "everyone"; // Assigns "everyone" into a local str
这是我从 int 到 char* 的转换: char* str = malloc(sizeof("0000")); int int_ = 10; sprintf_s(str, sizeof("0000
我有一个 C++ 应用程序,其中客户报告了一个崩溃。但是崩溃不容易重现。在分析了一些日志之后,我发现崩溃可能发生在以下代码部分之间。请告诉我,如果我在其中包含这些代码语句,应用程序是否有可能崩溃?
在 C++ 中,使用 VS2012,我想获取 Mac 地址并将其转换为汽车格式。我使用 sprintf_s function() 以便在汽车模式下进行转换。在 Debug模式下,一切正常,但在 Rel
我正在使用来自 C# 的 C++ dll(不是我的)。我使用 Console.SetOut 和 Console.SetError 成功地将 C# 控制台输出重定向到一个文件。 有什么办法可以从“外部”
我正在尝试使用 WCHAR 中的 sprintf_s 创建一个新字符串。我的代码如下所示: #include #include void main(int argc, char ** argv)
这是工作的原始代码: // ... unsigned __int64 num = 57; sprintf_s(buffer, sizeof(buffer), "%llu", num); 但是,当我尝试
我写了一个跨平台代码,给出了当前日期 (mm/dd/yy) 和时间 (hh/mm/ss) 和完整日期 (yyyymmdd),此代码适用于 windows(MSVS2015) 但不适用于Linux(GC
我是一名优秀的程序员,十分优秀!