Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция в цикле работает один раз, а надо чтобы работала каждый раз 
:(
    Опции темы
request
Дата 16.12.2009, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 16.12.2009

Репутация: нет
Всего: нет



Функция для заполнения массива структур. Первый элемент структуры array[i].name при i=1 заполняется (посредством функции entcontrol2) корректно, а при последующих повторах не заполняется вообще. При этом все остальное заполняется нормально.
Код

void fill(STUDENT array[])
{
        char temp[20];
        int i,j;
        for(i=0; i<10; i++)
        {
                printf("Введите имя и инициалы: ");
                entcontrol2(temp);
                strcpy(array[i].name,temp);

                printf("\nВведите номер группы: ");
                array[i].group = entcontrol(1,100);

                for(j=0; j<5; j++)
                {
                        printf("\nВведите оценку %d: ", j+1);
                        array[i].mark[j] = entcontrol(2,5);
                }
                printf("\n\n");
        }
}

PM MAIL   Вверх
comcon1
Дата 16.12.2009, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



1. Замените: strcpy(array[i].name,temp); на strcpy(array[i].name, "xui"); отпишитесь. Так будет яснее, в чем проблема.
2. код инициализации array[i].name покажите


--------------------
PM MAIL   Вверх
request
Дата 16.12.2009, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 16.12.2009

Репутация: нет
Всего: нет



Код

typedef struct
{
        char name [20];
        int group;
        int mark[5];
} STUDENT;


Код

void entcontrol2(char array[])
{
        int bl;
        int i;
        char str[20];

        do
        {
                fgets(str, 20, stdin);
                bl = 1;
                for(i=0;i<strlen(str);i++)
                        if(!isalpha(str[i])&&!isspace(str[i]))
                        {
                                printf("Error: wrong name! Use only letters or space.\n");
                                bl=0;
                                break;
                        }
        }
        while (!bl);
       strcpy(array, str);
}



При первом срабатывании все работает, в том числе в других программах, а в цикле больше одного раза не хочет.
Строка strcpy(array[i].name,temp); сама по себе работает вполне успешно.

PM MAIL   Вверх
comcon1
Дата 16.12.2009, 03:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



возможно, тут присутствует шаманизм с нулевым символом.  Ничего другого в голову не приходит. Вообще strcpy - это для работы с нуль-терминированными строками. Для работы с массивом символов попробуй memcpy. Вот прямо сейчас замени и попробуй.


--------------------
PM MAIL   Вверх
azesmcar
Дата 16.12.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



request

Ничего не понял. Что за функция entcontrol? Короче покажи весь код и расскажи что именно не работает.

PM   Вверх
request
Дата 16.12.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 16.12.2009

Репутация: нет
Всего: нет



с memcpy так же точно получается
PM MAIL   Вверх
xvr
Дата 16.12.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Предположение - entcontrol оставляет '\n' в stdin

PM MAIL   Вверх
request
Дата 16.12.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 16.12.2009

Репутация: нет
Всего: нет



тогда бы потом сама entcontrol бы тоже не работала, а она нормально работает до конца цикла. или я чего-то не понимаю. выглядит она так:
Код


int entcontrol(int a, int b)
{
        int bl;
        int i,N;
        char str[20];

        do
        {
                scanf("%s",str);
                bl = 1;
                for(i=0;i<strlen(str);i++)
                        if(!isdigit(str[i]))
                        {
                                printf("Error: wrong value\n");
                                bl=0;
                                break;
                        }
                        N = atoi(str);
                        if(N<a || N>b)
                        {
                                printf("Error: wrong value\n");
                                bl = 0;
                        }
        }
        while (!bl);
        return N;
}

PM MAIL   Вверх
xvr
Дата 16.12.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата

или я чего-то не понимаю
Правильно не понимаешь - scanf оставляет в stdin '\n'. Следующий scanf его проглатывает, но оставляет свой, и т.д. Потом fgets читает до оставленного '\n' - т.е. пустую строку

PM MAIL   Вверх
request
Дата 16.12.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 16.12.2009

Репутация: нет
Всего: нет



спасибо, fflush(stdin) после scanf решило проблему. только вопрос, надо ли это делать после fgets? может ли она оставлять чтото в stdin?
PM MAIL   Вверх
xvr
Дата 16.12.2009, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(request @ 16.12.2009,  14:33)
только вопрос, надо ли это делать после fgets? 

Нет
Цитата

может ли она оставлять чтото в stdin?
Она читает строку вместе с разделителем. Если во входном потоке более одной строки, или одна строка, но длинее, чем буфер куда читаешь, то хвост останется во входном потоке. Надо ли его оттуда удалять или нет - вопрос спорный.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0777 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.