Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不输出的printf样式格式_C_String_Printf - Fatal编程技术网

C 不输出的printf样式格式

C 不输出的printf样式格式,c,string,printf,C,String,Printf,我想做的是使用类似于printf的语法创建一个新的char*: char* myNewString = XXXXprintf("My string says %s", myFirstString); 这在不打印到输出流的情况下是否可行?当然,这就是sprintf的作用:printf将格式设置为提供的char* 涵盖sprintf和相关printf功能。请务必考虑使用 SNPrTNF :适当的用法将通过限制实际复制到所提供的缓冲区的字节数,使它比SaveTf更安全。 用法与您的示例略有不同:您提

我想做的是使用类似于
printf
的语法创建一个新的
char*

char* myNewString = XXXXprintf("My string says %s", myFirstString);

这在不打印到输出流的情况下是否可行?

当然,这就是
sprintf
的作用:
printf
将格式设置为提供的
char*

涵盖
sprintf
和相关
printf
功能。请务必考虑使用<代码> SNPrTNF :适当的用法将通过限制实际复制到所提供的缓冲区的字节数,使它比SaveTf更安全。

用法与您的示例略有不同:您提供了一个由
sprintf
修改的缓冲区。该函数不返回结果,与其他
printf
函数一样,返回
int
:打印的字符数

char myNewString[MAX_LEN];
snprintf(myNewString, MAX_LEN, "My string says %s", myFirstString);

您正在寻找的函数是
sprintf


sprintf应该为您做到这一点

与printf的唯一区别在于,第一个参数是一个char*,用于存储字符串,即

sprintf(myNewString, "My string says %s", myFirstString);

我推荐
snprintf
,它比您正在寻找的
sprintf
snprintf
功能更安全

请注意,
sprintf
不会返回指向新分配字符串的指针;您必须自己分配字符串,并确保它足够大:

char target[100];
sprintf(target, "My string says %s", myFirstString);
除非可以确定目标足够大,否则应使用
snprintf
,这将限制复制到目标字符串的字节数

snprintf
返回本应写入目标字符串的字符数。您可以使用空目标和零大小调用
snprintf
,找出需要多少大的缓冲区,然后分配缓冲区并再次调用它以写入目标(注意:我的原始代码示例出现了一个off by one错误。)


如果使用此选项,则必须稍后使用
free()
来取消分配字符串。由于这是一个GNU扩展,它会降低代码的可移植性。

如果你不介意GNUisms,
asprintf
可能是最接近你所追求的东西:它会自动为你分配一个缓冲区(但你必须记得
之后释放它)

char*目标;
int-ret=asprintf(&target,“我的字符串表示%s”,myFirstString);
//如果ret<0,则目标的内容未定义

什么是
sprintf()
,沃森?RE:snprintf()。它不能防止失败,只是改变了失败的类型。您得到的是截断,而不是缓冲区溢出。我怀疑一次失败比另一次好。此外,在出现错误时,snprintf()返回-1。我的RX是分配最大的缓冲区,而不是字符串注入的结果,使用sizeof(really_big)表示n,并针对大小和-1测试返回值。如果返回值为GT 0,并且LT sizeof(string_to_keep-1)运行良好。-1表示nul终止符。我同意。。强烈建议使用snprintf而不是sprintf!。。sprintf通常会导致无法预料的溢出。您还可以对格式说明符设置硬限制:%20.20对于提及cplusplus.com,我深表歉意。
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    const char *myFirstString = "hello, world";
    char *target;
    size_t size = snprintf(NULL, 0, "My string says %s", myFirstString);
    target = malloc(size+1); /* +1 for terminating '\0' */
    if (target == NULL) {
        fprintf(stderr, "Allocation failed\n");
        exit(EXIT_FAILURE);
    }
    size = snprintf(target, size+1, "My string says %s", myFirstString);
    printf("target = \"%s\"\n", target);
    return 0;
}
char *target;
asprintf(&target, "My string says %s", myFirstString);
char *target;
int ret = asprintf(&target, "My string says %s", myFirstString);
// if ret < 0, the contents of target are undefined