ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

C#でscanf的なことをする

既出ですが、C#でscanf的に値を読み込む方法を書いていきたいと思います。

今回はわりと小さい記事です。
久しぶりにC#カテゴリの記事を書きますが、VB.NETでもPowerShellでも、.NETで動くもので共通ですけどね。


そもそもC言語ではscanf関数を使って

int a,b;
scanf("a:%d, b:%d", &a, &b);


みたいにフォーマットされた文字列を読み込んで指定の部分を変数に格納することができます。


しかし、C#ではこういう関数がないので、どうしようかと困ってしまいますね。

単純なカンマ区切りとかだったらString.Splitで特定の場所を取ったりできますが、なんか自然じゃないし、そもそももっと複雑なフォーマットになるとコードも複雑になります。



じゃあどうするかというと、正規表現のキャプチャを使います。
番号でグループにアクセスしてもいいんですが、わかりやすさのため(?<a>[0-9]+)みたいにグループに名前をつけておきます。

string input = Console.ReadLine();
Match m = Regex.Match(input, "^a:(?<a>[0-9]+), b:(?<b>[0-9]+)$");
int a = int.Parse(m.Groups["a"]);
int b = int.Parse(m.Groups["b"]);


(?<a>[0-9]+)などがscanfでいう%dに相当します。


読み込むのが整数じゃなくて小数だった場合は、scanfでは%fと書けば済みますが、
こちらの正規表現では小数のフォーマットを自前で書かないといけないので多少面倒さは残ります。

あと、負数に対応させる場合も自前で書かないといけないですね。


string input = Console.ReadLine();
Match m = Regex.Match(input, @"^a:(?<a>[0-9]+(\.[0-9]+)?), b:(?<b>-?[0-9]+)$");
float a = float.Parse(m.Groups["a"]);
int b = int.Parse(m.Groups["b"]);



しかし書式を自前で書かないといけないということは、それだけ細かいところに手が届くので、カスタマイズしやすいということでもありますね。

さっき調べてみたら、scanfの書式指定もわりと多機能そうだったんですが、正規表現には敵わないでしょうね。

正規表現では繰り返しの表現が可能ですので、頑張れば任意の長さのカンマ区切りのデータなども読めます。


ということで、正規表現で入力を読み込めば便利という記事でした。

読み込む部分を関数に切り分けて、なんちゃってscanf関数を作ってもいいかもしれないですね。

tag: プログラミング C# C言語 文字列 正規表現 パターンマッチ 入力

7月

その他で覚えた技術
・シークエント計算について少し学んだ。

コメント
前回と同じですね。ほんの少しだけで、ゼロに等しいような成果です。今回は前回と違って記事執筆などのアウトプットも少なかったので、たいしたことのない月となってしまいました。

tag:

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。