将const char与int一起加入char *

时间:2017-11-10 12:15:15

标签: c char

鉴于此变量:

const char* Filename="file";
int size=100;
int num=300;

我想将它们放在一个char *中,格式为“file_num_size”(在这种情况下为file_300_100),所以c ++中的内容就像这样简单:

std::string newFile =Filename+std::to_string(size)+std::to_string(num);

我怎样才能在var char* newFile; ??

的C中做到这一点

由于

-------------- ---------------- EDIT

感谢所有人,我想不设置var newFile的大小会有点难以实现,所以我将使用sprintf并将大小设置为newfile。再次感谢。

3 个答案:

答案 0 :(得分:4)

大致相同:

const char* Filename="file";
int size = 100;
int num = 300;
char newFile[50];    // buffer for 50 chars
sprintf(newfile, "%s_%d_%d", Filename, num, size);

您需要确保文件名永远不会超过49个字符。

如果文件名长度可能很长,则此变体可能更好:

const char* Filename="very_long_file_name_fooo_bar_evenlonger_abcde_blabla";
int size = 100;
int num = 300;
char *newFile = malloc(strlen(Filename) + 30);  // computing needed length
sprintf(newfile, "%s_%d_%d", Filename, num, size);
...
free(newFile);    // free the buffer, once you're done with it, but only then

+ 30是为_xxx_yyy腾出空间的快捷方式。这里还有改进的余地。

答案 1 :(得分:1)

如果您使用的是C99或更高版本的C编译器,它们支持可变长度数组,我们可以在其中分配可变大小的自动数组(在堆栈上)。

假设sizenum始终是正整数,您可以这样做:

#include <stdio.h>
#include <string.h>

int getSize (int n) {
    int size = 1;
    while (n > 9) {
            n /= 10;
            size++;
    }
    return size;
}

int main()
{
    const char* Filename="file";
    int size = 100;
    int num = 300;

    int total_size = strlen(Filename)+getSize(size)+getSize(num)+1;

    char newFile[total_size]; //Variable length array

    sprintf(newFile, "%s_%d_%d", Filename, num, size);

    printf ("newfile : %s\n", newFile);

    return 0;
}

答案 2 :(得分:0)

在编译时(最快,但无法更改):

#define FILE "file"
#define NUM 300
#define SIZE 100

#define STRINGIFY(x) #x
#define NEWFILE(file, num, size) file "_" STRINGIFY(num) "_" STRINGIFY(size)

...
const char* Filename = FILE;
int num = NUM;
int size = SIZE;
const char* newFile = NEWFILE(FILE, NUM, SIZE); // "file_300_100"

在运行时,缓慢但可读:

sprintf(str, "%s_%d_%d", file, num, size);

(其中str足够大以包含结果 - 必须提前检查)

更快的运行时版本手动执行整数到字符串转换,然后逐步手动构建字符串。