【问题标题】:How to restrict input to what is needed? ( eg: no numbers where letters are supposed to be inputted )如何将输入限制在需要的范围内? (例如:没有应该输入字母的数字)
【发布时间】:2014-05-16 17:53:53
【问题描述】:

谁能告诉我检查输入类型的最佳方法是什么?例如,如果我要求某人输入他们的姓名,我想确保他们不输入数字。或者当我询问他们的年龄时,我不希望字母被估算。我尝试过使用 switch 语句,但这似乎不是一个好主意。

【问题讨论】:

  • 到目前为止你尝试过什么?输入是 C 字符串的形式吗?你有可用的“正则表达式”库吗?这将是最简单的检查方法。否则,您必须逐个字符地检查字符串并检查 isalpha()、isdigit() 等。
  • 使用isdigitisalpha等函数来测试一个字符是数字还是字母。
  • sscanf() 想法:char buf[100]; fgets(buf, sizeof buf, stdin); int n = -1; sscanf(buf, " %*[A-Za-z ]%*[\n]%n", &n); if (n > 0 && buf[n] == '\0') GoodName();
  • 最好使用strtol()函数族来测试数字输入。
  • 在编写更多操作名称的代码之前,您可能会考虑阅读kalzumeus.com/2010/06/17/…

标签: c input


【解决方案1】:

isalpha() 在 C 中仅适用于字符。构建一个遍历字符串的函数,并检查isalpha()是否接受所有字符

见:

int string_is_name(char *s)
{
    int i;
    int valid = 1;
    for (i = 0; i < strlen(s); i++) {
        if (!isalpha(s[i])) {
            valid = 0;
            break;
        }
    }
    return valid;
}

【讨论】:

  • 1) 最好使用!isalpha((unsigned char) s[i]) 来防止UB。 2) 最好使用size_t i;
  • @chux 您使用 size_t 作为循环索引?为什么这是一种更好的方法?
  • @chux 我能想到的唯一原因是溢出(如果数组中有超过 MAX_INT 的元素),但这真的会发生吗?使用 int 或 unsigned int 更清楚,不是吗?
  • 哪一个更清楚intunsignedsize_t 是一个主观问题——因此不可能有明确的答案。但是从技术上讲,使用size_t 是正确的,size_tstrlen() 的返回类型,size_t 被很好地定义为从基础s 索引数组。 int 遭受负索引(此处不适用)和您提到的范围。 “这真的会发生吗?”:不太可能,除非有人在 64 位机器上编写病毒以利用 int 范围的弱点。我建议练习安全索引。
  • 感谢您的洞察力。今后我会牢记这一点。
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2015-10-22
  • 2018-08-30
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多