【C言語】配列に分割した文字を代入しようとしたら何故かすべての配列の要素が代入した値で上書されてしまう
解決したいこと
C言語でCSVファイルから俳句のデータをカンマ区切りで取り出してその中からランダムな語句を組み合わせて俳句を作成するというプログラムを作っています。
配列に分割した文字を代入しようとしたら何故かすべての配列の要素が代入した値で上書されてしまいます。
指定した配列だけに値が代入されるようにするにはどうすればいいか解決方法を教えていただけないでしょうか?
よろしくお願いいたします。
該当するソースコード
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
void main() {
FILE* file;
char line[256];
line[0] = '\0';
char haiku[256];
haiku[0] = '\0';
char* onePhrase[3][256];
char* twoPhrase[3][256];
char* threePhrase[3][256];
char* ptr;
int i = 0;
int j = 0;
int rnd = 0;
file = fopen("c:\\test\\test.csv", "r");
if (file == NULL) {
printf("ファイルが開けません。¥n");
exit(1);
}
// ファイルのデータ読み込む
while (fgets(line, 256, file) != NULL)
{
// カンマを区切りに文字列を分割
// 1回目
ptr = strtok(line, ",");
*onePhrase[i] = ptr;
printf("%s\n", *onePhrase[i]);
// 2回目以降
while (ptr != NULL) {
// strtok関数により変更されたNULLのポインタが先頭
ptr = strtok(NULL, ",");
// ptrがNULLの場合エラーが発生するので対処
if (ptr != NULL && j == 0) {
*twoPhrase[i] = ptr;
printf("%s\n", *twoPhrase[i]);
}
if (ptr != NULL && j == 1) {
*threePhrase[i] = ptr;
printf("%s\n", *threePhrase[i]);
}
j++;
}
j = 0;
i++;
}
srand((unsigned int)time(NULL));
rnd = rand() % 3;
strcat(haiku, *onePhrase[rnd]);
srand((unsigned int)time(NULL));
rnd = rand() % 3;
strcat(haiku, *twoPhrase[rnd]);
srand((unsigned int)time(NULL));
rnd = rand() % 3;
strcat(haiku, *threePhrase[rnd]);
printf("onePhrase[0] = %s\n", *onePhrase[0]);
printf("onePhrase[1] = %s\n", *onePhrase[1]);
printf("onePhrase[2] = %s\n", *onePhrase[2]);
printf("俳句:%s\n", haiku);
}
### 実行結果
aaaaa
bbbbbbb
ccccc
ddddd
eeeeeee
fffff
ggggg
hhhhhhh
iiiii
onePhrase[0] = ggggg
onePhrase[1] = ggggg
onePhrase[2] = ggggg
俳句:ggggghhhhhhhiiiii