Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将输入字符串与C中包含整数变量的字符串进行比较?_C_String_Strcmp - Fatal编程技术网

将输入字符串与C中包含整数变量的字符串进行比较?

将输入字符串与C中包含整数变量的字符串进行比较?,c,string,strcmp,C,String,Strcmp,我试图将输入的字符与格式为“!x”的字符串进行比较,其中x是任意整数 最简单的方法是什么?我试过了 int result = strcmp(input,"!%d"); 这不起作用。这里有一种方法: int is_bang_num(const char *s) { if (*s != '!') { return 0; } size_t n = strspn(s + 1, "0123456789"); return n > 0 &&am

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

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

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

这不起作用。

这里有一种方法:

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';
}

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

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

您可以看到,
scanf()
函数族返回一个值,该值指示转换了多少个参数

即使是书籍通常也会忽略这个值,这会导致程序员忽略它确实返回了一个值。这种情况的后果之一是当
scanf()
函数失败且值未初始化时,即在调用
scanf()
之前,以及由于
scanf()

您可以使用
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;
}
#包括
int
主(空)
{
常量字符*字符串;
int值;
int结果;
string=“!12345”;
结果=sscanf(字符串,!%d,&值);
如果(结果==1)
fprintf(stderr,“值为:%d\n”,值);
其他的
fprintf(stderr,“字符串与模式不匹配\n”);
返回0;
}
如您所见,如果成功扫描了一个参数,则表示字符串与模式匹配,否则就不匹配


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

因为stirng必须以!然后跟一个整数,使用一个限定的
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;
}

你为什么期望它能起作用?不清楚你想要实现什么,输入的内容是什么?@AlanAu第二个字符是字符而不是int时,我如何捕捉?@sc1892353所有字符都是字符。你能澄清你的意图吗?我确实认为这是OP想要的。但这段代码绝对不安全。@iharob它怎么不安全?@iharob这个函数接受一个字符串
NULL
不是字符串。您无法防止调用方传递非字符串<代码>*s=='\0'
可以。这有什么不安全之处?@iharob标准库中没有任何字符串函数检查
NULL
。在这种情况下,您所能做的就是在调用者中隐藏一个bug(或者调用
abort()
,但在这种情况下,为什么不干脆崩溃呢?)。OP的编码代码是“将输入字符串与字符串进行比较…”
NULL
不是字符串,因此不需要检查
s==NULL
。我们可以为
NULL
添加检查,可以添加检查以查看整数是否在
int
范围内,所有类型的未请求检查。与其说是那些次要问题,不如说是“x是任意整数”的代码目标问题。比如“-123”、“+0xABC”?这里没有提到这些问题。如果说“失败”是指成功解析它,那么是的。
scanf
%d
跳过了前导空格。@melpomene没错,我昨晚没有想清楚,因为我太累了。