No.8ベストアンサー
- 回答日時:
> ただ、"%*[^0123456789]%d"の部分がわかりにくいです。
ひとつづつ解説します。
%の直後の'*'ですが、これは実引数への格納を抑止するという意味です。'*'がないと、(型が違うのに)aに無理やり格納されてしまいます。
[^0123456789]ですが、[]内で'^'を最初に指定した場合、それに続く文字群以外からなる文字列を走査します。この場合には数字以外がこの部分に合致するようにしています。処理系によっては[^0-9]とすることもできますが、厳密に規格に合致させるには、[^0123456789]のように全部ダラダラ並べる必要があります。
strが"今週,23位"を指す場合、数字以外ですから、このフィールドは"今週,"の部分を読み込んで、その内容を破棄します。
%dは十進数値を走査します。直前のフィールドで"今週,"が読み飛ばされていますから、続く"23位"から最初の十進数値、すなわち23を読み込み、整数値としてaに格納します。
アスタリスクは検索で何でもOKという使い方しか知りませんでした。この書式は覚えておこうと思います。どうもありがとうございました。
No.7
- 回答日時:
No5, 6 ency です。
> ただchar *pで23を差すは理解できにくいですが、思った結果が
> 返ってきましたので、これを使おうかと思います。
atoi() がどのような関数なのかはご存知ですか?
数字 (文字列) を int型の数値に変換してくれる関数です。
たとえば。。。
--------------------------------------------------------
int hoge;
hoge = atoi( "1234" );
--------------------------------------------------------
という場合には、文字列 "1234" から int型の数値 1234 になるわけです。
atoi() は数字 (文字列) を数値に変換するのが目的の関数ですが、後ろの数字以外の文字がついている場合、それは無視してくれるんです。
というわけで、"23位" を atoi() に渡すと 23 という数値が返ってくるわけです。
回答されている皆さんのどれもが、先頭の数字を見つけるための方法です。
phoenix343 さんと私の場合、それが関数化されているものをご紹介したに過ぎません。
「難しい」という一言で一蹴するのではなく、それを理解できるように努力することもお忘れなく。
No1 jacta さんのご回答は「正規表現」(ですよね?) をうまく利用した方法で、応用範囲もかなり広いと思います。
理解して使えるようになれば、かなり大きな力になると思います。
No2 komakana さんのご回答は標準関数を使えない環境なんかではよく使う方法です。
# 私も組込み系な人間なもので。。。
# 最近は標準ライブラリもしっかりしてきていますが、ちょっと前
# なんかは、「標準関数使用禁止!」などというお達しがでたくらい
# 信用のないものでした。。。
…なんか、いろいろと書きすぎましたね。
勉強し始めのころは、いろいろなパターンを考えてみるのが良いと思いますよ。
そうするうちに、「手を抜いて楽する」方法も身についてきますから。。。
がんばってくださいね、bonbontarou さん!
No.6
- 回答日時:
No5 ency です。
ポインタ p の NULL チェックしてませんでしたね。
--------------------------------------------------------
int a;
char str[] = "今週,23位";
char *p;
p = strpbrk( str, "1234567890" );
if ( p != NULL ) /* ←数字が見つかった! */
a = atoi( p );
--------------------------------------------------------
この関数が私には一番わかりやすいです。
ただchar *pで23を差すは理解できにくいですが、思った結果が返ってきましたので、これを使おうかと思います。
皆さん本当時間割いてくれて有難う御座いました。
No.5
- 回答日時:
こんな方法もありますね。
# 標準関数だけでやってみました。。。
--------------------------------------------------------
int a;
char str[] = "今週,23位";
char *p;
p = strpbrk( str, "1234567890" );
a = atoi( p );
--------------------------------------------------------
strpbrk() は1番目の引数に設定した文字列の中で、2番目の引数に設定した文字列に含まれるどれかの文字が現れる位置を指すポインタを返す関数です。
# 要するに、この場合 str の '2' の場所を指すポインタが返ります。
あとは、atoi()/atol() なり、strtol() なり、sscanf() なり、お好きなものを使えば良いでしょう。
No.3
- 回答日時:
次の関数を使えば、その位置へのポインタを取得できます。
strcspn、wcscspn、_mbscspn
http://www.microsoft.com/japan/msdn/library/defa …
だからこうなりますか。
int a;
char *p = strcspn(str, "0123456789");
if ( p )
{
a = atoi(p);
}
どうでしょう?
No.2
- 回答日時:
#include <stdio.h>
main(){
char str[] = "今週,23位";
int a = 0;
int i = 0;
int j = 0;
while(str[i] != NULL){
if(str[i] - '0' > 0 && str[i] - '0' < 9){
a = a*10 + (int)(str[i]-'0');
}
i++;
}
printf("%d ", a);
}
ごちゃごちゃしてしまいましたがこんな感じでどうでしょうか?
前の回答者の方の言っているとおり、
char str[] = "今週23位"だと思います。
char だけだと一文字を表します。
char * または charの配列を用いて文字列を表します。
str[i] - '0'というのは数字を表す文字が数字の順に並んでいることを利用したものです。
文字コードについては、
http://e-words.jp/p/r-ascii.html
を参照してください。
駄文しつれいいたしました!がんばってくださいね!
No.1
- 回答日時:
まず、char str[] = "今週,23位";の間違いではないでしょうか?そうだと解釈して以下回答します。
int a;
sscanf(str, "%*[^0123456789]%d", &a);
とすれば概ね問題ないと思いますが、文字コードにISO-2022-JPなどを使っていると期待通りに動作しません。
ワイド文字が使えるのであれば、いったんmbstowcsでワイド文字列に直してから、swscanfを使うなどした方がよいかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C言語 少しの疑問 4 2022/11/08 02:48
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fstream型オブジェクトを関数の...
-
C言語のintとcharの違いってな...
-
文字列ポインタと配列の違いで...
-
char型にint型の数値を代入する。
-
しつこい様ですが、再度ポイン...
-
strtok
-
C言語で文字列置き換え
-
ポインタを使用 [数字列を数値...
-
C言語での構造体
-
入力された文字列の中の数字を...
-
char c = 'a'; char h[1] = c; ...
-
引数として二次元配列を利用す...
-
ASCIIコードへの変換方法
-
コマンドライン引数 *argv[]は...
-
CStringからchar*への型変換に...
-
WM_CHAR or WM_KEYDOWN の「wPa...
-
new charとnew char[N]の違いは?
-
char*型の文字列をchar[10]へ。
-
C言語にて構造体のメンバがNULL...
-
csvファイルをfscanfで読み込む...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
strcat関数を自作したいです
-
fstream型オブジェクトを関数の...
-
new charとnew char[N]の違いは?
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
wsprintf( ポインタ , "%d" , "...
-
c言語でポインタ変数を用いた配...
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C++17で、unsigned char * 配列...
-
共用体について
-
エクセルのMID関数は、C言語では?
おすすめ情報