Как сделать проверку на ввод символов в c

от admin

Verifying that a string contains only letters in C#

I have an input string and I want to verify that it contains:

  • Only letters or
  • Only letters and numbers or
  • Only letters, numbers or underscore

To clarify, I have 3 different cases in the code, each calling for different validation. What’s the simplest way to achieve this in C#?

12 Answers 12

Only letters and numbers:

Only letters, numbers and underscore:

Philippe Leybaert's user avatar

Letters and numbers:

Letters, numbers and underscore:

Note, these patterns also match international characters (as opposed to using the a-z construct).

For those of you who would rather not go with Regex and are on the .NET 2.0 Framework (AKA no LINQ):

Only Letters:

Only Numbers:

Only Numbers Or Letters:

Only Numbers Or Letters Or Underscores:

I think is a good case to use Regular Expressions:

You can loop on the chars of string and check using the Char Method IsLetter but you can also do a trick using String method IndexOfAny to search other charaters that are not suppose to be in the string.

Iterate through strings characters and use functions of ‘Char’ called ‘IsLetter’ and ‘IsDigit’.

If you need something more specific — use Regex class.

Arnis Lapsa's user avatar

I haven’t yet seen a solution using pattern matching:

or if you really really hate readable code:

Frederik Hoeft's user avatar

I added a check so that I could only get the Alphabets and white spaces. You can repeat the for loop after the second if statement to validate the string again.

Recently, I made performance improvements for a function that checks letters in a string with the help of this page.

I figured out that the Solutions with regex are 30 times slower than the ones with the Char.IsLetterOrDigit check.

We were not sure that those Letters or Digits include and we were in need of only Latin characters so implemented our function based on the decompiled version of Char.IsLetterOrDigit function.

Here is our solution:

And the usage is like this:

Please find the method to validate if char is letter, number or space, otherwise attach underscore (Be free to modified according your needs)

Use this to scan each CHARACTER of the STRING.

You can add SWITCH STATEMENT after 1 IF STATEMENT if you want to include "many" characters aside from ‘SPACE’.

OUTPUT: With FALSE Input

Enter Letters Only
Agent 47
Checking Character "A"
Checking Character "g"
Checking Character "e"
Checking Character "n"
Checking Character "t"
Checking Character " "
Checking Character "4"
Oops. "4" is not a Valid Input
pls try again

Enter Letters Only

OUTPUT: Without FALSE Input

Enter Letters Only
Agent Forty Seven
Checking Character "A"
Checking Character "g"
Checking Character "e"
Checking Character "n"
Checking Character "t"
Checking Character " "
Checking Character "F"
Checking Character "o"
Checking Character "r"
Checking Character "t"
Checking Character "y"
Checking Character " "
Checking Character "S"
Checking Character "e"
Checking Character "v"
Checking Character "e"
Checking Character "n"
Input Approved: "Agent Forty Seven"
Press any key to exit

Or SWITCH STATEMENT only, if you only want to include "some" CHARACTERS from LETTER category & "some" CHARATERS from DIGIT category.

Урок №72. Обработка некорректного пользовательского ввода

Большинство программ, имеющих хоть какой-либо пользовательский интерфейс, сталкиваются с обработкой пользовательского ввода. В программах, которые мы писали раньше, используется std::cin для получения пользовательского ввода. А так как ввод данных имеет свободную форму (пользователь может ввести всё, что пожелает), то пользователю очень легко ввести данные, которые от него никак не ожидаются.

При написании программ, вы всегда должны учитывать, как пользователи (преднамеренно или непреднамеренно) могут использовать ваши программы. Хорошо написанная программа предвидит, как ею могут злоупотребить, и либо будет обрабатывать такие случаи, либо предотвращать их (если это возможно). Программа, которая имеет обработку некорректного ввода, называется надежной.

На этом уроке мы рассмотрим, как пользователи могут вводить некорректные данные через std::cin, а также как с этим бороться.

std::cin, буфер данных и извлечение

Прежде чем разбираться с обработкой некорректного ввода через std::cin и оператор >> , давайте сначала рассмотрим их принцип работы.

Процесс, когда мы используем оператор >> для получения данных от пользователя и размещение этих данных в определенной переменной, называется извлечением. Соответственно, оператор >> называется оператором извлечения.

Когда пользователь вводит данные в ответ на операцию извлечения, то эти данные помещаются в буфер std::cin. Буфер данных — это просто часть памяти, зарезервированная для временного хранения данных, когда они перемещаются из одного места в другое. В этом случае буфер используется для хранения пользовательского ввода, пока он находится в режиме ожидания выделения для него переменных.

При использовании оператора извлечения, выполняется следующая процедура:

Если во входном буфере есть данные, то эти данные используются для извлечения.

Если во входном буфере нет данных, то пользователю предлагается ввести данные (обычно именно это и происходит в большинстве случаев). Когда пользователь нажимает Enter, символ новой строки \n помещается во входной буфер.

Читать:
Как написать число пи на клавиатуре

Оператор >> извлекает столько данных из входного буфера в переменную, сколько позволяет размер самой переменной (игнорируя любые пробелы, табы или \n ).

Любые данные, которые не были извлечены, остаются во входном буфере для последующего извлечения.

Извлечение данных считается успешным, если по крайней мере один символ был извлечен из входного буфера. Оставшиеся данные во входном буфере используются для последующих извлечений. Например:

Если пользователь введет 7d , то 7 будет извлечено, преобразовано в целое число и присвоено переменной a . А d\n останется во входном буфере дожидаться следующего извлечения.

Извлечение не выполняется, если данные ввода не соответствуют типу переменной, выделенной для них. Например:

Если бы пользователь ввел z , то извлечение не выполнилось бы, так как z не может быть извлечено в целочисленную переменную.

Проверка пользовательского ввода

Существует три основных способа проверки пользовательского ввода:

Предотвращение некорректного пользовательского ввода.

Пользователь может вводить всё, что хочет, но осуществляется последующая проверка данных. Если проверка прошла успешно, то выполняется перемещение данных в переменную.

Пользователь может вводить всё, что хочет, но при операции извлечения данных оператором >> параллельно решаются возможные ошибки.

Некоторые графические пользовательские интерфейсы или расширенные текстовые интерфейсы позволяют проверять ввод пользователя сразу (символ за символом). Программист создает функцию проверки данных, которая принимает и проверяет пользовательский ввод, и, если данные ввода корректны, то возвращается true, если нет — false. Эта функция вызывается каждый раз, когда пользователь нажимает на клавишу. Если функция проверки возвращает true, то символ, который пользователь ввел — принимается. Если функция возвращает false, то символ, который только что ввел пользователь — отбрасывается (и не отображается на экране). Используя этот метод, мы можем гарантировать, что любой пользовательский ввод будет корректным, так как любые неверные нажатия клавиш будут обнаружены и немедленно удалены. К сожалению, std::cin не поддерживает этот тип проверки.

Поскольку строки не имеют никаких ограничений на то, какие символы вводятся, то извлечение гарантированно будет успешным (хотя помним, что std::cin останавливает процесс извлечения при первом обнаружении символа пробела). После ввода строки программа сразу может её проанализировать. Однако этот анализ и последующая конвертация данных в другие типы данных (например, числа) может быть сложной, поэтому это делается только в редких случаях.

Чаще всего мы позволяем std::cin и оператору извлечения выполнять тяжелую работу. В соответствии с этим методом пользователь может вводить всё, что хочет, а далее std::cin и оператор >> пытаются извлечь данные и, если что-то пойдет не так, выполняется обработка возможных ошибок. Это самый простой способ, и его мы и будем рассматривать.

Рассмотрим следующую программу «Калькулятор», которая не имеет обработки ошибок:

Как сделать проверку на ввод символов в c

int main()
int count;
char again;
double a, b;
do cout << «Hello, my dear. What are the numbers?\n»;
cout << «Number 1: «;
while(!(cin >> a))
cin.clear();
cin.ignore (10000, ‘\n’);
cout << «Number 1: «;
>

#include <iostream>
#include <windows.h>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

template<typename T, class STREAM_>
vector<T> input_validation(STREAM_&, const size_t &);

int main()
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
system(«color 0A»);

template<typename T, class STREAM_>
vector<T> input_validation(STREAM_ &strm, const size_t &count_input)
vector<T> rez;
for (;;)
string input;
vector<string> words;
string word;
getline(strm, input);
for (const auto &c : input)
if (c == ‘ ‘)
if (!word.empty())
words.push_back(word);
word.clear();
>
>
else
word.push_back(c);
>
>
if (!words.empty())
words.push_back(word);
word.clear();
>
auto flag = true;
for (const auto &word : words)
stringstream ss(word);
stringstream ss2;
string str_value;
T value;
ss >> value;
ss2 << value;
ss2 >> str_value;
if (word == str_value)
rez.push_back(value);
>
else
flag = false;
break;
>
>
if (flag && rez.size() == count_input)
break;
>
else
cout << «Ошибка. Повторите ввод» << endl;
words.clear();
word.clear();
rez.clear();
>
>
return rez;
>

Как сделать проверку на ввод символов в c

Gray Pipe

Лучший отвечающий

Вопрос

Нужно осуществить задачю в консольном приложении!Я воожу данные типа int , как проверить, что пользователь вводит токло цыфры а не знаки?

Если можно то покажите еще как провирять правильность ввода стринговых данных!Может есть для этого клас!

  • Перемещено Tagore Bandlamudi 1 октября 2010 г. 21:40 MSDN Forums consolidation (От:Visual C#)

Ответы

Для этого у всех типов данных есть метод TryParse, который попытается преобразовать в нужный тип данных.

Можно воспользоваться также регулярным выражением, который будет проверять, что все символы строки — цифры:

  • Помечено в качестве ответа I.Vorontsov 2 августа 2010 г. 7:56

Если пользователь введет нечто подобное то проверка не пройдет. Далее программа должна напечатать что то вроде "Непонимаю!Мне нужно вводить числа!" и повторить ввод. Вот примерно так:

1. Ввести строку.

2. Проверить на правильность.

3. Если неправильно то вывести сообщение о непрвильном вводе и перейти на 1.

4. Продолжить работу.

Как проверить правильность вам уже объяснили.

This posting is provided "AS IS" with no warranties, and confers no rights.

Похожие статьи