Как делают Вы создаете станд.:: строка со встроенным пустым указателем?

При обновлении до Xcode 7.1 вы можете увидеть этот тип ошибки, и он не может быть разрешен ни одним из приведенных выше ответов. Одним из симптомов в моем случае было то, что приложение работает на устройстве не в симуляторе. Вероятно, вы увидите огромное количество ошибок, связанных со значительной частью всех используемых вами фреймворков.

Исправление на самом деле довольно простое. Вам просто нужно удалить запись из параметра «Пути поиска в Ракурсе», найденного в разделе TARGETS> Build Settings> Search Paths (убедитесь, что выбрана вкладка «Все»)

Если вы видите другую запись (помимо $ (унаследованной)) для своей основной цели или вашей целевой цели, просто удалите неисправный путь из всех целей и перестройте.

82
задан 0x499602D2 24 October 2013 в 20:56
поделиться

7 ответов

Начиная с C++ 14

мы были в состоянии создать литерал std::string

#include <iostream>
#include <string>

int main()
{
    using namespace std::string_literals;

    std::string s = "pl-\0-op"s;    // <- Notice the "s" at the end
                                    // This is a std::string literal not
                                    // a C-String literal.
    std::cout << s << "\n";
}

Перед C++ 14

, проблема std::string конструктор, который берет const char*, предполагает, что вход является струной до. Струны до \0 завершены и таким образом анализирующие остановки, когда это достигает \0 символ.

Для компенсации этого необходимо использовать конструктора, который создает строку из массива символов (не струна до). Это берет два параметра - указатель на массив и длину:

std::string   x("pq\0rs");   // Two characters because input assumed to be C-String
std::string   x("pq\0rs",5); // 5 Characters as the input is now a char array with 5 characters.

Примечание: C++ std::string НЕ \0 - завершен (как предложено в других сообщениях). Однако можно извлечь указатель на внутренний буфер, который содержит струну до с методом c_str().

Также выезд ответ T Doug ниже об использовании vector<char>.

Также выезд RiaD для C++ 14 решений.

123
ответ дан Martin York 24 November 2019 в 09:11
поделиться

Я понятия не имею , почему Вы хотели бы сделать такую вещь, но попробовать это:

std::string my_string("a\0b", 3);
13
ответ дан 17 of 26 24 November 2019 в 09:11
поделиться

Следующее будет работать...

std::string s;
s.push_back('a');
s.push_back('\0');
s.push_back('b');
8
ответ дан Andrew Stein 24 November 2019 в 09:11
поделиться

Лучше использовать станд.:: vector< char> если этот вопрос не только в образовательных целях.

1
ответ дан Harold Ekstrom 24 November 2019 в 09:11
поделиться

Почти все реализации станд.:: строки завершаются пустым указателем, таким образом, Вы, вероятно, не должны делать этого. Обратите внимание, что "a\0b" является на самом деле четырьмя символами долго из-за автоматического пустого разделителя (a, пустой указатель, b, пустой указатель). Если Вы действительно хотите сделать это и станд. повреждения:: контракт строки, можно сделать:

std::string s("aab");
s.at(1) = '\0';

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

-7
ответ дан Martin York 24 November 2019 в 09:11
поделиться

Если Вы делаете, управление как Вы было бы со строкой c-стиля (массив символов) рассматривают использование

std::vector<char>

У Вас есть больше свободы рассматривать его как массив таким же образом, Вы рассматривали бы струну до. Можно использовать копию () для копирования в строку:

std::vector<char> vec(100)
strncpy(&vec[0], "blah blah blah", 100);
std::string vecAsStr( vec.begin(), vec.end());

и можно использовать его во многих из тех же мест, можно использовать струны до

printf("%s" &vec[0])
vec[10] = '\0';
vec[11] = 'b';

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

22
ответ дан Doug T. 24 November 2019 в 09:11
поделиться

Я знаю, что это долгое время, этот вопрос задан. Но для всех, кто имеет аналогичную проблему, может заинтересовать следующий код.

CComBSTR(20,"mystring1\0mystring2\0")
-4
ответ дан 24 November 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: