Манипулирование строками в стиле C? - PullRequest
1 голос
/ 23 ноября 2010

Привет всем, Мой вопрос: как мне добавить две строки в стиле C в одну?

Будучи укоренившимся в способе выполнения C ++ (std :: string), я никогда не касался строк в стиле C и мне нужно больше узнать о них для моего текущего проекта разработки. Например:

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

Заранее спасибо.

Ответы [ 6 ]

3 голосов
/ 23 ноября 2010

Использование strcat().

См. Здесь: http://www.cplusplus.com/reference/clibrary/cstring/strcat/

0 голосов
/ 23 ноября 2010

Вы должны подумать, как ваша «строка» на самом деле представлена ​​в памяти.В C строки - это буферы выделенной памяти, оканчивающиеся байтом 0.

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

Требуется новое пространство памяти для копирования содержимого памяти обеих строк вместе и последнего 0 байтов.

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

Что дает этот код:

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

(В этом коде может быть ошибка off-by-1, фактически она не проверена ... Сейчас 01:00 и янадо идти спать!)

0 голосов
/ 23 ноября 2010

Обязательно объявите / выделите массив char, достаточно большой, чтобы вместить filename и directory.Затем используйте strcat() (или strncat()), как предложено xxpor.

0 голосов
/ 23 ноября 2010

Имейте в виду, что вы работаете на более низком уровне, и он не будет выделять вам память автоматически. Вы должны выделить достаточно памяти для хранения двух строк плюс нулевого терминатора, а затем скопировать их на место.

0 голосов
/ 23 ноября 2010

Вам нужен достаточно большой буфер, чтобы при условии, что у вас нет размера filename и directory во время компиляции, вы должны получить во время выполнения, например1004 *

0 голосов
/ 23 ноября 2010
#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);
...