在此处编程菜鸟。我有一个作业,必须使用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
)
答案 0 :(得分:1)
您在getchar()
循环中多次调用while
。他们每个人都放弃上一个呼叫的结果。您应该只在getchar()
条件下使用while()
调用的结果,而不要再次调用它。
您也不会将循环之前读取的字符保存到累加器中。
您在ch = '0'
中有一个错字,应该是ch - '0'
。
您需要声明ch
为int
而不是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_FAILURE
是exit()
函数的参数值。将其用作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;
}