C++ strcat игнорирует аргумент?

Новичок здесь. Я пытаюсь объединить аргументы программы на C++ в один массив символов. По какой-то причине strcat выборочно игнорирует argv[2] в цикле:

#include <cstring>

int main(int argc, char *argv[]) {

    char *argstr = argv[1];

    for(int i=2; i < argc; i++) {
        argstr = std::strcat(argstr, " ");
        argstr = std::strcat(argstr, argv[i]);
    }

    std::cout << argstr << std::endl;

    return 0;
}

Файл называется qtimer, Итак, ожидаемый результат работы:

qtimer asdf 1 2 3

было бы:

asdf 1 2 3

но вместо этого он выводит:

asdf 2 3 (с двумя пробелами после asdf)

Кто-нибудь может объяснить, почему это так? Кроме того, есть ли лучший способ сделать это?

1 ответ

Решение

Вы добавляете к строке, хранящейся в argv[1], но вы не знаете, что там есть место. Вы перезаписываете память, которая не принадлежит вам.

Это неопределенное поведение, и все может случиться.

Скорее всего, память, которую вы перезаписываете, - это память, в которой хранятся другие аргументы, так что к тому времени, когда вы обращаетесь к ним, они уже повреждены.

Вы должны использовать std::string для строковых операций в C++ это намного лучше и безопаснее.

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