如何使用scanf检测C中的运算符与int?

如何使用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

如何在我的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;//声明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);
}