2020年1月 実力テスト(C言語)

(ブログ記事の一覧は「こちら」)

C言語に関する、以下の問いについて回答しなさい。

問1

以下のC言語のプログラムがあるとします。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 int main(void)
 5 {
 6     int i = 0;
 7
 8     int array[100];
 9     for (i = 0; i < 100; i++) {
10         array[i] = 1000 + i;
11     }
12
13     // 動的なメモリ領域の確保
14 
15
16     for (i = 0; i < 100; i++) {
17         *(p + i) = array[i];
18     }
19
20     for (i = 0; i < 100; i++) {
21         printf("Pointer: %d\n", *(p + i));
22     }
23
24     // 動的なメモリ領域の解放
25 
26
27     return 0;
28 }

問1-1(各10点)

14行目、25行目に入る適切なプログラムを書きなさい。

問1-2(10点)

(14行目に入るプログラムは正しく書かれていたとして)25行目に入るプログラムが書かれなかった場合、どのような問題点があると考えられますか?簡単に説明しなさい。

問2

C言語の文字列の処理に関する標準関数について、以下の問いを回答しなさい。

問2-1(10点)

以下のプログラム内の、if文の中(「問2-1」の部分)には何が入るか書きなさい。

#include <string.h>
#include <stdio.h>

int main(void)
{
    char str1[] = "ABC";
    char str2[] = "123";

    if (   /*  問2-1  */   ) {
        printf("str1とstr2は同じ\n");
    } else {
        printf("str1とstr2は異なる\n");
    }

    return 0;
}

問2-2(10点)

以下のプログラムを実行したときに出力される結果を書きなさい。

#include <string.h>
#include <stdio.h>

int main(void)
{
    char str1[] = "123";
    char str2[] = "ABC";

    strcat(str1, str2);
    printf("%s\n", str1);

    return 0;
}

問2-3(各5点)

以下のプログラム内の「①」「②」の部分には何が入るか書きなさい。

#include <string.h>
#include <stdio.h>

int main(void)
{
    char str1[] = "123";
    char str2[] = "ABCDEF";

    printf("str1の長さは %d, str2の長さは %d\n", /* ① */, /* ② */);

    return 0;
}

問3

C言語のファイル処理(テキストファイルの編集)に関する以下の問いについて回答しなさい。

問3-1(20点)

以下は、テキストファイルの読み込みについてのプログラム例です。

#include <stdio.h>

int main(void)
{
    FILE *fp;
    fp = fopen("test_r.txt", "r");
    if (fp == NULL) {
        return -1;   // <- ここを通る場合
    }

    int chr;
    while ((chr = fgetc(fp)) != EOF) {
        printf("%c", chr);
    }

    fclose(fp);

    return 0;
}

プログラム内の「ここを通る場合」の箇所を通るのはどのような場合に起こるでしょうか? わかりやすく説明しなさい。
(プログラムは最後まで処理されずに終了することになります。)

問3-2(20点)

以下は、テキストファイルの書き込みについてのプログラム例です。

#include <stdio.h>

int main(void)
{
    FILE *fp;
    fp = fopen("test_w.txt", "w");
    if (fp == NULL) {
        return -1;
    }


    fclose(fp);

    return 0;
}

上のプログラムに追記して、以下のテキストを書き込んだファイルを作成できるようにしたいです。追記が必要なコードを書きなさい。

おはようございます。

今日もがんばりましょう!