在C中连接size_t和char *

时间:2017-04-16 08:23:42

标签: c

size_t sz = 100;
char* length[3] = "LEN";

如何连接size_t和char *?

我想要的结果就像是

char* length = "100LEN"

不只是打印出“100LEN”。

4 个答案:

答案 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 */