我的简单代码用于从用户那里获取信息并打印,该代码在 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 或其他任何东西的错误。
这里有一些关于如何修复它并使其正常工作以及如何编译它的提示。
system("pause");
不要这样做。避免系统调用,因为它们对终端系统的要求进行了硬编码(这在 Linux 上并不存在)gets(b[top].name);
应被替换为scanf("%s", &b[top].name);
获取字符串输入的更可靠方法。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。
代码中还有许多可以改进的地方。仔细看看。