2010-11-18 5 views
1

Можно ли добавить текст в char*?Добавление текста в char *

Поскольку этот код дает ошибки:

name3 = "SELECT account_id FROM players WHERE name = '" + name + "'"; 

(name3 = а символ *)

+1

См. [SQL injection attack] (http://en.wikipedia.org/wiki/SQL_injection) –

ответ

16

Ваш вопрос с меткой C++, поэтому использовать C++. Избавьтесь от char*-х и использовать std::string:

std::string name = "..."; 

std::string name3 = "SELECT account_id FROM players WHERE name = '" + name + "'"; 

Вы можете „добавить“ два массива символов (символ * s), выделяя новый массив, достаточно большой, чтобы держать как и скопировать обе строки в новый массив. Я думаю, вы согласитесь, что std::string проще, но он также предоставляет меньше возможностей для ввода тонких ошибок в ваш код, что делает отладку и обслуживание проще в будущем.

+2

В качестве побочного элемента, если вы планируете делать много конкатенации строк, вы должны использовать 'std :: stringstream'. Кроме того, воздержитесь от использования встроенного SQL, если сможете. –

2

Вы должны выделить память первого, например:

char* name = new char[ BUFF_SIZE ]; 

, а затем использовать strcpy и strcat, но .. у вас есть тег c++. Используйте std::string

std::string name3 = "SELECT account_id FROM players WHERE name = '" 
        + 
        std::string(name) 
        + 
        "'"; 

или

std::string name3 = "SELECT account_id FROM players WHERE name = '"; 
name3 += name; 
name3 += "'"; // or name3.push_back(';'); 

Примечание если name не const char*, но std::string, вам не нужно от явных преобразований, поэтому обратитесь к meagar Начать

+0

'std :: string' умнее этого. В лучшем случае вам нужна 'std :: string (name)', другие явные объявления просто беспорядочны. – meagar

+0

Yep, справа, спасибо –

1

Вы также можете используйте sprintf за то, что вы описываете.

Также, если это для подключения к базе данных, вы можете рассмотреть возможность использования подготовленных операторов.

+0

-1 за рекомендацию использовать небезопасную функцию 'sprintf'. –

+0

+1 для подготовленных операторов, -1 для 'sprintf' (используйте' string', streams или в худшем случае 'snprintf'. –

+0

+1 для подготовленных операторов. Серьезно, слушайте этого парня. Do _not_ concatenate SQL вроде этого _ * ever * _. В лучшем случае ваша программа будет вести себя нечетно, когда будет задан определенный ввод. В худшем случае кто-то будет использовать эту легко обнаружимую уязвимость системы безопасности и сделает то, о чем вы пожалеете. –

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