【问题标题】:sprintf() is giving Access Violation Error in VS2008sprintf() 在 VS2008 中给出访问冲突错误
【发布时间】:2012-05-13 16:28:53
【问题描述】:

我在通过VS2008 运行应用程序时遇到问题。我已经调试了代码,发现问题出在sprintf() 上。我收到以下错误

clear.exe 中 0x005251d2 处未处理的异常:0xC0000005:访问冲突读取>位置 0xffffffd4。

在执行下面一行时

static char buf[512]; 
char time_buf[100];

sprintf(buf, 
"EVENT_TIME %5.2f DOING 'LOGIN EVENT' on 'Session Login' LEVEL 1 \n AT %s \n\n",
seconds, time_buf);

我也尝试过_snprintf(),但遇到了同样的问题。

【问题讨论】:

  • 请贴出相关代码。 (例如 buf 和 time_buf 的声明)
  • 那么调试器说bufsecondstime_buf的值是什么?其中一个或多个可能不太正确。我敢打赌它是time_buf
  • 声明如下...static char buf[512]; char time_buf[100]; time_buf 和 seconds 的值是正确的.. time_buf 给出了机器的时间.. 在执行此行之前.. buf 包含有效字符串
  • 更多代码。 :) 所有字符串都确定终止了吗?
  • @Nikhil:也许您可以在调试器捕获异常时发布堆栈跟踪。特别是显示传递给sprintf() 的参数的堆栈跟踪。

标签: c++ c visual-studio visual-studio-2008


【解决方案1】:

是秒浮点型吗? 你为什么不把它分成更小的部分? 第一次尝试:

sprintf(buf, "test");

然后:

sprintf(buf, "test %s", time_buf);

然后:

sprintf(buf, "test %5.2", seconds);

【讨论】:

  • 我观察到的另一件事.. 在调用 sprintf() 之前.. buf 包含字符串.. 但该字符串末尾有垃圾字符.. 这可能是原因吗?
  • 你为什么不回答我的问题呢?不,没关系,buf没有初始化,所以它可以包含垃圾字符。
  • 是的 secinds 是浮点类型,我尝试将它分成不同的部分.. 仍然面临同样的问题... :(
【解决方案2】:

我认为您的问题是使用数组进行写入。

调试表明您的代码只会将time_buf 的第一个元素写入buf,其余内容将被忽略。

Eclipse 忽略了这一事实,并没有给我任何警告或错误,但也许 VS 对这种情况有一些其他限制。

你可以做类似的事情

char buf[100];
char* temp;
temp = "--> Some Content <--";

sprintf(buf, "%s", temp);

这会将完整内容复制到缓冲区,但是否可以在您的情况下使用它取决于您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多