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

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

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

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

Q&A

解決済

3回答

2222閲覧

配列を関数に渡す

FumiakiNakao

総合スコア180

C

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

0グッド

1クリップ

投稿2016/01/26 07:13

c言語で「好きな言葉を入力すると、その言葉を一文字ずつ出力する(文字と文字の間は0.1秒)」というプログラムを作ろうと思い、以下のコードを書いてみました

c

1#include<stdio.h> 2#include<time.h> 3#include<string.h> 4 5int sleep(unsigned long x){ 6 7 clock_t c1=clock(),c2; 8 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} 15 16 void gput(char *s,int speed){ 17 int c,i; 18 c=strlen(s); 19 for(i=0;i<c;i++){ 20 printf("%c",s[i]); 21 sleep(speed); 22 } 23 24} 25 26int main(void){ 27 28 char str[50]; 29 printf("好きな言葉を入力してください:"); 30 scanf("%s",str); 31 gput(str,100); 32 33 return 0; 34 35} 36

ですが、これを実行すると、言葉を入力した後に、少し間があった後全ての文字が一気に表示されてしまいます
何が問題なのでしょうか?

それと、「関数に配列を渡す」ということが、いまいちわかっていないので私のやり方(関数に配列の最初のポインタを渡す)に問題があれば、そちらもご教授願います

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

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

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

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

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

guest

回答3

0

nanosleep(), setvbuf() をつかって書いてみました。

c

1#include<stdio.h> 2#include<time.h> 3#include<string.h> 4#include <sys/time.h> 5 6void gput(char * s, int speed) { 7 int c = strlen(s); 8 struct timespec ts; 9 ts.tv_sec = speed; 10 ts.tv_nsec = 0; 11 12 setvbuf(stdout, 0, _IONBF, 0); // バッファリング無しにする 13 for(int i = 0; i < c; i++) { 14 printf("%c", s[i]); 15 nanosleep(&ts, NULL); 16 } 17} 18 19int main(void) { 20 char str[50]; 21 printf("好きな言葉を入力してください:"); 22 fgets(str, sizeof(str), stdin); 23 gput(str, 1); // 1 秒 24 return 0; 25}

イメージ説明

投稿2016/01/26 16:02

katoy

総合スコア22324

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

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

0

for(i=0;i<c;i++){
printf("%c",s[i]);
fflush(stdout); // <-これを追加
sleep(speed);
}

上のように、fflush(stdou); を入れてみて下さい。

「関数に配列を渡す」はその理解で正しいです。

投稿2016/01/26 07:28

nob.

総合スコア711

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

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

FumiakiNakao

2016/01/26 07:34

回答ありがとうございます 下の方とほぼ同じ回答をされていたので、先の方の回答者様をベストアンサーにさせていただきました すみません 「関数に配列を渡す」ということについて、あっていてよかったです
guest

0

ベストアンサー

2点気になったことがあります。

  • 環境によっては、標準出力がバッファリングされていて、1文字単位で出ないことがあります。fflush(stdout)として強制出力させましょう。
  • ASCIIの範囲内の文字ならこれでいいのですが、日本語などで複数バイト文字がある場合に、1バイトだけ出力するとどうなるのか気になりました。

投稿2016/01/26 07:19

maisumakun

総合スコア145183

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

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

FumiakiNakao

2016/01/26 07:33

fflush(stdout)を打ち込むと解決しました バッファの掃き出しは、参考書で見たのですが、軽く読み飛ばしていました。今回重要性に気づくいい機会になったと思います 打ち込む文字は数字、アルファベットのみを想定していたので、2点目については全く考えていませんでした ちなみに打ち込んだ場合、網模様(?)がしばらく出力されます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問