Что не так с этой программой? - PullRequest
2 голосов
/ 07 апреля 2011

Я пытаюсь написать код конкатенации строк. Интересно, что в этом плохого? Можете ли вы помочь мне. Вот мой код.

#include <stdlib.h>

void strcat1(char *s, char *t)
{
    while(*s !='\0')
        s++;

    while((*s++=*t++)!= '\0')
    {

    }

}

int main()
{
char s[]= "hello";
char t[]= "world";
strcat1(s,t);
printf("%s", s);

return 0;
}

Я получаю этот вывод на codepad.org: Disallowed system call: SYS_socketcal Вот ссылка: http://codepad.org/Arz6U7YA

РЕДАКТИРОВАТЬ : Изменится ли char * s = "Hello" и char * t = "World" в основной функции как-то иначе?

Ответы [ 4 ]

8 голосов
/ 07 апреля 2011

s имеет место для 6 символов (а именно 'h', 'e', ​​'l', 'l', 'o' и '\ 0').

Вы пытаетесьнапишите на 5 символов больше, чем он может вместить.

Не делайте этого!

Попробуйте увеличить размер s до

int main()
{
char s[11] = "hello";
/* ... */

Редактироватьпосле редактирования OP

Изменение s в основном на

char *s = "hello";

изменяет s из массива с небольшим пространством на указатель на строковый литерал.

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

3 голосов
/ 07 апреля 2011

Что ж, большая проблема в том, что s недостаточно велика, чтобы сохранить результат;он имеет размер 6 символов (5 букв плюс 0), поэтому, как только вы начнете пытаться добавить содержимое t, вы переполните буфер.

3 голосов
/ 07 апреля 2011

Переполнение буфера. Вы не можете добавить в конец массива s, потому что он был выделен только с 6 символами (5 печатных и один \0).

0 голосов
/ 07 апреля 2011

Вы пытаетесь добавить постоянную строку. Этот сегмент памяти защищен. Создайте новый буфер, войдите туда, а затем верните его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...