Лучший подход для копирования части массива 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 байтов, то все в порядке.

Другие вопросы по тегам