C言語の復習がてらに文字列を格納する(不完全な)動的配列を作りました。
探せばいくらでも出てきそうですが、今回は自分で1から実装しました。
環境:visual studio 2017
書いたもの
stringArray.h
#pragma once
#include<errno.h>
typedef struct {
int size;//要素の数
int memSpaceSize;//確保している領域の数
char **str;//文字列を指すポインタ変数
}stringArray_t;
errno_t InitStringArray(stringArray_t *array);
void FreeStringArray(stringArray_t *array);
errno_t AddStringArrayItem(stringArray_t *array, char *str);
stringArray.c
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include<errno.h>
#include "stringArray.h"
errno_t InitStringArray(stringArray_t *array) {
array->str = (char **)malloc(sizeof(char *));
if (array->str == NULL) {
return errno;
}
array->size = 0;
array->memSpaceSize = 1;
return 0;
}
void FreeStringArray(stringArray_t *array) {
for (int i = 0; i < array->size; i++) {
free(array->str[i]);
}
free(array->str);
array->size = -1;
array->memSpaceSize = -1;
}
errno_t AddStringArrayItem(stringArray_t *array, char *str) {
long int memSpaceSizeCheck = 0;
int memSpaceSize;
if (array->memSpaceSize > array->size)
memSpaceSize = 0;
else if ((memSpaceSizeCheck = (long int)array->memSpaceSize + array->memSpaceSize) < INT_MAX)//2倍したものがint型で表せる数だったら
memSpaceSize = (int)memSpaceSizeCheck;
else if (array->memSpaceSize < INT_MAX)//
memSpaceSize = INT_MAX;
else
return EINVAL;
if (memSpaceSize > 0) {
char **temp;
temp = (char **)realloc(array->str, sizeof(char *)*memSpaceSize);
if (temp == NULL)
return errno;
array->str = temp;
array->memSpaceSize = memSpaceSize;
}
int length = strlen(str);
char *newStr = (char *)malloc(sizeof(char)*(length + 1));
if (newStr == NULL)
return errno;
memcpy(newStr, str, length + 1);
array->str[array->size] = newStr;
array->size++;
return 0;
}
main.c
#include <stdio.h>
#include<stdlib.h>
#include "stringArray.h"
int main(void) {
stringArray_t stringArray;
InitStringArray(&stringArray);
AddStringArrayItem(&stringArray, "おはよう");
AddStringArrayItem(&stringArray, "こんにちは");
AddStringArrayItem(&stringArray, "こんばんは");
for (int i = 0; i<stringArray.size; i++) {
printf("%s\n", stringArray.str[i]);
}
FreeStringArray(&stringArray);
system("pause");
return 0;
}
実行結果
おはよう
こんにちは
こんばんは
続行するには何かキーを押してください . . .
エラーチェック等main関数では省略しています。
何か変なところがあればアドバイスをお願いします。