c++ - 为什么这个对 sprintf_s() 的调用有效,我怎样才能在我的计算机上使它工作?
问题描述
我是一个没有经验的学生,这是我们 C++ 编程作业的已发布解决方案的一部分。但它不能在我的电脑上编译,我需要帮助理解为什么。我遇到的第一条错误消息是在 sprintf_s() 说“标识符 'sprintf_s' 未声明”,我认为这是因为我正在运行 linux 并且 sprintf_s() 不是标准的 lib func。因此,我尝试将其替换为 snprintf() 并且原始错误消息消失了(但请让我知道这是否不正确,我的更改已在原始行上方注释掉)。
更改后,我收到错误消息“'const char *'类型的参数与'size_t'类型的参数不兼容”和“'float'与'const char *'类型的参数不兼容”。我知道 sprintf_s() 和 snprintf() 的参数都是
(char *str, size_t size, const char *format, ...)
如此,所以我认为这个错误是有道理的,因为传递的参数中缺少大小。但是,如果必须有大小的参数,那么将其设置为 128 是否正确?为什么在我老师的 sprintf_s() 的 Windows 机器上没有这个论点,但在 Linux 上的 snprintf() 却不行?另外,他使用的是 Visual Studio,我使用的是 Visual Studio Code。
整个函数如下图所示。如果您知道我在编译应该是可行的解决方案时可能遇到问题的另一个原因,请告诉我!
bool myNode::isAccessible()
{
return isAccessible(x, y);
}
myNode::myNode(const float location[3])
{
x = (location[0] > 0.0) ? (int)floor(location[0] / SCALE + 0.5f) : (int)ceil(location[0] / SCALE - 0.5f);
y = (location[1] > 0.0) ? (int)floor(location[1] / SCALE + 0.5f) : (int)ceil(location[1] / SCALE - 0.5f);
if (isAccessible(x, y)) return;
int originalX = x, originalY = y;
for (int a = -1; a <= 1; a++)
for (int b = -1; b <= 1; b++) {
if (a == 0 && b == 0) continue;
x = originalX + a;
y = originalY + b;
if (isAccessible(x, y)) return;
}
char buffer[128];
//snprintf(buffer, "***AStarNode: could not find any isAccessible node for (%f, %f, %f)***", location[0], location[1], location[2]);
sprintf_s(buffer, "***AStarNode: could not find any isAccessible node for (%f, %f, %f)***", location[0], location[1], location[2]);
controlPanel->addMessage(buffer);
}
解决方案
错误"argument of type 'const char *' is incompatible with parameter of type 'size_t'"
和以下错误来自缺少缓冲区大小参数snprintf
。
正确的调用snprintf
是:
snprintf(buffer, sizeof buffer, "***AStarNode: could not find any isAccessible node for (%f, %f, %f)***", location[0], location[1], location[2]);
推荐阅读
- automation - 如何自动化测试以安装/卸载应用程序
- userscripts - 关于 GM_getValue 的问题,以及寻找除 GM_setValue 之外的用户脚本数据存储解决方案
- git - 你的分支和 'origin/new_ci3' 已经分道扬镳了
- c# - 带有方法接口的 C# 泛型约束
- javascript - 按字母顺序排序对象,忽略Angular中的小写和大写字母
- git - Jenkins git - Peer's Certificate has expired 错误
- node.js - 什么是委托代理
- nginx - NGINX sendmsg() 在代理和发送到上游时失败(1:不允许操作)
- interactive - 无法在 Cloudcase 中创建交互式操作
- javascript - 当我在对象内定义属性时,为什么我的 JavaScript 代码给出了引用错误?