使用 getchar() 存储数字
Using getchar() to store numbers
我有一个任务,我应该用 C 语言制作一个简单的算术计算器,它接受一个数字、一个运算符和第二个数字的输入,并执行运算并输出它。听起来很简单吧?
我仅限于使用 getchar()
和 putchar()
进行数字输入。这意味着我必须一次读取整个输入的一个字符......我很困惑如何读取一个数字的两个字符(9
和 1
of 91
例如)作为一个数字。如果 getchar()
从右向左阅读,情况就不同了。但不幸的是,它不是...
如有指点,我将不胜感激!
这是一些伪代码:
c = getchar()
num = 0
while isdigit(c)
num = (num * 10) + (c - '0')
c = getchar()
这会累加数字,认识到右边的每个新数字有效地将已经看到的数字乘以 10。当看到非数字时它会停止累加,因此解析像 91+3 这样的字符串 有效。
如果每个输入都分开给出,那么您可以尝试使用循环。
char c = getchar();
int num = 0;
int neg = 0;
if(c == '-') {
neg = 1;
c = getchar();
}
while(isdigit(c)) {
num = num * 10;
num = num + (c - '0');
c = getchar();
}
if(neg) {
num = num * -1;
}
基本上,您一次将每个数字累加一个字符。
但是,您需要为下一个即将到来的角色腾出空间。所以你需要将这个数字乘以 10 才能将它向左移动 1 位。
定义 ENTER '\n'
int read_num()
{
int num = 0;
int c;
c = getchar() - '0';
num = (c < 0) ? 0 : c;
while ((c = getchar()) != ENTER) {
c -= '0';
num *= 10;
num = (num == 0 || num < 0) ? num - c: num + c;
}
return num;
}
PS: 新代码
#include <stdio.h>
int readnum()
{
unsigned int c;
int num = 0;
int dec;
int sign = 0;
while ( (c = getchar()) != '\n') {
dec = c - '0';
if ( dec >= 0 && dec <= 9) {
num *= 10;
num = (sign == 1 || num < 0) ? num - dec: num + dec;
} else if (c == '-') {
sign = 1;
} else if (c == '+')
sign = 0;
}
return num;
}
int main()
{
printf("%d\n", readnum());
return 0;
}
其他解决方案:
#define ENTER '\n'
int read_num()
{
int num = 0;
int c;
int signal = 1;
while ((c = getchar()) != ENTER) {
if (signal == 1 && (c == '-' || c == '+')) {
signal = (c == '-') ? -1 : 1;
} else {
num = num * 10 + (c - '0');
}
}
return num * signal;
}
我有一个任务,我应该用 C 语言制作一个简单的算术计算器,它接受一个数字、一个运算符和第二个数字的输入,并执行运算并输出它。听起来很简单吧?
我仅限于使用 getchar()
和 putchar()
进行数字输入。这意味着我必须一次读取整个输入的一个字符......我很困惑如何读取一个数字的两个字符(9
和 1
of 91
例如)作为一个数字。如果 getchar()
从右向左阅读,情况就不同了。但不幸的是,它不是...
如有指点,我将不胜感激!
这是一些伪代码:
c = getchar()
num = 0
while isdigit(c)
num = (num * 10) + (c - '0')
c = getchar()
这会累加数字,认识到右边的每个新数字有效地将已经看到的数字乘以 10。当看到非数字时它会停止累加,因此解析像 91+3 这样的字符串 有效。
如果每个输入都分开给出,那么您可以尝试使用循环。
char c = getchar();
int num = 0;
int neg = 0;
if(c == '-') {
neg = 1;
c = getchar();
}
while(isdigit(c)) {
num = num * 10;
num = num + (c - '0');
c = getchar();
}
if(neg) {
num = num * -1;
}
基本上,您一次将每个数字累加一个字符。 但是,您需要为下一个即将到来的角色腾出空间。所以你需要将这个数字乘以 10 才能将它向左移动 1 位。
定义 ENTER '\n'
int read_num()
{
int num = 0;
int c;
c = getchar() - '0';
num = (c < 0) ? 0 : c;
while ((c = getchar()) != ENTER) {
c -= '0';
num *= 10;
num = (num == 0 || num < 0) ? num - c: num + c;
}
return num;
}
PS: 新代码
#include <stdio.h>
int readnum()
{
unsigned int c;
int num = 0;
int dec;
int sign = 0;
while ( (c = getchar()) != '\n') {
dec = c - '0';
if ( dec >= 0 && dec <= 9) {
num *= 10;
num = (sign == 1 || num < 0) ? num - dec: num + dec;
} else if (c == '-') {
sign = 1;
} else if (c == '+')
sign = 0;
}
return num;
}
int main()
{
printf("%d\n", readnum());
return 0;
}
其他解决方案:
#define ENTER '\n'
int read_num()
{
int num = 0;
int c;
int signal = 1;
while ((c = getchar()) != ENTER) {
if (signal == 1 && (c == '-' || c == '+')) {
signal = (c == '-') ? -1 : 1;
} else {
num = num * 10 + (c - '0');
}
}
return num * signal;
}