我无法使用getchar()读取数字

时间:2019-05-04 01:11:55

标签: c int stdio getchar

在此处编程菜鸟。我有一个作业,必须使用getchar()读入一个数字并对其执行一些操作。该数字可以是正数或负数。这是我的代码中接受输入的部分。我找不到问题,但返回了其他内容。

我正在使用将字符转换为整数的一般方法,首先将累加器乘以10,然后使用(ch -'0')将字符转换为其等效的数字并将其添加到累加器中,

我尝试删除对负数的验证,但仍然没有任何效果。

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>

int main() {
    int accumulator = 0;
    char ch;
    int negative = 0;

    ch = getchar();
    if (ch == '-') {
        negative = -1;
        ch = getchar();
    }

    if (isdigit(ch) == 0) {
        puts("\nError: Not valid number.\nPlease try again");
        EXIT_FAILURE;
    }

    while ((ch = getchar()) != '\n') {
        ch = getchar();
        if ((ch = getchar()) == EOF) {
            break;
        }
        if (!isdigit(ch)) {
            puts("\nError: Not valid number.\nPlease try again");
            break;
            EXIT_FAILURE;
        }

        accumulator = accumulator * 10;
        accumulator = (ch = '0') + accumulator;
    }

    if (negative == -1)
        accumulator = accumulator * negative;

    printf("%d", accumulator);
}

示例

输入:2351 输出:2351(使用getchar

输入:-5689 输出:-5689(使用getchar

2 个答案:

答案 0 :(得分:1)

您在getchar()循环中多次调用while。他们每个人都放弃上一个呼叫的结果。您应该只在getchar()条件下使用while()调用的结果,而不要再次调用它。

您也不会将循环之前读取的字符保存到累加器中。

您在ch = '0'中有一个错字,应该是ch - '0'

您需要声明chint而不是char,因为EOF不是字符。

EXIT_FAILURE应该是exit(EXIT_FAILURE)。而且您不应该在break;之前加上它,因为那样会终止循环,跳过exit()调用。

您可以将negative初始化为1,因此最后可以乘以它,而不必先测试该值。在这种情况下,变量的更好名称是sign

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>

int main() {
    int accumulator = 0;
    int ch;
    int sign = 1;

    ch = getchar();
    if (ch == '-') {
        sign = -1;
        ch = getchar();
    }

    if (!isdigit(ch)) {
        puts("\nError: Not valid number.\nPlease try again");
        exit(EXIT_FAILURE);
    }

    accumulator = ch - '0';

    while ((ch = getchar()) != '\n' && ch != EOF) {
        if (!isdigit(ch)) {
            puts("\nError: Not valid number.\nPlease try again");
            exit(EXIT_FAILURE);
        }

        accumulator *= 10;
        accumulator += (ch - '0');
    }

    accumulator *= sign;

    printf("%d", accumulator);
}

答案 1 :(得分:1)

您的代码中存在多个问题:

  • ch必须定义为int类型,以容纳getchar()返回的所有值。
  • 您应该在EOF循环的顶部测试while
  • EXIT_FAILUREexit()函数的参数值。将其用作exit(EXIT_FAILURE)
  • 您在while循环体内重新读取了一个新字符,而不是处理ch

这是更正的版本:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int accumulator = 0;
    int ch;
    int negative = 0;

    ch = getchar();
    if (ch == '-') {
        negative = -1;
        ch = getchar();
    } else (if (ch == '+') {
        ch = getchar();
    }   

    if (isdigit(ch) == 0) {
        puts("\nError: Not valid number.\nPlease try again");
        exit(EXIT_FAILURE);
    }

    while ((ch = getchar()) != EOF && ch != '\n') {
        if (!isdigit(ch)) {
            puts("\nError: Not valid number.\nPlease try again");
            exit(EXIT_FAILURE);
        }
        accumulator = accumulator * 10 + (ch = '0');
    }
    if (negative < 0)
        accumulator = -accumulator;

    printf("%d\n", accumulator);
    return 0;
}