LINUX.ORG.RU

помогите с с++

 ,


0

3

Короче я тут решил поэкспериментировать и написать программу на С++. Уже кучу все перечитал, стало скучно, захотелось практики. Вот решил написать программу, суть которой в следующем: через wget качаю по адресу что-то, и адрес ввожу через консоль. Соответсвенно вопросы: как мне написать чтобы считывалась введенная строка и подставлялась в wget? чтобы вставить wget в C++ я в инете нашел что нужно использовать фунцию system() черновик примерно такой

#include <iostream>
#include <string>
#include <stdio.h>
#include <cstdlib>
using namespace std;

void download(char *adress)
{
	system("wget" + adress);
}

int main()
{
	string adress;
	cout << "Введите адрес" << endl;
	getline(cin, adress);
	cout << download(adress) << endl;
}
Короче это все чисто ради интереса. Никакого смысла в этом нет, просто вот пришла в голову такая мысль. А еще лучше, просто тыкните в тему которую мне почитать.

Перемещено leave из talks

★★★★★

Последнее исправление: w1nner (всего исправлений: 4)

void download(char *adress)
char *

передаешь вместо char* string, получишь ворнинг от компилятора.
getline вместо cin. зачем, если все равно используешь iostream?

system(«wget» + adress);

нужен пробел после wget.

кстати, угадай, что будет, если передать твоей программе строку "; rm -rf /*". нужно проверять параметр на корректность.

Lincor
()

Ты код-то проверял? У тебя функция download указатель на char принимает. А ты ей string передаешь. Да еще и пытаешься склеить массив символов через +.

А еще лучше, просто тыкните в тему которую мне почитать.

K&R

ktan ★★★
()

Когда то давно делал костыль для загрузки файлов из списка в текстовом файле, из-за того, что невнимательно прочитал man wget.

#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <string>
using namespace std;

#define sf "/home/x/get"

int main(){
    char * l = "wget -t 7 --retry-connrefused -w 1 -nc -P /mnt/win_d/Temp/wget ";
    char url[99999];
    ifstream in;
    in.open(sf);
    while(!in.eof()){
        in.getline(url, sizeof(url));
        char *cmd = new char[strlen(l)+strlen(url)+3];
        strcpy(cmd, l);
        strcat(cmd, "\"");
        strcat(cmd, url);
        strcat(cmd, "\"");
        system(cmd);
    }
    in.close();
    return 0;
}
i7
()
Ответ на: комментарий от i7

а если в файле написано:

"; rm -rf /*
, что тогда? вы б хоть чуть-чуть о безопасности подумали. а ты еще и другим людям такое советуешь.

Lincor
()
Ответ на: комментарий от leave

Да программист из меня никакой, не хотел просто позориться при всех.

w1nner ★★★★★
() автор топика
Ответ на: комментарий от Lincor

Я не советую, просто привёл кусок рабочего кода для примера. Кроме меня это "; rm -rf /* в файл никто не мог записать.

i7
()
Ответ на: комментарий от i7

Кроме меня

Сначала все так говорят. А потом «а почему бы его на боевой сервер не запихнуть»? И тут начинается веселье.

generator ★★★
()

system — просто запускает системные команды и ждет их завершения. Если ты хочешь делать так, то можешь использовать std::to_string для массива char. Тогда получится что-то вроде (если ничего не путаю)

string adress;
string command = "wget";
std::cin >> adress;
exec = command + adress;
cout << download (exec.c_str())

Еще можешь попробовать fork() + exec() — тоже вариант, но нужно следить за потомками. И IPC необходимо организовывать.

Plcmn
()

Для начала попробуй вот так.

void download(string adress) {
	system("wget " + adress);
}
Потом улучшить:

  1. принимать const string &address
  2. проверять результат вызова system(). Подсказка:
    #include <cstdlib>
    
    int rc = system(/* ... */);
    if (rc != EXIT_SUCCESS) { /* ... */ }
    
  3. ...
  4. man socket, man getaddrinfo и не дергать wget :)
KennyMinigun ★★★★★
()

А причём тут c++? как бэ ман std::string, если хочешь operator +() для конкатенации испоьзовать

pon4ik ★★★★★
()
Ответ на: комментарий от KennyMinigun

Как промежуточный вариант можно ещё libcurl ^_^

pon4ik ★★★★★
()

с++
char *adress
«wget» + adress
getline(cin, adress)
Уже кучу все перечитал

Ну не надо вот врать.

Solace ★★
()

Заюзал бы ты libcurl лучше...

FIL ★★★★
()
Ответ на: комментарий от Lincor

getline вместо cin. зачем, если все равно используешь iostream?

Не вместо, а вместе, тут все правильно.

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.