【问题标题】:Unexpected behavior from simple shell in C Debian LinuxC Debian Linux 中简单 shell 的意外行为
【发布时间】:2015-10-10 05:56:20
【问题描述】:

以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define MAX_LINE 80 /* Max command length */

int main(void)
{
   char fullCmd[MAX_LINE-1];
   const char *EXIT_CMD = "exit"; /* command to exit shell */
   int should_run = 1; /* flag to determine when to exit*/

   while (should_run)
   {
      printf("daw.0>");
      fflush(stdout);
      scanf("%s", fullCmd);

      if (strcmp(fullCmd, EXIT_CMD) == 0)
      {
         should_run = 0;
      }
   }
   return 0;
}

导致提示 (daw.0>) 重复打印(字数 - 1 次)。例如,我输入“大家好,你好吗?”,会看到以下输出:

daw.0>Hello there everyone, how are you?

daw.0>
daw.0>
daw.0>
daw.0>
daw.0>
daw.0>

我不明白为什么。我还有很多工作要做才能为分配创建一个 shell,但我什至无法让最简单的变体可靠地工作。我在 Virtual Box 中使用 Linux 的 Debian 发行版。

【问题讨论】:

  • 编译时包含所有警告和调试信息 (gcc -Wall -Wextra -g)。使用调试器gdb。读一整行(见this...),然后再解析。
  • %s 读取一个单词,而不是一行。
  • 这里是题外话。我们不会为你做作业。 BTW,你真的应该研究一些现有shell的源代码......(它们都是免费软件)

标签: c linux debian


【解决方案1】:

scanf()%s 在第一个空格处停止扫描。这解释了你观察到的行为。

您可能想要使用的是fgets()。请注意,如果缓冲区中有足够的可用空间,fgets() 也会读取换行符。如果这是您不想要的,那么您必须删除尾随换行符(如果有)。

【讨论】:

  • 猜我太慢了。但我不妨添加doc。在中间它说s Matches a sequence of non-white-space characers
  • @Arc676 谢谢!也添加了链接。
  • 我推荐getlinereadline,见thisfgets(强制限制行的最大长度)只应在您没有 getline 时使用,它存在于所有 POSIX 系统上。
  • @BasileStarynkevitch 从来不知道readline。很酷的功能。
  • “请注意fgets() 也会读取换行符”。 Here 是一些关于删除换行符以及删除 STDIN 中多余数据以防止提示出现太多次的额外信息。
猜你喜欢
  • 2021-05-07
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 2015-01-13
  • 2011-04-07
相关资源
最近更新 更多