- ベストアンサー
C言語で決まった文字列幅でのスクロールを実現する方法
- C言語で文字列のスクロールを実現する方法についてお伺いします。
- 文字列の文字数と指定した文字列幅から、スクロールさせるために必要な処理を行います。
- 具体的な実装例を示し、期待する挙動を実現する方法をご説明します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2 です。 「何かに格納する」というだけなら、printf() を sprintf() に置き換えるだけです。 たとえば、表示バッファ(か、そのワークエリア)が、char * として見えるのであれば、それを、 char *outLineBuffer; とすれば sprintf(outLineBuffer, "[%*s]\n", width, &outMess[i]); とするだけ。
その他の回答 (2)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
たとえば、こんなのはいかがでしょう。 あと、 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の機能は使えません。 何かに「格納する」と表現したほうがよかったかもしれません。 説明不足で申し訳ないです。
- ky072
- ベストアンサー率60% (85/140)
一度、長いバッファに前後の空白を含めて文字列を格納し、 そこからオフセットをインクリメントしながら ウィンドウサイズに切り出す形が簡単だと思います。 -- #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; }
お礼
丁寧なご回答ありがとうございました。