|
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <mbstring.h>
int compare( const void *arg1, const void *arg2 );
int main() {
LPTSTR lpBuffer = NULL;
DWORD nSize; // バッファサイズ
// 必要なバッファサイズを取得する
nSize = GetEnvironmentVariable(
"PATH",
lpBuffer,
0
);
// バッファを動的に確保する
HANDLE hMem = GetProcessHeap();
lpBuffer = (LPTSTR)HeapAlloc(hMem, 0, nSize);
if ( lpBuffer == NULL ) {
printf( "%s\n", "メモリの確保に失敗しました" );
return 0;
}
// PATH 環境変数取得( 1回目 )
GetEnvironmentVariable(
"PATH",
lpBuffer,
nSize
);
// トークンの数をカウントする
unsigned char* tok;
int nCount; // トークンの数
tok = _mbstok( (unsigned char *)lpBuffer, (const unsigned char *)";" );
nCount = 0;
while( tok != NULL ) {
nCount++;
tok = _mbstok( NULL, (const unsigned char *)";" );
}
// トークンをセットするのに必要なメモリを確保する
LPTSTR *strArray = (LPTSTR *)HeapAlloc(hMem, 0, sizeof(LPTSTR)*nCount + 256 );
// PATH 環境変数取得( 2回目 )
GetEnvironmentVariable(
"PATH",
lpBuffer,
nSize
);
// トークンを配列にセットする
tok = _mbstok( (unsigned char *)lpBuffer, (const unsigned char *)";" );
nCount = 0;
while( tok != NULL ) {
strArray[nCount] = (LPTSTR)tok;
nCount++;
tok = _mbstok( NULL, (const unsigned char *)";" );
}
// 配列ソート
qsort( (void *)strArray, nCount, 4, compare );
// 書き込み
FILE *fp;
fp = fopen( "result.txt", "wt" );
int i;
for( i = 0; i < nCount; i++ ) {
fprintf( fp, "%s\n", strArray[i] );
}
fclose( fp );
// メモリ開放
HeapFree( hMem, 0, strArray );
HeapFree( hMem, 0, lpBuffer );
return 0;
}
// *********************************************************
// ソート用比較関数
// *********************************************************
int compare( const void *arg1, const void *arg2 )
{
return lstrcmp( *((char **)arg1), *((char **)arg2) );
}
| |