【发布时间】: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);