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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

3回答

506閲覧

日時を取得して、表示する関数を作成したい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/07/16 08:39

実現したい事

C言語で日時を1文字ずつ取得し、日時を表示する関数を作成したいです。

該当のソースコード

C

1#include <stdio.h> 2#include <time.h> 3 4#define STX 0x02 /* テキスト開始 */ 5#define ETX 0x03 /* テキスト終了 */ 6 7static char str[] = "9999年99月99日 99時99分99秒"; 8static int int_c[] = { 0, 1, 2, 3, 6, 7, 10, 11, 16, 17, 20, 21, 24, 25}; /* 上の配列strの間接的な添え字 */ 9 10/* 11 名称 timer_data_1 12 引数 char timer_str:日時([STX]YYYYMMDDHHMMSS[ETX])の1文字 13 戻り値 無し 14*/ 15/*----- ここより下に解答を記述してください -----*/ 16void timer_data_1(char timer_str) 17{ 18 int i = 0; 19 int flag = 0; 20 21 if (timer_str == STX){ 22 flag = 1; 23 }else if (timer_str == ETX){ 24 printf("%c\n", str); 25 flag = 0; 26 }else if (flag = 1){ 27 str[int_c[i]] = timer_str + (i + 1); 28 i++; 29 } 30 31 return; 32} 33/*----- ここより上に解答を記述してください -----*/ 34 35int main(void) 36{ 37 time_t current; 38 struct tm *timer; 39 int tm_sec = 0; 40 char str[20]; 41 int i; 42 char *str_snd; 43 44 /* 乱数の初期化 */ 45 srand(time(NULL)); 46 i = rand() % 15; 47 48 while(1){ 49 current = time(NULL); 50 timer = localtime(&current); 51 if(timer->tm_sec != tm_sec){ 52 *(str + 0) = STX; 53 sprintf(str + 1,"%04d%02d%02d%02d%02d%02d", 54 timer->tm_year + 1900, timer->tm_mon + 1, timer->tm_mday, 55 timer->tm_hour, timer->tm_min, timer->tm_sec); 56 *(str + 15) = ETX; 57 *(str + 16) = '\0'; 58 59 while(*(str+i)){ 60 timer_data_1(*(str + i)); 61 i++; 62 } 63 64 tm_sec = timer->tm_sec; 65 i = 0; 66 } 67 } 68 69 return 0; 70}

表示例

2020年07月16日 17時19分21秒
2020年07月16日 17時19分22秒
2020年07月16日 17時19分23秒
2020年07月16日 17時19分24秒
2020年07月16日 17時19分25秒
2020年07月16日 17時19分26秒
2020年07月16日 17時19分27秒
上のように1秒ずつ表示されるようにしたい

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

コンパイルエラーは起きていませんが何も表示されません。関数内で、テキスト開始(STX)が来た時の処理、テキスト終了(ETX)が来た時の処理など上手く書けないでいます。どうすれば正しく表示させることができるのか教えてほしいです。

試したこと

関数部分のプログラムは一応書きました。表示例のようにならないけれど
カーソルだけ縦に1秒ずつ動いているのが確認できました。

個人的な考え

配列strの中に一文字ずつtimer_strの中身を入れて最後に文字としてまとめて表示するのかな?と考えています。

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

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

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

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

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

guest

回答3

0

static int int_c[] = { 0, 1, 2, 3, 6, 7, 10, 11, 16, 17, 20, 21, 24, 25}; /* 上の配列strの間接的な添え字 */

何故全角文字(年、月など)が2バイトなんでしょう?
・・・UNIX系OS(LinuxやMac)じゃダメですよ・・・

書式を変えましょう↓
"%04d%02d%02d%02d%02d%02d"→"%04d年%02d月%02d日 %02d時%02d分%02d秒"

蛇足ながら、『関数にする必要ありますか?』
追記:ただ、表示するだけで良ければ・・・

c

1#include <stdio.h> 2#include <unistd.h> 3#include <time.h> 4// 5int main( ) 6{ 7 time_t current; 8 struct tm *timer; 9 int tm_sec = 0; 10 char str[256]; 11 // 12 while(1) { 13 current = time(NULL); 14 timer = localtime(&current); 15 if(timer->tm_sec != tm_sec) { 16 sprintf(str, "%04d年%02d月%02d日 %02d時%02d分%02d秒", 17 timer->tm_year + 1900, timer->tm_mon + 1, timer->tm_mday, 18 timer->tm_hour, timer->tm_min, timer->tm_sec); 19 puts(str); 20 tm_sec = timer->tm_sec; 21 } 22 sleep(1); 23 } 24 // 25}

usr ~/Project/test % ./a.out
2020年07月16日 22時56分36秒
2020年07月16日 22時56分37秒
2020年07月16日 22時56分38秒
2020年07月16日 22時56分39秒
2020年07月16日 22時56分40秒
2020年07月16日 22時56分41秒
2020年07月16日 22時56分42秒
2020年07月16日 22時56分43秒
^C

投稿2020/07/16 13:22

編集2020/07/16 13:59
cateye

総合スコア6851

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

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

cateye

2020/07/16 14:02 編集

あと、CPUの使用率も考慮して、表示しない時(空ループの時)は、sleep()関数などを利用してCPUを他のプロセスに開けてあげましょう。こちらで計測したCPU使用率は。空ループ:7%、sleep():1%でした。 ※sleep()は、1秒単位でしか対応できないので何処かで誤差が出そう^^;
guest

0

sprintf(str + 1,"%04d%02d%02d%02d%02d%02d",

表示する文字列を生成してるのはわかるのですが、
それをプリントアウト(表示)しているところが見当たりません

投稿2020/07/16 11:40

y_waiwai

総合スコア87747

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

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

0

ベストアンサー

diff

1 void timer_data_1(char timer_str) 2 { 3- int i = 0; 4- int flag = 0; 5+ static int i = 0; 6+ static int flag = 0; 7 8 if (timer_str == STX){ 9 flag = 1; 10 }else if (timer_str == ETX){ 11- printf("%c\n", str); 12+ printf("%s\n", str); 13 flag = 0; 14+ i = 0; 15- }else if (flag = 1){ 16- str[int_c[i]] = timer_str + (i + 1); 17+ }else if (flag == 1){ 18+ str[int_c[i]] = timer_str; 19 i++; 20 }

投稿2020/07/16 09:48

編集2020/07/16 09:51
kazuma-s

総合スコア8224

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

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

退会済みユーザー

退会済みユーザー

2020/07/16 19:13

教えてくださりありがとうございます。上記のプログラムのelse if (timer_str == ETX)の部分を else if (timer_str == ETX && i == 14)と変えてみたら表示例のように正しく表示することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問