回答編集履歴

1 元のソース修正と追加質問への回答

Chironian

Chironian score 20274

2017/02/01 12:00  投稿

こんにちは。
カンマ区切りの0以上の10進数をunsigned intの並びへ変換して、sendData()を呼び出すのであれば、下記で出来ます。
```C++
#include <iostream>
#include <iomanip>
#include <sstream>
#include <vector>
void sendData(unsigned int buf[], int len, int hz)
{
   for (std::size_t i=0; i < len; ++i)
   {
       if (i) std::cout << ", ";
       std::cout << std::hex << std::setfill('0') << std::setw(8)
                 << "0x" << buf[i];
       std::cout << "0x" << std::hex << std::setfill('0') << std::setw(8)
                 << buf[i];
   }
}
int main()
{
   std::stringstream ss("123,456,789");
   std::vector<unsigned int> buffer;
   while(ss.good())
   {
       unsigned int data;
       ss >> data;
       if (ss.fail())
   break;
       buffer.push_back(data);
       char delim=0;
       ss >> delim;
       if (delim != ',')
   break;
   }
   sendData(&buffer[0], buffer.size(), 38);
   return 0;
}
```
数値定数は、0xを付けると16進数表現ができますが、文字列に"0x"を付けてもコンピュータにとっては文字列のままです。数値に変わるわけではありません。文字列を数値へ変換処理する必要が有ります。
変換方法には実に様々な方法がありますが、お手軽な[string stream](http://d.hatena.ne.jp/g940425/20110212/1297531253)を使ってみました。
std::cinから読み込む時と同じ処理で出来ます。
バッファの組み立てはstd::vectorを使ってみました。効率は悪いですが、お手軽です。
sendData()でデバック用に0x付きの16進数表現で表示してみました。これは人が目で見て分かりやすいようにするためです。[マニュピュレータ](http://qiita.com/katabamisan/items/5c9600e839d1d6ef4d62)を使ってます。
sendData()でデバック用に0x付きの16進数表現で表示してみました。これは人が目で見て分かりやすいようにするためです。[マニュピュレータ](http://qiita.com/katabamisan/items/5c9600e839d1d6ef4d62)を使ってます。
---
【追加】
コメントにも書きましたが、数値表現については[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE)等の記事を参考にされて下さい。
文字列からの変換サンプル・ソースはググってみたけど標準ライブラリを使わないケースを見つけることができませんでした。アルゴリズムを提示しているサイトは、数学的(文字列と数値を区別しない)に書いているところばかりでしたので、更に混乱しそうです。
簡単ですの書いてみました。エラー処理をほとんどしていませんので、想定外の文字列がdata1に入っているとエラーにならずに誤動作します。
```C++
void sendData(unsigned int buf[], int len, int hz);
int main()
{
   char data1[20] = "123,456,789";
   unsigned int buf[100];
   int index=0;
   buf[index]=0;
   for (char* p=data1; *p != 0; ++p)
   {
       if (*p == ',')
       {
           ++index;
           buf[index]=0;
   continue;
       }
       else if ((*p < '0') || ('9' < *p))
   continue;
       buf[index] *= 10;
       buf[index] += *p-'0';
   }
   sendData(buf, index+1, 38);
   return 0;
}
#include <iostream>
#include <iomanip>
void sendData(unsigned int buf[], int len, int hz)
{
   for (std::size_t i=0; i < len; ++i)
   {
       if (i) std::cout << ", ";
       std::cout << "0x" << std::hex << std::setfill('0') << std::setw(4)
                 << buf[i];
   }
}
```
EEPROMへ書き込むフォーマットに"0x"が追加されてますね。面倒なのでそれには対応していません。ご自身で改造されてみて下さい。
しかし、EEPROMへ書き込むフォーマットを選択できるのでしたら、最初からunsigned int buf[SIZE];形式で書いておけば楽と思います。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る