【问题标题】:Comparing an input string with a string that has a integer variable in C?将输入字符串与在 C 中具有整数变量的字符串进行比较?
【发布时间】:2015-09-19 21:41:00
【问题描述】:

我正在尝试将输入的字符与格式为“!x”的字符串进行比较,其中 x 是任何整数。

最简单的方法是什么?我试过了

int result = strcmp(input,"!%d");

这不起作用。

【问题讨论】:

  • 你为什么期望它可以工作?
  • 不清楚你想实现什么,input的内容是什么?
  • @AlanAu 当第二个字符是 char 而不是 int 时如何捕捉?
  • @sc1892353 所有字符都是字符。
  • 你能说明一下你的意图吗?

标签: c string strcmp


【解决方案1】:

这是一种方法:

int is_bang_num(const char *s) {
    if (*s != '!') {
        return 0;
    }
    size_t n = strspn(s + 1, "0123456789");
    return n > 0 && s[1 + n] == '\0';
}

这将验证第一个字符是!,后面是更多字符,并且后面的所有字符都是数字。

【讨论】:

  • 我确实认为这是 OP 想要的。但是这段代码不必要地不安全。
  • @iharob 怎么不安全?
  • @iharob 这个函数接受一个字符串。 NULL 不是字符串。您无法防止调用者传递非字符串。 *s == '\0' 很好。这有什么不安全的?
  • @iharob 标准库中的字符串函数都没有检查NULL。在这种情况下你所能做的就是在调用者中隐藏一个错误(或调用abort(),但在这种情况下为什么不简单地崩溃呢?)。
  • OP 的编码代码是“将输入字符串与字符串进行比较...”。 NULL 不是字符串,因此不需要检查 s==NULL。我们可以NULL 添加检查,可以添加检查以查看整数是否在int 范围内,所有类型的未请求检查。而不是那些附带问题:“x 是任何整数”的代码目标问题呢?比如 "-123", `+0xABC"?这些不是这里的地址。
【解决方案2】:

你看,scanf() 系列函数返回一个值,指示转换了多少参数。

即使是书籍也通常会忽略这个值,这会导致程序员忽略它确实返回了一个值。其后果之一是 Undefined Behavior,当 scanf() 函数失败且值未初始化时,不是在调用 scanf() 之前,因为它也不是由 scanf() 失败。 p>

你可以使用sscanf()返回的这个值来检查是否成功,像这样

#include <stdio.h>

int
main(void)
{
    const char *string;
    int value;
    int result;
    string = "!12345";
    result = sscanf(string, "!%d", &value);
    if (result == 1)
        fprintf(stderr, "the value was: %d\n", value);
    else
        fprintf(stderr, "the string did not match the pattern\n");
    return 0;
}

如您所见,如果一个参数被成功扫描,则表示该字符串匹配模式,否则不匹配。

使用这种方法,您还可以提取整数值,但您应该小心,因为scanf() 不适用于正则表达式,这适用于非常简单的情况。

【讨论】:

  • 如果“失败”是指解析成功,那么可以。 scanf %d 跳过前导空格。
  • @melpomene 没错,昨晚我没有想清楚,因为我很累。
【解决方案3】:

因为搅拌必须以 !并跟随一个整数,使用一个合格的strtol(),它允许一个前导符号字符。由于 OP 没有指定整数的范围,让我们允许任何范围。

int is_sc_num(const char *str) {
  if (*str != '!') return 0;
  str++;

  // Insure no spaces- something strtol() allows.
  if (isspace((unsigned char) *str) return 0;

  char *endptr;
  // errno = 0;

  // By using base 0, input like "0xABC" allowed
  strtol(str, &endptr, 0);

  // no check for errno as code allows any range
  // if (errno == ERANGE) return 0

  if (str == endptr) return 0;  // no digits
  if (*endptr) return 0; // Extra character at the end
  return 1;
}

【讨论】:

    【解决方案4】:

    如果你想测试一个字符串是否匹配一个感叹号的格式,然后是一些数字系列,这个正则表达式:“!\d+”将匹配那个。如果第一个数字为零,则不会捕获,这是无效的。这将:“![1,2,3,4,5,6,7,8,9]\d*”。

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      相关资源
      最近更新 更多