- ベストアンサー
文字列を数値に変換する方法
- ATmega88マイコンでC言語プログラムを作成していますが、文字列を数値に変換する必要があります。
- PCとATmega88をRS232Cケーブルで接続し、PCから送られるコマンドをATmega88のEEPROMメモリに書き込みたいと考えています。
- 現在のプログラムは正常に動作していません。どのように修正すればよいか教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
該当のマイコンは知りませんが…(Arduino とは違うか…) >while(*p) >{ > strcpy(&words[n++], p); > p = strtok(NULL, " "); >} strtok()の仕様を確認した方がよいでしょう。 元々の文字列内に" "が含まれなかった場合、NULLを返却するハズです。 となると、「while(*p)」はNULLポインタアクセスです。 # 最初のstrtok()で該当する文字が発見できなかった場合も当然NULLポインタアクセスです。 >my_eeprom_write_byte(&greg_slave[atoi(&words[2])].serial[i],atoi(&words[3+i])); ループ中「atoi(&words[2])」に関しては値が変わらないのですから、ローカル変数なりに入れた方が 実行時の効率が上がるかと思われます。 マイコンの為、メモリは厳しいかと思われますが… あとは…どこがどう「うまく動作していないよう」なのか不明ですので…なんとも。
その他の回答 (3)
- asuncion
- ベストアンサー率33% (2127/6290)
そこかしこに登場している words という変数をどのように定義しているかがわからないので、なんとも…。
- D-Matsu
- ベストアンサー率45% (1080/2394)
strtokは「デリミタが見つからない場合は(残りの)全文を返す、残りが空ならNULLを返す」なので第1引数の中身がNULLや空文字列でなければ戻り値がNULLでないのは保証されます。 問題なのはwhileの条件式の方で、この式では「参照先がヌル文字」の場合のみ抜けるということになるので空文字列を返すことがないstrtokでは絶対に正常終了できません。 要するに「ほぼ確実に最初のwhileで既にメモリ例外になっている」ということです。
- titokani
- ベストアンサー率19% (341/1726)
sscanfが使えるなら、そちらのほうが楽ですよ。 char s1[40]; char s2[40]; int d; int serial; sscanf(rx_char,"%s %s %d %d",s1,s2,&d,&serial); という感じで。