これは正規表現の問題と考えることができます。
そのため正規表現ライブラリを使う方法と、その簡易版を実装する方法があります。
ここでは先頭から対象の文字列をチェックしていく方法を考えます。
ポインタstrに対象文字列が格納してあるとします。
str を先頭からチェックしていく位置をpで確保します。
そうすると,例えばfor文をつかって次のように書けるでしょう。
c
1#define MAX_NUM 5 // 先頭がアルファベットでない場合最大5個
2const char *str="A100B20C3000D40"; //
3unsigned long long result[MAX_NUM]; // 答の格納先
4char i=0; //格納位置
5unsigned long long work = 0;
6
7
8// 文字列 str を先頭からチェックする
9for(char *p = (char*)str;p!=¥0;p++)
10{
11...
12...
13}
次に、肝心の処理部分ですが、2パターンを考えます。
現在の文字位置が数字であるかどうか 数字であればworkを計算します。
数字でなければ、つまりアルファベットか文字列終端であれば、今までの数字を結果に格納します。
数字であれば、
WORKは今までの位置の数字なので10倍して現在の位置の数字を足せばいいでしょう。
数字でなければ
WORKを結果の格納し、次の格納場所を用意し、WORKをクリアすればいいでしょう。
c
1if ( is_number_char(*p) ){
2 work = work *10 + (*p - '0');
3} else {
4 result[i]=work; //
5 i++;
6 work=0;
7}
8
9} //for ループの終り
10result[i]=work; // 最後のアルファベット以降の結果
ここで is_number_char は 数字かどうかを判定する関数です。
c
1int is_number_char(c){
2 return (('0' <= c) && (c <='9'))
3}
2018/09/01 23:40
2018/09/02 01:38