Получать часть массива 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_);
    }
};