アプリ版:「スタンプのみでお礼する」機能のリリースについて

中置記法でかかれたもの後置記法に直してから計算するプログラムをつくったのですが、atoi関数のところで、うまく数字が渡されず、0となってします。これらの原因と解決方法、また解決したプログラムを教えてください。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"Item1.h"
#include"Stack1.h"
#include"Item2.h"
#include"Stack2.h"

int main(int argc, char *argv[])
{
char *a = argv[1];
int i;
int N = strlen(a);
char r;
int s;

STACKinit1(N);STACKinit2(N);
for(i=0;i<N;i++)
{
if(a[i] == ')')
{
r = STACKpop1();
if(r == '+')
{
STACKpush2(STACKpop2() + STACKpop2());
}
else if(r == '*')
{
STACKpush2(STACKpop2() * STACKpop2());
}
}
if(a[i] == '+' || a[i] == '*')
{
STACKpush1(a[i]);
}

if ((a[i] >= '0') && (a[i] <= '9'))
{
s = atoi("a[i]");
STACKpush2(s);
}

}
printf("%d \n",s);
printf("%d \n",STACKpop2());
return 0;
}

A 回答 (4件)

>s = atoi("a[i]");


"a[i]"という文字列に数字は入ってないので変換不能なのでは。
    • good
    • 0
この回答へのお礼

知識不足ですいません。
どのように直せばいいのでしょうか…

お礼日時:2012/11/16 08:05

>>>s = atoi("a[i]");


>>"a[i]"という文字列に数字は入ってないので変換不能なのでは。
>
>知識不足ですいません。
>どのように直せばいいのでしょうか…

この部分に単純に回答すれば、
s = atoi(&a[i]);
でいいように思うが、
for(i=0;i<N;i++)
となっているので2ケタ以上の数値を演算する場合、うまくいかない。
    • good
    • 0

atoi()の結果がおかしいのは #1の指摘通りではないかと思いますが


個人的には
atoi()でなくて、strtol()を使って'\0'まで処理するようにループを変更した方が
よいかと思います。

あと、この手のやつは、最初に字句解析(この場合、数字と演算子を分解)してから
計算を始めた方がきれいにいけますよ。

準備するスタックの量は演算子の数*2確保しておけば足ります。
    • good
    • 0

皆さんの回答の通りですが一番簡単なのは



s = atoi("a[i]");



s = (int)(a[i] - '0');

に変更すれば終わると思いますよ。せっかくifで判定してるし。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!