Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Язык си 2 строки  (Прочитано 952 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Kozak Illya

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Язык си 2 строки
« : 06 Февраля 2013, 11:30:37 »
#include <stdio.h>
#include <stdlib.h>

main()
{
  char *s1 = NULL;
  size_t len = 0;
  char *s2;
  s2 = (char *)malloc(getline (&s1, &len, stdin) + 1);
 
  printf("string 1: %s\n", s1);
  while(*s2++ = *s1++)
    ;
  printf("string 2: %s\n", s2);
  free(s1);
  free(s2);
}
$ ./a.out
asdf
string 1: asdf

string 2:
Segmentation fault (core dumped)
Что не так?
Гуглил malloc, getline, ssize_t, size_t. Светлее в голове не стало.

Оффлайн cerh

  • Новичок
  • *
  • Сообщений: 35
    • Просмотр профиля
Re: Язык си 2 строки
« Ответ #1 : 06 Февраля 2013, 14:07:33 »


char *s22=s2;
char *s11=s1;
while(*s22++ = *s11++);
printf("string 2: %s\n", s2);
free(s1);
free(s2);

Оффлайн Kozak Illya

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Re: Язык си 2 строки
« Ответ #2 : 06 Февраля 2013, 14:57:50 »
Насколько я понял то Segmentation fault при вызове free(s1 или s2); вылетает по тому что после инкрементирования они уже не указывают на начало блока в памяти.
Но почему не выполняется копирование строки?
Правильно ли я выделил память под строку s2 ведь malloc() просит size_t, а getline(); дает ssize_t?

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Язык си 2 строки
« Ответ #3 : 06 Февраля 2013, 15:03:53 »
Пользуйтесь функциями стандартной библиотеки strlen и strcpy.

Оффлайн cerh

  • Новичок
  • *
  • Сообщений: 35
    • Просмотр профиля
Re: Язык си 2 строки
« Ответ #4 : 06 Февраля 2013, 15:10:58 »
Но почему не выполняется копирование строки?

Выполняется

Оффлайн Kozak Illya

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Re: Язык си 2 строки
« Ответ #5 : 06 Февраля 2013, 17:21:03 »
Все понял.
В строке printf("string 2: %s\n", s2);
s2 указывает на ее окончание.
Всем спасибо.

 

Страница сгенерирована за 0.035 секунд. Запросов: 25.