2014-09-25 1 views
2
std::string mystring; 

sprintf(mystring.c_str(), "%s %d", "Helloworld", 2014); 

Его, дает ошибку компилятора мне:Sprintf»: не удается преобразовать параметр 1 из„сопзЬ символ *“в„символ *“

'sprintf' : cannot convert parameter 1 from 'const char *' to 'char *'

+1

первый параметр Sprintf должен быть символ *, но вы передаете константный символ *. ** mystring.c_str() ** - const char *. вы можете использовать append, чтобы делать все, что хотите, для sprintf ** mystring.append («Helloworld 2014»); ** – Gangadhar

+0

Первый аргумент «sprintf» - это указатель на массив символов «char *», где форматированная строка будет сохранены. С другой стороны, mystring.c_str() представляет собой массив символов контировки, который генерируется из mystring. Тип данных для них отличается. –

ответ

9

ваше предупреждение дает вам всю необходимую информацию ,

std::string::c_str() возвращает const char*, а для sprintf требуется char*, так как он хранит буфер.

Но вы пишете C++ и должны избегать sprintf. Используйте файл ostringstream для записи форматированных данных в строку.

+0

Это 'std :: string :: c_str()'. И он должен использовать 'std :: ostringstream' для записи, а не' std :: stringstream'. –

+0

@JamesKanze да я исправил опечатку. С «stringstream» я имел в виду концепцию, отличную от конкретного класса. В противном случае я использовал backticks, но я тоже добавлю. –

2

std::string управляет базовым буфером типа C. c_str возвращает const char *, потому что он не должен быть изменен ничем иным, кроме методов строки.

Вы должны использовать ostringstream. См. Этот вопрос: C++ equivalent of sprintf?

10

Это не должно быть предупреждение, оно должно быть ошибкой. Указатель , возвращаемый std::string::c_str(), указывает на постоянное запоминающее устройство; любая попытка записи через него - это неопределенное поведение. (В вашем случае, если вы используете const_cast заткнуться компилятор, вы код, вероятно, аварии, так как вы звоните c_str() на пустой strying.)

Вообще говоря, то, что вы, вероятно, хотите является std::ostringstream:

std::ostringstream formatter; 
formatter << "Helloworld" << ' ' << 2014; 
std::string myString = formatter.str(); 

FWIW: sprintf является одним из наиболее опасных функций в стандартной библиотеке , и присутствует только по историческим причинам. Это практически невозможно использовать безопасно; даже в C, вы должны предпочесть snprintf (но в C++, std::ostringstream намного лучше).

+0

Красивый ответ! +1 – user1336087

2

Вы сообщаете sprintf, чтобы сохранить результат в mystring.c_str(). Это представление только для представления базового представления mystring. Поскольку он является readonly (или const char *), вы не можете написать ему результат.

Если вам нужно использовать sprintf, вам придется создать перезаписываемый буфер символов для его использования, а затем назначить этот буфер для mystring.

Другой способ выполнения такого рода операции без необходимости создания буферов символов и иметь дело с возможным переполнением будет использовать stringstream:

std::stringstream buffer; 
buffer << "Helloworld " << 2014; 
mystring = buffer.str(); 
0

В качестве альтернативы можно использовать старую C snprintf во временный буфер, затем назначить в строку:

std::string mystring; 
char buf[64]; 
snprintf(buf, sizeof(buf), "%s %d", "Helloworld", 2014); 
mystring.assign(buf); 

snprintf всегда безопаснее, чем sprintf, так как это позволяет избежать buffer overflow.

Но, конечно, используя ostringstream, как ответил here by James Kanze, это лучше.

0
#include <iostream> 
#include <string> 
#include <sstream> 

std::stringstream ss; 
ss << "Helloworld"; 
ss << " "; 
ss << "2014"; 
ss << std::endl; 
std::string str = ss.str(); 
std::cout << str; 

const char * mystring= str.c_str(); 

Таким образом, вы также можете добавить int или long number в строку.

Пример:

long year = 2014; 

std::stringstream ss; 
ss << "Helloworld"; 
ss << " "; 
ss << year; 
ss << std::endl; 
std::string str = ss.str(); 
std::cout << str; 

const char * mystring= str.c_str(); 
Смежные вопросы