所以我的程序必须从用户输入中读取2个整数并打印它们。我使用scanf,程序将在输入错误时退出。但是,当输入为“3 + 2”或“3-2”时,scanf忽略“+”和“ - ”符号,并将3和2读为两个整数输入。我想要3 + 2和3-2作为坏输入,程序将退出。我该如何解决?
int num1, num2;
if (scanf("%d%d", &num1, &num2) != 2) {
//bad input, exit the program
}
else {
//print the two integers
答案 0 :(得分:3)
您必须自己验证字符串。请考虑以下事项:
#include <stdio.h>
#include <ctype.h>
#define MAX_STR_LEN (50)
int main(void)
{
char str[MAX_STR_LEN] = {0};
int num1, num2;
printf("Enter two numbers: ");
fgets(str, MAX_STR_LEN, stdin);
for(int i = 0; i < MAX_STR_LEN; i++)
{
if(!isdigit(str[i]) && (!isspace(str[i])) && (str[i] != '\0'))
{
if((i != 0) && (str[i - 1] != ' ') && ((str[i] != '+') || (str[i] != '-')))
{
printf("'%c' is bogus! I'm self destructing!", str[i]);
return -1;
}
}
if((str[i] == '\n') || (str[i] == '\0'))
break;
}
sscanf(str, "%d%d", &num1, &num2);
printf("You entered %d and %d. Good job. Pat yourself on the back.", num1, num2);
return 0;
}
逻辑如下:
答案 1 :(得分:2)
由于要求似乎是输入行中两个数字之间至少有一个空格字符,因此代码必须类似于:
char s[2];
if (scanf("%d%1[ \t]%d", &num1, s, &num) != 3)
...format error...
此(%1[ \t]
)在第一个数字后面立即查找空白或制表符。在第二个数字之前可能有额外的空白。除非您愿意,否则您无需对s
中的值执行任何操作。
答案 2 :(得分:0)
使用"%n"
扫描以检测分离的空格。
int num1, num2;
int n1, n2;
if (scanf("%d%n %n%d", &num1, &n1, &n2, &num2) != 2) {
; // bad input, exit the program
}
if (n1 == n2) {
; // no space between 1st and 2nd number, exit the program
}
另一种方法,类似于@Jonathan Leffler,只接受至少1个空格
if (scanf("%d%*[ ]%d", &num1, &num2) != 2) {
; // bad input, exit the program
}
同意许多其他说法:使用fgets()/sscanf()
要好得多。