我希望使用者輸入一個字串,然後可以做+,-,*,/
當使用者輸入以後首先要把運算元跟運算子分開
所以我想到用strtok來弄
可是我在丟運算子的時候一直發生記憶體出錯的問題
我找了好久不知道是哪裡錯
拜託各位大大幫忙
請各位盡量不要弄到指標的東西
我剛開始學
指標我完全不會
感謝各位
以下是程式碼
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
double num[100];
char *op;
char equation[100],equation_2[100];
int i=0;
//使用者輸入
printf("請輸入運算式\n");
scanf("%s",&equation);
for( i=0;i
equation_2[i]=equation[i];
}
//把字串轉成浮點數並把運算子跟運算元放進陣列裡 (strtok)
/*把運算元存到op陣列裡*/
op=strtok(equation,"0123456789");
while(op!=NULL)
{
printf("%s\n",op);
op=strtok(NULL,"0123456789");
}
/*把運算子存到陣列裡(問題出在這裡)*/
num[0]=atof(strtok(equation_2,"+-*/"));
for(i=0;i
while(num[i]!=NULL)
{
printf("%f\n",num[i]);
num[i]=atof(strtok(NULL,"+-*/"));
}
}
getchar();
getchar();
return 0;
}
2006-12-13 18:13:30 · 3 個解答 · 發問者 ®aÞ³ 1 in 電腦與網際網路 ➔ 程式設計
To jacob Lee :
不好意思,strtok這個函數我不是很清楚他在幹麻,所以我查到的資料怎麼寫我就抄上去,我也不知道NULL從哪生出來的,指標我實在是搞不太懂他在幹麻 ,只能看著錯誤訊息去修改....呵呵
關於equation_2: 我不知道還有結束字元這個東西 非常感謝你
我只是要寫最簡單的計算機,沒有( ) 不用先*/後 -,使用者打什麼就算什麼就行了 QQa
2006-12-14 08:45:59 · update #1
不過你打的有一段我實在是看不懂他怎麼運作的 借用您的程式碼
for(op=strtok(equation_2, delimNum), i=0; op; op=strtok(NULL, delimNum), i )
{ num[i] = atof(op);
printf("%f\n", num[i]);
}
2006-12-14 08:46:21 · update #2
以下是我嘗試修改的程式碼,請問這樣哪裡有錯誤嗎
for( i=0; op; i )
{
op=strtok(equation_2, " -*/")
num[i] = atof(op);
printf("%f\n", num[i]);
op=strtok(NULL, " -*/")
}
謝謝您的耐心回答
2006-12-14 08:46:28 · update #3
To jj:
我用編輯器的是dev c ,不知道它是用什麼在編譯的??
您說我有問題的那段程式碼我有把它改成您教我的那段試試看,可是發現還是有一樣的問題,程式碼可以編譯,可是當程式執行到那裡的時候就說記憶體出錯,然後他就自己關掉了...我不知道是dev c 的問題還是程式碼的問題,可是我把它移到FreeBSD上面去跑他也是可以編譯,可是好像也有問題!!(不知道是不是我手殘哪裡用錯了)
2006-12-14 08:53:32 · update #4
To 小娟sara:
不好意思,因為我不知道NULL是怎麼出來的,所以我看不太懂您說的是什麼意思,不好意思喔
2006-12-14 08:57:17 · update #5
A. 錯誤出現在 atof(__); 因為您要它把一個 NULL 轉成 double。
原因是:您把判斷寫在 num[i]!=NULL, 而 num[i] 是 double!
這個判斷永遠不會是您想要的!
而且,這個判斷在 atof(NULL) 之後!
B. 要解決您 A. 的問題,要用一個 字串指標(不用怕,像您的 op就是)。
建議您:先算數字,+-*/,這樣可以省下一個指標。
缺點:程式稍微不易讀:op到底是用來做啥的?
解決之道:加註。
C. 您的 equation_2 沒 copy 到結束字元!這經常會出錯!
建議您:
1. i
for (i=strlen(equation); i>=0; i--)
equation_2[i] = equation[i];
3. 用內建函數:strcpy。
D. 您最後for的i無效!它被 while 遮掉了!
E. 您沒留下 ( ) 等,是否暗示您想做的只是簡單的計算機?
您的結構要處理先 */ 後 +- 〝可能〞有點困難。
F. 建議您 delim 設成變數。必要的話,可設成 const 型態。
優點:不必寫 2 次,萬一寫錯或將來要增加,如:加上 ( )。
缺點:可能會變慢一點點!可加上 const 把速度撿回來。
加 const 的缺點:失去彈性。
G. 依您的程式,我簡單修改如下:
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{ double num[100];
char *delimNum = "+-*/",
*delimOp = "0123456789",
equation[100], equation_2[100],
*op;
int i;
printf("請輸入運算式: ");
scanf("%s", equation);
strcpy(equation_2, equation);
for(op=strtok(equation_2, delimNum), i=0; op; op=strtok(NULL, delimNum), i++)
{ num[i] = atof(op);
printf("%f\n", num[i]);
}
for (op=strtok(equation, delimOp); op; op=strtok(NULL, delimOp))
printf("%s\n",op);
return 0;
}
2006-12-14 01:21:03 補充:
對了,漏寫了:
H. 您的 op 只存了一個(沒用陣列)!是否是我寫您 E. 的原因?
若要處理 E. 的東東,op 要用陣列喔!
2006-12-14 06:25:02 補充:
最後2個 printf 裡的 "__\n" 的\都被 Yahoo 自動刪除了!所以你只看到 fn 和 sn,請加上半型的\
您要像 JJ 講的可以輸入空白,只要
1. 把第一個 scanf(__, _); 改成 get(equation);
2. 把2個delim__的內容加上 空白,即 " -*/ " 和 "0123456789 " 應該就可以了。
2006-12-14 06:25:17 補充:
gets, 不是 get
2006-12-13 20:18:16 · answer #1 · answered by ? 7 · 0⤊ 0⤋
看你的程式, 可能不是用 ANSI C 編輯器.
因為在我的系統下沒有問題
(不知道你輸入什麼出問題的).
有兩點建議:
1. scanf("%s",&equation);
所以你的輸入字串不能有空白吧. 不是錯誤, 但仍有改良的空間.
2. num[0]=atof(strtok(equation_2,"+-*/"));
for(i=0;i
while(num[i]!=NULL)
{
printf("%fn",num[i]);
num[i]=atof(strtok(NULL,"+-*/"));
}
}
這段程式大有問題.
num[0]=atof(strtok(equation_2,"+-*/"))做了之後,
第一個運算元的位置已經被改為 NULL. 所以 equation_2 的長度就是第一個數字的長度.
當 i=0 時, 你的 while 迴路就會做完所有的工作.
所以你的 for 迴路會空轉好幾次.
而你的 i 在 while 中並沒有改變, 所以 num[0] 的值一直被後來的數給替換.
建議改成如下:
num[0]=atof(strtok(equation_2,"+-*/"));
i = 0;
while(num[i]!=NULL)
{
printf("%fn",num[i]);
i ++;
num[i]=atof(strtok(NULL,"+-*/"));
}
2006-12-13 21:53:58 · answer #2 · answered by JJ 7 · 0⤊ 0⤋
while(num[i]!=NULL)//這行就錯了吧…
//num[i]是浮點數陣列中的元素,本來就不會是NULL吧 @_@
atof轉換不成功的話會return 0.0,所以可能要改成while(num[i]!=0.0)吧 @﹏@
不過這樣運算元和運算子分開存...好像會不能判斷哪個先哪個後吧 @_@"
這樣要寫出計算機我也不知道怎麼寫...
2006-12-13 19:30:07 · answer #3 · answered by ? 5 · 0⤊ 0⤋