ページ 11

続 バックスペースについて

Posted: 2009年12月23日(水) 15:27
by dic
バックスペースについて もう一回質問したいです

下のコードを実行すると
#include    <stdio.h>
#include    <windows.h>

void    main()
{
    int    i ,j;
    for( i=0; i<10; i++ )
    {
        for( j=0; j<10; j++ )
        {
            printf( "%d", i );
        }
    }
    Sleep( 1000 * 5 );
    for( i=0; i<100; i++ )
        putchar( 0x08 );
}
(上の段)0000000001111111111......777777777
(下の段)8888888889999999999_

から

(上の段)0000000001111111111.....7777777
(下の段)_

_が出力先頭になるのですが

コンソール上で改行が起きると
上の段に出力先頭の位置を戻す方法はないのでしょうか?

Re:続 バックスペースについて

Posted: 2009年12月23日(水) 17:27
by バグ
WINAPIを使用してもよいのであれば可能ですよ(^-^)

Re:続 バックスペースについて

Posted: 2009年12月24日(木) 09:25
by バグ
戻すというよりは、好きな位置へカーソルを移動させることで解決できるかと思います。
提示されたソースにwindows.hと書かれてあるので、WINAPIを使用できる環境だと仮定して書き込みますね。
#include <stdio.h>
#include <windows.h>

VOID main(VOID)
{
    // 出力先のハンドルを取得
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

    // COORD構造体へ座標を設定する
    COORD stPosition = {10, 0};

    // COORD構造体で指定された座標へカーソルを移動させる
    SetConsoleCursorPosition(hOut, stPosition);

    // 文字列を出力する
    printf("test\n");
}
WINAPIを使用できるコンソールアプリでは、こんな方法で任意の位置へ文字列を出力することが可能です。
ただ、このままでは少々使いづらいかもしれませんので、出力ハンドルをグローバル変数にしたり、位置指定している箇所を関数化したりカスタマイズした方が便利かもしれませんが…(^_^;)

参考までに…ですが、コンソールアプリでも、文字に色をつけたりすることも可能です。固定16色しかありませんけどね(苦笑)

Re:続 バックスペースについて

Posted: 2009年12月24日(木) 16:51
by dic
カーソルの位置を変更するのは成功しましたが
下のようにすると、付属画像のようになります
#include    <stdio.h>
#include    <string.h>

void    main()
{
    char    http[1024] = "http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1414571724";
    int        len = strlen(http);

    int    i, j;
    for( i=0; i<99; i++ )
    {
        printf( http );
        for( j=0; j<len; j++ )
            putchar( 0x08 );
    }
}

この表示しているものを消すにはどうすればいいでしょうか?

Re:続 バックスペースについて

Posted: 2009年12月24日(木) 17:04
by バグ
バックスペース(0x08)を出力してもカーソルが戻るだけですので、表示を消したい場合はスペースで上書きしてやる必要があります。

それと、細かいことですが、strlen関数の戻り値はsize_t型ですので注意しましょう。(ちなみにVC++6.0ではsize_t型はunsigned int型です)

#include <stdio.h>
#include <string.h>

void main()
{
    char http[1024] = "http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1414571724";
    int len = (int)strlen(http);
    int    i;

    printf("%s", http);
    for (i = 0 ; i < len; ++i)
    {
        putchar(0x08);
        putchar(' ');
        putchar(0x08);
    }
}

Re:続 バックスペースについて

Posted: 2009年12月24日(木) 18:39
by dic
多分、動作すると思います

Re:続 バックスペースについて

Posted: 2009年12月24日(木) 18:48
by バグ
はいはい、聞く耳持たない訳ね。
勝手にしてくださいな…┐('~`;)┌

Re:続 バックスペースについて

Posted: 2009年12月24日(木) 19:14
by Mist
> この表示しているものを消すにはどうすればいいでしょうか?

前の質問のときに回答したけどなぁ。

Re:続 バックスペースについて

Posted: 2009年12月25日(金) 06:20
by lbfuvab
system("CLS");

↑でも良いかと思いますけどね(ただしベッタリと環境依存)

Re:続 バックスペースについて

Posted: 2009年12月25日(金) 19:54
by dic
>Mistさん
前回は回答ありがとうございました
今回はコンソール上で改行されてるとバックスペースで消せなかったので
もういちど質問させてもらいました

>lbfuvabさん
おお、そんな命令あったんですね
環境依存のようですが、Windows前提なんでとても使えます


参考に私が買った参考書の画像を貼り付けておきます
苦情はその方におっしゃってください
前にも言いましたが戻り値使わないんで

Re:続 バックスペースについて

Posted: 2009年12月25日(金) 21:38
by Mist
> 前にも言いましたが戻り値使わないんで

なんか勘違いしてません?
バグさんはstrlenの戻り値の型の話しているのに、なんでmainの戻り値の話なの?

Re:続 バックスペースについて

Posted: 2009年12月26日(土) 17:33
by dic
すいません、バックスペースに関して質問してるんで

Re:続 バックスペースについて

Posted: 2009年12月26日(土) 19:43
by バグ
質問のタイトルはともかく、最初の書き込み内容は…

>>コンソール上で改行が起きると上の段に出力先頭の位置を戻す方法はないのでしょうか?


であった訳ですから、コンソール上でのカーソル制御についての質問でした。

あなた自身、バックスペースについては全く質問されていませんが?

かなり拡大解釈して、私が提示してみたバックスペースを使用しての文字の消去処理のサンプルについては、全く無反応でしたから、あなたが思っていた動作とは違うようですし、何がしたいのか意味不明です。

Re:続 バックスペースについて

Posted: 2009年12月26日(土) 20:06
by dic
関りたくないんで、管理人さん
不適切でしたら削除してください

Re:続 バックスペースについて

Posted: 2009年12月26日(土) 22:42
by Q
質問するだけしておいて都合が悪くなると関わりたくないって・・・

Re:続 バックスペースについて

Posted: 2009年12月27日(日) 08:30
by Tororo
とりあえず、回答者sにアリガトウとか言ったら?

Re:続 バックスペースについて

Posted: 2009年12月27日(日) 09:33
by dic
>バグさん
ありがとうございました

Re:続 バックスペースについて

Posted: 2009年12月27日(日) 13:42
by バグ
何故お礼を言われるのか分かりませんが、これ以上かかわりあいたくないので、ここへの書き込みは止めます。