it-swarm.com.de

Suche nach C # -Äquivalent von scanf

Ich habe früher in der Programmiersprache C programmiert und fand die scanf-Funktion sehr nützlich. Leider gibt es in C # keine Entsprechung.

Ich verwende es, um halbstrukturierte Textdateien zu analysieren.

Ich habe ein interessantes Beispiel für scanf Implementierung hier gefunden. Leider sieht es alt und unvollständig aus.

Kennt jemand eine scanf C # -Implementierung? Oder zumindest etwas, das als umgekehrter string.Format funktionieren würde?

27
Larry

Wenn reguläre Ausdrücke für Sie nicht funktionieren, habe ich gerade einen sscanf()-Ersatz für .NET veröffentlicht. Der Code kann unter http://www.blackbeltcoder.com/Articles/strings/a-sscanf-replacement-for-net eingesehen und heruntergeladen werden.

7
Jonathan Wood

Können Sie, da die Dateien "semi-strukturiert" sind, eine Kombination aus ReadLine () - und TryParse () - Methoden oder die Regex-Klasse zum Analysieren Ihrer Daten verwenden?

9
Mitch Wheat

Sie können scanf direkt aus C-Laufzeitbibliotheken verwenden. Dies kann jedoch schwierig sein, wenn Sie es mit unterschiedlichen Parametern ausführen müssen. Ich empfehle Ihnen, reguläre Ausdrücke für Ihre Aufgabe oder beschreiben Sie diese Aufgabe hier, vielleicht gibt es andere Möglichkeiten.

5
okutane

Ich habe eine bessere Lösung gefunden als mit sscanf von C oder einem anderen Teil, der von jemandem neu geschrieben wurde (keine Beleidigung).

http://msdn.Microsoft.com/de-de/library/63ew9az0.aspx In diesem Artikel wird erläutert, wie benannte Gruppen gebildet werden, um die gewünschten Daten aus einem Muster zu extrahieren Schnur Hüten Sie sich vor dem kleinen Fehler im Artikel und der besseren Version unten. (der Doppelpunkt war nicht Teil der Gruppe)

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
4
jurik

Sie können msvcrt.dll importieren.

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));
        }
    }
}

Es funktioniert gut unter .NET, jedoch nicht unter Mono. Es zeigt die Fehlermeldung:

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

Eine andere Möglichkeit, die sowohl in .NET als auch in Mono gut funktioniert, ist die Verwendung von 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);
        }
    }
}

Diese Methode ist jedoch eher begrenzt.

Bearbeiten Sie 2018-5-24  

Die erste Methode, die arglist verwendet, funktioniert unter .net Core nicht. Es scheint, dass das Aufrufen der Vararg-Funktion im C-Stil als schlecht angesehen wird. Sie sollten stattdessen die .net-Bibliothek wie string.format verwenden.

4
Jason Lee

Es gibt gute Gründe, warum eine scanf-ähnliche Funktion in c # fehlt. Es ist sehr fehleranfällig und nicht flexibel. Die Verwendung von Regex ist viel flexibler und leistungsfähiger.

Ein weiterer Vorteil ist, dass die Wiederverwendung im gesamten Code einfacher ist, wenn Sie dasselbe in verschiedenen Teilen des Codes parsen müssen.

3
sprite

Ich denke, Sie möchten, dass die C # -Bibliotheksfunktionen entweder Parse oder Convert sind.

// 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

Sie könnten System.IO.FileStream und System.IO.StreamReader verwenden und von dort aus analysieren.

0
SMB