2015-11-28 3 views
-1

Итак, я пытался создать эту программу, которая будет содержать до 12 цифр от пользователя, используя строковые и строковые классы. Вопрос, который у меня есть, составляет:Проверка пользовательского ввода строки пользователя

  1. Игнорирует (-) знак.
  2. Игнорирование десятичной точки.
  3. Ошибка при вводе более 12 цифр.
  4. только принимающие цифры (т.е. без букв)

До сих пор это то, что у меня есть:

#include <iostream> 
#include <string> 
#include <cctype> 
#include <iomanip> 

using namespace std; 

bool test(char [] , int); 

int main() 
{ 
const int SIZE= 13; 
char number[SIZE]; 
int count; 

cout<< "Please enter a number up to "<< (SIZE-1) <<" digits long." << endl; 
cout<< "The number may be positive or negative" << endl; 
cout<< "and may include fractions (up to two decimal positions)" << endl; 
cout<< "Sign and decimal dot(.) are not included in the digit count:"<< "\t"; 

cin.getline (number, SIZE); 

if (test(number, SIZE)) 
    { 
    while (number[count]!='\0') 
     { 
     cout<< "The currency value is: \t $"; 
     cout<< setprecision(2) << number[count]; 
     count++; 
     } 
    } 
else 
    { 
     cout << "Invalid number: contains non-numeric digits."; 
    } 

return 0; 
} 



bool test(char testNum[], int size) 
{ 
int count; 

for (count = 0; count< size; count++) 
    { 
     if(!isdigit(testNum[count])) 
      return false; 
    } 

return true;  
} 

Любая помощь очень высоко ценится, но самое главное для меня в данный момент является 4-й пункт. Независимо от того, что вводится, вывод «Недопустимый номер: ....», и я не уверен, почему это так.

+4

Вы даже проверяете терминатор (null char) на 'isdigit()'. Тем не менее, почему вы используете исходный массив? Используйте строку 'std :: string,' и затем прочитайте эту строку с 'getline (std :: cin, line);' и начните проверку оттуда. –

+0

Итак, чтобы не тестировать (нулевой символ), который я положил для (count

+1

Посмотрите, сколько символов вы ввели и сколько вы проверили. –

ответ

0

Ваша тестовая функция всегда проверяет 13 символов, даже если вход короче.

Вместо передать строку и использовать диапазон на основе для цикла, так что вы только проверить действительные символы - что-то вроде:

bool test(string testNum) 
{ 
    for (auto c : testNum) 
    { 
     if(!isdigit(c)) 
      return false; 
    } 

    return true;  
} 

Далее вы должны изменить основной-цикл (где вы печатаете значение) а также использовать строку вместо char-array.

BTW - обратите внимание, что это будет проверяться только на цифры. Для описания допустимого формата ввода потребуется более сложная тестовая функция.

Например, чтобы проверить на знак можно добавить:

bool test(string testNum) 
{ 
    bool signAllowed = true; 
    for (auto c : testNum) 
    { 
     if (c == '-') 
     { 
      if (!signAllowed) return false; 
     } 
     else 
     { 
      if(!isdigit(c)) return false; 
     } 

     // Sign not allowed any more 
     signAllowed = false; 
    } 

    return true;  
} 

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

Если вы не хотите использовать пастбища (.) основанный на петле, вы можете сделать:

+0

Все имеет смысл для меня, кроме авто с, не могли бы вы объяснить, что это такое? Вы используете ключевое слово auto для c? –

+0

'auto' - это как короткая рука для записи типа, т. Е. Компилятор автоматически назначит правильный тип. В этом случае вы также можете написать 'for (char c: testNum)', потому что диапазон, основанный на loop для строки, будет возвращать символы в строке один за другим. – 4386427

+0

'std :: all_of' выполняет этот же процесс –

Смежные вопросы