鉴于此变量:
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;
??
由于
-------------- ---------------- EDIT
感谢所有人,我想不设置var newFile
的大小会有点难以实现,所以我将使用sprintf并将大小设置为newfile。再次感谢。
答案 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编译器,它们支持可变长度数组,我们可以在其中分配可变大小的自动数组(在堆栈上)。
假设size
和num
始终是正整数,您可以这样做:
#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
足够大以包含结果 - 必须提前检查)
更快的运行时版本手动执行整数到字符串转换,然后逐步手动构建字符串。