C - 如何扫描仅在符号后输入的整数

C - How to scan an int only entered after symbol

只有在 !:

之后直接打印时,我才能从用户输入的整数中扫描(并存储它)
   char cmd[MAX_LINE/2 + 1];  
   if (strcmp(cmd, "history") == 0)
       history(hist, current);
   else if (strcmp(cmd, "!!") == 0)
       execMostRecHist(hist, current-1);
   else if (strcmp(cmd, "!%d") == 0)
       num = %d;
   else
       {//do stuff}

我知道这对 strcmp() 来说是完全错误的语法,但这只是作为我如何收集用户输入的示例。

你不是喜欢自己写检查器吗?

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

int check(const char *code) {
    if (code == NULL || code[0] != '!') return 0;
    while(*(++code) != '[=10=]') {
        if (!isdigit(*code)) return 0;
    }
    return 1;
}


/* ... */

if (check(cmd))
    sscanf(cmd + 1, "%d", &num);

strcmp 不知道格式说明符,它只是比较两个字符串。 sscanf 做你想做的事:它测试一个字符串是否具有特定格式并将字符串的一部分转换为其他类型。

例如:

int n = 0;

if (sscanf(cmd, " !%d", &num) == 1) {
    // Do stuff; num has already been assigned
}

格式说明符 %d 告诉 sscanf 查找有效的十进制整数。感叹号没有特殊意义,只有有感叹号才匹配。前面的 space 表示该命令可能有前导白色 space。请注意,在感叹号之后和数字之前可能有白色 space,并且该数字很可能是负数。

格式说明符对于 scanf 系列来说是特殊的,并且与'%dformat ofprintf' 相关但又不同。通常在其他字符串中没有任何意义,当它在代码中未被引用时当然也没有。

使用 sscanf() 并检查其结果。

char cmd[MAX_LINE/2 + 1];  
num = 0;  // Insure `num` has a known value
if (strcmp(cmd, "history") == 0)
   history(hist, current);
else if (strcmp(cmd, "!!") == 0)
   execMostRecHist(hist, current-1);
else if (sscanf(cmd, "!%d", &num) == 1)
   ;
else
   {//do stuff}