strcat констатирует символ на строку? - PullRequest
9 голосов
/ 29 января 2011

Используя GDB, я обнаружил ошибку сегментации при попытке выполнить эту операцию:

strcat(string,&currentChar);

Учитывая, что строка инициализирована как

char * string = "";

, а currentChar равен

char currentChar = 'B';

Почему это приводит к ошибке сегментации?

Если strcat не может использоваться для этого, как еще можно объединить символ в строку?

Ответы [ 6 ]

12 голосов
/ 16 марта 2014

Как ответили другие, ¤tChar является указателем на char или char *, но строка в C равна char [] или const char *.

Один из способов использования strcat для объединения char в string - создание минимальной строки и ее использованиепреобразовать символ в строку.

Пример:

Создание простой строки, содержащей только 1 символ и суффикс '\ 0' ;

char cToStr[2];
cToStr[1] = '\0';

Применительно к вашему вопросу:

char * string = "";
char currentChar = 'B';

cToStr примет строку "B":

cToStr[0] = currentChar;

И strcat будет работать!

strcat ( string, cToStr );
8 голосов
/ 29 января 2011

Поскольку &currentChar не является строкой, она не заканчивается символом \0.Вы должны определить B как char *currentChar = 'B';.Также согласно http://www.cplusplus.com/reference/clibrary/cstring/strcat string должно быть достаточно места для хранения строки результата (в данном случае 2 байта), но это всего 1 байт.

Или если вы хотите использовать char тогда вы можете сделать что-то вроде (в зависимости от вашего кода):

char string[256];
...

char currentChar = 'B';
size_t cur_len = strlen(string);
if(cur_len < 254) {
    string[cur_len] = currentChar;
    string[cur_len+1] = '\0';
}
else
    printf("Not enough space");
1 голос
/ 05 апреля 2016

Я думаю, что самый простой метод (не эффективный) будет sprintf

sprintf(str, "%s%c", str, chr);

1 голос
/ 29 января 2011

strcat () принимает две строки с \ 0.Когда вы передаете адрес символа, подпрограмма будет искать память, которая следует за символом, в поисках терминатора.

Поскольку вы не знаете, к чему даже относится эта память, следует ожидать проблем,Ваш код обращается к нему.

В дополнение к этому, ваш строковый аргумент не имеет места для добавления каких-либо символов.Куда записана эта память?Он попытается записать после конца памяти, связанной с этой строкой.

0 голосов
/ 29 января 2011

Первый аргумент strcat должен иметь достаточно места для хранения остальной части строки. "" является константной строкой и поэтому GCC не выделяет место.

Сделать массив с достаточным пространством:

char buf[1024];

strcat(buf, "");
strcat(buf, "B");
0 голосов
/ 29 января 2011

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

Это работает:

char string[10] = "";
char* currentChar = "B";
strcat(string, currentChar);
...