0

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

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# 中打印它的值”。

4

1 回答 1

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);

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

如果您要传递一个字符串,您还需要传递%sprintf,就像您在第二次调用 时所做的那样printf

于 2013-09-14T18:14:49.840 回答