ロゴ ロゴ

文字列合体!(+現在時刻の表示)

こんにちは、じゃた。です。課題シリーズ第4弾です。今回は文字列をがっちゃんこするプログラムです。

今回のプログラムについて

 入力された2つの文字列を合体させます。また、今回の条件は以下の通りです。

1. xの後ろにyを繋ぐ関数を作成する
2. 1.の関数について、x, yを引数とする
3. 1.の関数について、引数は明示的にポインタにする
4. string.h をインクルードしない
5. NULL文字、添え字演算子を必ず使用する

プログラム

 こんな感じで書いてみました。

#include<stdio.h>
void my_strcat(char*x, char*y);

int main(void){
    char x[100], y[100];
    printf("文字列1 > "); scanf("%s",x);
    printf("文字列2 > "); scanf("%s",y);

    my_strcat(x, y);
    printf("結合文字列:%s\n",x);

    return 0;
}

void my_strcat(char*x, char*y){
    int n = 0, m = 0;
    while(x[n] != '\0'){
        n++;
    }
    do{
        x[n] = y[m];
        n++, m++;
    }while(y[m-1] != '\0');
}

 ちなみに、前回はwhileで無限ループするようにして、ifで条件が一致したらbreakで出るようにしてたんですが、そもそもwhileで条件書けばよかったと今更気が付きました…。
 20行目から24行目について、少しコメントしておきます。今回文字列xには、文字列yのNULL文字までコピーするわけですが、

while(y[m] != ‘\0’)

とするとNULLまでコピーされません。では、

while(y[m-1] != ‘\0’)

とするとどうでしょう。まあ、上手くいきません。そもそも y[-1] にアクセスしようとするのは危険な気がします…。ただこの場合、一番最初の処理以外は上手くいくはずなんですよね。一番最初だって、一度while文の中身の処理を行ってから判定してくれれば、上手くいくはずです。こんな時の為に用意されたものがありましたよね。さあ、今こそお前の出番だ!do while!!

おまけ

 文字列結合って、どんな時に使うのかなって少し調べてみたら、どうやら音声応答を自動で割り出す時なんかに応用できるらしいですね。ということで、せっかくなので動かしたら現在時刻の読み上げを行う、はちょっと勉強しないとできないので、すぐできそうな現在時刻の表示をやってみました。

#include<stdio.h>
#include<time.h>
void my_strcat(char*a, char*b);

int main(void){
    char ans[100] = "ただいま";
    char half[2][10] = {"午前","午後"};
    char unit[3][10]={"時","分","秒"};
    char last[10] = {"です。"};
    char strtime[3][10];

    //時間の取得に使うやつ
    time_t nowtime;
    struct tm *time_local;
    int hour, min, sec;

    //現在時刻の取得、地域時間を表す構造体にして時間情報取得
    nowtime = time(NULL);
    time_local = localtime(&nowtime);
    hour = time_local -> tm_hour;
    min = time_local -> tm_min;
    sec = time_local -> tm_sec;

    //午前午後判別、結合
    if(hour >= 12){
        my_strcat(ans, half[1]);
        hour -= 12;
    }
    else my_strcat(ans, half[0]);

    //時刻の情報を数値から文字列に変換
    sprintf(strtime[0], "%d", hour);
    sprintf(strtime[1], "%d", min);
    sprintf(strtime[2], "%d", sec);

    //時刻の部分の結合
    for(int i = 0; i < 3; i++){
        my_strcat(ans, strtime[i]), my_strcat(ans, unit[i]);
    }
    my_strcat(ans, last);

    printf("%s\n",ans);

    return 0;
}

void my_strcat(char*a, char*b){
    int n = 0, m = 0;
    while(a[n] != '\0'){
        n++;
    }
    do{
        a[n] = b[m];
        n++, m++;
    }while(b[m-1] != '\0');
}

 「ただいま午後6時10分52秒です。」みたいな感じで表示されます。汚いプログラムですが、そこはプログラム初心者(?)ということで、許してください。

おわりに

最後まで見てくれてありがとうございます!See You Next Time!

コメント入力

関連サイト