我正在编写一个简单的计算程序,但是我可以使用的唯一字符串处理函数是getchar和putchar。现在我只是尝试将输入中的数字分配给变量,但是当我打印变量时,它是一些随机数。例如,我输入3进入控制台,输出为505110.任何帮助将不胜感激。谢谢。
#include <stdio.h>
#include "math.h"
int addFunction( int, int);
int subtractFunction(int, int);
int multiplyFunction(int, int);
int modulusFunction(int, int);
float divideFunction(float, float);
int main(int argc, const char * argv[])
{
int iochar = 0;
char num1 = 0, num2 = 0, continuePrompt, operator = 0;
do {
iochar = getchar();
getchar();
if ((iochar >= 0) && (iochar <= 20000)) {
num1 = iochar;
}
if ((iochar == '+') || (iochar == '-') || (iochar == '*') || (iochar == '/') || ( iochar == '%')) {
operator = iochar;
}
if ((num1 >= 0) || ((iochar >= 0) && (iochar <= 20000))){
num2 = iochar;
}
switch (operator) {
case '+':
iochar = addFunction(num1, num2);
break;
case '-':
iochar = subtractFunction(num1, num2);
break;
case '*':
iochar = multiplyFunction(num1, num2);
break;
case '%':
iochar = modulusFunction(num1, num2);
break;
case '/':
iochar = divideFunction(num1, num2);
break;
}
putchar(iochar);
printf("Would you like to make another calulation? (y or n)");
scanf("%c", &continuePrompt);
} while (continuePrompt != 'n');
return 0;
}
int addFunction(int x, int y){
return x + y;
}
int subtractFunction(int x, int y){
return x - y;
}
int multiplyFunction(int x, int y){
return x * y;
}
int modulusFunction(int x, int y){
return x % y;
}
float divideFunction(float x, float y){
return x / y;
}
答案 0 :(得分:1)
代码工作正常。当您在ASCII中输入“3”(实际上是十六进制值0x33
)时,您将以dec(%d)打印该值,因此您将在输出中看到51
。
现在你没有使用输入的换行符,所以getchar()
正在跳过第二遍的输入并且假设你传入'\n'
ASCII,这是十六进制{{接下来打印1}},然后打印0xa
。
您不会在输出中打印任何换行符或空格,如下所示:
10
要解决主要问题,请使用换行符:
3 (I entered that)
5110 (the output from '3''\n')
当你打印这些值时,你会得到ASCII个值,所以如果你想要dec,那么你很好,如果你想要它的话:
int main(int argc, const char * argv[]) {
int iochar, num1, num2;
char continuePrompt = 0, operator;
do {
iochar = getchar(); // Get input from user
getchar(); //Consume new line character
如果你想要它的十六进制(0x ??)
printf("%c", num1);
另外,我会打印一个或多个新行或更有用的东西,然后只输出一串输出来帮助找到这样的问题。
最后这个条件:
printf("%#x", num1);
错了。这是不可能的,检查'n',你不能在一个字符中'不'。
答案 1 :(得分:0)
使用%c
代替%d
即
printf("%c", num1);
此外,您应该初始化变量。
即
int iochar=0, num1=0, num2=0;
char continuePrompt = 0, operator=0;
答案 2 :(得分:0)
由于您只允许使用putchar
和getchar
,因此我认为您不允许使用printf
来展示结果。为了使用putchar
的实际数字,您必须取每个数字并将其转换为正确的ASCII值。
幸运的是,这很简单,因为
digitRepresentationASCIIValue == singleDigitValue + '0';
但是,这只适用于一位数字。因此,您必须获得数字的长度,并为每个数字使用putchar
。这很简单:
void putNumber(int num){
int order = 1; // even zero has at least one digit
int tmp = num; // even zero has at least one digit
while(tmp /= 10)
order *= 10; // count digits
if(num < 0)
putchar('-'); // sign
while(order > 0){
// put a single digit, see above how to calculate the ASCII value
putchar('0' + ( ( num / order ) % 10));
order /= 10;
}
}
为了实际读取值,您必须完全相反:检查getchar
提供的字符是否为数字,并修改您当前的数字:
int num[2] = {0,0};
int currentNum = 0;
int iochar = getchar();
while(!isNewline(iochar) && iochar != EOF){
if(isDigit(iochar)){
num[currentNum] = num[currentNum] * 10 + iochar - '0';
}
else if(isOperator(iochar)){
if(currentNum == 1)
num[0] = operate(num[0],num[1],operator);
else
currentNum = 1;
operator = iochar;
num[1] = 0;
}
iochar = getchar();
}
isDigit
,isNewline
和isOperand
留待锻炼,这三个都非常简单,但它们可以让您更好地了解ASCII值。 operate
包含您的switch
声明。
请注意,我使用了int num[2] = {0,0};
。这使得(除currentNum
之外)可以编写类似
3 + 3 + 3 / 9
请注意,所有运算符都是从左到右进行计算,因此上面示例的结果将为1而不是6.3333333。
不要在此处发布您的解决方案,而是自己动手,因为它们可以帮助您提高ASCII / char技能。对于某些练习,ASCII table可能会有所帮助。
isDigit
,isNewline
和isOperand
。未对注释的代码进行注释,尤其是此行缺少注释:
num[currentNum] = num[currentNum] * 10 + iochar - '0';
那到底发生了什么?如果此时num[currentNum]
对你来说太复杂,只需使用num1并在读取第二个之前打印该值。提示:看看练习#1。
即使以正确的顺序评估运算符(加法前的乘法),结果也不会是6.333333而是6.为什么会这样?您目前的计划需要改变什么?
答案 3 :(得分:-3)
首先,您需要从“getchar”转换输入,因为它是ascii输入。
iochar = atoi(getchar());
然后你可以将它与整数值进行比较。
答案 4 :(得分:-3)
首先,getchar
的返回值为char
,提升为int
。因此,请使用char
变量来存储它。
其次,要将输入char
转换为int
,请使用以下内容:
int num1 = iochar - '0';