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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2012, 14:30   #1
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
По умолчанию Язык Си. Защита от неправильного ввода.

Доброго времени суток, господа. Ниже представлен неправильный вариант модуля программы "защиты от дурака":
...
Код:
char m[10];
float x3;
flag1=0;
		while(1)
		{
			printf("\n  a = ");
			scanf("%s",m);
			for(i=0;i<9;i++)
			{
				if (m[i]>45 && m[i]<58 && m[i]!=46) flag1=1; else flag1=0;
			}
		if (flag1==1) {x3=m; printf("\n\n\nSimvoli vvedeni pravilno. Eto %f", x3);break;}
		else printf("\nOshibka vvoda, povtorite vvod");
		}
...
В строку-массив вводятся символы (разрешенные 0...9 и точка). При вводе любых иных символов или же сочетаний типа 1.3s3; 1.23.2; .55; 3q и т.д. на экран должно выводиться соответствующее сообщение и программа запускается вновь. В правильном случае типа 12.4 данная строка присваивается переменной типа float и программа завершается успешно. Будьте добры, подскажите правильный вариант. Заранее благодарю.

Последний раз редактировалось Stilet; 30.04.2012 в 21:23.
Землянин вне форума Ответить с цитированием
Старый 29.04.2012, 14:45   #2
rUs_LAN
Форумчанин
 
Регистрация: 15.11.2008
Сообщений: 577
По умолчанию

Код:
#include "stdafx.h"
using namespace std;

bool isNumeric(string stringToCheck)
{
  bool numeric = false;
 
  if(stringToCheck.find_first_not_of("0123456789.") == string::npos)
    numeric = true;
 
  return numeric;
}

int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL, "");

	string test;
	cout << "Введите число \t";
	while(true)
	{
		cin >> test;
		if(isNumeric(test)) break;
		cout << "\n Неправильное число, попробуйте еще раз \t";
	}

	cout << "Поздравляєм, ваше число " << test << endl << endl;
	system("pause");
}
блин на си надо было

Последний раз редактировалось rUs_LAN; 29.04.2012 в 14:48.
rUs_LAN вне форума Ответить с цитированием
Старый 29.04.2012, 14:56   #3
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
По умолчанию

Спасибо, но как этот код перевести на код Си я к сожалению не знаю.

Ребята, есть кто сможет решить данный вопрос? Буду признателен.

Последний раз редактировалось Stilet; 30.04.2012 в 21:24.
Землянин вне форума Ответить с цитированием
Старый 29.04.2012, 18:20   #4
rUs_LAN
Форумчанин
 
Регистрация: 15.11.2008
Сообщений: 577
По умолчанию

Код:
bool isnumeric(char *str)
{
  while(*str)
  {
    if(!isdigit(*str))
	{
		if(!(*str == '.')) return false;
	}
    str++;
  }
  return true;
}
rUs_LAN вне форума Ответить с цитированием
Старый 29.04.2012, 18:32   #5
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
По умолчанию

Если я не ошибаюсь, в Си нет логического типа bool (boolean). Здесь я так понимаю представлена функция типа bool, где при вводе точки возвращается значение false. Руслан, а есть возможность выявить ошибку в моем коде?
Землянин вне форума Ответить с цитированием
Старый 29.04.2012, 18:59   #6
rUs_LAN
Форумчанин
 
Регистрация: 15.11.2008
Сообщений: 577
По умолчанию

Код:
int isnumeric(char *str)
{
  while(*str)
  {
    if(!isdigit(*str))
	{
		if(!(*str == '.')) return 0;
	}
    str++;
  }
  return 1;
}
я не насколько хорошо знаю С чтоб исправлять чужие ошибки
rUs_LAN вне форума Ответить с цитированием
Старый 30.04.2012, 13:51   #7
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
По умолчанию

Я пытаюсь применить последний вариант кода, передавая указателю адрес строки-массива, устанавливая условия, что только числа и точка разрешены следующим образом:

Код:
int isnumeric(char *str)
{
  while(*str)
  {
    if(!isdigit(*str))
	{
		if(!(*str >45) && !(*str <58) && !(*str!=47)) return 0;
	}
    str++;
  }
  return 1;
}

int main()
{
char m[10];  int p; float x3;
while(1)
{
printf("\n a = ");
scanf("%s",m);
     p=isnumeric(m);
     if (p==1) x3=m; else printf("Neverniy vvod");
}
return 0;
}
Но если я ввожу "1.2qwc" он принимает это за верный ввод. Как поступить?

Последний раз редактировалось Землянин; 30.04.2012 в 14:23.
Землянин вне форума Ответить с цитированием
Старый 30.04.2012, 14:22   #8
FenixGuard
Новичок
Джуниор
 
Регистрация: 28.04.2012
Сообщений: 10
По умолчанию

Можно через цикл do. Пример того,
Код:
do
{
  тело цикла, тут все что надо пишешь на ввод и вывод информации
}
while((m[i]<=0)||(m[i]>=9)||(m[i]!='.'));

этот цикл будет повторяться столько раз пока не введется число от 0 до 9 или символ точка. Если я не ошибаюсь.


Вот для проверки наклепал быстро:
Код:
#include<stdio.h>
int main (void)
{
    int n;
    char ans;
    do
   {
     printf("Enter N(0<=n<=9)=");
     scanf("%i",&n);
     printf("Enter Ans('.')=");
     scanf(" %c",&ans);

   }
while((n<=0)||(n>=9)||(ans!='.'));

    return 0;
}


Конечно это не твой вариант, но просто я думаю ты поймешь как под себя переделать?

Последний раз редактировалось FenixGuard; 30.04.2012 в 14:24.
FenixGuard вне форума Ответить с цитированием
Старый 30.04.2012, 14:26   #9
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
По умолчанию

Спасибо, сейчас будем пробовать адаптировать.
Землянин вне форума Ответить с цитированием
Старый 30.04.2012, 15:01   #10
ERAGORN
Пользователь
 
Аватар для ERAGORN
 
Регистрация: 02.01.2012
Сообщений: 46
По умолчанию

Код:
#include<stdlib.h>
#include <conio.h> // getch()
#include <ctype.h> // isdigit()


int main( void ){
    const int SIZE = 10;
    char str[SIZE];
    char ch;
    float number;
    int i;

    for ( i = 0; i < SIZE - 1 && (ch = getch()) != '.'; )
        if ( isdigit(ch){
            str[i++] = ch;
            putchar(ch);
        }
    if ( ch == '.' ){
        str[i++] = ch;
        putchar(ch);
    }

    for (; i < SIZE - 1; )
        if ( isdigit(ch = getch()) ){
            str[i++] = ch;
            putchar(ch);
        }
    str[i] = '\0';

    number = atof(str);

    printf("\"%s\" = %f\n", str, number );

    system("PAUSE");

    return 0;
}

Последний раз редактировалось ERAGORN; 30.04.2012 в 16:55.
ERAGORN вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Защита от неправильного ввода Obey177 Общие вопросы Delphi 11 19.03.2012 15:57
Запрет нажатия кнопки и запрет неправильного ввода данных De_Kurlzz Помощь студентам 1 15.06.2011 15:14
onKeyPress. Защита от неправильного ввода. Антон Лысенко Помощь студентам 5 23.02.2011 17:20
Защита от неправильного ввода Christina_2010 PHP 2 09.06.2010 13:28
Защита от кривого ввода на С++ survavior Помощь студентам 4 13.04.2010 17:56