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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Защита от некорректного ввода на С, Нужно срочно! 
:(
    Опции темы
Zhenius
Дата 9.9.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Люди, помогите с таким вопросом. Если с клавиатуры идёт приём числовых данных, то необходимо отслеживать ввод буквдо тех пор, пока не введут снова число . Как это правильно реализовать на Си, а то у меня вечно цикл зацикливается. Необходимо срочно. Заранее благодарен!
P.S. Облазил весь форум, но нигде не нашёл...

Это сообщение отредактировал(а) Zhenius - 9.9.2006, 23:28
PM MAIL   Вверх
Kuvaldis
Дата 9.9.2006, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



Zhenius, если я правильно понял, что ты хочешь
[code=cpp]
Код

int get_num(void)
{
    int   num;
    int   i;
    int   x;
    int   y;


     x  = wherex();
     x++;            // for gap before number
     y = wherey();   // remember position for input

     do
     {
          gotoxy(x, y);
          putc(' ', stdout);
          gotoxy(x - 1, y);
          clreol();           // clear line from cursor till end
          fflush(stdin);
          i = scanf("%d", &num);
      }
      while (i < 1);        // while non-number

    return num;
}


Это сообщение отредактировал(а) Kuvaldis - 9.9.2006, 23:41


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Zhenius
Дата 9.9.2006, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Возможно, но хотелось бы максимально упростить. Если тебе не лень, то рассмотри такой пример. Здесь вводится одно число. Если случайно введена буква, то запрашивается ввод снова. Пример чисто демонстративный. 

Код

#include <stdio.h>

int main( void )
{
        int a, b;
        b = scanf("%d", &a);                    
               
        while( b < 1 ) 
              b = scanf("%d", &a);

        printf("a = %d", a);
        
        return 0;
}     


Вот понимаю, что какая-то проблема в цикле, но никак не могу её решить...
Помоги, если не трудно.
PM MAIL   Вверх
bel_nikita
Дата 9.9.2006, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата(Zhenius @ 9.9.2006,  22:23)
Люди, помогите с таким вопросом. Если с клавиатуры идёт приём числовых данных, то необходимо отслеживать ввод буквдо тех пор, пока не введут снова число . Как это правильно реализовать на Си, а то у меня вечно цикл зацикливается. Необходимо срочно. Заранее благодарен!
P.S. Облазил весь форум, но нигде не нашёл...

isalpha

Код

// locale_isalpha.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>

using namespace std;

int main( )   
{
   locale loc ( "German_Germany" );
   bool result1 = isalpha ( 'L', loc);
   bool result2 = isalpha ( '@', loc);
   bool result3 = isalpha ( '3', loc);

   if ( result1 )
      cout << "The character 'L' in the locale is "
           << "alphabetic." << endl;
   else
      cout << "The character 'L' in the locale is "
           << " not alphabetic." << endl;

   if ( result2 )
      cout << "The character '@' in the locale is "
           << "alphabetic." << endl;
   else
      cout << "The character '@' in the locale is "
           << " not alphabetic." << endl;

   if ( result3 )
      cout << "The character '3' in the locale is "
           << "alphabetic." << endl;
   else
      cout << "The character '3' in the locale is "
           << " not alphabetic." << endl;
}
...
The character 'L' in the locale is alphabetic.
The character '@' in the locale is  not alphabetic.
The character '3' in the locale is  not alphabetic.




--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Kuvaldis
Дата 10.9.2006, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



Принцип работы у scanf() такой, что если она не встретила нужные символы, в твоем случае цифру, то символы заносятся обратно в поток ввода. Поэтому у тебя цикл бесконечный, если ввести буквую Для этого перед ВСЕМИ вызовами scanf() и других стандартных функций ввода С необходимо сбрасывать буфер потока (стандартный ввод stdin) при помощи команды fflush(stdin) 

Код

#include <stdio.h>    
int main( void )    
{    
        int a, b;    
                        
       do  
      {       
         fflush(stdin);
         b = scanf("%d", &a);    
      }
      while (b < 1); 

     printf("a = %d", a);    
         
     return 0;    
} 


Это сообщение отредактировал(а) Kuvaldis - 10.9.2006, 00:18


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Zhenius
Дата 10.9.2006, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



bel_nikita, благодарю конечно, но мне необходимо именно на Си, а не на С++.
Если кто может, исправьте ошибки в моём коде.

Kuvaldis, спасибо тебе огромное!!! Выручил неимоверно! Я до этой функции fflush() не дошёл ещё ( по книге занимаюсь ). А в универе про это не объяснили, препод только подсказку дал, что при ошибке scanf() ноль выдаст. Вот я на этом и завис. Не знал, за что зацепиться...

Ещё раз ОГРОМНОЕ СПАСИБО!!!
Думаю, тему можно закрыть...

Это сообщение отредактировал(а) Zhenius - 10.9.2006, 00:19
PM MAIL   Вверх
ReGeDiT
Дата 10.9.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



блин, у меня подобная задача.... а как сделать так, чтобы если ввелось всё кроме цифр, потребовалось заного ввести число?

сорри.. )))) мегатуплю

а ннет... не туплю...

Код

//
//
//

#include <stdio.h>
#include <conio.h>

int R[10], Z[10], i = 0, flag1 = 0;

int main(void)
{
 clrscr();
 for (i=1;i<=10;i++) {
              do {
              printf("Vvedite %2d element massiva: ",i);
              fflush(stdin);
              flag1 = scanf("%d",&Z[i]);
              if (flag1 < 1) {
                       scanf("%d",&Z[i]);
                     };
             }
              while (flag1 < 1);
             };
 for (i=1;i<=10;i++) {
               printf("%d",Z[i]);
             };
 getch();
 return 0;
}


если я введу последний 10й элемент буквой, а затем правильно, то потом почемуто мне потребуется заного ввести все 10 элементов начиная со второго Oo почему?

Это сообщение отредактировал(а) ReGeDiT - 10.9.2006, 17:24
PM MAIL WWW ICQ   Вверх
ReGeDiT
Дата 10.9.2006, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



помогите!)) времени до завтра )

также там могут встречатся отрицательные элементы smile(

Это сообщение отредактировал(а) ReGeDiT - 10.9.2006, 20:03
PM MAIL WWW ICQ   Вверх
Kuvaldis
Дата 10.9.2006, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



ReGeDiT, 
Вообще-то у тебя ошибка при работе с памятью (ее visual c++ тестит только). В отличие от Pascal, в С индексация массивов начинается с 0. smile 

Т.е. согласно идиомам (общепринятым правилам С) в циклах нужно писать
 for (i = 0; i < 10; i++). ПРи обращении Z[10] ты выходишь за границы массива. 

Но в чем твоя проблема? 
Цитата

если я введу последний 10й элемент буквой, а затем правильно, то потом почемуто мне потребуется заного ввести все 10 элементов начиная со второго Oo почему?


У меня вроде бы все работает как нужно...

Это сообщение отредактировал(а) Kuvaldis - 10.9.2006, 20:06


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
ReGeDiT
Дата 10.9.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



по моему в си массивы тоже начинаются с 1, а чары с 0... но хз, просто я никогда не видел "введите 0 элемент массива".....

но всеравно... без понятия, попробовал с 0 - таже проблема
PM MAIL WWW ICQ   Вверх
Kuvaldis
Дата 10.9.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



Цитата

по моему в си массивы тоже начинаются с 1, а чары с 0... но хз, просто я никогда не видел "введите 0 элемент массива".....


ВСЕ массивы в С/С++ начинаются с нуля. Не веришь, посмотри литературу.
При запросе можно написать так
Код

printf("Vvedite %2d element massiva: ", i + 1);


Весь код, я удалил if в цикле do...while. Он там не нужен
Код

#include <stdio.h>    
#include <conio.h>    
int R[10], Z[10], i = 0, flag1 = 0;    
int main(void)    
{    
 clrscr();    
 for (i = 0; i < 10; i++)
 {
     do
     {
        printf("Vvedite %2d element massiva: ",i + 1);
        fflush(stdin);
        flag1 = scanf("%d",&Z[i]);
      }
      while (flag1 < 1);    
 };

 for (i = 0; i < 10; i++)
 {
      printf("%d ",Z[i]);
 };
 getch();    
 return 0;    
}



Если хочется еще красивее и понятнее, то можно использовать мою функцию get_num() (смотри выше пост)

Код

#include <stdio.h>     
#include <conio.h>     
int R[10], Z[10], i = 0, flag1 = 0;     
int main(void)     
{     
 clrscr();     
 for (i = 0; i < 10; i++)    
 {    
      Z[i] = get_num();
 };    
 for (i = 0; i < 10; i++)    
 {    
      printf("%d ",Z[i]);    
 };    
 getch();     
 return 0;     
}


Это сообщение отредактировал(а) Kuvaldis - 10.9.2006, 20:27


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
ReGeDiT
Дата 10.9.2006, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а если я введу отрицательный элемент? программа заглючит )
PM MAIL WWW ICQ   Вверх
Kuvaldis
Дата 10.9.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



У меня не глючит в Borland C++ Builder 6.0.
Какой у тебя компилятор? 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
ReGeDiT
Дата 10.9.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



всё спасибо )
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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