Получать часть массива char
Я чувствую, что это действительно глупый вопрос, но я не могу найти ответ нигде!
можно ли получить группу символов из символьного массива? чтобы сбросить какой-то псевдокод:
char arry[20] = "hello world!";
char part[10] = arry[0-4];
printf(part);
выход:
hello
итак, могу ли я получить сегмент символов из массива, подобного этому, без цикла и получения их char-by-char или преобразования в строки, чтобы я мог использовать substr()?
4 ответов
короче, нет. "Строки" в стиле C просто не работают таким образом. Вам придется либо использовать ручной цикл, либо strncpy()
, или сделать это с помощью C++ std::string
функциональность. Учитывая, что вы находитесь в C++, вы также можете делать все со строками c++!
к
как это происходит, для вашего конкретного примера приложения, вы можете достичь этого просто по возможности printf()
:
printf("%.5s\n", arry);
вы могли бы использовать memcpy
(или strncpy
) получить подстроку:
memcpy(part, arry + 5 /* Offset */, 3 /* Length */);
part[3] = 0; /* Add terminator */
в другом аспекте вашего кода обратите внимание, что doing printf(str)
может привести к уязвимости строки формата, если str
содержит ненадежные входные данные.
Как сказал Оли, вам нужно будет использовать c++ std::string
функциональность. В вашем примере:
std::string hello("Hello World!");
std::string part(hello.substr(0, 5)); // note it's <start>, <length>, so not '0-4'
std::cout << part;
Ну, вы упоминаете два очевидных подхода. Единственное, что я могу придумать, это определить свой собственный тип подстроки для работы с массивами символов:
struct SubArray
{
SubArray(const char* a, unsigned s, unsigned e)
:arrayOwnedElseWhere_(a),
start_(s),
end_(e)
{}
const char* arrayOwnedElseWhere_;
unsigned start_;
unsigned end_;
void print()
{
printf_s("%.*s\n", end_ - start_ + 1, arrayOwnedElseWhere_ + start_);
}
};