NULL равно 0. Указатель со значением 0 имеет значение. Но символ со значением 0 имеет другое значение . Он используется в качестве разделителя, чтобы показать конец строки. Поэтому, если вы используете std::vector<char>
и push_back
0, вектор будет содержать символ со значением 0. vector<char>
- это вектор символов, а std::vector<char*>
- это вектор строк в стиле C - очень разные вещи ,
Обновление. Как хочет ОП, я даю представление о том, как хранить (в векторе) строки с нулевым символом в конце, некоторые из которых являются нулевыми.
Вариант 1 : Предположим, у нас есть vector<char> c_strings;
. Затем мы определяем функцию для хранения строки pi. Введена большая сложность, поскольку мы должны различать пустую строку и нулевой символ *. Мы выбираем символ-разделитель, который не встречается в нашем использовании. Предположим, это символ «~».
char delimiter = '~';
// push each character in pi into c_strings
void push_into_vec(vector<char>& c_strings, char* pi) {
if(pi != 0) {
for(char* p=pi; *p!='\0'; p++)
c_strings.push_back(*p);
// also add a NUL character to denote end-of-string
c_strings.push_back('\0');
}
c_strings.push_back(deimiter);
// Note that a NULL pointer would be stored as a single '~' character
// while an empty string would be stored as '\0~'.
}
// now a method to retrieve each of the stored strings.
vector<char*> get_stored_strings(const vector<char>& c_strings) {
vector<char*> r;
char* end = &c_strings[0] + c_strings.size();
char* current = 0;
bool nullstring = true;
for(char* c = current = &c_strings[0]; c != end+1; c++) {
if(*c == '\0') {
int size = c - current - 1;
char* nc = new char[size+1];
strncpy(nc, current, size);
r.push_back(nc);
nullstring = false;
}
if(*c == delimiter) {
if(nullstring) r.push_back(0);
nullstring = true; // reset nullstring for the next string
current = c+1; // set the next string
}
}
return r;
}
Вам все еще нужно вызвать delete[]
в памяти, выделенной на new[]
выше. Все эти сложности решаются с помощью класса string
. Я очень редко использую char*
в C ++.
Вариант 2: Вы можете использовать vector<boost::optional<char> >
. Тогда '~' может быть заменено пустым boost :: option, но другие другие части такие же, как и в варианте 1. Но использование памяти в этом случае будет выше.