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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проверка введенных данных 
:(
    Опции темы
titanrem
Дата 18.11.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Такой вопрос по языку С.
Пользователь вводит два числа и считается частное.
Как обезопасить программу от ввода пользователем вместо числа символа??
Так чтобы, если пользователь ввел символ, а программа в консоль написала сообщение, а не считала 
PM MAIL   Вверх
sQu1rr
Дата 18.11.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



считывать надо не сразу в int, а в char
потом проверять на ненужные символы (легче проверить на нужные, сосчитать их и сравнить с длиной строки).
Если такие имеются, то вывести сообщение (лучше исключение)
Если таковых нету, то через atoi или _atoi64 переводете в int или __int64 соответсвенно.
Если нужно в число с плавающей точкой, то нужно самому написать програмку

Если нужно могу скинуть у меня есть перевод char * в любую переменную (сам делал, когда С++ проходил (ну типо для начинающих) )

А извените, заметил, что С, а не С++, но там делать нужно тоже самое вообщемто
Тоесть считываете как текст, проверяете насимволы, если все ОК, конвертируете в цисла.


Это сообщение отредактировал(а) sQu1rr - 18.11.2008, 18:52
PM MAIL Skype GTalk   Вверх
SVN74
Дата 18.11.2008, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

//////////////////////////////////////////////
 bool IntVerf(char *Txt)
{
  int q,i = strlen(Txt);
  for(q=0;q<i;q++)
    if(isdigit(Txt[q])==0) return false;
return true;
}

PM MAIL WWW   Вверх
IKM2007
Дата 18.11.2008, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


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

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



Вот написал функцию ввода.
Код

#include <iostream>
#include <cstring>
#include <cctype>
#include <cstdlib>
using std::cout;
using std::cin;
void in(int &digit)
{
char x[11];
cout<<"*******Vvedite chislo*******\n";
l:
cin.getline(x,11,'\n');

int n=(int)strlen(x);

for(int i=0;i<n;i++)
if(!isdigit(x[i]))
{
cout<<"Vvedite snova\n";
goto l;
}
digit=atoi(x);
}
void main()
{
int x,y;
in(x);
in(y);
}



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
taiven
Дата 19.11.2008, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

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

int iscorrect(char *str)
{
    int i = 1;
    while(*str)
    {
        if(!isdigit(*str))
            if(*str!='.' || i > 1) return 0;
            else ++i;
        *str++;
    }
    return 1;
}

int main()
{
    char first[30];
    char second[30];
    double res;

    printf("%s", "Vvedite delimoe-> ");
    gets(first);
    printf("%s", "Vvedite delitel-> ");
    gets(second);

    if(iscorrect(first) && iscorrect(second))
    {
        res = atof(first) / atof(second);
        printf("%s%.2f\n", "Rezultat: ", res);
    }
    else printf("%s\n", "dopushena oshibka");

    _getch();
    return 0;
}



Это сообщение отредактировал(а) taiven - 19.11.2008, 00:14
PM   Вверх
xvr
Дата 19.11.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Есть такие замечательные функции: stdtol & strtod, у них есть 2й параметр - указатель на неразобранную часть строки. Если после вызова он указывает на не 0, то у вас число записано не правильно, а если на 0, то число правильное и то, что вернет strto? оно и есть. Как говорится - 2 в одном  smile 
Код

char *inp_string;
char *p;
int num=strtol(inp_string,&p,10);
if (*p) abort();
// num - ваше число

PM MAIL   Вверх
Dov
Дата 19.11.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Код
    float a, b;

    printf("Введите делимое  : "), fflush(stdin);
    while(!scanf("%f", &a))     
        printf("Ошибка ввода.\nВведите делимое  : "), fflush(stdin);   

    printf("Введите делитель : "), fflush(stdin);
    while(!scanf("%f", &b))   
        printf("Ошибка ввода.\nВведите делитель : "), fflush(stdin);
    
    printf("Результат деления: %g\n", a / b);



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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