【问题标题】:I need advice on sprintf and escape null我需要关于 sprintf 和逃避 null 的建议
【发布时间】:2018-02-11 15:13:54
【问题描述】:

我正在学习使用malloc()sprintf()printf() 操作字符串。

但是不知道在%s格式说明符后面加一个null对不对……

sprintf(handling, "%s\0", source);

因为我不确定sprintf()是否已经在sprintf()函数代码中包含了escape null,还是我必须自己添加?

char * source = "Hello\n";
char * handling = (char *) malloc(sizeof(source)+1);

sprintf(handling, "%s\0", source);
printf("%s", handling);

free(handling);

我使用 GCC 编译了这段代码,没有错误。


代码已更新。

char source[] = "Hello\n";
char * handling = (char *) malloc(strlen(source)+1);

if(handling == NULL)
{
 printf("Malloc Failed");
}

sprintf(handling, "%s", source);    
printf("%s\n", handling);

free(handling);

更好?或者请给我一些例子。

【问题讨论】:

  • 您不必添加它,但如果您这样做,它不会改变任何东西,除了使您的程序大一个字节,这是简短的答案。长答案需要完整的 C 教科书。
  • 重要提示:当您对指针执行sizeof 时,您会得到指针 的大小,而不是指针所指向的大小。要获取字符串的长度,请使用strlen
  • 谢谢zwol和一些程序员老兄。
  • 在调用任何堆分配函数(malloc、calloc、realloc)时 1) 始终检查 (!=NULL) 返回值以确保操作成功。 2) 返回类型为void*,可以分配给任何指针。强制转换只会使代码混乱,使其更难以理解、调试等
  • 关于:printf("%s", handling); 输出流(stdout)被缓冲,所以文本不会立即输出到终端,直到发生几件事之一。在当前场景下,数据直到程序退出后才会显示在终端上。要立即在终端上显示数据,请以 '\n' 结束格式字符串。 IE。 printf("%s\n", handling);

标签: c printf malloc free


【解决方案1】:

因为我不确定 sprintf 是否已经在 sprintf 函数代码中包含了 escape null 或者我必须自己添加它?

您不必自己添加\0。这已经被sprintf处理了

您的第一个代码示例有一个错误:

char * source = "Hello\n";
char * handling = (char *) malloc(sizeof(source)+1);
                                         ^^^^^^
                                         This is a pointer so you'll get the
                                         size of the pointer instead of the
                                         length of the string

指针的大小可以是 8(64 位机器)或 4(32 位机器)。在第一种情况下,您的程序可以运行,但在第二种情况下,您没有保留足够的内存。无论如何 - 获取指针的大小不是您想要的,因此您的第一个代码示例是错误的。

你的第二个例子好多了。没有错误。

但是,请注意

char source[] = "Hello\n";
char * handling = (char *) malloc(strlen(source)+1);

也可以

char source[] = "Hello\n";
char * handling = (char *) malloc(sizeof(source));

因为source 现在是一个数组,因此sizeof 将返回数组的大小(其中已经包含\0 终止符)。

【讨论】:

  • 明白。谢谢。
  • 如果在 64 位机器上编译,第一个代码可以工作——但大多是偶然的,只是因为字符串比指向它的指针短。这不是好的代码。在 32 位机器上,分配的空间不足。这个琐事并没有减损要点 - sprintf() 自动添加空值并“确保分配了足够的空间”。
  • @JonathanLeffler 是的。我更新了答案以包含它。
猜你喜欢
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多