如何 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# 中打印其值"。
对于%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
时所做的那样。