1

特定のメッセージを 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で)停止すると、暗号化も行われます(メッセージを暗号化した後、このコードを停止する必要があります)。このケースについて説明してください。

4

5 に答える 5

5

Ctrl+D を押して停止したとき(cmdで)

それがcmdWindowsからの場合は、おそらく必要ですCtrl+Z

于 2012-08-17T07:55:37.457 に答える
4

Ctrl-Dは、Unix システムのコンソール EOF に使用されます。

Ctrl-Zは、Windows システムのコンソール EOF に使用されます。

于 2012-08-17T08:01:12.757 に答える
2

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;
}
于 2012-08-17T08:19:56.050 に答える
1

終了条件を追加します。

if( c < 0x20 ) break;

エンコードせずにバックスペースをサポートするには、他のチェックも追加する必要がある場合があります...

http://www.asciitable.com/

于 2012-08-17T08:01:55.027 に答える
0

とにかく走れ

  $> kill -l

Linux でシグナルのリストを表示するには。そこに SIGKILL (Ctrl + D) シグナルが見つかりません:(

Ctrl + D は Linux の SIGKILL (0) シグナルであり、どこにも文書化されていません。Ctrl + Z は EOF を通知する Windows 用であり、閉じるには「Enter」を押す必要があります。

于 2012-08-17T09:39:55.797 に答える