size_t sz = 100;
char* length[3] = "LEN";
如何连接size_t和char *?
我想要的结果就像是
char* length = "100LEN"
不只是打印出“100LEN”。
答案 0 :(得分:0)
如果要将编译时整数常量与字符串文字连接起来,问题将减少为在预处理器级别对整数常量进行字符串化,前提是预处理器会自动连接相邻的字符串文字:
#define SZ 100
#define MYSTR "LEN"
int main()
{
#define _STR(X) #X
#define STR(X) _STR(X)
puts(STR(SZ) MYSTR);
}
如果编译时不知道这两个组件中的任何一个,那么你需要一个(足够大的)缓冲区来将结果写入,你需要自己将数字转换成一个字符串,例如{ {1}}:
sprintf
答案 1 :(得分:0)
不要使用sprintf()
它不安全,并存在缓冲区覆盖的风险。
始终使用snprintf()
并根据类型的大小分配输出的最大空间。
#include <stdio.h>
#include <stdint.h>
int main() {
size_t sz = 100;
const char length[] = "LEN";
const size_t buffersz=24;//On 64-bit platform covers a 20 digit size, 2 characters of "LEN" and the '\0' terminator.
char buffer[buffersz];
int count=snprintf(buffer,buffersz,"%zu%s",sz,length);
printf("%d %s",count,buffer);
return 0;
}
脚注:为什么你不应该使用sprintf
。
建议只要您知道输入就可以使用sprintf
大小。
这仍然存在风险,编写良好的程序不再使用它了。 它总是存在一些改变输出大小的程序其他部分的变化。那是经典的下游灾难。将int更改为long(或从32到64位...)和 Boom 。
标准不推荐使用该标准,不仅仅是用户输入,而且所有输入都是有充分理由的。或者你可能只是错了,当一些变量接近极限时,程序会在不明显的情况下失败。
假设日志消息打印出用户名,日期和大小以及缓冲区太短的睡眠错误。根据您的日期格式,您可能会遇到一个错误,该错误仅在某个月的某些时间针对某些用户崩溃!
不要使用sprintf()
。真的没有必要担心。只是不要使用它。
答案 2 :(得分:-1)
如果您希望length
成为字符串,则需要空终结符的空间; char length[4] = "LEN";
,或更好,char length[] = "LEN";
,以确保这一点。或者,length
可以是指向字符串文字的指针:char *length = "LEN";
。
您可以使用sprintf()
构建如下字符串:
#include <stdio.h>
int main(void)
{
size_t sz = 100;
char *length = "LEN";
char result[7];
sprintf(result, "%zu%s", sz, length);
printf("%s\n", result);
return 0;
}
result
缓冲区必须足够大,以包含sprintf()
所写的字符。如果涉及的尺寸存在不确定性,则使用snprintf()
(自C99起)更安全。如果函数调用中存在错误,则此函数的返回值为负,否则为已写入适当大小的缓冲区的字符数,减去空终止符。此返回值可用于检查输出是否被截断,或者可用于分配正确大小的缓冲区。
后一种方法在下面的代码中说明。首先,调用snprintf()
将零字符写入空指针目标。返回值n
是将写入适当大小的缓冲区的字符数。此值可用于声明VLA,但如果再次需要,则无法在以后调整此数组的大小;这里malloc()
用于分配空间,包括空终止符的空间。如果再次需要result
缓冲区,则可以将其重新分配为新大小。在退出程序之前,必须取消分配此内存。
请注意,检查snprintf()
的返回值是否有错误。还会检查malloc()
的返回值是否有错误。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
size_t sz = 100;
char *length = "LEN";
int n;
n = snprintf(NULL, 0,"%zu%s", sz, length);
if (n < 0) {
fprintf(stderr, "Error in snprintf() size evaluation\n");
exit(EXIT_FAILURE);
}
/* Could use a VLA, but this cannot be resized */
// char result[n+1];
/* Using malloc() allows result to be reallocated later if necessary */
size_t result_sz = n + 1;
char *result = malloc(result_sz);
if (result == NULL) {
fprintf(stderr, "Allocation error\n");
exit(EXIT_FAILURE);
}
n = snprintf(result, result_sz, "%zu%s", sz, length);
if (n < 0) {
fprintf(stderr, "Error in snprintf() write\n");
exit(EXIT_FAILURE);
}
printf("%s\n", result);
free(result);
return 0;
}
节目输出:
100LEN
答案 3 :(得分:-2)
使用上述代码修复所有其他问题后,使用sprintf()
(或者,如果您有C99编译器,则进行必要的更改snprintf()
)
sprintf(dst, "%d%s", (int)sz, string);
/* make sure dst has enough space */