2010-11-19 5 views
23

Можно создать дубликат:
Is there an equivalent to 'sscanf()' in .NET?C# эквивалент C sscanf

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

Как достичь этого C#.

Например,

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

Приведенный выше код будет назначать 10 а и 12 б.

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

+0

И некоторые люди в Microsoft считают, что 'C#' лучше, чем 'C++' ... ** '(~. ~)' ** –

ответ

13

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

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

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

+2

Я уже знаю эту технику. Было бы неплохо хотя бы иметь что-то вроде sscanf в C#. –

+0

@Gunner, я согласен, было бы хорошо. Но я думаю, что вам нужно будет его реализовать самостоятельно, если вам это нужно. Это не существует в рамках. – driis

+1

downvote; это смешной ответ. sscanf намного сложнее, чем просто разделение на общий разделитель. Например, «% d% 3s% d» должно разрешить «123abc567» до 123, abc, 567, что нельзя использовать для разделения. – Doug

10

В .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]); 

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

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


EDIT: Если вы действительно deadset на использовании 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); 
8

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

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

Я знаю, что вы просто убиваете время. НО ваш код - рокин! (очень краткий, очень читаемый, очень гибкий -> равен rockin!) –

+0

Я ставлю, что некоторые люди не голосовали из-за «небезопасной» вещи. Я уверен, что большинству разработчиков C# не разрешено использовать «небезопасное» ключевое слово. Я очень «c» ориентированный разработчик, поэтому ... нет biggie. –

+3

или просто потому, что это только часть функций sscanf ;-) – mikus

6

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

Вы можете увидеть мою версию в статье A sscanf() Replacement for .NET.

+0

Спасибо. Только то, что я искал. –

+0

, кажется, не удается проанализировать этот формат: «% [0-9] /% [0-9] /% [0-9]" – aeroson