Помогите разобраться
От: a1ien.n3t  
Дата: 25.12.07 22:04
Оценка:
Народ помогите разобраться с этим кодом уже 2 часа с ним парюсь. (всякая ненужная фигня вырезанна)
int main(int argc, char* argv[])
{    
    
    char com[80];
    while(1)
    {
        cout<<"# ";
        gets(com);
        int iret=command(com);
        if (iret==2) break;
    cout<<"\n\n";
    }
    return 0;
}

int command(char *s)
{
char * pch;
     pch = strtok (s," ");
  while (pch != NULL)
  {
      if(!strcmp("-add",pch))
        {
        pch = strtok (NULL, " ");
        if (pch)
        {
        if (!strcmp("s",pch)) 
        {
            pch = strtok (NULL, " ");
            add_stud(pch);
            break;
        }
        }
        cout<<"To get help about command put -help add";
        return 1;
        }
    if(!strcmp("-exit",pch) || !strcmp("-quit",pch))
        {
        cout<<"Good Buy\n";
        return 2;
        }
      pch = strtok (NULL, " ");
  }
  cout<<"Command is not supported! Put -help to get Help";
return 0;
}

int add_stud(char *n)
{
char t[80];
        int i5Valu[5];
    cout<<"EnterFIO\n";
    cin>>t;
    cout<<"Enter 5 Values\n";
    return 1;
}


дело в том что если мы вводим
-add s 1

Вместо 1 может быть что угодно суть не в этом.
То на экране появляется запрос на ввод FIO
НО когда мы вводим фио и нажимаем ентер то у нас появляются 2 лишние строки с сообщением
Command is not supported! Put -help to get Help

Откуда????? они там берутся не как немогу догнать.

Вот что выводиться на экран.

# -add s 1
EnterFIO
asdsad
Enter 5 Values
Command is not supported! Put -help to get Help

# Command is not supported! Put -help to get Help

#

Исправлено форматирование. — Кодт
Re: Помогите разобраться
От: _Dreamer Россия  
Дата: 26.12.07 03:40
Оценка:
Здравствуйте, a1ien.n3t, Вы писали:

AN>Народ помогите разобраться с этим кодом уже 2 часа с ним парюсь. (всякая ненужная фигня вырезанна)

AN>
AN>int command(char *s)
AN>{
AN>  char * pch;
AN>  pch = strtok (s," ");
AN>  while (pch != NULL)
AN>  {
AN>      if(!strcmp("-add",pch))
AN>    {
AN>        pch = strtok (NULL, " ");
AN>        if (pch)
AN>        {
AN>            if (!strcmp("s",pch)) 
AN>            {
AN>                pch = strtok (NULL, " ");
AN>                add_stud(pch);
AN>                break; /* 1 */
AN>            }
AN>        }
AN>
AN>        cout<<"To get help about command put -help add";
AN>        return 1;
AN>    }
AN>    if(!strcmp("-exit",pch) || !strcmp("-quit",pch))
AN>    {
AN>        cout<<"Good Buy\n";
AN>        return 2;
AN>    }
AN>    pch = strtok (NULL, " ");
AN>  }
AN>
AN>  cout<<"Command is not supported! Put -help to get Help";
AN>  return 0; /* 2 */
AN>}



AN>НО когда мы вводим фио и нажимаем ентер то у нас появляются 2 лишние строки с сообщением

AN>
Command is not supported! Put -help to get Help

AN>Откуда????? они там берутся не как немогу догнать.

тоесть откуда ?
break в пункте /* 1 */ выкидывает из цикла while, и потом выход из функции в точке /* 2 */ с выводом сообщения.
компьютер делает ровно то, что Вы ему велели, но это может отличаться от того, что Вы имели ввиду. (с)
Re[2]: Помогите разобраться
От: a1ien.n3t  
Дата: 26.12.07 07:17
Оценка:
Дак как он может фходить в цикле while еще раз в функцию command после того как я выпрыгиваю из нее.
Он почемуто проскакивает gets после того как мы выпрыгиваем из command.
Re[2]: Помогите разобраться
От: a1ien.n3t  
Дата: 26.12.07 07:21
Оценка:
А да совсем забыл.
Если вместо break; написать return 1; то мы всеравно выведем.

# Command is not supported! Put -help to get Help

#
Re: Помогите разобраться
От: Pasternak  
Дата: 26.12.07 10:01
Оценка:
Здравствуйте, a1ien.n3t, Вы писали:

AN>Народ помогите разобраться с этим кодом уже 2 часа с ним парюсь. (всякая ненужная фигня вырезанна)

AN>[СCODE]int main(int argc, char* argv[])
AN>{

AN> char com[80];

AN> while(1)
AN> {
AN> cout<<"# ";
AN> gets(com);
AN> int iret=command(com);
AN> if (iret==2) break;
AN> cout<<"\n\n";
AN> }
AN> return 0;
AN>}

AN>int add_stud(char *n)

AN>{
AN>char t[80];
AN> int i5Valu[5];
AN> cout<<"EnterFIO\n";
cin>>>t;
AN> cout<<"Enter 5 Values\n";
AN> return 1;
AN>}[/СCODE]

AN>дело в том что если мы вводим

AN>
-add s 1

AN>Вместо 1 может быть что угодно суть не в этом.
AN>То на экране появляется запрос на ввод FIO
AN>НО когда мы вводим фио и нажимаем ентер то у нас появляются 2 лишние строки с сообщением
AN>
Command is not supported! Put -help to get Help

AN>Откуда????? они там берутся не как немогу догнать.

Мне кажется дело в том, что в функции add_stud cin>>t считывает слово до первого разделителя, оставляя последний в потоке ввода. Т.е в данном случае, после cin>>t в потоке остается символ перевода строки, который потом считывается функцией gets в main.
Re: Помогите разобраться
От: alzt  
Дата: 26.12.07 11:42
Оценка:
Здравствуйте, a1ien.n3t, Вы писали:

На мой взгляд отладчик поможет отлично разобраться с проблемой.
Re[2]: Помогите разобраться
От: a1ien.n3t  
Дата: 26.12.07 17:06
Оценка: -2
Здравствуйте, alzt, Вы писали:

A>Здравствуйте, a1ien.n3t, Вы писали:


A>На мой взгляд отладчик поможет отлично разобраться с проблемой.


Ты такой умный. Тебе череп то не жмет? Я уже с дебагером сижу целый день.
И нечего.
Ты сам то закинь скомпиль и посиди с дебагером.
Re[3]: Помогите разобраться
От: Mad_Stas Беларусь  
Дата: 26.12.07 17:51
Оценка: 3 (1)
Здравствуйте, a1ien.n3t, Вы писали:

AN>Дак как он может фходить в цикле while еще раз в функцию command после того как я выпрыгиваю из нее.

AN>Он почемуто проскакивает gets после того как мы выпрыгиваем из command.

Внимай. Твоя проблема в cin>>t;

Эта комманда вычитывает из stdin строку, но оставляет там символ новой строки.
Последующая чуть позже команда gets берет этот символ.

Решение: вставь перед gets команду fflush(stdin) либо считывай данные какими-либо другими командами.
Re[4]: Помогите разобраться
От: a1ien.n3t  
Дата: 26.12.07 18:19
Оценка:
Здравствуйте, Mad_Stas,
Огромное вам спасибо.
Вы просто спасли меня.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.