【问题标题】:Handling user input in C在 C 中处理用户输入
【发布时间】:2011-02-13 23:18:28
【问题描述】:

在 C 语言中,我正在编写一个程序,它接收用户输入而不是比较它以查看它应该使用哪个输出。我发现它有问题,想知道是否有人可以帮我一把。到目前为止,我有:

while(cmd[0] != EOF){
     fgets(cmd, sizeof(cmd), stdin); /** Takes in user input and stores it in cmd **/
     if(cmd[0] == '\n')
         printf("%s> ", cwd);
     else if(strcmp(cmd, "ls") == 0)
         printf("I will list everything");
}

有什么想法吗? 基本上它只是忽略任何用户输入。

附:变量 cwd 只是一个字符串。

【问题讨论】:

  • 您遇到了什么问题?
  • 基本上它会忽略除新行之外的任何用户输入。
  • @Michael Dillon - 如果将其声明为 char cmd[128];,则非常有意义。如果它是一个动态数组,那么你是对的。
  • @Chris- 关键是问题中根本没有声明它。 sizeof 应该只用于完全定义的类型,我们看不到 char *cmd 是否完全定义。

标签: c string input


【解决方案1】:

我认为您需要问一个更具体的问题。我可以看到几个问题:

  1. strcmp() 电话。 fgets() 将保留输入行中的换行符(如果有)。鉴于您的程序看起来像是在实现命令行 shell,与 "ls" 进行比较可能永远不会成立 - 您需要使用 strncmp() 或在要比较的字符串中包含 \n

  2. 您没有检查 fgets() 调用的返回状态 - 如果有人在您的提示符下输入了一些错误的控制字符,您可能希望这样做以避免灾难。

    李>
  3. 正如我上面提到的,您的程序看起来有点像命令外壳。如果是这种情况,您的提示("%s> ",对吗?)只有在用户输入空行作为输入时才会打印出来。大概您希望每次循环都打印出提示。

  4. 您如何期望 cmd[0] 成为 EOF 以完成您的循环? fgets() 手册页说:

    成功完成后,fgets()gets() 返回指向字符串的指针。如果在读取任何字符之前出现文件结尾,则它们返回 NULL 并且缓冲区内容保持不变。

    在我看来,您永远无法通过使用 fgets() 在缓冲区中获得 EOF

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2022-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多