2010-11-22 5 views
1

Salut à tous, Ma question est, comment puis-je ajouter deux chaînes de style C en un seul? Étant donné la façon de faire des choses en C++ (std :: string), je n'ai jamais touché aux chaînes de style C et j'ai besoin d'en apprendre plus à leur sujet pour mon projet de développement actuel. Par exemple:Manipulation de chaînes de style C?

char[] filename = "picture.png"; 
char[] directory = "/rd/"; 
//how would I "add" together directory and filename into one char[]? 

Merci d'avance.

+1

Pourquoi ne pas simplement les ajouter en tant que std :: strings et utiliser c_str() ou & string [0] pour convertir en chaîne C? – Puppy

+0

Je ne peux pas parce que je compile pour Dreamcast, et la bibliothèque de chaînes n'a pas été porté. – epicasian

+0

Notez que les littéraux de chaîne sont de type 'const char *' et non 'char *' et le code affiché ne compilera que sur les compilateurs non conformes. – pmr

Répondre

0
 
#include <stdlib.h> 
#include <string.h> 

// ... 

char * fullpath; 

fullpath = malloc(strlen(directory)+strlen(filename)+1); 
if (fullpath == NULL) 
{ 
    // memory allocation failure 
} 
strcpy(fullpath, directory); 
strcat(fullpath, filename); 
0

Vous avez besoin d'un tampon assez grand, que, en supposant que vous n'avez pas filename « s et directory » s taille à portée de main au moment de la compilation, vous devez obtenir à Exécuter- temps, comme si

char *buf = (char *) malloc (strlen (filename) + strlen (directory) + 1); 
if (!buf) { /* no memory, typically */ } 
strcpy (buf, filename); 
strcat (buf, directory); 
0

Gardez à l'esprit que vous travaillez un niveau plus bas, et il ne va pas allouer de la mémoire pour vous automatiquement. Vous devez allouer suffisamment de mémoire pour contenir les deux chaînes plus un terminateur null, puis les copier en place.

0

Assurez-vous de déclarer/allouer un tableau char assez grand pour contenir à la fois filename et directory. Ensuite, utilisez strcat() (ou strncat()) comme xxpor suggéré.

0

Vous devez penser comment votre "chaîne" est réellement représentée en mémoire. En C, les chaînes sont des tampons de la mémoire allouée terminée par un 0 octet.

filename |p|i|c|t|u|r|e|0| 
directory |/|r|d|/|0| 

Qu'est-ce que vous avez besoin est un nouvel espace de mémoire pour copier le contenu de la mémoire des deux chaînes en même temps et le dernier octet 0.

path  |p|i|c|t|u|r|e|/|r|d|/|0| 

Ce qui donne ce code:

int lenFilename = strlen(filename); // 7 
int lenDirectory = strlen(directory); // 4 
int lenPath = lenFilename + lenDirectory; // 11 I can count 
char* path = malloc(lenPath + 1); 
memcpy(path, filename, lenFilename); 
memcpy(path + lenFilename, directory, lenDirectory); 
path[lenPath] = 0; // Never EVER forget the terminating 0 ! 

... 

free(path); // You should not forget to free allocated memory when you are done 

(Il peut y avoir une erreur off-by-1 dans ce code, il ne fait tester ... Il est 01h00 et je allez dormir!)