朱朱你堕落了 发表于 2023-6-28 17:19

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;
}

woflant 发表于 2023-6-28 17:19

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:33

本帖最后由 失去灯塔的孤帆 于 2023-6-28 17:37 编辑

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

sgbyg 发表于 2023-6-28 17:39

#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:43

本帖最后由 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是其他字符默认的

only998 发表于 2023-6-28 18:05

还有一种方法,把多字节字符串转成unicode就成了,win上有api的,找AI写个一下就好。

朱朱你堕落了 发表于 2023-6-28 18:10

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

#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]
查看完整版本: C++中如何把WCHAR格式的字符串输入?