2016-01-19 8 views
9

C言語を読み、練習1-10を行うと、困惑します。文字 ' b'を保存してcプログラムのファイルに認識させる方法

バックスペースを入力すると、その文字はコンソールドライバで処理され、プログラムには渡されないと言われています。そのため、バックスペースが埋め込まれたファイルを作成することができます。しかし、 '\ b'を入力するかCtrl + Hを押してください。

Ctrl + Hを押すと、画面に「\ b」と表示されますが、プログラムを実行すると「\」と「b」の2文字で表示されるようです。私が何を入力しても、私はプログラムを実行すると "\ backspace"を表示しません。

プログラムでバックスペースの文字として認識させるにはどうすればよいですか?

私のコードは次のようなものです:

#include <stdio.h> 
int main() 
{ 
    int c; 
    while((c=getchar())!=EOF){ 
     if(c=='\t') 
      printf("\\t"); 
     else if(c=='\\') 
      printf("\\\\"); 
     else if(c=='\b') 
       printf("\\backspace"); 
      else 
       putchar(c); 
    } 
} 
+0

「ファイルを作成する」このファイルはどのように作成しましたか? (テキストエディタは何ですか?) – Rufflewind

+0

私はvimを使ってbという名前のファイルを作成します。コマンドに./a.out

+1

バックスペースのような[制御文字を入力するためのvimの特別なキーの組み合わせ](http://stackoverflow.com/a/1585463)を使用する必要があります。あなたの場合は、 'ctrl + v'の後に' ctrl + h 'をタイプする必要があります。それは実際のバックスペース文字を入力します。 – Rufflewind

答えて

4

あなたのコードには問題はないと思いますが、テキストエディタでバックスペース文字を書いた方法ではありません。

バックスペースなどのspecial key combination in vim to enter control charactersを使用する必要があります。あなたのケースでは、あなたはCTRL CTRL +時間続い + Vを入力する必要があります。それは実際のバックスペース文字を生成するはずです。

あなたは hexdumpを使用することができ、あなたが実際にバックスペース文字を生産しているかどうかを確認するには、次の

$ hexdump myfile 
00000000 68 65 6c 6c 6f 20 08 77 6f 72 6c 64    |hello .world| 
          ^^ 

お知らせバックスペース文字である08、(Cで、それは\bを表記です)。


バックスペース文字を生成するもう一つの方法は、単純にCでプログラムを経由して、それを書くことです:

#include <stdio.h> 
int main(void) { 
    FILE *f = fopen("myfile", "w"); 
    fputs("hello \bworld", f); 
    fclose(f); 
    return 0; 
} 
+0

あなたの答えは私の問題を解決しました。どうもありがとうございました! –

+0

次に、Windowsでどのようなキーを入力すればよいか教えてください。 –

+1

ASCII 08のようなソースコードに印刷できないASCII文字を埋め込むのは悪です。代わりに適切なバックスラッシュエスケープシーケンスを使用してください。 –

2

BackspaceASCIIコード8.

あるので、ファイルから読み込むときに、あなたはc == 0x08にチェックすることができます。

else if(c == 0x08) 
    printf("\\backspace"); 

thisにチェックしてください。

+0

さて、今私はそれを見て、そのプログラムを理解しています。しかし、それは私とは違うと思われます。私はちょうどファイル内の "\ c"を1文字として認識できるようにすることはできません。 "b"が埋め込まれたファイルbにリダイレクトされます。 –

3

問題は、あなたの端末で、あなたが言ったように、あなたのプログラムには本当にありませんが、ドライバ。あなたのプログラムで見られるように、奇妙な振る舞いは、Unix端末モデルの結果です。あなたはタブを押した後、あなたはおそらく、あなたのプログラムが\t文字としてタブを見る前をEnterキーを押す必要があることを

は注意してください。つまり、端末は「調理済み」モード(rawモードではない)になっています。同様に、プログラムのgetchar()がこれを見る機会を得る前に、端末ドライバはCtrl + Hを処理します。

できることは、プログラムを起動する前にstty -icanonを実行することです。 (または、プログラムの初期化ルーチン内でdo it programmaticallyを実行することもできます)。などのキーストロークおよびCtrl + H keypressは、即時にgetchar()でピックアップされます。

デフォルトの端末動作を復元するには、stty icanonまたはstty saneを使用してください。

+0

私はsttyのmanページを見つけ、 "stty sane"を見つけました。そして、私はそれをどうやって使うのか、そして正しいフォーマットがどういうものなのか困惑しました。申し訳ありません、私はもっと新しいLinuxです。stty icanonとstty saneを使用するときに、正しいフォーマットコマンドが何であるか教えてください。 –

+0

シェルプロンプトで 'stty -icanon'コマンドを入力するだけです。 –

関連する問題