【问题标题】:Ctrl+D doesn't stop application from executing in command windowCtrl+D 不会阻止应用程序在命令窗口中执行
【发布时间】:2012-08-17 07:53:32
【问题描述】:

我编写了一个程序来通过 XOR 加密给定消息。它有效,但它并没有结束。这是代码。(我创建了3个文件):

加密.h:

void encrypt(char *message);

message_hider.c:

#include <stdio.h>
#include "encrypt.h"

int main() {
  char msg[80];

  while (fgets(msg, 80, stdin)){
    encrypt(msg);
    printf("%s", msg);
  }

  return 0;
}

加密.c:

#include "encrypt.h"

void encrypt(char *message) {
  while (*message) {
    *message++ ^= 0x1f;
  }
}

正如我上面提到的,它有效。但我无法阻止它。当我按下 Ctrl+D 停止它(在 cmd 中)它也会对其进行加密。(我需要在加密消息后停止此代码)。请解释一下这个案例。

【问题讨论】:

  • 正如你所写。你能解释一下你希望这段代码在什么情况下停止吗?
  • cmd 不理解 Ctrl+D,使用文件结束条件(即写入文件并将其提供给 stdin 上的程序:prog &lt; file)。而且你不加密,你混淆(一点)。顺便说一句,不要指望 printf 能够实际显示混淆文本。
  • 你使用了更糟糕的主题,请修改为有意义。
  • @fork0 (1) Windows cmd 将 Ctrl+Z 识别为 EOF; (2) 这确实是一种使用简单替换密码的加密方式,就像ROT13 is a substitution cipher 一样。
  • Brad 编辑的行没问题,但它也加密了返回字符。

标签: c


【解决方案1】:

当我按下 Ctrl+D 停止它时(在 cmd 中)

如果那是 Windows 中的 cmd,您可能需要 Ctrl+Z

【讨论】:

    【解决方案2】:

    Ctrl-D 用于 Unix 系统上的控制台 EOF。

    Ctrl-Z 用于 Windows 系统上的控制台 EOF。

    【讨论】:

    • 在 Windows 上的 cmd.exe 中按 Ctrl-Z+Enter。
    【解决方案3】:

    isprint() 可以帮忙:

    #include <stdio.h>
    #include <ctype.h>
    
    void encrypt(char *message)
    {
        while (*message) {
            *message = *message ^ 31;
            message++;
        }
    }
    
    int main(void)
    {
        char msg[80];
    
        while (fgets(msg, 80, stdin) != NULL) {
            if (!isprint((unsigned char)*msg)) break;
            encrypt(msg);
            printf("%s", msg);
        }
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      添加退出条件:

      if( c < 0x20 ) break;
      

      您可能还需要添加其他检查以支持退格而不对其进行编码...

      http://www.asciitable.com/

      【讨论】:

        【解决方案5】:

        直接跑吧

          $> kill -l
        

        查看 Linux 中的信号列表。你不会在那里找到 SIGKILL (Ctrl + D) 信号:(

        Ctrl + D 是 Linux 中的 SIGKILL (0) 信号,在任何地方都没有记录。 Ctrl + Z 用于告诉EOF的Windows,我们需要按“Enter”关闭。

        【讨论】:

        • 这是不正确的。 Ctrl-D 不会导致在 unix 上发送信号。 SIGKILL 通常是信号 9,而不是 0。值 0 没有分配给它的标准名称。
        猜你喜欢
        • 2016-03-30
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        • 1970-01-01
        • 2013-06-17
        • 1970-01-01
        • 1970-01-01
        • 2013-01-11
        相关资源
        最近更新 更多