Не работает создание переменной с помощью malloc

Я хочу создать программу с C++ и этот логин на моем сервере FTP и происходит, если в папке сервера есть новый файл.

Мой друг уже создал эту программу, она функционирует (работает) и передает ее мне.

Внутри программы мы используем библиотеку и инструменты CURL для входа на FTP.

На моем компьютере эта программа не работает с использованием DEV C++. Затем я создаю новый проект, переписываю весь код старой программы, загружаю библиотеку CURL и компилирую.

Программа получает проблемы с выполнением.

Проанализируйте программу, есть ли аномалия с MALLOC.

Это код, где есть аномалия:

 char* userpwd = (char*)malloc(strlen(USERNAME)+1+strlen(PASSWORD));
 printf("\n malloc %s",userpwd);
          strcat(userpwd, (const char*)USERNAME);
          strcat(userpwd, ":");
          strcat(userpwd, (const char*)PASSWORD);
 printf("\n not %s",userpwd);

Объясните, как работает эта функция: во-первых, мне нужно построить переменную, содержащую «USERNAME:PASSWORD». Проблема после char* userpwd = (char*)malloc(strlen(USERNAME)+1+strlen(PASSWORD)); Потому что, когда я печатаю значение userpwd, у меня есть - или другие символы перед строкой. Тогда обычно логин неверен или отклонен.

Это изображение: введите здесь описание изображения

Для работы без проблем я могу изменить код:

char userpwd[50];
              userpwd="USERNAME";
              strcat(userpwd, ":");
              strcat(userpwd, "PASSWORD");
     printf("\n not %s",userpwd);

И эта функция.

Но программа прочитала файл configuration.txt для получения URL, ИМЯ ПОЛЬЗОВАТЕЛЯ и ПАРОЛЬ. Тогда удобно пользоваться malloc но у меня на компе и на сестре аномалия символов.

Как я могу предотвратить эти аномалии? Почему у меня эти странные символы? Спасибо за любую возможную помощь.

P.S: я удаляю строку USERNAME и PASSWORD с белым цветом для защиты моей учетной записи.


person Mirko Cianfarani    schedule 28.04.2014    source источник
comment
тебе нужен memset после malloc   -  person Sakthi Kumar    schedule 28.04.2014
comment
Почему вы вообще возитесь с низкоуровневой памятью? Просто используйте std::string для своих строк, и у вас будет гораздо меньше проблем.   -  person Mike Seymour    schedule 28.04.2014
comment
Я знаю это, но с помощью указателей программа будет легче и быстрее. @MikeSeymour Пожалуйста, как использовать memset после malloc? Шакти Кумар   -  person Mirko Cianfarani    schedule 28.04.2014
comment
Код, который вы говорите, не имеет проблем, даже не будет компилироваться.   -  person molbdnilo    schedule 28.04.2014
comment
@MirkoCianfarani легче и быстрее? 1: Нет, не будет. 2: Сколько раз в секунду вы планируете входить в систему?   -  person molbdnilo    schedule 28.04.2014
comment
Я думаю бесконечно, потому что это проект видеонаблюдения. Он должен подать сигнал тревоги, как только он получит файл перемещения на сервере папки. (Есть веб-камера, которая загружает папку с видеофайлами на сервер)   -  person Mirko Cianfarani    schedule 28.04.2014
comment
Бесконечное количество раз в секунду? Впечатляющий!   -  person Lightness Races in Orbit    schedule 28.04.2014
comment
Честно говоря, это полное заблуждение, что добавление ошибок с malloc и C-строками сделает вашу программу легче и быстрее. Это просто неправда. Все, что он делает, — это замедляет ваше развитие.   -  person Lightness Races in Orbit    schedule 28.04.2014
comment
Возможно (но маловероятно) сокращение на пару наносекунд конкатенации строк не повлияет на время, необходимое для входа на ftp-сайт, таким образом, чтобы его можно было осмысленно измерить. Помните, что легче и быстрее — это аргумент, который в конечном итоге сделал Heartbleed настолько серьезным — это потенциально пагубная привычка, особенно когда вы отправляете биты по кабелю.   -  person molbdnilo    schedule 28.04.2014


Ответы (1)


Вы забыли добавить 1 для завершающего нуля.
Вы также забыли завершить строку нулем, прежде чем strcat на нее.
Это приводит к неопределенному поведению.

char* userpwd = (char*)malloc(strlen(USERNAME) + 1 + strlen(PASSWORD) + 1);
userpwd[0] = 0;

Или (лучше) используйте идиоматический С++:

std::string USERNAME;
std::string PASSWORD;
// Load username and password...

std::string pass = USERNAME + ":" + PASSWORD;

и передайте pass.c_str() функции входа

person molbdnilo    schedule 28.04.2014
comment
Через час я меняю код, чтобы попробовать его ответ. Теперь пришло время обеда. - person Mirko Cianfarani; 28.04.2014
comment
Но я не понимаю, в чем причины странных символов malloc. - person Mirko Cianfarani; 28.04.2014
comment
Ок, через час переоденусь. - person Mirko Cianfarani; 28.04.2014
comment
Спасибо. Эта функция также без финала +1 на char* userpwd = (char*)malloc(strlen(USERNAME) + 1 + strlen(PASSWORD)°);. Но теперь у меня есть этот финал +1. - person Mirko Cianfarani; 28.04.2014
comment
@MirkoCianfarani Нет, без +1 не работает - он не определен. Вы можете не видеть каких-либо проблем прямо сейчас, но это недействительная программа, и что угодно может произойти в любое время, если вы запустите ее. - person molbdnilo; 28.04.2014