atoi 似乎不适用于我的程序

Posted

技术标签:

【中文标题】atoi 似乎不适用于我的程序【英文标题】:atoi does not seem to be working for my program 【发布时间】:2019-01-23 15:02:54 【问题描述】:

这是一个使用堆栈的后缀计算器的简单程序,但是 atoi() 导致它崩溃。为什么会这样? 我尝试使用 ch-'0' 将 char 转换为字符串,它可以工作,但用于 char 到 int 转换的 atoi() 函数在这种情况下似乎不起作用。

是不是因为 ch 是 char 也不是 string 例如。字符 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;

【问题讨论】:

"是不是因为 ch 是 char 也不是字符串,例如 char ch; 而不是 char ch[20];" 没错。它适用于字符串,只有一个 char 没有重载。 如果您想将表示从 0 到 9 的数字的 char 转换为相应的整数,只需像您在代码中所做的那样减去 '0'。如果您希望它保持相同的值(例如 '0' 在 ASCII 中是 48),只需将 char 分配给 int 变量。 atoi(ch) 甚至不应该编译。您的编译器要么非常糟糕,要么配置不正确。 default: printf("&lt;%d&gt;\n", ch);查看问题。 编译时启用所有警告并将其视为错误,尤其是在包含atoi 的行中显示的警告。提示:atoi 需要一个指向字符串的指针,但您传递的是 char。您正在混淆字符串和字符,请阅读 C 教科书中处理字符串的章节。 【参考方案1】:

是不是因为 ch 既不是字符也不是字符串,例如。字符 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);

【讨论】:

以上是关于atoi 似乎不适用于我的程序的主要内容,如果未能解决你的问题,请参考以下文章

事务管理似乎不适用于 Spring 测试

iOS AppLinks 仅不适用于邮件应用程序

Google 登录不适用于已发布的应用

Xcode Cocoa 默认选择器动画不适用于 iOS 应用程序

ngCordovaGoogleAnalytics 适用于 ios,但不适用于 Android

为啥 WebSQL 不适用于使用 PhoneGap 制作的 iOS 应用程序?