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("<%d>\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 似乎不适用于我的程序的主要内容,如果未能解决你的问题,请参考以下文章
Xcode Cocoa 默认选择器动画不适用于 iOS 应用程序