web-dev-qa-db-ja.com

scanfに相当するC#を探す

以前はC言語でコーディングしていて、scanf関数が非常に便利であることがわかりました。残念ながら、C#には同等のものはありません。

半構造化テキストファイルの解析に使用しています。

scanfの実装の興味深い例 here が見つかりました。残念ながら、古くて不完全に見えます。

誰かがscanf C#実装を知っていますか?または、少なくとも逆に機能するものstring.Format

30
Larry

正規表現が機能しない場合は、.NETの代わりにsscanf()を投稿しました。コードは http://www.blackbeltcoder.com/Articles/strings/a-sscanf-replacement-for-net で表示およびダウンロードできます。

7
Jonathan Wood

ファイルは「半構造化」されているため、ReadLine()メソッドとTryParse()メソッドの組み合わせ、またはRegexクラスを使用してデータを解析できませんか?

9
Mitch Wheat

Cのsscanfまたは誰かが書き直した部分(違反なし)を使用するよりも良い解決策を見つけました

http://msdn.Microsoft.com/en-us/library/63ew9az0.aspx この記事をご覧ください。名前付きグループを作成して、パターン化された文字列から必要なデータを抽出する方法について説明しています。記事の小さなエラーと以下のより良いバージョンに注意してください。 (コロンはグループの一部ではありませんでした)

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string url = "http://www.contoso.com:8080/letters/readme.html";
      Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",RegexOptions.None, TimeSpan.FromMilliseconds(150));
      Match m = r.Match(url);
      if (m.Success)
         Console.WriteLine(r.Match(url).Result("${proto}:${port}")); 
   }
}
// The example displays the following output: 
//       http::8080
5
jurik

ScanfはCランタイムライブラリから直接使用できますが、異なるパラメーター数で実行する必要がある場合、これは難しい場合があります。タスクの正規表現を使用するか、ここでそのタスクを説明することをお勧めします。別の方法があるかもしれません。

5
okutane

Msvcrt.dllをインポートしてみてください

using System.Runtime.InteropServices;

namespace Sample
{
    class Program
    {
        [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int printf(string format, __arglist);

        [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int scanf(string format, __arglist);

        static void Main()
        {
            int a, b;
            scanf("%d%d", __arglist(out a, out b));
            printf("The sum of %d and %d is %d.\n", __arglist(a, b, a + b));
        }
    }
}

これは.NET Frameworkでうまく機能します。しかし、Monoでは、エラーメッセージが表示されます。

Unhandled Exception:
System.InvalidProgramException: Invalid IL code in Sample.Program:Main (): IL_0009: call      0x0a000001


[ERROR] FATAL UNHANDLED EXCEPTION: System.InvalidProgramException: Invalid IL code in Sample.Program:Main (): IL_0009: call      0x0a000001

Monoの互換性が必要な場合は、arglistの使用を避ける必要があります

using System.Runtime.InteropServices;

namespace Sample
{
    class Program
    {
        [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int printf(string format, int a, int b, int c);

        [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int scanf(string format, out int a, out int b);

        static void Main()
        {
            int a, b;
            scanf("%d%d", out a, out b);
            printf("The sum of %d and %d is %d.\n", a, b, a + b);
        }
    }
}

引数の数は固定されています。

2018-5-24を編集

arglistも.NET Coreでは機能しません。 Cのvararg関数の呼び出しは推奨されないようです。代わりに、String.Formatなどの.NET文字列APIを使用する必要があります。

4
Jason Lee

Scanfのような関数がc#から欠落しているのには十分な理由があります。エラーが発生しやすく、柔軟性がありません。 Regexを使用すると、はるかに柔軟で強力になります。

別の利点は、コードのさまざまな部分で同じものを解析する必要がある場合に、コード全体で再利用しやすくなることです。

3
sprite

C#ライブラリ関数の解析または変換が必要だと思います。

// here's an example of getting the hex value from a command line 
// program.exe 0x00080000

static void Main(string[] args)
{
    int value = Convert.ToInt32(args[1].Substring(2), 16);
    Console.Out.WriteLine("Value is: " + value.ToString());
}
2
Nichol Draper

System.IO.FileStreamとSystem.IO.StreamReaderを使用して、そこから解析できます。

0
SMB