幼稚園時代「何組」でしたか?

開発言語はC言語です。

決まった文字列幅の中で文字列をスクロールさせたいのですが、
うまい方法が思いつきません。
まず、期待する挙動を説明します。

文字列を用意して、その文字数を読み取らせます。
unsigned int strl = 0;
文字列(A QUICK BROWN FOX JUMPS OVER THE LAZY DOG)
strl = 41;
文字列幅ぶんの数(今回は16)をstrlに足します。
strl += 16;
iが0からstrlになるまで次のように文字列を出力します。

[________________] i=0
[_______________A] i=1
[______________A_] i=2
[_____________A_Q] i=3
[____________A_QU] i=4
...
[OG______________] i=55
[G_______________] i=56
[________________] i=57

このような挙動を実現するには、どのように組めばよいのでしょうか。
例を示していただけると非常に助かります。

A 回答 (3件)

No.2 です。



「何かに格納する」というだけなら、printf() を sprintf() に置き換えるだけです。

たとえば、表示バッファ(か、そのワークエリア)が、char * として見えるのであれば、それを、

char *outLineBuffer;

とすれば

sprintf(outLineBuffer, "[%*s]\n", width, &outMess[i]);

とするだけ。
    • good
    • 0
この回答へのお礼

丁寧なご回答ありがとうございました。

お礼日時:2011/12/22 18:54

たとえば、こんなのはいかがでしょう。


あと、
printf("[%*s]\n", width, &outMess[i]);

printf("[%*s]\r", width, &outMess[i]);
にすると、多くの環境では、同じ行を書き換えます。(書き換えのウエイトは必要ですが)
printf() シリーズの関数は、幅指定で * を指定すると、動的に幅を指定できてなかなか便利です。



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

char *mess = "A QUICK BROWN FOX JUMPS OVER THE LAZY DOG";
char outMess[1024];

int main()
{
int i;
int width = 16;
for (i = 0; i < strlen(mess) + width + 1; i++)
{
sprintf(outMess, "%*s%s%*s", width, "", mess, width, "");
outMess[width + i] = '\0';
printf("[%*s]\n", width, &outMess[i]);
}

return 0;
}

この回答への補足

少し書き忘れたことがあったので補足します。
この文字列は、マイコン制御でセグメントLEDにディスプレイさせることを考えています。
そのため、printfの機能は使えません。
何かに「格納する」と表現したほうがよかったかもしれません。
説明不足で申し訳ないです。

補足日時:2011/12/22 16:53
    • good
    • 0

一度、長いバッファに前後の空白を含めて文字列を格納し、


そこからオフセットをインクリメントしながら
ウィンドウサイズに切り出す形が簡単だと思います。

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

extern int main ( int argc, char ** argv )
{
 const char * S = "A QUICK BROWN FOX JUMPS OVER THE LAZY DOG";
 int WIDTH = 16;

 int buf_len = strlen( S ) + WIDTH * 2 + 1;
 char * buf = malloc( buf_len + 1 );
 char * win = malloc( WIDTH + 1 );
 int i;

 buf[buf_len] = 0;
 memset( buf, '_', buf_len );
 memcpy( buf + WIDTH, S, strlen( S ) );
 win[WIDTH] = 0;

 for( i = 0; i < strlen( S ) + WIDTH + 1; i++ ){
  memcpy( win, buf + i, WIDTH );
  fprintf( stdout, "[%s] i=%d\n", win, i );
 }

 return EXIT_SUCCESS;
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報