C言語で決まった文字列幅でのスクロールを実現する方法

このQ&Aのポイント
  • C言語で文字列のスクロールを実現する方法についてお伺いします。
  • 文字列の文字数と指定した文字列幅から、スクロールさせるために必要な処理を行います。
  • 具体的な実装例を示し、期待する挙動を実現する方法をご説明します。
回答を見る
  • ベストアンサー

決まった文字列幅でのスクロール

開発言語は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 このような挙動を実現するには、どのように組めばよいのでしょうか。 例を示していただけると非常に助かります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

No.2 です。 「何かに格納する」というだけなら、printf() を sprintf() に置き換えるだけです。 たとえば、表示バッファ(か、そのワークエリア)が、char * として見えるのであれば、それを、 char *outLineBuffer; とすれば sprintf(outLineBuffer, "[%*s]\n", width, &outMess[i]); とするだけ。

Erorin
質問者

お礼

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

その他の回答 (2)

回答No.2

たとえば、こんなのはいかがでしょう。 あと、 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; }

Erorin
質問者

補足

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

  • ky072
  • ベストアンサー率60% (85/140)
回答No.1

一度、長いバッファに前後の空白を含めて文字列を格納し、 そこからオフセットをインクリメントしながら ウィンドウサイズに切り出す形が簡単だと思います。 -- #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; }

関連するQ&A

  • Excelで列幅を自動的に調整

    Excelで文字を入力していて、自動的に列幅を変更したいのですが、 その際、列と列の間にカーソルを持っていってダブルクリックすれば 変わることは変わりますが、それはあくまでも「手動」と思っています。 そうではなく、文字数に応じて勝手に列幅が広がるという やり方はないのでしょうか? よろしくお願い致します。

  • フォントのサンプルに良く出てくる英語

    以下は全てのアルファベットが早くでてくるという理由でフォントのサンプルに良く使われる文らしいです。 A quick brown fox jumps over the lazy dog. Cozy lummox gives smart squid who asks for job pen. 上の意味は簡単に解るんですが、下の訳でどんな感じになるんでしょうか?

  • 【Excel VBA】列幅の設定

    こんばんは。 Excel2003を使用しています。 あるシステムからのデータをCSVで出力、Excelで表示させると、セルの幅が合っていないので、見づらいのですが、これを解消するためにそれぞれの列幅を決めて、マクロで設定したいと思っています。 連続しない列の列幅の設定のコードの書き方がわからないので、教えていただけないでしょうか?ひとつの列や連続した列幅の設定であれば、手元にある参考書でわかるのですが。。。 例えば A列、C列、D列、G列、I列、J列の列幅を14 B列、F列、H列の列幅を10 に設定するコードはどのように書いたらいいのでしょうか? マクロ勉強中です。よろしくお願いします。

  • 日本語フォントのサンプル表記(あたらしい朝が……)について

    表題の通りなんですが……。 フォントのサンプルを見ると、必ず「あたらしい朝がきた希望のあさだ(以下略」の文面が書かれています。 欧文フォントだと「The quick brown fox jumps over the lazy dog.1234……」で、これは調べてみると『アルファベットすべての文字が含まれている文』とのことで、なるほど、納得できました。 和文フォントのサンプルがこの「あたらしい……」の理由はなんでしょうか? 別段写植の知識が豊富というわけではないのですが、もしよろしければご回答いただけるとありがたいです。 ※ぱっと見てわかりそうなものですが、「まさか全部の平仮名が……」と思って調べてみたら、さっそく「う」がなく挫折……。とりあえず「特徴的な文字がちょうどよく抽出された文章なのかな」というのが現状考えついた、私なりの答えです。 ※仮名だけなら「いろは歌」ですが、漢字が含まれていないのがネックなのでしょうか……。

  • 10進数の2進数文字列変換

    10進数の2進数文字列変換 ◆開発環境 OS:Linux(Ubuntu9.10) コンパイラ:gcc4.4 言語:C ◆質問内容 ポインタ*Aに格納されている10進数を2進数の文字列に変換し、 文字配列Bに格納したい。 バッファとして*fpを準備。 webで調査した結果を以下のソースのようにアレンジしましたが、 fputc関数の処理で、プログラムが強制終了してしまいます。 何か、良い方法ございませんでしょうか。 ◆サンプルソース void Dec_conv_bit(long *A,char *B){ unsigned int bit,n; //ビット比較用 unsigned int *fp = &n; n = (unsigned int)A; for(bit = 1 << sizeof(int)*8-1; bit > 0; bit >>= 1){ fputc((n & bit)?'1':'0',fp); } sprintf(B,"%s",fp); //putchar('\n'); }

  • Excel 英大文字小文字を区別せず検索対象にする

    こんにちは。 Excel 2007を使っています。 表中、A列に以下のような文字列があります。 DOG house HOUSE dog housing HOUSING dog DOG たとえばcountif関数でdogの個数を数える時は =countif(A1:A100,"dog") のようにしますが dogとDOG両方を数えたいときにはどのように どのようにしたらよいでしょうか? お分かりの方お教えください。 よろしくお願いいたします。

  • 文字列のコピー

    文字列のコピーで長さの違う文字列をコピーすると変なふうになってしまいます。たとえば下のようにやるとdogeetみたいになってしまいます。dogだけを表示したいんです。strcpyやstrcatを使わずに文字の長さの違った文字列のコピーはどうやるんでしょうか? #include <stdio.h> int main (void){ char spelA[] = "street"; char spelB[] = "dog"; int i; for(i=0;spelB[i]!=0;i++){ spelA[i] = spelB[i]; } printf("%s\n",spelA); return(0); }

  • 列にある指定文字のその行の指定文字の合計数

    ExcelでセルH1文字"う"がA列の文字とマッチした文字"う"の行B3:F3の文字"A"のみを合計しセルI1に数値3をつづいてH2文字に対してI2にA列文字"こ"の行"A"の合計数を入力したくI列に入れる関数をどなたか解る方宜しくお願いします。

  • javaでの文字判定

    javaにおいて16進数文字判定はどのようにするのでしょうか? 例えばString文字列が16進数文字0-9,a-f,A-Fで構成されているかどうかを 判定するにはどのようにすれば良いのでしょうか? このString文字列の長さは事前には分からず、数文字かもしれないし 数百文字かもしれません c言語の場合だとchar配列xyz[]があって中身が"1234abc"の場合 isxdigit()を使ってループでisxdigit( xyz[i] )として1文字づつ判定しNUL文字が 出現すれば終了となるわけですがjavaの場合だとどうするのでしょう? Stringの場合、byte[]の場合、char[]の場合それぞれ教えてもらえると助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
  • エクセル 長いテキストを次の行に表示させない方法

    ある列、例えばA列に、列幅に収まりきらない長さの文字を入力すれば、 通常は(「折り返して全体を表示する」「縮小して全体を表示する」などにチェックを入れていなければ)、 B列以降に文字がかかりますね。 そして、B列に文字や数字など、何かが入力されれば、A列の文字は途中で切れます。 そこで質問なのですが、B列に何もデータが入っていなくても、 A列の文字をA列の列幅で表示を切る(?)ことはできないのでしょうか。 例えば、A列とB列の間に罫線を引けば切れるよ、というように。 (この方法ではできませんでしたが) 今、A列に商品名が入り、その長さがバラバラなのです。 (が、知っている商品なので、全てが見える必要はないのです) そしてB列にその販売数が入るのですが、そこがブランクの行だけ、 文字がかかって、表が見にくいのです。 とても簡単なことをお聞きしているかもしれませんが、 ご存知の方がいらっしゃれば教えて下さい。