scanf() 只有符号和数字
scanf() only sign and number
我想用 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 {...}
谢谢。
你好像忘记了这里的逗号:
scanf(" %c %d", &sign &number)
此外,space 既多余又错误。
应该是
scanf(" %c%d", &sign, &number)
scanf(" %c %d", &sign &number) != 2
不起作用,因为格式不 要求 char
和 int
之间的 space。 " "
匹配 0 个或多个 white-space,而不是单个 ' '
.
所以代码需要寻找 sign、space 和 number .
char sign[2];
int number;
if (scanf(" %1[+-]%*1[ ]%d", sign, &number) != 2) {
puts("Fail");
}
" "
扫描跳过可选白-space
"%1[+-]"
扫描保存1+或-
"%*1[ ]"
扫一扫不存一个space.
"%d"
扫描 white-spaces 然后 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] != '[=11=]') {
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) 测试尾随非白-spaceif (buf[n] != '[=30=]')
注意:不检查溢出。
我想用 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 {...}
谢谢。
你好像忘记了这里的逗号:
scanf(" %c %d", &sign &number)
此外,space 既多余又错误。 应该是
scanf(" %c%d", &sign, &number)
scanf(" %c %d", &sign &number) != 2
不起作用,因为格式不 要求 char
和 int
之间的 space。 " "
匹配 0 个或多个 white-space,而不是单个 ' '
.
所以代码需要寻找 sign、space 和 number .
char sign[2];
int number;
if (scanf(" %1[+-]%*1[ ]%d", sign, &number) != 2) {
puts("Fail");
}
" "
扫描跳过可选白-space
"%1[+-]"
扫描保存1+或-
"%*1[ ]"
扫一扫不存一个space.
"%d"
扫描 white-spaces 然后 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] != '[=11=]') {
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) 测试尾随非白-spaceif (buf[n] != '[=30=]')
注意:不检查溢出。