【问题标题】:C - not output after snprintfC - snprintf 后不输出
【发布时间】:2016-11-04 17:08:22
【问题描述】:

我正在用 C 做我的第一步(指针,指针指针等,我喜欢它),所以如果这是一个愚蠢的问题,请宽恕。

此片段不输出任何内容:

char buf[256];
snprintf(buf, sizeof buf, "output: %s%s%s");

puts("test");

这个片段输出“测试”(如预期的那样):

char buf[256];
snprintf(buf, sizeof buf, "output: %s%s");

puts("test");

=>test

问题: snprintf 在这里扮演什么角色?与 puts 语句是否有任何关系,或者为什么在第一个代码中 puts 没有效果/输出?

【问题讨论】:

  • 您的 snprintf 调用缺少参数 - 您的编译器应该警告您这一点(假设您启用了编译器警告?)。您可能想选择one of these 并阅读一下。
  • 此外 sprintf 和 snprintf 不在标准输出上打印任何内容,它们在缓冲区上打印(在您的情况下为 buf)
  • 我正在使用 eclipse cdt。没有出现编译器警告。我现在正在检查我是否错过了某处的设置
  • 当您学习一些东西时,阅读手册总是很有用的。查看 snprintf() 的手册以了解它的作用。
  • 我知道 snprintf 做了什么(将在内存中将它用于 int+string 连接),但我的问题更多地是关于之后的不同 puts-result

标签: c printf puts


【解决方案1】:

因为snprintf(buf, sizeof buf, "output: %s%s%s");需要3个参数:

snprintf(buf, sizeof buf, "output: %s%s%s", str1, str2, str3);

snprintf(buf, sizeof buf, "output: %s%s");需要2个参数:

snprintf(buf, sizeof buf, "output: %s%s", str1, str2);

如果您不将参数传递给 snprintf 函数并不意味着 snprintf 不会尝试访问它们。因此,您看到的结果是 snprintf 尝试访问不存在的“str3”参数导致的分段错误结果。

【讨论】:

  • 谢谢,您的回答听起来很合理。但是在我的两个测试(成功和不成功)中,至少缺少两个参数。其中之一没有发生分段错误。这不是编译器的可预测行为还是?无论如何,我会接受你的回答,因为我认为当函数不应该使用时,这些问题没有合理的答案。
  • 不可预测的行为正是您对此类错误的预期。它被称为未定义的行为。
  • 这很简单:当 snprintf 尝试访问前两个参数时,这些参数驻留在现有页面中(snprintf 收到一些垃圾,但来自属于您的进程的内存),但是当它尝试访问时第三个参数 snprintf 尝试访问不属于您的进程或不存在的内存页面并且您捕获分段错误。换句话说,您何时会遇到分段错误取决于您分配的内存页面中的垃圾信息(因为 snprintf 搜索 /0 = EOL)。
猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多