Как объединить константные строки char * в c ++ без вызовов функций? - PullRequest
3 голосов
/ 12 декабря 2011

Ps: это скорее концептуальный вопрос.

Я знаю, что это усложняет ситуацию без веской причины, но вот что мне интересно. Если я не ошибаюсь, const char* "like this" в c ++ указывает на l и будет автоматически обнуляться во время компиляции. Я считаю, что она создает временную переменную const char* для ее хранения, если она не отслеживает смещение с помощью байтовой переменной (я не проверял разборку). Мой вопрос: как бы вы, если возможно, добавили символы в эту строку, не вызывая функции или создавая строки?

Пример (Это неправильно, просто чтобы вы могли визуализировать, что я имел в виду):

"Like thi" + 's';

Самое близкое, что я придумал, это сохранить его в const char* с достаточным количеством пробелов и изменить другие символы.

Пример:

char str[9];
strcpy(str, "Like thi")
str[8] = 's';

Пояснение: Голосование вниз: этот вопрос не требует каких-либо исследований; неясно или бесполезно

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

Мой вопрос был больше, чтобы я мог лучше понять, что происходит, когда вы просто создаете строку "like this" без сохранения адреса этой строки в const char* Я также хотел знать, возможно ли объединение / изменить содержимое этой строки без использования таких функций, как strcat() и без использования перегруженного оператора + из строки класса. Я знаю, что это не совсем полезно для работы со строками в C ++, но мне было любопытно, был ли способ кроме стандартных способов сделать это.

string example = "Like thi" + "s"; //I'm aware of the string class and its member functions
const char* example2 = "Like this"; //I'm also aware of C-type Strings (CString as well)

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

Ответы [ 2 ]

3 голосов
/ 12 декабря 2011

Вместо использования простой строки символов следует использовать библиотеку строк, предоставляемую библиотекой C ++:

#include <string>
#include <iostream>
using namespace std;

int main()
{
    string str = "Like thi";
    cout << str << endl;

    str = str + "s";
    cout << str << endl;
    return 0;
}

Обычно невозможно просто объединить простые char * строки в C или C ++, потому что они являются просто указателями на массивы символов. Почти нет причин, по которым вам следует использовать пустой массив символов в C ++, если вы собираетесь выполнять какие-либо манипуляции со строками в своем собственном коде.

Даже если вам нужен доступ к представлению C (например, для внешней библиотеки), вы можете использовать string::c_str().

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

Во-первых, ничто null не завершено, но ноль завершен. Все строки char * в C заканчиваются на '\0'.

Когда вы в коде делаете что-то вроде этого:

char *name="Daniel";

компилятор сгенерирует строку с содержимым:

Daniel\0

и инициализирует указатель name для указания на него в определенное время во время выполнения программы в зависимости от контекста переменной (member, static, ...).

Добавление НИЧЕГО к name не будет работать так, как вы ожидаете, так как память, на которую указывает name, не изменяется, и вы, вероятно, получите либо ошибку нарушения доступа, либо перезапишете что-то другое.

Наличие

const char* copyOfTheName = name;

не создаст копию рассматриваемой строки, он будет иметь только copyOfTheName, указывающий на исходную строку, поэтому

copyOfTheName[6]='A';

будет в точности как

name[6]='A';

и доставит вам только проблемы.

Вместо этого используйте std::strcat. И, пожалуйста, поинтересуйтесь, как работают basic string string в C.

...