Атои, похоже, не работает для моей программы - PullRequest
0 голосов
/ 23 января 2019

вот простая программа для постфиксного калькулятора, использующая стек, но atoi () вызывает его сбой. Почему это происходит? Я попытался преобразовать char в строку, используя ch-'0 ', и это работает, но функция atoi () для преобразования char в int, похоже, не работает в этом случае.

Это потому, что ch это char или string например. char ch; а не char ch [20];

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
int num[MAX],tos=-1;

push(int x)
{
    if(tos==MAX)
    {
        printf("the stack is full");
    }
    else
    {
        printf("  l");
        tos++;
        num[tos]=x;
    }
}
int pop()
{
    if(tos<0)
    {
        printf("stack underflow");
    }
    else
    return num[tos--];
}
int main()
{
    char postfix[MAX],exp[MAX],ch,val;
    int a,b;
    printf("enter the postfix expression");
    fgets(postfix,MAX,stdin);
    strcpy(exp,postfix);
    for(int i=0;i<strlen(postfix);i++)
    {
         printf(" xox ");
        ch=postfix[i];
        if(isdigit(ch))
        {
            push(ch - '0');
            printf(" %d ",atoi(ch));
        }
      else
      {
          printf("%d",tos);
          a=pop();
          b=pop();
          switch(ch)
          {
          case '+':
            val=a+b;
            break;
          case '-':
            val=a-b;
            break;
          case '*':
            val=a*b;
            break;
          case '/':
            val=a/b;
            break;
        }
        printf("%d",val);
        push(val);
      }
    }
    printf("the result of the expression %s = %d",exp,num[0]);
    return 0;
}

1 Ответ

0 голосов
/ 23 января 2019

Это потому, что ch - это символ или строка, например.char ch;а не char ch [20];

Да.atoi(ch) даже не является допустимым C и не может правильно скомпилироваться.

В этом случае вы можете создать временную строку на основе ch и нулевого терминатора.Например, через составной литерал: (char[2]){ch, '\0'}.

И вы никогда не должны использовать atoi для каких-либо целей, поскольку он плохо обрабатывает ошибки и является совершенно лишней функцией.Вместо этого используйте семейство функций strtol.

Вы можете вызвать strtol следующим образом:

strtol( (char[2]){ch, '\0'}, // string to convert from
        NULL,                // end pointer, not used, set to NULL
        10 );                // base 10 = decimal

Пример:

printf(" %d ", (int)strtol( (char[2]){ch, '\0'}, NULL, 10) );

Что полностью эквивалентноболее читабельный:

char tmp[2] = { ch, '\0' };
int result = (int) strtol(tmp, NULL, 10);
printf(" %d ", result);
...