wcstombs(Windows)

次は、Windowsでwcstombsを使う。

wcstombs、_wcstombs_l | Microsoft Learn

wcstombs.cで、

/* ヘッダファイルのインクルード */
#include <stdio.h>	/* 標準入出力 */
#include <stdlib.h>	/* 標準ユーティリティ */
#include <locale.h>	/* ロケール */

/* main関数の定義 */
int main(void){

	/* 変数・配列の宣言・初期化 */
	wchar_t wstr[] = L"あいうえお";
	int buf_size1;
	char *buf1_ptr = NULL;
	int len1;
	FILE *fp1 = NULL;

	/* "Japanese_Japan.932"指定 */
	setlocale(LC_ALL, "Japanese_Japan.932");	/* setlocaleにLC_ALL, "Japanese_Japan.932"を指定. */
	
	/* 標準出力 */
	printf("wstr = %ls\n", wstr);	/* wstrを出力. */
	
	/* バッファサイズ取得. */
	buf_size1 = wcstombs(NULL, wstr, -1);	/* 先頭NULLで必要バッファサイズをbuf_size1に格納. */
	
	/* ワイド文字列からマルチバイト文字列へ変換. */
	buf1_ptr = malloc((buf_size1 + 1) * sizeof(char));	/* (buf_size1 + 1)分のメモリ確保. */
	len1 = wcstombs(buf1_ptr, wstr, buf_size1);	/* wcstombsで変換. */
	*(buf1_ptr + len1) = '\0';	/* 終端はNULL. */
	
	/* 標準出力 */
	printf("buf1_ptr = %s\n", buf1_ptr);	/* buf1_ptrを出力. */
	printf("len1 = %d\n", len1);	/* len1を出力. *;

	/* バイナリファイル出力 */
	fp1 = fopen("test1.txt", "wb");	/* "test1.txt"を開く. */
	if (fp1 == NULL){	/* 失敗 */
		perror("test1");
		free(buf1_ptr);	/* 解放 */
		return -1;
	}
	fwrite(buf1_ptr, sizeof(char), len1, fp1);	/* fwriteでbuf1_ptrを書き込む. */
	fclose(fp1);	/* 閉じる */
	free(buf1_ptr);	/* 解放 */

	/* 正常終了 */
	return 0;	/* 0を返して正常終了. */

}

とすると、

またassert出る。
またassert出る。

またassert出る。
バッファサイズ取得する時の第3引数の-1が悪かったみたい。

とすると、

こうなって
こうなって

こうなって、

SJISになった。
SJISになった。

SJISになった。

Sample/c/wcstombs/wcstombs_Windows/src/wcstombs at master · bg1bgst333/Sample · GitHub