При обновлении до Xcode 7.1 вы можете увидеть этот тип ошибки, и он не может быть разрешен ни одним из приведенных выше ответов. Одним из симптомов в моем случае было то, что приложение работает на устройстве не в симуляторе. Вероятно, вы увидите огромное количество ошибок, связанных со значительной частью всех используемых вами фреймворков.
Исправление на самом деле довольно простое. Вам просто нужно удалить запись из параметра «Пути поиска в Ракурсе», найденного в разделе TARGETS> Build Settings> Search Paths (убедитесь, что выбрана вкладка «Все»)
Если вы видите другую запись (помимо $ (унаследованной)) для своей основной цели или вашей целевой цели, просто удалите неисправный путь из всех целей и перестройте.
мы были в состоянии создать литерал 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";
}
, проблема 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 решений.
Я понятия не имею , почему Вы хотели бы сделать такую вещь, но попробовать это:
std::string my_string("a\0b", 3);
Следующее будет работать...
std::string s;
s.push_back('a');
s.push_back('\0');
s.push_back('b');
Лучше использовать станд.:: vector< char> если этот вопрос не только в образовательных целях.
Почти все реализации станд.:: строки завершаются пустым указателем, таким образом, Вы, вероятно, не должны делать этого. Обратите внимание, что "a\0b" является на самом деле четырьмя символами долго из-за автоматического пустого разделителя (a, пустой указатель, b, пустой указатель). Если Вы действительно хотите сделать это и станд. повреждения:: контракт строки, можно сделать:
std::string s("aab");
s.at(1) = '\0';
, но если Вы делаете, все Ваши друзья будут смеяться над Вами, Вы никогда не будете находить истинное счастье.
Если Вы делаете, управление как Вы было бы со строкой 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';
Естественно, однако, Вы страдаете от тех же проблем как струны до. Можно забыть пустой терминал или записать мимо выделенного места.
Я знаю, что это долгое время, этот вопрос задан. Но для всех, кто имеет аналогичную проблему, может заинтересовать следующий код.
CComBSTR(20,"mystring1\0mystring2\0")