scanf()只有符号和数字

时间:2015-11-11 22:06:29

标签: c scanf

我想用scanf()获取变量 sign number
它应该如何运作:

 input:
 + 10
 output:
 OK, "sign = +" and "number = 10"

 input:
 +10
 output:
 Fail!

 input:
 10
 output:
 Fail!

 input:
 a
 output:
 Fail!

我尝试过这个解决方案,但它对我没用。特别是对于输入: +10 a

 plus='+';
 minus='-';     

 if ( scanf(" %c %d", &sign, &number) != 2 || ((sign != minus) && (sign != plus)) || number < 0 ) 
                {
                printf("Fail!");
                } 
            else {...}

感谢。

2 个答案:

答案 0 :(得分:5)

scanf(" %c %d", &sign &number) != 2不起作用,因为格式不会要求 charint之间的空格。 " "匹配0个或更多空格,而不是' '

因此代码需要查找 sign space number

char sign[2];
int number;
if (scanf(" %1[+-]%*1[ ]%d", sign, &number) != 2) {
  puts("Fail");
}

" "扫描并跳过可选的空白区域 "%1[+-]"扫描并保存1 +或 -
"%*1[ ]"扫描并且不保存空间 "%d"扫描空格,然后扫描int

注意:最好使用fgets(),阅读该行,然后使用sscanf()

[编辑]更强大的解决方案 - 它使用fgets(),因为强大的解决方案不使用scanf()

  char buf[80];
  if (fgets(buf, sizeof buf, stdin) == NULL) {
    puts("EOF");
  } else {
    int n = 0;
    sscanf(buf," %*1[+-]%*1[ ]%*[0-9] %n", &n);
    if (n == 0) {
      puts("Fail - conversion incomplete");
    } else if (buf[n] != '\0') {
      puts("Fail - Extra garbage");
    } else {
      char sign;
      int number;
      sscanf(buf," %c%d", &sign, &number);
      printf("Success %c %d\n",sign, number);
    }
  }

"%n"保存扫描的字符数。

提示:将%n"附加到int n = 0; ... sscanf(..., "... %n"到格式的末尾是一个简单的方法,1)测试扫描是否不完整if (n == 0)和2)测试尾随非白色 - 空间if (buf[n] != '\0')

注意:不检查溢出。

答案 1 :(得分:0)

你似乎忘记了逗号:

scanf(" %c %d", &sign &number)

此外,空间既冗余又错误。 它应该是

scanf(" %c%d", &sign, &number)