web-dev-qa-db-fra.com

Équivalent C # de C sscanf

Duplicata possible:
Existe-t-il un équivalent de 'sscanf ()' dans .NET?

sscanf en C est une bonne façon de lire une entrée bien formatée à partir d'une chaîne.

Comment atteindre ce C #.

Par exemple,

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

Le code ci-dessus attribuera 10 à a et 12 à b.

Comment obtenir la même chose en utilisant C #?

26
Shamim Hafiz

Il n'y a pas d'équivalent direct en C #. Étant donné la même tâche en C #, vous pouvez le faire quelque chose comme ceci:

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

En fonction de la bonne forme que vous pouvez supposer que l'entrée est, vous pouvez ajouter des vérifications d'erreur.

15
driis

Il n'y a pas d'équivalent direct de sscanf dans le .NET Framework.

La façon la plus simple d'obtenir la même fonctionnalité consiste à fractionner la chaîne ( String.Split ) puis en affectant les parties suivantes aux variables avec le Int32.Parse méthode. Par exemple:

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

De nombreux types de données différents dans le Framework ont ​​des méthodes Parse, y compris des énumérations, si les valeurs que vous souhaitez lire dans la chaîne ne sont pas nécessairement des valeurs entières.

Vous pouvez également utiliser expressions régulières , mais ils sont probablement un peu exagérés pour une tâche aussi simple que celle-ci.


EDIT: Si vous êtes vraiment découragé d'utiliser sscanf, vous pouvez toujours envisager P/Invoquer la fonction les bibliothèques d'exécution C. Quelque chose comme ça peut-être (non testé):

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

J'écris juste pour tuer le temps.

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]);
    }
}
9
Cheng Chen

Écrire votre propre méthode sscanf() en C # n'est pas si difficile, si cela ne vous dérange pas d'écrire un peu de code de bas niveau.

Vous pouvez voir ma version dans l'article n remplacement sscanf () pour .NET .

6
Jonathan Wood

de routines d'exécution et équivalents .NET Framework

sscanf, swscanf ==> Voir Méthodes d'analyse, telles que System.Double.Parse

Donc, je suppose qu'il n'y a pas d'équivalent direct.

1
pmg