C++中如何把WCHAR格式的字符串输入?
是格式化输入,不是输出!!!#include "stdafx.h"
#include <windows.h>
int main()
{
CHAR myData = { 0 };
CHAR myTemp[] = "myTemp";
CHAR myTest[] = "test";
sprintf_s(myData, MAX_PATH, "%s@%s\n", myTemp, myTest);
MessageBoxA(NULL, myData, "myData", 0);
/*
---------------------------
myData
---------------------------
myTemp@test
---------------------------
确定
---------------------------
*/
//要求用WCHAR实现上面同样的功能。
//WCHAR wmyData = { 0 };
//WCHAR wmyTemp[] = L"myTemp";
//WCHAR wmyTest[] = L"test";
//貌似是没有wsprintf_s这个函数的吧。
//wsprintf_s(wmyData, MAX_PATH, L"%S@%S\n", wmyTemp, wmyTest);//主要是这句如何实现?
//MessageBoxW(NULL, wmyData, L"wmyData", 0);
getchar();
return 0;
} swprintf_s,格式化采用“ws”
#include <iostream>
#include <windows.h>
int main()
{
CHAR myData = { 0 };
CHAR myTemp[] = "myTemp";
CHAR myTest[] = "test";
sprintf_s(myData, MAX_PATH, "%s@%s\n", myTemp, myTest);
//MessageBoxA(NULL, myData, "myData", 0);
//要求用WCHAR实现上面同样的功能。
WCHAR wmyData = { 0 };
WCHAR wmyTemp[] = L"myTemp";
WCHAR wmyTest[] = L"test";
//貌似是没有wsprintf_s这个函数的吧。
swprintf_s(wmyData, MAX_PATH, L"%wS@%wS\n", wmyTemp, wmyTest);//主要是这句如何实现?
MessageBoxW(NULL, wmyData, L"wmyData", 0);
getchar();
return 0;
}
本帖最后由 失去灯塔的孤帆 于 2023-6-28 17:37 编辑
用swprintf_s()
sprintf_s的宽字符版本是swprintf_s,不是wsprintf_s #include <cstdio>
#include <windows.h>
int main()
{
WCHAR myData = { 0 };
WCHAR myTemp[] = L"myTemp";
WCHAR myTest[] = L"test";
swprintf(myData, L"%ls_%ls", myTemp, myTest);
MessageBoxW(NULL, myData, L"myData", 0);
} 本帖最后由 Eaglecad 于 2023-6-28 17:50 编辑
WCHAR wmyData = { 0 };
WCHAR wmyTemp[] = L"myTemp";
WCHAR wmyTest[] = L"test";
//貌似是没有wsprintf_s这个函数的吧。
wsprintf(wmyData, L"%ls@%ls\n", wmyTemp, wmyTest);// 这个也可以
//swprintf_s(wmyData, MAX_PATH, L"%ls@%ls\n", wmyTemp, wmyTest); // 这个可以
MessageBoxW(NULL, wmyData, L"wmyData", 0);
一般后面的 _s 是出于安全考虑。
同类型功能函数,有时候是可以使用别的函数替代的。wsprintf_s 好像是被win32 API禁用了
wsprintfW UNICODE编码使用
wsprintfA是其他字符默认的 还有一种方法,把多字节字符串转成unicode就成了,win上有api的,找AI写个一下就好。 woflant 发表于 2023-6-28 17:19
swprintf_s,格式化采用“ws”
#include
为什么要使用:%wS
w代表啥,S和s有啥区别? "ws"是一起使用的,表示w类型宽字符
按理说"ls"也行,但测试过程有乱码 我补充一点,对于%s,如果格式化函数预期接收的是const char*形式的格式化字符串,比如sprintf_s,那么%s会把对应参数当做const char*来解析;如果是预期接收const wchar_t*的格式化字符串,那么%s会把对应参数当做const wchar_t*来解析。也就是楼主的代码里只要把函数名写对swprintf_s,%s是不用更改的。
明确指定hs、ls/ws、s/S的情况,一般是char*和wchar_t*混用的时候才需要的。比如sprintf_s的参数中需要解析wchar_t*字符串,那么可以使用ws/ls/S;或者swprintf_s的参数中需要解析char*字符串,那么可以使用hs/S。
至于楼上说的出现乱码,可以加一句setlocale(LC_ALL, "chs");
页:
[1]