Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2009, 20:42   #1
0kopok
 
Регистрация: 02.10.2009
Сообщений: 5
По умолчанию Считывание строки неограниченной длины (Си)

Код:
char *strd (void)
{
     size_t n = SIZE;
     char *s, *temp;
     temp = s = (char *) malloc (n);
     //if (s == NULL) {
     //      printf ("Error1");
     //      return NULL;
     //}
     while (getchar( ) != '\n') {
           *s++ = getchar ( );     //
           if (s - temp == n + 1) {
                s = (char *) realloc (temp, n + ADD_SIZE) + n;
                n += ADD_SIZE;
                temp = s;
                //if (temp == NULL) {
                //   printf ("Error2");
                //  return NULL;
                //}
           }
     }
     //if (s - temp == n) {
     //       s = (char *) realloc (temp, n + 1) + n;
     //        temp = s;
     //        if (temp == NULL) {
     //                    printf ("Error 3");
     //                    return NULL;
     //        }
     //}
     *s = '\0';
     s = temp;
     return s;
}
Ребят, помогите, пожалуйста, не могу понять, почему не работает. (Выводит как-то странно буквы через одну).
Закомментил участки, в которых маллок и реаллок могут не выделить памяти.

Кстати, вывожу этой функцией:
Код:
void strprint (char *s)
{
     while (*s++ != '\0')
     {
           printf ("%c", *s);
     }
}
А сайз и эдд_сайз описаны:
Код:
#define SIZE 100
#define ADD_SIZE 100

Последний раз редактировалось 0kopok; 04.10.2009 в 20:57.
0kopok вне форума Ответить с цитированием
Старый 05.10.2009, 03:03   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от 0kopok
Код:
     while (getchar( ) != '\n') {
           *s++ = getchar ( );     //
Не странно, что через одну.
Код:
char c;
while ( (c = getchar( ) ) != '\n') {
    *s++ = c;     //
...
netrino вне форума Ответить с цитированием
Старый 05.10.2009, 08:45   #3
0kopok
 
Регистрация: 02.10.2009
Сообщений: 5
По умолчанию

Ммм, а какая разница? =)

Ой, огромное спасибо. Я столько с этим промучался. Только не понял всё же почему первоначальный вариант неверен.

Не, всё равно что-то не так. Когда в дефайне поставил сайз и эдд_сайз за 3, всё виснет. Видимо, реаллок непрально работает.

Последний раз редактировалось Stilet; 05.10.2009 в 10:16.
0kopok вне форума Ответить с цитированием
Старый 05.10.2009, 14:00   #4
0kopok
 
Регистрация: 02.10.2009
Сообщений: 5
По умолчанию

Ни у кого нет идей?
0kopok вне форума Ответить с цитированием
Старый 05.10.2009, 14:05   #5
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 823
По умолчанию

Цитата:
Ммм, а какая разница? =)
Код:

    while (getchar( ) != '\n') {
           *s++ = getchar ( );
Смотри,ты когда проверяешь условие в while считываешь символ,потом считываешь ещё один в теле цикла...а тот,символ для проверки условия теряется...
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 05.10.2009, 14:09   #6
0kopok
 
Регистрация: 02.10.2009
Сообщений: 5
По умолчанию

Точно, спасибо большое. А почему реаллок не работает, нет идей?
0kopok вне форума Ответить с цитированием
Старый 05.10.2009, 20:46   #7
0kopok
 
Регистрация: 02.10.2009
Сообщений: 5
По умолчанию

Я в отчаянии =).
0kopok вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массивы переменной длины curly182 Паскаль, Turbo Pascal, PascalABC.NET 12 20.05.2009 21:17
Уменьшение длины имени Aндрей Помощь студентам 3 20.05.2009 16:52
Поиск цикла длины 4. <Бананан> Помощь студентам 33 25.05.2008 20:10
Массив неопределённой длины Влажимир Общие вопросы Delphi 2 01.04.2008 10:14
Считывание строки из файла до символа Stormzcooler Общие вопросы Delphi 7 18.12.2006 15:01