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