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++ это намного лучше и безопаснее.