Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

Проверка вводимых данных

-

Вопросы и ответы, обсуждения

- Ваши вопросы по C/C++ только в данном разделе

Ответ
 
Опции темы
Старый 20.11.2013, 10:22   #1
 Разведчик
Аватар для polzo
 
polzo вызывает надежду
Регистрация: 12.01.2011
Сообщений: 24
Популярность: -20
Сказал(а) спасибо: 19
Поблагодарили 6 раз(а) в 6 сообщениях
Отправить сообщение для polzo с помощью ICQ Отправить сообщение для polzo с помощью Skype™
 
По умолчанию Проверка вводимых данных

Делаю программу, в которой нужен контроль введенных данных, то есть чтобы в массив можно было ввести только число. Начал делать через atoi, вроде все хорошо, если бы не одно НО: atoi превращает буквенную строку в 0, и когда я просто ввожу 0 программа выдает ошибку. Как можно дописать этот код или предложите другой способ проверки...Вот первая часть программы:
Код:
  
#include "stdafx.h"
#include "conio.h"
#include "locale.h"
#include "iostream"
#include "stdlib.h"
#include "stdio.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 setlocale(LC_ALL, "Russian"); // включение русского языка
    const int Nmax=100;
      int i, num_max, M[Nmax], Mmax, a,ak;
       char ch, N[256], D[256];
do
{
	cout << "Введите количество элементов целочисленного массива N, (N<=" << Nmax << ") :";

	cin >> N;
	 a = atoi(N);
	  if (a==0 || a>100)
		do
			{
			cout << "строка введена неверно, введите строку еще раз!" << endl;
			cin >> N;
			a = atoi(N);
			}while  (a==0 || a>100);
	 cout << endl;

	for (i=0; i<a; i++)
	{
		cout << "Введите элемент A[" << i << "]: "; 
		 cin >> D;
		 ak = atoi(D);
		  if (ak==0)
		do
			{    
				cout << "строка введена неверно, введите строку еще раз!" << endl;
				cout << "Введите элемент A[" << i << "]: "; 
				cin >> D;
				ak = atoi(D);
			}while  (ak==0);
		M[i] = ak;
	}
  Ответить с цитированием
Старый 20.11.2013, 20:50   #2
 Разведчик
Аватар для hunker
 
hunker на правильном путиhunker на правильном пути
Регистрация: 01.05.2011
Сообщений: 17
Популярность: 159
Сказал(а) спасибо: 9
Поблагодарили 4 раз(а) в 4 сообщениях
 
По умолчанию Re: Проверка вводимых данных

Попробуй вместо
Код:
a = atoi(N);
написать
Код:
if (N=="0") a = 0;
else a = atoi(N);
и вместо
Код:
ak = atoi(D);
написать
Код:
if (D=="0") ak = 0;
else ak = atoi(D);
  Ответить с цитированием
Старый 25.11.2013, 07:43   #3
 Пехотинец
Аватар для twice
 
twice на правильном путиtwice на правильном пути
Регистрация: 07.07.2012
Сообщений: 60
Популярность: 171
Сказал(а) спасибо: 3
Поблагодарили 11 раз(а) в 10 сообщениях
 
По умолчанию Re: Проверка вводимых данных

1. Проверка на цифру + перевод в число :
Код:
#include <ctype>
...
for(int i=0; i < sizeof(N) ;i++)
{
    if (isdigit(N[i]))
       a = a*10 + (N[i] - '0');
}
2. Добавь инициализацию переменных, особенно массивов.
3.
Код:
	cin >> N;
	 a = atoi(N);
	  if (a==0 || a>100)
		do
			{
			cout << "строка введена неверно, введите строку еще раз!" << endl;
			cin >> N;
			a = atoi(N);
			}while  (a==0 || a>100);
Логичней записать так:
Код:
for(;;)
{
    cin >> N;
    a = atoi(N);
    if ((a > 0) && (a <= 100))
        break;
    cout << "строка введена неверно, введите строку еще раз!" << endl;
}

Последний раз редактировалось twice; 25.11.2013 в 07:49.
  Ответить с цитированием
Старый 25.11.2013, 08:33   #4
 Разведчик
Аватар для NerdyCodingKid
 
NerdyCodingKid на правильном путиNerdyCodingKid на правильном пути
Регистрация: 18.11.2013
Сообщений: 3
Популярность: 197
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 9 сообщениях
 
По умолчанию Re: Проверка вводимых данных

Цитата:
Сообщение от hunkerПосмотреть сообщение
Попробуй вместо
Код:
a = atoi(N);
написать
Код:
if (N=="0") a = 0;
else a = atoi(N);
и вместо
Код:
ak = atoi(D);
написать
Код:
if (D=="0") ak = 0;
else ak = atoi(D);

На будущее - для сравения строк в крестах нужно использовать strcmp (wcscmp для юникода), а не оператор сравнения. В противном случае сравниваются указатели.
Автору - а на каком месте падает хоть? Посмотри в отладчике.
  Ответить с цитированием
Старый 25.11.2013, 17:18   #5
 Разведчик
Аватар для polzo
 
polzo вызывает надежду
Регистрация: 12.01.2011
Сообщений: 24
Популярность: -20
Сказал(а) спасибо: 19
Поблагодарили 6 раз(а) в 6 сообщениях
Отправить сообщение для polzo с помощью ICQ Отправить сообщение для polzo с помощью Skype™
 
По умолчанию Re: Проверка вводимых данных

Цитата:
Сообщение от hunkerПосмотреть сообщение
Попробуй вместо
Код:
a = atoi(N);
написать
Код:
if (N=="0") a = 0;
else a = atoi(N);
и вместо
Код:
ak = atoi(D);
написать
Код:
if (D=="0") ak = 0;
else ak = atoi(D);

Не работает(

Цитата:
Сообщение от twiceПосмотреть сообщение
1. Проверка на цифру + перевод в число :
Код:
#include <ctype>
...
for(int i=0; i < sizeof(N) ;i++)
{
    if (isdigit(N[i]))
       a = a*10 + (N[i] - '0');
}

Я пытался делать через isdigit, только при вводе русских букв у меня программа вылетала(

Цитата:
Сообщение от NerdyCodingKidПосмотреть сообщение
Автору - а на каком месте падает хоть? Посмотри в отладчике.

Программа не вылетает, просто atoi переводит буквенную строку в 0, у меня идет проверка на 0... Поэтому просто не могу в ячейку массива ввести 0.
  Ответить с цитированием
Старый 25.11.2013, 17:30   #6
 Разведчик
Аватар для NerdyCodingKid
 
NerdyCodingKid на правильном путиNerdyCodingKid на правильном пути
Регистрация: 18.11.2013
Сообщений: 3
Популярность: 197
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 9 сообщениях
 
По умолчанию Re: Проверка вводимых данных

Цитата:
Сообщение от polzoПосмотреть сообщение
Не работает

Правильно.
Потому-что должен быть не D=="0" а *D == '0'

Цитата:
Сообщение от polzoПосмотреть сообщение
Я пытался делать через isdigit, только при вводе русских букв у меня программа вылетала(

Потому-что кириллица - это уже юникод. Попробуй iswdigit
  Ответить с цитированием
Старый 25.11.2013, 17:43   #7
 Разведчик
Аватар для polzo
 
polzo вызывает надежду
Регистрация: 12.01.2011
Сообщений: 24
Популярность: -20
Сказал(а) спасибо: 19
Поблагодарили 6 раз(а) в 6 сообщениях
Отправить сообщение для polzo с помощью ICQ Отправить сообщение для polzo с помощью Skype™
 
По умолчанию Re: Проверка вводимых данных

Цитата:
Сообщение от NerdyCodingKidПосмотреть сообщение
Правильно.
Потому-что должен быть не D=="0" а *D == '0'

Все равно не работает(

Цитата:
Сообщение от NerdyCodingKidПосмотреть сообщение
Потому-что кириллица - это уже юникод. Попробуй iswdigit

Спасибо за совет! iswdigit работает) сейчас попробую переписать начало
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Страница для кражи вводимых данных vice73rus Вопросы и ответы, обсуждения 7 29.02.2012 20:22
[Информация] ПРОВЕРКА!!! lkotikl Общение и обсуждение 18 28.10.2010 11:24

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 03:06.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net