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

本文关键字:Console ReadLine PInvoke scanf 如何 | 更新日期: 2023-09-27 18:31:28

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

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 - 不工作。嘟嘟

好。完整任务听起来像这样:"如何使用控制台类从用户那里获取变量并在 C# 中打印其值"。

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

对于%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 时所做的那样。