質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

2回答

2909閲覧

新明解c言語 中級編 演習2-4 テロップ表示

kelt22

総合スコア46

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2020/01/12 04:53

編集2020/01/12 07:11

前提・実現したいこと

void telop(const char *s,int direction,int speed,int n)
文字列sをdirection(左方向 0 右方向 1) speedクロックごとに文字を移動させ、n回テロップを表示させる関数をつくりたいです。

発生している問題・エラーメッセージ

今のコードでは、テロップをn回表示ではなく、n文字だけ文字が移動してしまいます。なぜそのように動くのか自分では理解できません。

該当のソースコード

c

1#include<stdio.h> 2#include<stdlib.h> 3#include<time.h> 4#include<string.h> 5int sleep(unsigned long x){ 6 clock_t c1=clock(),c2; 7 do{ 8 if((c2=clock())==(clock_t)-1) 9 return 0; 10 }while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); 11 return 1; 12} 13void telop(const char *s,int direction,int speed,int n){ 14 int name_len=strlen(s); 15 int i,j; 16 int cnt=0; 17 for(i=0;i<n;i++){ 18 putchar('\r'); 19 for(j=0;j<name_len;j++){ 20 if(cnt+j<name_len) 21 putchar(s[cnt+j]); 22 else 23 putchar(s[cnt+j-name_len]); 24 25 } 26 fflush(stdout); 27 sleep(speed); 28 if(direction==0){ 29 if(cnt<name_len-1) 30 cnt++; 31 else 32 cnt=0; 33 }else{ 34 if(cnt>0) 35 cnt--; 36 else 37 cnt=name_len-1; 38 } 39 } 40} 41int main(void) 42{ 43 int direction; 44 do{ 45 printf("方向1or0:");scanf("%d",&direction); 46 }while(!((direction=0)||(direction=1))); 47 telop("abcde ",direction,500,3); 48 return 0; 49} 50

試したこと

関数telop内の1番最初のfor文が影響していることは理解できるんですが、なぜn文字移動になるのかは理解できません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/01/12 05:01

コードはマークダウンのcode機能を利用してご提示ください。 このままコピペしても誰も再現確認できません。 また沢山言語のタグをつけられていますが「C」以外は関係ないのでは・
jimbe

2020/01/12 06:39

演習4-2というのが何なのか分かりません. 具体的に, 何が表示されて何を入力したらどうなるはずがどうなったのか, 画面の状態をお書きくださいませんか.
kelt22

2020/01/12 07:13

ご指摘ありがとうございます。修正しました。
guest

回答2

0

ベストアンサー

単純にループの回数が足りていないだけのようです。

C

1for (j = 0; j < name_len; j++) { 2 if (cnt + j < name_len) 3 putchar(s[cnt + j]); 4 else 5 putchar(s[cnt + j - name_len]); 6 7 }

の部分は文字列を cnt だけずらして表示しています。これを一周させるには name_len 回繰り返さないといけないので、 n 週させるには n * name_len 回繰り返す必要があります。
あと、whileの条件式が代入になっているので、何を入力しても 1 になってしまっています。

C

1#include<stdio.h> 2#include<stdlib.h> 3#include<time.h> 4#include<string.h> 5 6 7int sleep(unsigned long x) { 8 clock_t c1 = clock(), c2; 9 do { 10 if ((c2 = clock()) == (clock_t)-1) 11 return 0; 12 } while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x); 13 return 1; 14} 15void telop(const char* s, int direction, int speed, int n) { 16 int name_len = strlen(s); 17 int i, j; 18 int cnt = 0; 19 for (i = 0; i < n * name_len + 1; i++) { //変更 20 putchar('\r'); 21 for (j = 0; j < name_len; j++) { 22 if (cnt + j < name_len) 23 putchar(s[cnt + j]); 24 else 25 putchar(s[cnt + j - name_len]); 26 27 } 28 fflush(stdout); 29 sleep(speed); 30 if (direction == 0) { 31 if (cnt < name_len - 1) 32 cnt++; 33 else 34 cnt = 0; 35 } 36 else { 37 if (cnt > 0) 38 cnt--; 39 else 40 cnt = name_len - 1; 41 } 42 } 43} 44int main(void) 45{ 46 int direction; 47 do { 48 printf("方向1or0:"); scanf_s("%d", &direction); 49 } while (!((direction == 0) || (direction == 1))); // = から == に変更 50 telop("abcde ", direction, 500, 3); 51 return 0; 52}

投稿2020/01/12 08:29

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kelt22

2020/01/12 13:48

詳しい説明ありがとうございます。自分の理解できていない所がわかりました。
guest

0

少なくとも, main 内の while 文の条件は変ではないでしょうか.

投稿2020/01/12 06:40

jimbe

総合スコア12543

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kelt22

2020/01/12 07:17

自分の質問の内容が悪かったので修正しました。while文の0,1は方向を表しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問