中置記法でかかれたもの後置記法に直してから計算するプログラムをつくったのですが、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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
>>>s = atoi("a[i]");
>>"a[i]"という文字列に数字は入ってないので変換不能なのでは。
>
>知識不足ですいません。
>どのように直せばいいのでしょうか…
この部分に単純に回答すれば、
s = atoi(&a[i]);
でいいように思うが、
for(i=0;i<N;i++)
となっているので2ケタ以上の数値を演算する場合、うまくいかない。
No.3
- 回答日時:
atoi()の結果がおかしいのは #1の指摘通りではないかと思いますが
個人的には
atoi()でなくて、strtol()を使って'\0'まで処理するようにループを変更した方が
よいかと思います。
あと、この手のやつは、最初に字句解析(この場合、数字と演算子を分解)してから
計算を始めた方がきれいにいけますよ。
準備するスタックの量は演算子の数*2確保しておけば足ります。
No.4
- 回答日時:
皆さんの回答の通りですが一番簡単なのは
s = atoi("a[i]");
を
s = (int)(a[i] - '0');
に変更すれば終わると思いますよ。せっかくifで判定してるし。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
fgetsなどのときのstdinのバッ...
-
間接操作のレベルとは
-
CStringをwchar_tに変換したい
-
バイトスワップをやりたい
-
c言語でユーザ関数を利用して入...
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
文字列から空白を取り除きたい...
-
Linuxでフォルダ内全ファイル名...
-
enumの記述について。
-
配列をnビットシフトする
-
ユニコード文字列の分割
-
DPマッチング
-
C言語です
-
RGB→YUV変換のプログラム
-
C言語のビットフィールドについて
-
c++ 文字列を入力して、一文字...
-
C言語のポインターで詰まっている
-
ワイルドカードを用いた文字列検索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報