“sh: 1: pause: not found”是什么?

“sh: 1: pause: not found”是什么?

我正在学习 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();
}

它在任何地方都有效!

相关内容