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
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
Jonathan Holz
Eigenes schreiben sscanf() -Methode in C# ist nicht so schwierig, wenn es Ihnen nichts ausmacht, ein wenig Low-Level-Code zu schreiben.
Und einige Leute bei Microsoft denken
C#
ist besser alsC++
…(~.~)
– Olivier Pons
6. Januar 2018 um 0:19 Uhr