如何PInvoke scanf而不是Console.ReadLine()?

时间:2013-09-14 15:55:16

标签: c# c dll pinvoke dllimport

简单的问题:我应该从控制台读取一些变量,但我不能使用Console类。所以我写的是这样的东西

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication153
{
    class Program
    {
        static unsafe void Main()
        {
            printf("%s" + Environment.NewLine, "Input a number");
            int* ptr;
            scanf("%i", out ptr);
            printf("%i", (*ptr).ToString());
        }

        [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void printf(string format, string s);

        [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
        private static unsafe extern void scanf(string format, out int* ptr);
    }
}

但它因NullReferenceException而失败。请帮忙,我该怎么办? Printf工作,但scanf - 没有。 TNX

好。完整的任务听起来像这样:“如何从用户获取变量并使用Console类在C#withoud中打印它的值。”

1 个答案:

答案 0 :(得分:1)

对于%i,您需要将指针传递给整数。您正在传递一个指向未初始化指针的指针。不好。

声明这样的函数:

[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void scanf(string format, out int value);

将int作为out参数传递是通过将指针传递给int来实现的。

这样称呼:

scanf("%i", out value);

这里不需要不安全的代码。

如果您要传递字符串,也需要将%s传递给printf,就像第二次调用printf时一样。