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

时间:2015-09-17 15:23:00

标签: c string int strcmp

只有在!之后直接打印时,我才难以从用户输入扫描整数(并存储它):

   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()的完全错误的语法,但仅作为我收集用户输入的示例。

3 个答案:

答案 0 :(得分:1)

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

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

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


/* ... */

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

答案 1 :(得分:1)

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

例如:

int n = 0;

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

格式说明符%d告诉sscanf查找有效的十进制整数。感叹号没有特殊含义,只有在有感叹号时才会匹配。前面的空间意味着命令可能具有前导空格。请注意,在exclam之后和数字之前可能存在空格,并且数字可能是负数。

格式说明符对于scanf系列是特殊的并且与'%d format of printf`有关,但不同。通常在其他字符串中没有任何意义,当代码中没有引用它时肯定没有意义。

答案 2 :(得分:0)

使用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}