如何使用scanf检测C中的运算符与int?
如何在我的RPN计算器中读取以下输入,以便无论顺序如何,它都能找到运算符 2如何使用scanf检测C中的运算符与int?,c,scanf,calculator,calc,rpn,C,Scanf,Calculator,Calc,Rpn,如何在我的RPN计算器中读取以下输入,以便无论顺序如何,它都能找到运算符 2 2+ 四, 到目前为止,我的scanf只看到字符串中的第一个字符,我只能这样做: 2 2 + 四, 我还尝试为整数与浮点模式添加一个选项。(例如,当输入“i”时,以浮点运算,反之亦然。) #包括 #包括 #定义最大值100 int*p; int*tos; int*bos; 无效推力(int i); int pop(无效); 内部主(空) { INTA,b; //浮点数c,d; chars[80]; //char op
2+
四, 到目前为止,我的scanf只看到字符串中的第一个字符,我只能这样做:
2
2
+
四, 我还尝试为整数与浮点模式添加一个选项。(例如,当输入“i”时,以浮点运算,反之亦然。)
#包括
#包括
#定义最大值100
int*p;
int*tos;
int*bos;
无效推力(int i);
int pop(无效);
内部主(空)
{
INTA,b;
//浮点数c,d;
chars[80];
//char op;//声明80个字符的字符串
p=(int*)malloc(MAX*sizeof(int));//获取堆栈内存
如果(!p){
printf(“分配失败\n”);
出口(1);
}
tos=p;
bos=p+MAX-1;
printf(“\nRPN计算器\n”);
printf(“输入“i”表示整数模式\n”);
printf(“输入“f”表示浮点模式\n”);
printf(“输入'q'退出\n”);
做{
printf(“>”);
//获取(s);
//scanf(“%s”,s);//读取整数
scanf(“%s”,s);
//开关(*s){
开关(*s){
案例“i”:
printf(“(整数模式)\n”);
打破
案例“f”:
printf(“(浮点模式)\n”);
打破
格“+”:
a=pop();
b=pop();
printf(“%d\n”,a+b);
推(a+b);
打破
案例'-':
a=pop();
b=pop();
printf(“%d\n”,b-a);
推(b-a);
打破
案例“*”:
a=pop();
b=pop();
printf(“%d\n”,a*b);
推(a*b);
打破
案例“/”:
a=pop();
b=pop();
如果(a==0){
printf(“不能被零除\n”);
打破
}
printf(“%d\n”,b/a);
推送(b/a);
打破
案例“”:
a=pop();
推(a);
printf(“堆栈顶部的当前值:%d\n”,a);
打破
违约:
推送(atoi);;
}
}而(*s!=“q”);
返回0;
}
//在堆栈上放置一个元素
无效推送(int i)
{
如果(p>bos){
printf(“堆栈已满\n”);
返回;
}
*p=i;
p++;
}
//从堆栈顶部获取元素
int-pop(无效)
{
p--;
if(p<0){
printf(“堆栈下溢\n”);
返回0;
}
返回*p;
}
您的scanf
读取整个字符串。下面的开关根据第一个字符进行判断,并忽略2+
中的+
为了改进它,您可以使用strtol
函数。它将解析字符串中的一个整数,并将整数结束的位置返回给您-如果该位置仍然不是字符串的结束位置,则可能存在运算符
浮点数的类似函数是strod
下面是一些适用于您的示例的
strtol
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char* input = "25+";
char* endptr;
int val = strtol(input, &endptr, 10);
if (*endptr == '\0')
{
printf("Got only the integer: %d\n", val);
}
else
{
printf("Got an integer %d\n", val);
printf("Leftover: %s\n", endptr);
}
return 0;
}
#包括
#包括
#包括
int main()
{
char*input=“25+”;
char*endptr;
int val=strtol(输入和结束,10);
如果(*endptr=='\0')
{
printf(“仅获取整数:%d\n”,val);
}
其他的
{
printf(“得到一个整数%d\n”,val);
printf(“剩余:%s\n”,endptr);
}
返回0;
}
我不确定我是否完全理解了您的问题,但您可以像这样重复字符串:
for(i = 0; i < strlen(s); i++)
{
// Here comes your switch section like this
switch(s[i]) {
.....
}
}
for(i=0;i
还记得包括string.h.我真的不明白你的代码 pzico说,如果希望用户每次输入一个字符,我的意思是一个字符+回车,那么你应该使用一个简单的字符,而不是字符[]。如果你假装使用字符串,你应该接收并解析它。 你可以这样做。问题是用多个数字来处理数字,但是稍微想一想你可以解决这个问题。我写了一篇文章,但我很确定它不会起作用 printf(“\nRPN计算器\n”);
printf(“输入“i”表示整数模式\n”);
printf(“输入浮点模式的“f”);
printf(“输入'q'退出\n”);
scanf(“%c”,s) 开关(*s){ } printf(“每次输入表达式一个字符\n”) 做{
scanf("%c", s);
switch(s) {
case '+':
a = pop();
b = pop();
printf("%d\n", a+b);
push(a+b);
break;
case '-':
a = pop();
b = pop();
printf("%d\n", b-a);
push(b-a);
break;
case '*':
a = pop();
b = pop();
printf("%d\n", a*b);
push(a*b);
break;
case '/':
a = pop();
b = pop();
if(a == 0){
printf("Cannot divide by zero\n");
break;
}
printf("%d\n", b/a);
push(b/a);
break;
case '.':
a = pop();
push(a);
printf("Current value on top of stack: %d\n", a);
break;
default:
a = pop()*10+atoi(s);
push(a);
}
}而(s!=“q”)
代码中的另一个问题是pop函数。您希望如何处理此测试:
如果(p<0){printf(“堆栈下溢\n”);
返回0;
} 您希望指针到达地址0吗
不管怎样,我希望这不是你的家庭作业。啊,
(…;iyes,但原始代码中的底层机制不是也是这样吗?请参见输入22的示例,这样第一行和第二行就有数字2。您能给我一个使用我的代码的示例吗?我阅读了语法,但不熟悉如何使用它。这不起作用:scanf(“%s”,s);n=strtol(s,0,10);switch(n){}@未知:很高兴我提供了帮助。良好的luckRather比默认值假定一个数字(尝试“%”表示s
),使用isdigit()
函数。请记住,默认值:
大小写用于与开关
语句中的任何其他大小写不匹配的任何内容。另一种解决方案是为“0”…“9”中的每个字符添加大小写语句,例如:大小写“0”:大小写“1”:
case 'i':
printf("(Integer Mode)\n");
break;
case 'f':
printf("(Floating Point Mode)\n");
break;
case 'q':
printf("Bye Bye\n");
return;
break;
scanf("%c", s);
switch(s) {
case '+':
a = pop();
b = pop();
printf("%d\n", a+b);
push(a+b);
break;
case '-':
a = pop();
b = pop();
printf("%d\n", b-a);
push(b-a);
break;
case '*':
a = pop();
b = pop();
printf("%d\n", a*b);
push(a*b);
break;
case '/':
a = pop();
b = pop();
if(a == 0){
printf("Cannot divide by zero\n");
break;
}
printf("%d\n", b/a);
push(b/a);
break;
case '.':
a = pop();
push(a);
printf("Current value on top of stack: %d\n", a);
break;
default:
a = pop()*10+atoi(s);
push(a);
}