吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1201|回复: 8
收起左侧

[求助] C++中如何把WCHAR格式的字符串输入?

[复制链接]
朱朱你堕落了 发表于 2023-6-28 17:19
100吾爱币
是格式化输入,不是输出!!!

[C++] 纯文本查看 复制代码
#include "stdafx.h"
#include <windows.h>

int main()
{
	CHAR myData[MAX_PATH] = { 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[MAX_PATH] = { 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” [mw_shl_code=cpp,true]#include #include int main() { CHAR myData[MAX_PATH] = { 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[MAX_PATH] = { 0 }; WCHAR wmyTemp[] ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

woflant 发表于 2023-6-28 17:19
swprintf_s,格式化采用“ws”

[C++] 纯文本查看 复制代码
#include <iostream>
#include <windows.h>

int main()
{
    CHAR myData[MAX_PATH] = { 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[MAX_PATH] = { 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;
}


swprintf_s.png

点评

为什么要使用:%wS w代表啥,S和s有啥区别?  详情 回复 发表于 2023-6-28 18:10
失去灯塔的孤帆 发表于 2023-6-28 17:33
本帖最后由 失去灯塔的孤帆 于 2023-6-28 17:37 编辑

用swprintf_s()
sprintf_s的宽字符版本是swprintf_s,不是wsprintf_s

免费评分

参与人数 1热心值 +1 收起 理由
朱朱你堕落了 + 1 热心回复!

查看全部评分

sgbyg 发表于 2023-6-28 17:39
[C++] 纯文本查看 复制代码
#include <cstdio>  
#include <windows.h>

int main()  
{
    WCHAR myData[MAX_PATH] = { 0 };
    WCHAR myTemp[] = L"myTemp"; 
    WCHAR myTest[] = L"test";

    swprintf(myData, L"%ls_%ls", myTemp, myTest);

    MessageBoxW(NULL, myData, L"myData", 0);    

}

免费评分

参与人数 1热心值 +1 收起 理由
朱朱你堕落了 + 1 热心回复!

查看全部评分

Eaglecad 发表于 2023-6-28 17:43
本帖最后由 Eaglecad 于 2023-6-28 17:50 编辑

[C] 纯文本查看 复制代码
        WCHAR wmyData[MAX_PATH] = { 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  是其他字符默认的

免费评分

参与人数 1热心值 +1 收起 理由
朱朱你堕落了 + 1 热心回复!

查看全部评分

only998 发表于 2023-6-28 18:05
还有一种方法,把多字节字符串转成unicode就成了,win上有api的,找AI写个一下就好。

免费评分

参与人数 1热心值 +1 收起 理由
朱朱你堕落了 + 1 热心回复!

查看全部评分

 楼主| 朱朱你堕落了 发表于 2023-6-28 18:10
woflant 发表于 2023-6-28 17:19
swprintf_s,格式化采用“ws”

[mw_shl_code=cpp,true]#include

为什么要使用:%wS
w代表啥,S和s有啥区别?
woflant 发表于 2023-6-28 18:21
"ws"是一起使用的,表示w类型宽字符

按理说"ls"也行,但测试过程有乱码
yes2 发表于 2023-6-29 09:43
我补充一点,对于%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吾爱币 +3 热心值 +1 收起 理由
朱朱你堕落了 + 3 + 1 热心回复!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 21:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表