C#-Äquivalent von C sscanf [duplicate]

Lesezeit: 3 Minuten

Benutzer-Avatar
Shamim Hafiz – MSFT

Mögliches Duplikat:

Gibt es ein Äquivalent zu ‘sscanf()’ in .NET?

sscanf in C ist eine gute Möglichkeit, gut formatierte Eingaben aus einer Zeichenfolge zu lesen.

So erreichen Sie dieses C#.

Zum Beispiel,

int a,b;
char *str= "10 12";
sscanf(str,"%d %d",&a,&b);

Der obige Code weist 10 a und 12 b zu.

Wie erreicht man dasselbe mit C#?

  • Und einige Leute bei Microsoft denken C# ist besser als C++(~.~)

    – Olivier Pons

    6. Januar 2018 um 0:19 Uhr

Es gibt kein direktes Äquivalent in C#. Bei der gleichen Aufgabe in C# könnten Sie es etwa so machen:

string str = "10 12";
var parts = str.Split(' ');
int a = Convert.ToInt32(parts[0]);
int b = Convert.ToInt32(parts[1]);

Je nachdem, wie wohlgeformt Sie die Eingabe annehmen können, möchten Sie möglicherweise einige Fehlerprüfungen hinzufügen.

  • Diese Technik ist mir bereits bekannt. Es wäre jedoch schön gewesen, so etwas wie sscanf in C# zu haben.

    – Shamim Hafiz – MSFT

    19. November 2010 um 10:12 Uhr

  • @Gunner, ich stimme zu, es wäre schön. Aber ich denke, Sie müssten es selbst implementieren, wenn Sie es brauchen. Es existiert nicht im Framework.

    – driis

    19. November 2010 um 10:28 Uhr

  • ablehnen; das ist eine lächerliche antwort. sscanf ist weitaus komplexer als das einfache Aufteilen auf ein gemeinsames Trennzeichen. Zum Beispiel sollte „%d%3s%d“ „123abc567“ in 123, abc, 567 auflösen, was etwas ist, wofür split nicht verwendet werden kann.

    – Doug

    24. März 2013 um 3:43 Uhr

  • @Doug, ich bin mir bewusst, dass sscanf ein anderes Tier ist als Splitdaher beginne ich die Antwort mit “Es gibt kein direktes Äquivalent” -> Und dann gebe ich ein Beispiel dafür, wie die vom OP erwähnte konkrete Aufgabe in C # erfüllt werden kann.

    – driis

    24. März 2013 um 9:46 Uhr

Benutzer-Avatar
Cody Gray

Es gibt kein direktes Äquivalent zu sscanf im .NET-Framework.

Der einfachste Weg, dieselbe Funktionalität zu erreichen, ist das Teilen der Zeichenfolge (String.Split) und dann die nachfolgenden Teile Variablen mit dem zuweisen Int32.Parse Methode. Zum Beispiel:

string myString = "10, 12";
string[] stringValues = myString.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
int a = Int32.Parse(stringValues[0]);
int b = Int32.Parse(stringValues[1]);

Viele verschiedene Datentypen im Framework haben Parse Methoden, einschließlich Enumerationen, wenn die Werte, die Sie aus der Zeichenfolge einlesen möchten, nicht unbedingt ganzzahlige Werte sind.

Könntest du auch verwenden Reguläre Ausdrückeaber sie sind wahrscheinlich ein bisschen übertrieben für eine so einfache Aufgabe wie diese.

BEARBEITEN: Wenn Sie bei der Verwendung wirklich festgefahren sind sscanf, könnten Sie immer in Betracht ziehen, die Funktion aus den C-Laufzeitbibliotheken per P/Aufzurufen. Vielleicht so (ungetestet):

[DllImport("msvcrt.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int sscanf(string buffer, string format, ref int arg0, ref int arg1);

Ich schreibe nur, um die Zeit totzuschlagen.

public static unsafe void Main(string[] args)
{
    int a, b,c;
    string str = "10 12 100";
    sscanf(str, ' ', &a, &b, &c);
    Console.WriteLine("{0} {1} {2}", a, b, c);
    Console.Read();
}

public static unsafe void sscanf(string str, char seperator, params int*[] targets)
{
    var parts = str.Split(seperator);
    if (parts.Length != targets.Length) throw new ArgumentException();
    for (int i = 0; i < parts.Length; i++)
    {
        *targets[i] = int.Parse(parts[i]);
    }
}

  • Ich weiß, dass Sie nur die Zeit totschlagen. ABER dein Code rockt! (sehr prägnant, sehr lesbar, sehr flexibel –> gleich rockin!)

    – Trevor Boyd Smith

    6. Januar 2011 um 20:07 Uhr

  • Ich wette, einige Leute haben wegen der “unsicheren” Sache nicht abgestimmt. Ich bin mir ziemlich sicher, dass die meisten C#-Entwickler das Schlüsselwort „unsafe“ nicht verwenden dürfen. Ich bin ein sehr “c” zentrischer Entwickler, also … kein Problem.

    – Trevor Boyd Smith

    6. Januar 2011 um 20:08 Uhr

  • oder einfach weil es nur ein Teil der sscanf-Funktionalität ist 😉

    – mikus

    14. Dezember 2011 um 13:46 Uhr

Benutzer-Avatar
Jonathan Holz

Eigenes schreiben sscanf() -Methode in C# ist nicht so schwierig, wenn es Ihnen nichts ausmacht, ein wenig Low-Level-Code zu schreiben.

Sie können meine Version im Artikel sehen Ein sscanf()-Ersatz für .NET.

aus Laufzeitroutinen und .NET Framework-Äquivalente

sscanf, swscanf ==> Siehe Parse-Methoden, wie z System.Double.Parse

Also, ich denke, es gibt kein direktes Äquivalent.

1368200cookie-checkC#-Äquivalent von C sscanf [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy