2016-02-11 2 views
0

Это my question yesterday.Как добавить целое число в строку?

Я использую функцию для загрузки файла:

void downloadFile(const char* url, const char* fname, const char* id) { 
    //.. 
} 

Это называется как:

DownloadFile ("http://servera.com/file.txt", "/user/tmp/file.txt", «/ главная/пользователя/Скачать/хххх ");

Это прекрасно работает с фиксированным id, как показано на рисунке, но мне нужно xxxx, чтобы заменить со случайным числом:

srand(time(NULL)); 
int rdn = rand(); 

Если я стараюсь:

downloadFile("http://servera.com/file.txt", "/user/tmp/file.txt", "/home/user/Download/" + rdn); 

я получаю

error: invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]

Итак, как добавить rdn в строку "/home/user/Download/"? Например, если rdm == 123456789, я хотел бы передать функцию "/home/user/Download/123456789".

+4

Существует 'sprintf' но ** пожалуйста ** использовать' станд :: string'/'станд :: to_string'. – leemes

+0

Что именно вы надеетесь достичь с помощью ''/home/user/Download/"+ rdn' ??? –

+3

Я очень озадачен нисходящим и закрытым голосованием в частности. Для меня это, кажется, программист, который исходит из фона, где вы можете использовать '+' для объединения объектов в строку, например, в Java. @barakmanos Я уверен, что он пытается связать число (как строку) с префиксом. –

ответ

3

Если вы используете C++ 11 вы можете сделать

std::string download_location = "/home/user/Download/" + std::to_string(rdn) 
downloadFile("http://servera.com/file.txt", "/user/tmp/file.txt", download_location.c_str()); 

Еще лучше было бы покончить с голец * и использование строк везде. Слишком легко вводить ошибки с char *.

В качестве альтернативы вы также можете использовать stringstream для общего и эффективного конкатенации и форматирования строк.

#include <sstream> 
... 

stringstream download_location_stream; 
download_location_stream << "/home/user/Download" << rdn; 

downloadFile("http://servera.com/file.txt", "/user/tmp/file.txt", 
      download_location_stream.str().c_str()); 
+0

Я получаю ошибку to_string не в std, когда я пытаюсь это сделать. – Rocket

+0

Если вы выполняете много конкатенации строк, вам может потребоваться перегрузка 'operator +', чтобы помочь вам. '/ ** добавить строку со строковыми маньяками T */ шаблоном станда :: строками оператора + (константной зЬм :: строки & а, сопзИ Т & б) { возвращает + станд :: to_string (б) ; } '' /*** предварять строку с струнным маньяками T */ шаблоном станда :: строка оператора + (сопзИ Т & а, сопзИте станд :: струнные & б) { обратного станд :: to_string (a) + b; } 'Тогда' std :: string ("/ some/dir /") + rnd' должно работать. (извините за плохое форматирование. Не могу ответить на закрытый вопрос.) –

+0

@Rocket Вероятно, вы не используете компилятор C++ 11 или не отключите часть соответствующей функции. Все в порядке, я добавил еще один метод, который отлично работает с более старыми компиляторами. – Sorin

3

как сказал @leemes, вы можете использовать Sprintf:

char str[100]; 
sprintf(str,"/home/user/Download/%d",rdn); 
downloadFile("http://servera.com/file.txt", "/user/tmp/file.txt", str); 
+2

Возможно, лучше использовать 'snprintf()' вместо обычного 'sprintf()' здесь. –

+2

Для ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ –

+0

Можете ли вы объяснить разницу между snprintf и sprintf? Почему существует проблема использования одного над другим? Как вы используете snprintf? Это решение отлично работает для меня! – Rocket

Смежные вопросы