none
C#可否调用CRT中的scanf函数? RRS feed

  • 问题

  • 如题,我希望使用C#获得更好的控制台输入支持,而C语言中的scanf显然是一个不可多得的函数,请问可不可以通过PInvoke调用这个函数?应该使用哪个dll?应该怎么写PInvoke说明?
    2011年6月8日 3:15

答案

  • 问题已经由我自己解决,很简单:

    [DllImport("msvcrt.dll")]
    public static extern int scanf(string format, __arglist);
    
    [DllImport("msvcrt.dll")]
    public static extern int printf(string format, __arglist);
    

    注意C#中有那个几个不为人所知的关键字,也让我纳闷很久,__arglist是对应C语言中的va_list,使用的时候应该同样也使用__arglist,下面是我自己写的一个demo,注意&a和&b可以用ref a、ref b来表示:

    using System.Runtime.InteropServices;
    
    namespace TestConsoleCS
    {
      class Program
      {
        [DllImport("msvcrt.dll")]
        public static extern int scanf(string format, __arglist);
    
        [DllImport("msvcrt.dll")]
        public static extern int printf(string format, __arglist);
    
        static void Main(string[] args)
        {
          int a = 0, b = 0;
          printf("Please enter a and b:\n", __arglist());
          scanf("%d%d", __arglist(ref a, ref b));
          printf("a + b = %d\n", __arglist(a + b));
        }
      }
    }
    感觉又回到了C语言的时代……

    • 已标记为答案 Flysha 2011年6月8日 4:11
    2011年6月8日 4:10

全部回复

  • 问题已经由我自己解决,很简单:

    [DllImport("msvcrt.dll")]
    public static extern int scanf(string format, __arglist);
    
    [DllImport("msvcrt.dll")]
    public static extern int printf(string format, __arglist);
    

    注意C#中有那个几个不为人所知的关键字,也让我纳闷很久,__arglist是对应C语言中的va_list,使用的时候应该同样也使用__arglist,下面是我自己写的一个demo,注意&a和&b可以用ref a、ref b来表示:

    using System.Runtime.InteropServices;
    
    namespace TestConsoleCS
    {
      class Program
      {
        [DllImport("msvcrt.dll")]
        public static extern int scanf(string format, __arglist);
    
        [DllImport("msvcrt.dll")]
        public static extern int printf(string format, __arglist);
    
        static void Main(string[] args)
        {
          int a = 0, b = 0;
          printf("Please enter a and b:\n", __arglist());
          scanf("%d%d", __arglist(ref a, ref b));
          printf("a + b = %d\n", __arglist(a + b));
        }
      }
    }
    感觉又回到了C语言的时代……

    • 已标记为答案 Flysha 2011年6月8日 4:11
    2011年6月8日 4:10
  • 谢谢你跟我们分享你的答案。


    Jackie Sun [MSFT]
    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。 
    MSDN 论坛好帮手 立刻免费下载  MSDN 论坛好帮手
    .


    2011年6月9日 9:56
    版主