Добавить 'до и после символа [] в C - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь добавить одинарные кавычки до и после массива символов. Ниже приведен код, который я пытаюсь:

static const char str[] = "select * from name";
STATICF boolean test(){
   char[] key = "1234";
   strcat(str,(const char *)"\'");
   strcat(str,key);
   strcat(str,(const char *)"\'");
}

Он не работает, поскольку я получаю ошибку сегментации. Как я могу это исправить?

Ответы [ 2 ]

5 голосов
/ 31 января 2020

Массив str инициализируется так же, как и строка, которая его инициализирует. Это означает, что попытка добавить что-либо к этой строке приведет к записи за концом массива. Это вызывает неопределенное поведение , которое в этом случае приводит к тому, что ваша программа обрабатывает sh.

. Вам нужно сделать строку назначения достаточно большой, чтобы в ней была результирующая строка, и вам не нужно квалифицируйте его как const.

Кроме того, ручное построение строки SQL является плохой идеей, так как это может привести к атаке инъекцией SQL. Вместо этого вы должны использовать подготовленные операторы, которые могут безопасно вводить параметры в команду.

static const char str[] = "select * from name";
STATICF boolean test(){
   char[] key = "1234";
   int len = strlen(str) + 1 + strlen(key) + 1 + 1;
   char dest[len];
   strcpy(dest,str);
   strcat(dest,"'");
   strcat(dest,key);
   strcat(dest,"'");
}
2 голосов
/ 31 января 2020
strcat(str,(const char *)"\'");
strcat(str,key);
strcat(str,(const char *)"\'");

str должен быть достаточно большим, чтобы вместить всю объединенную строку результата, плюс \0 для завершения строки. Это не так в вашем примере с объявлением str как:

static const char str[] = "select * from name";

с str для хранения только размера старой строки плюс \0. Таким образом, попытка добавить больше символов вызывает ошибку сегментации.


Попробуйте объявить str с фиксированным размером, достаточным для хранения строки результата (старая строка select * from name + \' + 1234 + \' + завершающий \0, который должен составлять всего 25 символов, если я считаю правильно).

str должен быть непостоянным, чтобы изменить значение str кстати, поэтому опустите static const.

Также опустите приведение (const char *); и замените "\'" на "'".

Результат будет следующим:

char str[25];
strcpy(str,"select * from name");
STATICF boolean test(){
   char key[] = "1234";
   strcat(str,"'");
   strcat(str,key);
   strcat(str,"'");
}
...