2017-09-14 4 views
-2

J'ai le code suivant, où.Combinaison d'un tableau de caractères et d'un pointeur const char en un seul caractère const * dans C

s [] - génère un tableau de caractères et

LongStr - est un contre char *. Je veux combiner ces 2 en un seul const char * tel que s devrait être ajouté en premier suivi de longStr. quelque chose comme ci-dessous:

const char* combinedStr = ADD s[] and then longStr; 

La taille de LongStr peut continuer à changer. Par conséquent, allouer statiquement le combinedStr ne serait pas une bonne utilisation de la mémoire. Y a-t-il un moyen de le faire dynamiquement sans allouer la taille statiquement pour le combinéStr (également sans utiliser VLA).

code

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

'strcat()' ou 'snprintf()' est votre ami. méfiez-vous du 'const', cependant. –

+0

'strcat'? [Vous avez besoin d'un bon livre C] (https://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list) – StoryTeller

+0

Ne décrivez pas votre code, mais montrez-le. –

Répondre

1

Vous pouvez utiliser malloc, strcpy et strcat

Quelque chose comme:

#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; 
} 
+0

Obtention d'une exception non gérée. Lecture d'une erreur de localisation en faisant strcpy – codeLover

+0

@codeLover - J'ai corrigé l'appel à 'localtime_r' pour que vous puissiez réessayer – 4386427

0

strcpy et strcat, comme mentionné dans la réponse de 4.386.427. Vous devez faire attention aux débordements de tampon (comme dans cette réponse).

Les autres options sont sprintf et (si vous n'utilisez pas un ancien compilateur) 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); 

} 

N'oubliez pas de libérer de la mémoire lorsque vous avez terminé avec combinedStr. Si vous le passez hors de la fonction et que vous l'utilisez, vous devez le libérer en dehors de la fonction, lorsque vous en avez fini avec elle.