从c中的用户输入读取2个整数

时间:2014-01-24 02:23:56

标签: c input integer scanf

所以我的程序必须从用户输入中读取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

3 个答案:

答案 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. 搜索字符串以查找有问题的字符或字符序列。
  3. 如果没有,则相应地解析字符串。
  4. 坐下来幸灾乐祸。

答案 1 :(得分:2)

由于要求似乎是输入行中两个数字之间至少有一个空格字符,因此代码必须类似于:

char s[2];
if (scanf("%d%1[ \t]%d", &num1, s, &num) != 3)
    ...format error...

此(%1[ \t])在第一个数字后面立即查找空白或制表符。在第二个数字之前可能有额外的空白。除非您愿意,否则您无需对s中的值执行任何操作。

已修复,以响应来自comment 的准确chux

答案 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()要好得多。