C 程序在 Windows 上运行良好,但在 Ubuntu 上运行时它没有要求输入字符串?

C 程序在 Windows 上运行良好,但在 Ubuntu 上运行时它没有要求输入字符串?

我的简单代码用于从用户那里获取信息并打印,该代码在 Windows 操作系统上(在 Dev C++ 上)运行良好,但在 Ubuntu 上运行时它不会要求输入字符串(尝试通过 WINE/Code Blocks 使用 Terminal/Dev C++)

   #include<stdio.h>
   void display();
   struct book
  {
         int isbn;
         char name[25];
  }b[5];

   void PUSH()
   {
        int top;
        for(top=0;top<5;top++)
        {
        printf("Enter the ISBN no:");
        scanf("%d",&(b[top].isbn));
        printf("Enter the name:");
        fflush(stdin);
        gets(b[top].name);
        }
   }
  main()
  {
             PUSH();
             display();
  }
  void display()
  {
      int i;
      for(i=0;i<5;i++)
      {

      printf("----------------\nISBN no: %d",(b[i].isbn));
      printf("\nBook Name: %s \n",(b[i].name));
      }
      printf("----------------\n");
  }
  void POP()
  {
       int i;
      for(i=0;i<5;i++)
      {

      printf("----------------\nISBN no: %d",(b[i].isbn));
      printf("\nBook Name: %s \n",(b[i].name));
      }
      printf("----------------\n");

  }

Ubuntu 上的输出:

   Enter the ISBN no:23
   Enter the name:Enter the ISBN no:

在我输入 23 之后,它必须询问书名,但它跳过了该部分并再次询问下一个 isbn 号。

经过几次盲目重试后,我发现当 gets(b[top].name); gets(b[top].name); 像这样使用两次时,它工作正常......

我的问题是为什么会这样?如何让 ubuntu 编译并运行在 windows 上正常运行的程序?

答案1

这确实是因为您的 C 代码有问题,而不是 Ubuntu 或其他任何东西的错误。

这里有一些关于如何修复它并使其正常工作以及如何编译它的提示。

  1. system("pause"); 不要这样做。避免系统调用,因为它们对终端系统的要求进行了硬编码(这在 Linux 上并不存在)

  2. gets(b[top].name);应被替换为scanf("%s", &b[top].name);获取字符串输入的更可靠方法。

  3. main()无效的您应该main()int main()system("pause");简单 来替换return 0;,以使您的 C 符合标准。

如何编译

在Linux中编译比在Windows中简单得多(对于像这样的小程序)。

  • 打开命令行。
  • cd ~/your/code/
  • 用这个命令进行编译:gcc -Wall --pedantic -o my_program my_program.c
    • 如果此命令失败,您需要运行sudo apt-get install build-essential

最后一些重要的建议:Dev C++ 于 2005 年消亡 - 在 Windows 上,切换到 Visual C++ 2010 Express,在 Linux 上使用 Eclipse 或文本编辑器和命令gcc


希望这可以帮助

答案2

gcc 描述 fflush(stream) 时说:

如果 stream 指向一个输出流或一个未输入最近操作的更新流,则 fflush 函数会导致将该流的任何未写入数据传送到主机环境并写入文件;否则,行为未定义。

fflush 没有为输出流定义。它是为输出流和输出上一次操作的双向流定义的。stdin是输入流,fflush(stdin) 没有意义。

因此,当您输入 23 并按下回车键时。之后fflush不会执行任何操作。gets()函数只接受一个\n。用它替换 scanf。

代码中还有许多可以改进的地方。仔细看看。

相关内容