28

可能重复:
.NET 中是否存在与“sscanf()”等效的内容?

C 中的 sscanf 是一种从字符串中读取格式良好的输入的好方法。

如何实现这个 C#。

例如,

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

上面的代码会将 10 分配给 a,将 12 分配给 b。

如何使用 C# 实现相同的功能?

4

5 回答 5

17

C# 中没有直接的等价物。鉴于 C# 中的相同任务,您可以这样做:

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

根据您可以假设输入的格式如何,您可能需要添加一些错误检查。

于 2010-11-19T10:10:57.297 回答
11

sscanf在 .NET Framework 中没有直接等效的。

实现相同功能的最简单方法是拆分字符串 ( 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如果您要从字符串中读取的值不一定是整数值,则框架中的许多不同数据类型都有方法,包括枚举。

您也可以使用正则表达式,但对于像这样简单的任务来说,它们可能有点矫枉过正。


编辑:如果你真的死心塌地使用sscanf,你总是可以考虑从 C 运行时库中 P/Invoking 函数。可能是这样的(未经测试):

[DllImport("msvcrt.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int sscanf(string buffer, string format, ref int arg0, ref int arg1);
于 2010-11-19T10:14:32.350 回答
9

我只是为了消磨时间而写作。

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]);
    }
}
于 2010-11-19T10:22:39.470 回答
7

sscanf()如果您不介意编写一些低级代码,那么在 C# 中编写自己的方法并不难。

您可以在文章A sscanf() Replacement for .NET中查看我的版本。

于 2012-02-14T19:41:50.210 回答
1

来自运行时例程和 .NET Framework 等效项

sscanf, swscanf ==> 见 Parse 方法,例如System.Double.Parse

所以,我想没有直接的等价物。

于 2010-11-19T10:17:05.327 回答