我无法使用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:单击其分数下面的灰色复选标记,您可以接受其中一个答案