scanf()仅用于符号和数字

scanf()仅用于符号和数字,c,scanf,C,Scanf,我想用scanf()获取变量的符号和数字。 它的工作原理如下: input: + 10 output: OK, "sign = +" and "number = 10" 我尝试过这个解决方案,但对我不起作用。特别是对于输入:+10和a plus='+'; 负='-'; 如果(scanf(“%c%d”、&符号和数字)!=2 | |((符号!=减号)和&(符号!=加号))| |数字

我想用scanf()获取变量的符号和数字。
它的工作原理如下:

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

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

plus='+';
负='-';
如果(scanf(“%c%d”、&符号和数字)!=2 | |((符号!=减号)和&(符号!=加号))| |数字<0)
{
printf(“失败!”);
} 
否则{…}

谢谢。

您似乎忘记了这里的逗号:

scanf(" %c %d", &sign &number)
此外,该空间既冗余又错误。 应该是

scanf(" %c%d", &sign, &number)
scanf(“%c%d”&符号和数字)!=2
不起作用,因为格式在
char
int
之间不需要空格。
匹配0个或多个空格,而不是单个的


所以代码需要寻找符号、空格和数字

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


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


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

“%n”
保存扫描的字符数

提示:将
%n“
添加到
int n=0;在格式末尾添加…sscanf(…,“…%n”
是一个简单的技巧:1)测试扫描是否不完整
如果(n==0)
和2)测试尾部非空白
如果(buf[n]!='\0')


注意:不检查溢出。

什么不起作用?在
&sign
&number
之间缺少一个逗号。您最好显示实际代码。“a”不是数字,也不符合您的模式(sign number),所以它打印“Fail!”!“您想使用
scanf
或需要使用
scanf
进行作业。如果需要使用
scanf
,chux解决方案非常好。否则,如果您想实现精确的语义,不建议使用
scanf
,您应该使用
fgets
读取输入并用C进行解析。@chqri如果想使用scanf,我将查看手册中的fgets。我相信OP不希望在符号和数字之间留有空格。@CareyGregory问题中的示例是它应该如何工作,例如“+10”“应该失败。谢谢你,现在它工作得很好。我会再测试一次,但看起来不错。非常感谢。
scanf
无法可靠地完成这项工作:您非常精明的建议将在
+-10
+-10
-+10
--10
上失败。。。更不用说额外的空格了:它们应该被忽略还是被拒绝?
++10
是可以的,对于
+-10
,我将添加
| numberThanks,我在a写这篇文章时忘记了逗号。但是你的代码只适用于“+10”,对于“a”,程序正在等待另一个输入。对不起,我只是指出了容易犯的错误。如果要验证输入,请使用
fgets
读取该行,并使用
sscanf
对其进行解析,或者使用C编写简单的逻辑,
scanf
和friends都很麻烦、容易出错且效率低下。
 input:
 a
 output:
 Fail!
 plus='+';
 minus='-';     

 if ( scanf(" %c %d", &sign, &number) != 2 || ((sign != minus) && (sign != plus)) || number < 0 ) 
                {
                printf("Fail!");
                } 
            else {...}
scanf(" %c %d", &sign &number)
scanf(" %c%d", &sign, &number)
char sign[2];
int number;
if (scanf(" %1[+-]%*1[ ]%d", sign, &number) != 2) {
  puts("Fail");
}
  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);
    }
  }