// StringBuilder.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。 // #define _CRT_SECURE_NO_WARNINGS #include #include #include typedef struct { char* str; int len; int extent; } StringBuilder; //============================================================================== void SBInit(StringBuilder* sb) { sb->len = 0; sb->extent = 16; sb->str = (char*)malloc(sb->extent); if (sb->str != NULL) sb->str[0] = '\0'; } void SBTerm(StringBuilder* sb) { free(sb->str); } void SBAppend(StringBuilder* sb, const char* str) { int newLen; int newExtent; char* tmp; newLen = sb->len + strlen(str); newExtent = sb->extent; while (newExtent <= newLen) { newExtent <<= 1; } if (sb->extent < newExtent) { sb->extent = newExtent; tmp = (char*)realloc(sb->str, sb->extent); if (sb->str == NULL) { free(sb->str); /* 必ずfree(NULL)になる */ } sb->str = tmp; fprintf(stderr, "newExtent=[%d]\n", newExtent); } if (sb->str != NULL) strcpy(sb->str + sb->len, str); sb->len = newLen; } //============================================================================== int main(int argc, char* argv[], char* envp[]) { StringBuilder sb; SBInit(&sb); while (*envp) { SBAppend(&sb, *envp); SBAppend(&sb, "\n"); envp++; } printf("%s", sb.str); SBTerm(&sb); return 0; } // プログラムの実行: Ctrl + F5 または [デバッグ] > [デバッグなしで開始] メニュー // プログラムのデバッグ: F5 または [デバッグ] > [デバッグの開始] メニュー // 作業を開始するためのヒント: // 1. ソリューション エクスプローラー ウィンドウを使用してファイルを追加/管理します // 2. チーム エクスプローラー ウィンドウを使用してソース管理に接続します // 3. 出力ウィンドウを使用して、ビルド出力とその他のメッセージを表示します // 4. エラー一覧ウィンドウを使用してエラーを表示します // 5. [プロジェクト] > [新しい項目の追加] と移動して新しいコード ファイルを作成するか、[プロジェクト] > [既存の項目の追加] と移動して既存のコード ファイルをプロジェクトに追加します // 6. 後ほどこのプロジェクトを再び開く場合、[ファイル] > [開く] > [プロジェクト] と移動して .sln ファイルを選択します