2010-11-19 22 views
23

Mögliche Duplizieren:
Is there an equivalent to 'sscanf()' in .NET?C# -Äquivalent von C sscanf

sscanf in C ist eine schöne Art und Weise gut formatierte Eingabe aus einer Zeichenfolge zu lesen.

Wie erreicht man diese C#.

Zum Beispiel

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

Der obige Code zuweist 10 a und 12 b auf.

Wie erreicht man dasselbe mit C#?

+0

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

Antwort

13

Es gibt keine direkte Entsprechung in C#. Bei gleicher Aufgabe in C#, man könnte es so etwas tun:

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

Je nachdem, wie gut ausgebildet Sie die Eingabe annehmen kann zu sein, möchten Sie vielleicht einige Fehlerprüfungen hinzuzufügen.

+2

Ich bin mir bewusst, bereits von dieser Technik. Es wäre aber nett gewesen, etwas wie sscanf in C# zu haben. –

+0

@Gunner, ich stimme zu, es wäre nett. Aber ich denke, Sie müssten es selbst implementieren, wenn Sie es brauchen. Es existiert nicht im Rahmen. – driis

+1

downvote; Das ist eine lächerliche Antwort. sscanf ist wesentlich komplexer als einfach auf ein gemeinsames Trennzeichen aufzuteilen. Zum Beispiel sollte "% d% 3s% d" "123abc567" auf 123, abc, 567 auflösen, was etwas ist, für das Split nicht verwendet werden kann. – Doug

10

Es gibt keine direkte Entsprechung von sscanf in .NET Framework.

Der einfachste Weg, die gleiche Funktionalität zu erreichen, besteht darin, die Zeichenfolge zu teilen (String.Split) und dann die nachfolgenden Teile den Variablen mit der Int32.Parse-Methode zuzuweisen. 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 Parse Methoden, einschließlich Aufzählungen, wenn die Werte, die Sie aus der Zeichenfolge lesen möchten, nicht notwendigerweise ganzzahlige Werte sind.

Sie könnten auch regular expressions verwenden, aber sie sind wahrscheinlich ein bisschen übertrieben für eine so einfache Aufgabe.


EDIT: Wenn Sie sich mit sscanf wirklich deadset sind, könnten Sie immer P betrachten/die Funktion aus der C-Laufzeitbibliotheken aufrufen. So etwas wie diese vielleicht (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); 
8

Ich schreibe gerade, um die Zeit zu töten.

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]); 
    } 
} 
+0

ich weiß, dass Sie gerade Zeit töten. ABER dein Code ist rockin! (sehr prägnant, sehr gut lesbar, sehr flexibel -> gleich Rockin!) –

+0

Ich wette, dass einige Leute wegen der "unsicheren" Sache nicht abstimmen. Ich bin mir ziemlich sicher, dass die meisten C# -Entwickler das Schlüsselwort "unsafe" nicht verwenden dürfen. Ich bin ein sehr "c" centric Entwickler also ... kein großes Problem. –

+3

oder nur weil es nur ein Teil der sscanf Funktionalität ist ;-) – mikus

6

Schreiben Sie Ihre eigenen sscanf() Methode in C# ist nicht so schwierig, wenn Sie nichts dagegen haben ein wenig Low-Level-Code zu schreiben.

Sie können meine Version in dem Artikel A sscanf() Replacement for .NET sehen.

+0

Danke. Genau das, wonach ich gesucht habe. –

+0

es scheint, dieses Format zu analysieren: "% [0-9] /% [0-9] /% [0-9]" – aeroson