我有以下代码,在哪里。
s [] - 生成一个char数组和
longStr - 是一个cons char *。 我想将这两个组合成一个单独的char *,这样首先应该添加s,然后是longStr。 如下所示:
const char* combinedStr = ADD s[] and then longStr;
longStr的大小可以不断变化。因此,静态分配combinedStr不会很好地利用内存。 有没有一种方法可以动态地动态,而无需为combinedStr静态分配大小(也不使用VLA)。
代码
void concatenate(const char* longStr)
{
time_t t = time(NULL);
struct tm timeinfo;
localtime_s(&timeinfo, &t);
char s[100];
strftime(s, sizeof(s), "%c", &timeinfo);
//NOW I WANT TO Combine "s[]" & longStr in such a way that s should be added 1st followed by longStr.
const char* combinedStr = ADD s[] and then longStr;
}
答案 0 :(得分:1)
您可以使用malloc
,strcpy
和strcat
类似的东西:
#include <stdio.h>
#include <time.h>
void concatenate(const char* longStr)
{
time_t t = time(NULL);
struct tm timeinfo;
localtime_r(&t, &timeinfo);
char s[100];
strftime(s, sizeof(s), "%c", &timeinfo);
// Allocate memory and put the string together
const char* p = malloc(strlen(s) + strlen(longStr) + 1); // note: Add 1 for the string termination
strcpy(p, s);
strcat(p, longStr);
printf("%s\n", p);
free(p);
}
int main(void) {
char* p = "Hello world";
concatenate(p);
return 0;
}
答案 1 :(得分:0)
strcpy和strcat,如4386427的回答中所述。你必须小心缓冲区溢出(如答案中所示)。
其他选项是sprintf和(如果不是使用太旧的编译器)snprintf。
void concatenate(const char* longStr)
{
time_t t = time(NULL);
struct tm timeinfo;
localtime_s(&timeinfo, &t);
char s[100];
strftime(s, sizeof(s), "%c", &timeinfo);
//NOW I WANT TO Combine "s[]" & longStr in such a way that s should be added 1st followed by longStr.
// calculate the size:
// either this:
int buflen = snprintf(NULL, 0, "%s%s",s, longstr) + 1;
// or this:
int buflen = strlen(s) + strlen(longstr) + 1;
// allocate:
const char* combinedStr = malloc(buflen);
// then either this:
snprintf(combinedStr, buflen, "%s%s", s, longstr);
// or this:
sprintf(combinedStr, "%s%s", s, longstr);
// do what you need to with combinedStr
free(combinedStr);
}
记得在完成combinedStr后释放内存。如果你将它传递出函数并在那里使用它,那么当你完成它之后你需要在函数之外释放它。