代码之家  ›  专栏  ›  技术社区  ›  Hristo

在UNIX和Windows中运行程序

  •  4
  • Hristo  · 技术社区  · 14 年前

    我正在编译一个用C语言编写的简单程序,并且在Windows7和MacBookPro中使用Eclipse作为一个IDE。非常简单的程序,我的朋友写了,请我帮助他:

    int a = 0;
    char b[2];
    printf("Input first class info:\n");
    printf("Credit Hours: \n");
    scanf("%d", &a);
    printf("Letter Grade: ");
    scanf("%s", b);
    

    所以当我在我的Mac上运行这个命令时,每一行都会打印出来,当我遇到scanf()时,我可以按预期输入并继续。在Windows中,我必须输入所有内容,然后它将打印所有行。我不知道为什么会这样…这里的b/w windows和mac有什么区别?

    雨衣:

    Input first class info:
    Credit Hours: 4
    Letter Grade: B+
    

    窗户:

    4
    B+
    Input first class info:
    Credit Hours:
    Letter Grade:
    

    谢谢, 希斯托

    7 回复  |  直到 14 年前
        1
  •  3
  •   VonC    14 年前

    如上所述 this thread 在Windows上:

    你需要 fflush(stdout) 在你打电话给 printf() .

    还有,因为 bug 27663 Primff() 直到printf()的缓冲区满后,Eclipse控制台才会刷新。
    具有各种与Windows控制台相关的错误: bug 102043 bug 121454 .

        2
  •  1
  •   RC.    14 年前

    可能是由于缓冲区缓存的差异。

    尝试:

    fflush(stdout);
    

    在你的扫描之前。这将强制在需要查看时将输出刷新到屏幕。

        3
  •  1
  •   EMP    14 年前

    Windows和Mac以不同的方式缓冲控制台输出。如果您希望它立即出现,您需要通过调用

    fflush(stdout);
    

    打印后。

        4
  •  1
  •   Michael Aaron Safyan    14 年前

    我猜在Mac OS X上,“n”会导致stdout被刷新,而在Windows上则不是这样。尝试在打印语句之后和scanf语句之前添加以下代码:

    fflush(stdout);
    
        5
  •  0
  •   Andy White    14 年前

    就像费奥多说的,这很可能是一个行尾问题。

    在Windows上,行尾为“\r\n”(回车后接换行)。

    在Mac OSX上,行尾仅为“\r”,但也可以使用“\r\n”,因为它包括“\r”。

    在unix/linux上,行尾通常是\n。

        6
  •  0
  •   godlygeek    14 年前

    除了回答 fflush() -您的代码包含缓冲区溢出。将scanf()转换为 b 写入3个字节- { 'B', '+', '\0' } -而且你的阵列没有足够的空间来存储nul终结者。您要么需要3个字符宽的缓冲区,要么使用除 scanf(%s) 其中a用于读取中的2个字符。

        7
  •  -1
  •   Fyodor Soikin    14 年前

    你想用 \r\n 而不是 \n .