我正在学习 C 作为第一门编程语言。我输入了以下源代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,s,d;
printf("type the number which you want to add.\n\n");
scanf("%d %d",&a,&s);
d=a+s;
printf("addition is %d\n\n\n",d);
system("pause");
return 0;
}
我在 Windows 7 和 Ubuntu 中使用 Code::blocks 在 Code::blocks 中输入了相同的源代码,但在 Ubuntu 中运行它时,最后它显示
sh: 1: pause: not found
答案1
C 中的函数system(...)
将命令作为字符串(在 C 中为字符数组)并将其传递给操作系统的默认命令处理器/shell 来执行它。
在 Windows 上,这将通过 完成cmd.exe
,它有一个内部命令pause
,打印类似“按任意键继续......”的内容,并在退出之前等待键盘事件。
不过,Ubuntu 幸运地没有cmd.exe
,但sh
在这里使用作为其默认 shell(dash
内部),它没有pause
命令。您可以改用类似这样的命令:
read -p 'Press Enter to continue...' var
看Bash 中与 DOS 的暂停命令对应的命令是什么?和Linux 中与 DOS 暂停等同的是什么?(Stack Overflow)了解更多信息,但请注意,sh
这里是 C 调用,而不是bash
。
因此,在您的 C 代码中,该行可以替换为:
system("read -p 'Press Enter to continue...' var");
但是,这会使你的程序只能在具有sh
兼容 shell 的 Linux 系统上运行,在这种形式下它将不再在 Windows 上运行。
但是,请注意,通常不鼓励使用system("pause");
或类似(甚至与平台无关)的替代方案,原因在系统(“暂停”);——为什么错了?
答案2
通话的第一条规则system()
是绝不使用它,除非你有非常理由很充分。它以子进程的形式启动 shell,这 a) 是一个开销很大的操作,并且 b) 打开了完整的 shell 命令语言(如果您从用户输入构建命令行,这很糟糕)。
在这里,您要尝试实现的是打印提示并等待按键。您已经知道如何打印某些内容,阅读也并不难。要么循环getchar()
直到看到换行符 ( \n
),要么使用 读取整行fgets()
。
但是,正如您scanf()
之前使用的那样,结束用户输入的换行符仍将保留在输入缓冲区中。这是因为终端通常只会向程序提供整行,而scanf("%d")
不会使用数字后的部分。fgets()
也与此处的终端行为更匹配。
答案3
作为字节指挥官♦正确解释pause
是 Windows 特定的命令,默认情况下在 Linux 上不起作用。
您可以在编译时通过执行以下操作在 Windows 或 Linux 计数器之间进行选择:
#if defined(_WIN32)
define PAUSE "pause"
#elif defined(unix) || defined(__unix__) || defined(__unix)
define PAUSE "read -p 'Press Enter to continue...' var"
并在您的代码中只需执行:
std::system(PAUSE);
或者简单地这样做:
void pause()
{
std::cout<<"Press any key to continue";
std::getchar();
}
它在任何地方都有效!