0

文字列を入力として受け取り、エンコードされた文字列を返すプログラムを書きたいと思います。エンコードされた文字列は、元の文字列に存在する各文字が固定された数だけシフトされた文字列になります。例えば。文字列内の各文字が 2 桁シフトされているとします。したがって、ユーザーが「abcd」と入力すると、出力は「cdef」になります。

文字列全体を入力として取得し、各文字を処理して最終的な出力文字列を生成することで、それを行うことができます。

しかし、私が望むのは、ユーザーが文字を入力するとすぐに、元の形式ではなく、エンコードされた形式で表示されることです。

単一の文字に対して次のコードを試しました。

 char r;
    scanf("%c",&r);
    printf("\b%c",r+2);

ただし、ユーザーは入力した文字を引き続き表示できます。「Enter」を押さないと、エンコードされた文字が表示されません。どうすればこれを修正できますか? キャラクターを取得するために別の関数を使用している可能性がありますか?どんな助けでも感謝します。

4

3 に答える 3

2

UNIX を使用している場合は、次のように端末のモードを変更できます。

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

int main( void ) {
    system( "stty -icanon 2>/dev/null" ); // this line sets the mode

    while( 1 ) {
        int c = getc( stdin ); // a simpler way to get character input
        printf( "\b%c", c + 2 ); // print the shifted value
    }
}

stty -icanon「標準入力」を設定します。これは、改行を待つ代わりに、入力した瞬間に入力を取得できることを意味します (非常に複雑で、すべてを完全に理解していませんが、正しい効果があります)。詳細については、manページを参照してください。私が理解しているように、改行を待つのではなく、1文字で入力を返すのに十分なモードを設定します。を使用min Nして、2 文字以上待機するように変更したり、time Nあきらめる前に特定の時間 (10 分の 1 秒) だけ待機するように変更したりすることもできます。

2>/dev/nullにリダイレクトstderrするための一般的な構文で/dev/nullあり、単に「エラーを無視する」という意味です。

Windows では、これは機能しないためgetch、既に提案されているとおりに使用する必要があります。

最後に、暗号コードは少し奇妙です。yandと入力すると、 and !zが生成されます。{|

于 2013-08-24T14:45:33.170 に答える
0

Borland Turbo C++ (プラットフォーム: Windows)でコードをコンパイルして実行すると、入力「a」に対して出力「c」が得られます。問題が発生している場所や、コーディングしているプラ​​ットフォームはわかりません。

C で文字入力の代替関数を探している場合は、以下のようにいくつかあります。

getch():

ヘッダ: conio.h

説明:コンソールから 1 文字を入力として受け取り、画面にエコーせずに変数に戻ります。'enter'ユーザーが次の行に進むのを待たない

構文: char ch = getch();

getche():

ヘッダ: conio.h

説明:と同じように機能しますgetch()が、唯一の違いは、入力した文字を画面に表示することです。

構文: char ch = getche();

getchar():

ヘッダ: stdio.h

内容:のマクロですgetc(stdin)。簡単にするために、コンソールからの入力として文字も取り、変数に戻ります。画面に文字がエコーされ、ユーザーはenter次の操作に進むために押す必要があります。

構文: char ch = getchar();

お役に立てば幸いです。

次のコードを試してください。

#include<stdio.h>
#include<conio.h>
void main()
{
    char ch = getch();
    printf("%c", ch);
}
于 2013-08-26T17:05:20.057 に答える