【问题标题】:Preventing user from inputting certain chars in c++ [closed]防止用户在 C++ 中输入某些字符 [关闭]
【发布时间】:2014-12-29 14:58:46
【问题描述】:

我对 c++ 很陌生,所以请理解我的问题可能很愚蠢。

我需要创建一个函数,该函数从用户那里获取一个表并仅用特定字符填充它。假设用户需要输入他的姓名。如果用户输入从 A 到 Z(或 a 到 z)的字符,则该字符应显示在屏幕上,在这种情况下,一切都很好。问题是 - 当用户输入一个禁止字符(例如 1-9)时,它不应该显示在屏幕上并且光标应该保持在同一位置)。

你们知道怎么做吗?

【问题讨论】:

  • 这是标准 c++ 函数无法实现的。
  • 或许您可以使用getchar 测试该字符是否有效,然后使用putch(<backspace equivalent>) 将其删除?

标签: c++ input


【解决方案1】:

也许你可以用它来完成你的工作:

char ch;

while(ch = getch())
{
    if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z'))
    {
        cout << ch;
    }
}

这将仅打印 [A-Z][a-z]。您还可以存储所需的字符以供进一步使用。

【讨论】:

  • 此答案假定为 ASCII。
  • 如果用户输入一个从 A 到 Z(或 a 到 z)的字符,该字符应该显示在屏幕上。
【解决方案2】:

在 Windows 上,您可以使用 conio.h

另外,您可以重载istream::operator&gt;&gt; 函数,以使解决方案更加优雅和易于使用:

完整示例:

#include <iostream>
#include <conio.h>

using namespace std;


struct person_t
{
    string name;
    string last_name;
};

// This is the function you're looking for.
void get_filtered_string(string &str)
{
    char c;
    str = "";

    do
    {
        c = _getch();

        if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z'))
        {
            putchar(c); // 1
            str.push_back(c);
        }

    } while (c != '\r'); // 2

}


istream &operator>>(istream &stream, person_t &person)
{
    string str = "";

    cout << "Enter name: ";
    get_filtered_string(str);
    person.name = str;
    cout << endl;

    cout << "Enter last name: ";
    get_filtered_string(str);
    person.last_name = str;
    cout << endl;

    return stream;
}

int main()
{
    person_t person;
    cin >> person;
    cout << person.name.c_str() << " " << person.last_name.c_str() << endl;
    return 0;
}
  1. 将字符输出到屏幕。

  2. 在 Windows 中,当您按 Enter 时,您将按顺序引入两个字符 '\r''\n'。这就是为什么我们在这里查看'\r'

【讨论】:

  • 非常感谢您的解决方案,它奏效了。唯一可以添加的是能够使用退格键和其他文本编辑键,但这可以通过编辑 IF 轻松实现。非常感谢
  • 此答案假定为 ASCII。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多