Лучший подход для копирования части массива char, чем strncpy
Я использовал std::strncpy
в C++98 скопировать часть массива char в другой массив char. Похоже, для этого нужно вручную добавить конечный символ '\0'
, чтобы правильно завершить строку.
Как показано ниже, если явно не добавляется '\0'
в num1
, массив char может содержать другие символы в более поздней части.
char buffer[] = "tag1=123456789!!!tag2=111222333!!!10=240";
char num1[10];
std::strncpy(num1, buffer+5, 9);
num1[9] = '\0';
Есть ли лучший подход, чем этот? Я хотел бы сделать одношаговую операцию для достижения этой цели.
1 ответ
Да, работа со "строками" в C была довольно многословной, не так ли?
К счастью, C++ не так ограничен:
const char* in = "tag1=123456789!!!tag2=111222333!!!10=240";
std::string num1{in+5, in+15};
Если вы не можете использовать std::string
или не хотите, а затем просто включите описанную логику в функцию и вызовите эту функцию.
Как показано ниже, если явно не добавлять '\0' к num1, массив char может содержать другие символы в более поздней части.
Не совсем правильно. Здесь нет "поздней порции". "Поздняя часть", о которой вы думали, что вы наблюдали, была другими частями памяти, которые вы не имели права просматривать. Из-за того, что не удалось завершить нулевую C-строку, ваша программа имеет неопределенное поведение, и компьютер мог сделать что-нибудь, например, путешествовать во времени и убить мою прапрабабушку. Большое спасибо, приятель!
Стоит отметить, что, поскольку это функции библиотеки C, обеспечивающие доступ к памяти за пределами допустимого диапазона, если вы не использовали эти функции библиотеки таким образом, вам не нужно завершать нулем num1
, Это требуется только в том случае, если позднее вы захотите рассматривать ее как строку в стиле C. Если вы просто считаете, что это массив из 10 байтов, то все в порядке.