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

我无法使用getchar()读入数字,c,int,stdio,getchar,C,Int,Stdio,Getchar,在这里编程。我有一个作业,我必须使用getchar()读入一个数字,并对其执行一些操作。数字可以是正数或负数。这是接收输入的代码段。我找不到问题,但它返回了其他内容 我使用将字符转换为整数的一般方法,首先将累加器乘以10,然后使用(ch-'0')将字符转换为其等效数字,并将其添加到累加器中 我已经尝试过删除负数的验证,但仍然没有什么不同 #include <stdio.h> #include <ctype.h> #include <stdlib.h> #inc

在这里编程。我有一个作业,我必须使用
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);
}
#包括
#包括
#包括
#包括
int main(){
int累加器=0;
char ch;
int负=0;
ch=getchar();
如果(ch='-'){
负=-1;
ch=getchar();
}
if(isdigit(ch)==0){
puts(“\n错误:无效数字。\n请重试”);
退出失败;
}
而((ch=getchar())!='\n'){
ch=getchar();
if((ch=getchar())==EOF){
打破
}
如果(!isdigit(ch)){
puts(“\n错误:无效数字。\n请重试”);
打破
退出失败;
}
累加器=累加器*10;
累加器=(ch='0')+累加器;
}
如果(负==-1)
累加器=累加器*负;
printf(“%d”,累加器);
}
范例

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

输入:
-5689

输出:
-5689
(使用
getchar

循环中调用
getchar()
的次数太多。它们中的每一个都将丢弃上一次调用的结果。您应该只在
while()
条件中使用
getchar()
调用的结果,而不是再次调用它

您也没有将循环前读取的字符保存到累加器中

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

您需要将
ch
声明为
int
,而不是
char
,因为
EOF
不是字符

EXIT\u FAILURE
应该是
EXIT(EXIT\u FAILURE)
。而且你不应该把
打断exit()
调用

您可以将
负数
初始化为
1
,因此在最后,您只需乘以它,而无需先测试值。在这种情况下,变量的更好名称是
符号

#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);
}
#包括
#包括
#包括
#包括
int main(){
int累加器=0;
int-ch;
int符号=1;
ch=getchar();
如果(ch='-'){
符号=-1;
ch=getchar();
}
如果(!isdigit(ch)){
puts(“\n错误:无效数字。\n请重试”);
退出(退出失败);
}
累加器=ch-‘0’;
而((ch=getchar())!='\n'&&ch!=EOF){
如果(!isdigit(ch)){
puts(“\n错误:无效数字。\n请重试”);
退出(退出失败);
}
累加器*=10;
累加器+=(ch-‘0’);
}
累加器*=符号;
printf(“%d”,累加器);
}

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

  • ch
    必须使用类型
    int
    定义,以适应
    getchar()
    返回的所有值
  • 您应该在
    while
    循环的顶部测试
    EOF
  • EXIT\u FAILURE
    EXIT()
    函数的参数值。将其用作退出(退出失败)
  • 在循环体中重新读取
    中的新字符,而不是处理
    ch
  • 以下是更正的版本:

    #包括
    #包括
    int main(){
    int累加器=0;
    int-ch;
    int负=0;
    ch=getchar();
    如果(ch='-'){
    负=-1;
    ch=getchar();
    }else(如果(ch=='+')){
    ch=getchar();
    }   
    if(isdigit(ch)==0){
    puts(“\n错误:无效数字。\n请重试”);
    退出(退出失败);
    }
    而((ch=getchar())!=EOF&&ch!='\n'){
    如果(!isdigit(ch)){
    puts(“\n错误:无效数字。\n请重试”);
    退出(退出失败);
    }
    累加器=累加器*10+(ch='0');
    }
    如果(负<0)
    累加器=-累加器;
    printf(“%d\n”,累加器);
    返回0;
    }
    
    您的代码似乎在两个示例中都成功了。您能给出一个失败的示例吗?
    while
    循环多次调用
    getchar()
    。它在
    while()
    条件中调用它一次,然后在第一行再次调用它。因此,它在
    while()中测试的字符
    被忽略。然后它在
    if((ch==getchar())==EOF)中再次调用它
    ,因此它在前一行中读取的字符被忽略。@Beta我认为底部的示例是它应该返回的,而不是它实际返回的。@AlistairAlva:单击其分数下面的灰色复选标记,您可以接受其中一个答案