質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

6431閲覧

C言語 アルファベットと数字が混在する文字列からの数値切り出し

watan

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/09/01 19:23

アルファベットと数値が混在する文字列の中から数値を切り出し、その数値を配列に格納するという処理を実装したいのですが、解決方法が見つかっていません。
文字列の中に出現するアルファベットは最大4つ
出現するアルファベットは1文字
となります。
[A100B20C3000D40]
という文字列から
[100]
[20]
[3000]
[40]
を抜き出し別変数に格納するのが目的です。

どのような方法が考えられるかご教示いただければと思います。
自己解決ができておらず、コードがかけていない状況で申し訳ありませんがどうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

C

1#include <stdio.h> 2#include <ctype.h> 3#include <string.h> 4 5int main(){ 6 char str[] = "A100B20C3000D40"; 7 8 char out[100]; 9 int istr=0; 10 int iout=0; 11 12 printf("<<sample1>>\n"); 13 for(istr=0; istr<=strlen(str); ++istr){ 14 if(isdigit(str[istr])){ 15 out[iout] = str[istr]; 16 iout++; 17 out[iout] = '\0'; 18 }else if(iout){ 19 printf("%s\n",out); 20 iout=0; 21 } 22 } 23 24 printf("<<sample2>>\n"); 25 char *p, *q; 26 p=str; 27 while(q=strtok(p,"ABCDEFGHIJKLMNOPQRSTUVWXYZ")){ 28 p=NULL; 29 printf("%s\n", q); 30 } 31}

サンプル2は、関数strtokが元のstrの中身を書き換えますので、注意してください。

投稿2018/09/01 22:33

編集2018/09/01 22:34
otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

watan

2018/09/01 23:40

回答ありがとうございました。 一文字ずつ判定していく方法、strtokを用いて判定する方法どちらも理解できました。 サンプルコードについても大変参考になりました。 どうもありがとうございました!
otn

2018/09/02 01:38

注記忘れました。よく見るのは、istr<strlen(str) ですが、今回は最後の処理をする必要があるので、istr<=strlen(str) です。
guest

0

これは正規表現の問題と考えることができます。
そのため正規表現ライブラリを使う方法と、その簡易版を実装する方法があります。
ここでは先頭から対象の文字列をチェックしていく方法を考えます。

ポインタ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 22:21

fu7mu4

総合スコア1088

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

watan

2018/09/01 23:38

回答ありがとうございました。 数字かどうかを判定し、配列に格納しポインタを進めていく・・・ よく理解できました。 大変たすかりました!ありがとうございました!
guest

0

strtol 関数ってのがありますぜ

投稿2018/09/01 23:43

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問