结合字符数组&一个const char指针指向C中的单个const char *

时间:2017-09-14 09:39:40

标签: c arrays pointers char

我有以下代码,在哪里。

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;


}

2 个答案:

答案 0 :(得分:1)

您可以使用mallocstrcpystrcat

类似的东西:

#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后释放内存。如果你将它传递出函数并在那里使用它,那么当你完成它之后你需要在函数之外释放它。