【问题标题】:C code : Check whether alphanumeric value falls in specific alphanumeric rangeC代码:检查字母数字值是否在特定的字母数字范围内
【发布时间】:2022-01-28 18:03:17
【问题描述】:

如何使用 C 代码进行检查, 给定的字符串是否在字母数字值的开始和结束范围内?

Eg : 
given_string = "G32"
start_string = "F00"
stop_string  = "H44"

The valid sequence here will be a set of values below:
F00 F01 F02 ------ F99
G00 G01 G02 G03 ----- G99
H00 H01 H02 H03 ----- H44

所以在这种情况下,G32 落在 F00 - H44 范围内。因此 G32 将是有效的。 如果我们考虑 E99 或 H45,它们将不在该范围内。因此它们将是无效的。

【问题讨论】:

  • “H5”应该落入范围吗?按字母顺序没有;从数字上看确实如此。我想说明的是,您需要更准确地了解排序概念和/或输入语法的假设(例如要检查的字符串长度)。
  • IMO OP 通过“有效序列将是下面的一组值:”明确表示。 “H5”无效。
  • 没错矢野。这些验证在验证范围的 given_string 之前完成。字母部分单独验证,2位数字部分单独验证。其他无效输入字符串示例:1E5 6NZ A1 1A

标签: c validation sequence alphanumeric


【解决方案1】:

您可以使用strcmp。来自manpage

strcmp() returns an integer indicating the result of the comparison, as follows:
• 0, if the s1 and s2 are equal;
• a negative value if s1 is less than s2;
• a positive value if s1 is greater than s2.

这里有一些说明性代码

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

bool StrInRange(const char* start, const char* end, const char* testStr)
{
    // start is "F00", so if this comparison returns 0 or negative,
    // testStr is equal or "bigger" than testStr
    bool aboveStart = strcmp(start, testStr) <= 0;
    // end is "H44", so if this comparison returns 0 or positive,
    // testStr is equal or "smaller" than testStr
    bool belowEnd = strcmp(end, testStr) >= 0;
    // if both are true, testStr is within range.
    return aboveStart && belowEnd;
}

int main(void)
{
    const char* START_STR = "F00";
    const char* END_STR = "H44";

    const char* testStrs[] = {"G32", "E99", "H45", "F00", "H44", "G00"};

    for (size_t i=0; i< sizeof(testStrs)/sizeof(*testStrs); i++)
    {
        if (StrInRange(START_STR, END_STR, testStrs[i]) == true)
        {
            printf("String in range\n");
        }
        else
        {
            printf("String NOT in range\n");
        }
    }

    return 0;
}

输出:

String in range
String NOT in range
String NOT in range
String in range
String in range
String in range

Demonstration

事情可能会根据字符串长度、大小写等而改变。

【讨论】:

  • 很遗憾我忘记了 strcmp 的正负返回值。我正在尝试如此复杂的方法,例如在范围之间生成序列并匹配值 - 这非常不利于内存。感谢 Yano 的准确回答以及演示的链接。我也从你的回答中学到了一些东西。放一个演示链接:-)也谢谢你。
  • 这将验证 FXYG()H4
  • @SGeorgiades 这些都不在 OP 描述的有效集合中。
  • @yano 是的......因此应该被拒绝为无效。我们应该提倡正确的错误检查。
  • @SGeorgiades OP 在 cmets 中指出,在到达代码的这一点之前已经发生了验证类型,因此它超出了问题的范围。很明显,当达到这部分代码时,OP 将有一些 3 字符字符串,以大写字母开头,后跟 2 个数字。话虽如此,我绝不坚持我的答案是解决问题的唯一最佳方法。但考虑到问题的限制和要求,这是一个可行的解决方案。
【解决方案2】:

这样的事情应该可以工作:

#include <stdio.h>
#include <ctype.h>

typedef struct {
    char letter;
    int number;
} value_t;

value_t get_value(char *str)
{
    value_t result;

    if (strlen(str) != 3  ||    // Validate that string is 3 characters long
            !isupper(*str)  ||  // Validate that first character is uppercase
            !isdigit(str[1]  ||  !isdigit(str[2])) {  // Validate that remaining characters are digits
        printf("Invalid string!\n");
        exit(-1);
    }
    result.letter = *str;
    result.number = (str[1] - '0') * 10 + (str[2] - '0');
    return result;
}

int in_range(value_t min,value_t max,value_t val)
{
    if (val.letter < min.letter  ||  (val.letter == min.letter  &&  val.number < min.number))
        return 0;
    if (val.letter > max.letter  ||  (val.letter == max.letter  &&  val.number > max.number))
        return 0;
    return 1;
}

int main(int argc,char *argv[])
{
    value_t MIN = { 'F', 0 }, MAX = { 'H', 44 }, val;

    val = get_value(argv[1]);
    if (in_range(MIN,MAX,val))
        printf("%s is in range\n",argv[1]);
    else
        printf("%s is out of range\n",argv[1]);
}

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2021-04-01
    • 1970-01-01
    • 2022-08-11
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多