【问题标题】:Is there a win32 API to convert a string to character array是否有将字符串转换为字符数组的 win32 API
【发布时间】:2015-07-17 20:37:53
【问题描述】:

类似于 stringtoshortArray 的东西:

short arr[5];
LPCTSTR teststr = "ABC"; // passed as an argument, can be anything
input= stringtoshortarray(teststr, arr);

output:
    arr[0] = 41;
    arr[1] = 42;
    arr[2] = 43;
    arr[3] = 0;

可能还有一个提供数组大小的函数说

int sz = SizeofArray(arr);
output: 
    sz = 3

可能可以编码,但如果有库调用,我想 使用它。

【问题讨论】:

  • 为什么需要win32?
  • 注意:这不是问题标题中所述的字符数组;它是一个short 数组。我真的很想知道您要解决的真正问题。
  • @WhozCraig 我会说 OP 正在尝试将 const char* 转换为 const wchar_t*。有时 VC++ 编译器错误有点误导...
  • @user994572:如果您阅读LoadKeyboardLayout() documentation,它需要LPCTSTR 作为输入。您已经有一个 LPCTSTR 字符串,采用 LoadKeyboardLayout() 所期望的正确字符串格式。 无需转换。只需将您的字符串值 AS-IS 传递给 LoadKeyboardLayout()(不是 LoadKeyboardLayoutW(),除非您将字符串更改为 LP(C)WSTR 以匹配 LoadKeyboardLayoutW() 所期望的)。如果您没有预先说明您的实际要求,就会发生这种情况。
  • 我投票结束这个问题作为题外话,因为提出的问题没有充分说明需要解决的真正问题。真正的问题是对所涉及的 Win32 API 缺乏了解,而且输入数据的格式已经正确,因此不需要转换任何内容。

标签: c++ winapi


【解决方案1】:

http://www.cplusplus.com/reference/string/string/c_str/

返回一个指向数组的指针,该数组包含以空字符结尾的字符序列(即 C 字符串),表示字符串对象的当前值。

数组不是必须用一些常数来初始化吗?为什么你需要然后找出大小?

【讨论】:

  • 对不起,我只是举了一个例子,“ABC”是 LPTSTR 类型的。我已经更正了这个问题。
  • 这看起来非常接近我想要的,我可以得到一个字符数组,然后存储到一个短的(至少现在)。但是当我使用 teststr.c_str() 时。我离开 '.c_str' 必须有类/结构/联合类型
【解决方案2】:

如果您使用的是C++,则不需要Win32

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;


int main() {
    std::string in = "Input";
    std::vector<short> out(in.size());

    std::transform(
        in.begin(),
        in.end(),
        out.begin(),
        [] (const char i) -> short
        {
           return static_cast<short>(i);
        });

    for(auto o : out)
       std::cout << o << ' ';

    std::cout << std::endl;
    return 0;
}

将输出:73 110 112 117 116

int main()
{
    char in[] = "Input";
    short out[5];

    // If you don't know the length,
    // then you'll have to call strlen()
    // to get a proper begin/end iterator
    std::transform(
        std::begin(in),
        std::end(in),
        std::begin(out),
        [] (const char i) -> short
        {
           return static_cast<short>(i);
        });

    for(auto o : out)
       std::cout << o << ' ';
    return 0;
}

意识到如果你不知道字符串的长度并且必须调用strlen() 那么你会增加问题的复杂性,这里有一个更简洁的函数来满足这个特定的用例。

#include <algorithm>
#include <iterator>
using namespace std;
std::vector<short> to_short_array(char* s)
{
    std::vector<short> r;

    while(*s != '\0')
    {
       r.push_back(static_cast<short>(*s));
       ++s;
    }

    return r;
}


int main()
{
    char stuff[] = "afsdjkl;a rqleifo ;das ";
    auto arr = to_short_array(stuff);

    for(auto a : arr)
    {
        std::cout << a << ' ';
    }

    std::cout << endl;
}

【讨论】:

  • 问题是针对 Win32 和数组的 - 不要用 C++ 让它变得复杂。
  • 输入 LPTSTR 而不是 std::string
  • 问题被标记为C++std::transform 是“转换”事物的规范方式。
  • char 的签名是实现定义的。表达式static_cast&lt;short&gt;(i) 使用不同的编译器会产生不同的结果。您提出的解决方案不仅不必要地复杂,而且始终是错误的。
【解决方案3】:

也许您在问lstrlen 函数 - 获取字符串的长度? lstrlen 适用于 ANSI (ASCII) 和 Unicode 字符串。如果您想获取数组静态大小(无论来自内部的字符串),您可以这样做:

int len = sizeof arr / sizeof *arr;

它将返回任意元素大小的数组的元素个数。

另请参阅MultiByteToWideChar API - 我想您正在寻找它。它将char字符串(数组)转换为Unicode字符串(短数组)。

【讨论】:

  • 请记住,数组的大小和该数组中包含的字符串的长度是两个不同的东西。
  • 是的,我为其他情况添加了 cmets。问题和标题不清楚,我不确定作者到底想要什么。有用于 ASCII Unicode 转换的 Win32 API - 这也是可能的答案。
猜你喜欢
  • 2015-01-06
  • 2011-06-18
  • 2017-11-27
  • 2011-02-15
  • 1970-01-01
相关资源
最近更新 更多