为什么snprintf()会写出额外的字符?

时间:2016-07-07 11:54:17

标签: c

在我的程序中,我打开一个文件并在其中写下“Hello world”。我正在使用snprintf()来填充'fname'变量。在此之后,我将gdb放在a.out上并打印字符串'fname'。我看到字符串'fname'中有很多额外的字符,我没有指定。这些额外角色来自哪里?有人可以帮忙吗?

  3 int main(void)
  4 {
  5     FILE *debug_fp = NULL;
  6     char fname[100];
  7
  8     snprintf(fname, 100, "./my_debug_%d", getpid());
  9     debug_fp = fopen(fname, "w");
 10     fprintf(debug_fp, "%s", "Hello world");
 11     return 0;
 12 }

gdb输出:

(gdb) b test.c:10
Breakpoint 1 at 0x4005be: file test.c, line 10.

Breakpoint 1, main () at test.c:10
10          fprintf(debug_fp, "%s", "Hello world");
(gdb) p fname
$1 = "./my_debug_16178\000\000\000\000\000\000\000\000\300\313Ab:\000\000\000\360\005@\000\000\000\000\000\063\004@\000\000\000\000\000\001\000\000\000\000\000\301\000'\006@", '\000' <repeats 13 times>"\300, \313Ab:\000\000\000\360\005@", '\000' <repeats 13 times>"\260, \343\377\377"
(gdb) q

谢谢。

2 个答案:

答案 0 :(得分:7)

在这种情况下,gdb不关心字符串中的0终结符,只打印数组,即fname中的完整100个字符。

如果您希望gdb将您的数组视为C字符串,也可以使用printf "%s"p /s

答案 1 :(得分:0)

由于你的问题是关于看到你没有分配的许多额外字符,所以初始化你定义的内存(简单变量,数组或指针)始终是最好的做法,这样你总能看到你所期望的。 / p>

在你的情况下,你可以这样做:

char fname[100] = {0};

我从gdb得到的响应更可预测:

(gdb) b 9
Breakpoint 1 at 0x400610: file st_fname.c, line 9.
(gdb) run
Starting program: /home/gops/data/samples/st_fname.o

Breakpoint 1, main () at st_fname.c:9
9           fprintf(debug_fp, "%s", "Hello world");
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.166.el6_7.7.x86_64
(gdb) p fname
$1 = "./my_debug_26808", '\000' <repeats 83 times>
(gdb)

现在你应该看到你的期望了。希望它有所帮助。

相关问题