Подтвердить что ты не робот

С# эквивалент C sscanf

Возможный дубликат:
Есть ли эквивалент 'sscanf()' в .NET?

sscanf в C - отличный способ прочитать хорошо отформатированный ввод из строки.

Как добиться этого С#.

Например,

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

Вышеприведенный код назначит 10 для a и от 12 до b.

Как добиться того же, используя С#?

4b9b3361

Ответ 1

В С# нет прямого эквивалента. Учитывая ту же задачу в С#, вы можете сделать это примерно так:

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

В зависимости от того, насколько хорошо вы можете принять ввод, вы можете добавить некоторые проверки ошибок.

Ответ 2

В .NET Framework нет прямого эквивалента sscanf.

Простейшим способом достижения такой же функциональности является разделение строки (String.Split), а затем назначение последующих частей переменным с помощью Int32.Parse. Например:

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

У многих разных типов данных в Framework есть методы Parse, включая перечисления, если значения, которые вы хотите прочитать из строки, не обязательно являются целыми значениями.

Вы также можете использовать регулярные выражения, но они, вероятно, немного перегружены для выполнения такой простой задачи.


РЕДАКТИРОВАТЬ: Если вы действительно сработали при использовании sscanf, вы всегда можете рассмотреть функцию P/Вызов функции из библиотек времени выполнения C. Что-то вроде этого возможно (непроверено):

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

Ответ 3

Я просто пишу, чтобы убить время.

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

Ответ 4

Написание собственного метода sscanf() в С# не так уж сложно, если вы не возражаете писать небольшой низкоуровневый код.

Вы можете увидеть мою версию в статье Замена sscanf() для .NET.