Функция для объединения двух символов * в C ++ - PullRequest
2 голосов
/ 13 декабря 2011

Прежде всего, я программист на C #, поэтому мои рабочие знания C ++ довольно ограничены. Я взял его обратно в колледж, но 10 лет не трогал, поэтому, пожалуйста, прости меня, если это относительно просто.

Я пытаюсь создать DLL, которую можно использовать в C #, которая реализует библиотеку libwpd.

Мне удалось создать DLL, которая экспортирует 2 функции, к которым я могу получить доступ через P / Invoke. Первый возвращает постоянное целое число (генерируется Visual Studio в качестве образца), второй - строку.

Если я возвращаю постоянную строку из функции, она успешно передается в C #, и я могу прочитать ее на другом конце, поэтому я знаю, что данные передаются обратно.

Проблема, с которой я сталкиваюсь, связана с libwpd. Мне пришлось изменить их файл TextDocumentGenerator.cpp, чтобы добавить информацию в char * вместо использования printf, который они используют, чтобы я мог получить к нему доступ позже.

Я добавил определение переменной в публичный раздел заголовочного файла, чтобы я мог прочитать его из вызывающего кода.

Теперь я пытаюсь написать функцию, которая позволяет мне добавлять символ *, заданный libwpd, к внешнему символу *.

Я придумал это:

char* addString(const char* addThis, char* toThis)
{
char* copier  = (char*)malloc(strlen(toThis) + 1 + 1);
strcpy(copier, toThis);
strcpy(copier, "1");

toThis = (char*)malloc(strlen(copier) + 1);
strcpy(toThis, copier);

return copier;
} 

Но когда я передаю информацию обратно, я получаю пустую строку.

Я вызываю функцию, вызывая totalFile = addString("\n", totalFile);

(я понимаю, что технически следует добавлять «1» в строку несколько раз, но это даже не так)

Если я изменю strcpy на strcat для строк копира, он блокируется.

Я не знаю, как создать программу на C ++, поэтому я могу даже просмотреть функции, чтобы увидеть, что происходит.

Любая помощь будет принята.

Ответы [ 4 ]

6 голосов
/ 13 декабря 2011

Знаете ли вы о существовании std::string?Это класс, который обрабатывает строки в C ++;char * является устаревшим из C.

std::string предоставляет + оператор, который делает то, что вы хотите.

2 голосов
/ 13 декабря 2011

Вам необходимо выделить достаточно места для возвращаемой строки, скопировать начальную строку в буфер назначения и затем вызвать strcat для добавления дополнительной информации.

Например:

char* addString(const char* addThis, const char* toThis)
{
    char* destination = (char*)malloc( strlen( addThis ) + strlen( toThis ) + 1 );
    strcpy( destination, toThis );
    strcat( destination, addThis );
    return destination;
} 

Не забывайте, что вам нужно будет вызвать free( destination ) в какой-то момент после вызова этой функции.

РЕДАКТИРОВАТЬ: Конечно, это только я исправляю функцию, предложенную в вашем вопросе.Действительно, не очень хорошая идея возвращать указатель из функции и рассчитывать на вызывающего, чтобы освободить его.Поскольку вы используете C ++, а не C, вам, вероятно, будет гораздо лучше использовать некоторые конструкции C ++, такие как std :: string или, по крайней мере, оборачивая char * в shared_ptr или подобное.

Если вы собираетесь писать на C ++, я бы порекомендовал купить себе хорошую книгу на эту тему, ведь слишком легко выстрелить себе в ногу, если вы не знаете, что вам нужно.делаешь.

1 голос
/ 13 декабря 2011

Поскольку вы заменяете вызов printf(), sprintf(), вероятно, будет самым простым способом создания вашей строки.

0 голосов
/ 13 декабря 2011

Во-первых, Гривес прав. Вы не имеете дела делать то, что делаете, и помечаете этот вопрос как C ++. Причина проста: мы не работаем со строками в C ++.

Поскольку вы программист на C #, вам хорошо известен класс String. Ну, std::string похоже. От работы со струнами уходит вся работа, так что вам не нужно идти по болезненному маршруту, по которому вы идете.

Чтобы объединить две строки в C ++, достаточно просто:

std::string a = "I slept with ";
std::string b = "a heavy heart.";
std::string c = a + b;

Вуаля.

...