2016-09-13 15 views
0

ここで、私のコードは、オンラインgeeksforgeeksコンパイラで奇妙な結果を出します。printf()Cの奇妙な結果

#include <stdio.h> 

main() 
{ 
     printf("\nhai\bas\rha\n"); 
} 

出力:haiasha

が、私は正しい出力haasだと思います。

オンラインコンパイラインク:http://code.geeksforgeeks.org/paWwuv

はなぜコンパイラ間違った出力を与えますか?私を助けてください。

+1

コンパイラではなく、標準出力デバイスがバックスペースと戻り文字にどのように応答するかによって異なります。出力は、実際には、文字列 ''\ n'、' 'h''、' 'a''、 '' '、'' \ b''など(つまり11文字)です。特定の出力デバイスでそれらのすべてを参照してください。 – Peter

+0

'int main()'。ちょうど 'main()'はもはや有効なCではありません。 – AnT

答えて

2

オンラインコンパイラは、コンソールではなくhtmlページに出力します。 \bは、端末のウィンドウではなくブラウザによって表示が異なります。

オンラインコンパイラでコードを実行すると、ページソースを表示すると、印刷するすべての文字がそこにあることがわかります。

1

コンパイラエラーではありません。私はあなたの端末を非難するだろう。ここに私の出力は、Debianマシン上にある:

$ make so 
cc  so.c -o so 
$ ./so 

haas 

プログラムは、実際にあなたが例えばxxdにパイプ出力することができ、あなたが期待するCHARCODEを発する確かに。

また、何も返さない場合、main関数はvoidである必要があります。タイプ修飾子が使用されていないとき(私が醜いと思う)、intの戻り値が仮定されます。

+0

"また、何も返さない場合は、主な機能は無効にする必要があります。"それは間違っている。 'main'の戻り値の型は' void'ではなく 'int'でなければなりません。そして、それは明示的に 'int'として宣言されるべきです、なぜならC言語にはもう"暗黙のint "ルールがないからです。また、 'main'から安全に「何も返さない」ことができます。なぜなら、コンパイラは暗黙のうちに' 0'を返すからです。 – AnT

+0

@AnT私は、標準のメインに関連するものを覚えています。しかし、実際それはその議論に関係していた。 もう暗黙のintを持っていないということについてのご意見はありますか? – Aif

+0

まあ、C99のコピーを開くと、C89/90からの大きな変更のリストが入っています。そのリストの項目の1つに、暗黙のintルールの廃止が明示されています。残りの標準テキストはそれに従って修正されます。 – AnT

1

この場合の「正しい」出力を使用すると、対応する特殊文字(または文字の組み合わせ)放置\n\b\rで、printfにそれを供給まったく同じように、\nhai\bas\rha\nです。

しかし、この出力が特定の出力デバイスでどのように見えるかは、そのデバイスのプロパティと機能によって異なります。オンラインコンパイラによって使用(シミュレート)された出力デバイスは、そのシーケンスをhaiashaとして表示するだけです。

あなたの期待は「標準的な」ディスプレイ端末の動作に基づいているようです。一方、オンラインコンパイラは、 "ディスプレイ"に直接何も出力しません。標準出力を傍受し、後処理してWebページに表示します。あなたが見るのは、その後処理の結果です。

0

\bは特殊文字です。端末は通常、それを「キャレットを1文字左に移動する」と解釈します。その結果、次の印刷文字は\bの前に最後に印刷された文字を上書きします。

しかしながら、他の状況では、文字は異なる方法で解釈されてもよい。別ウィンドウ(タブ)の大きな表示で見るたとえば、ファイル内では通常のバイト(値は8)だけです。