在Unicode到ASCII转换后声明std :: string给出分段错误

拉加夫·索马尼(Raghav Somani)

我正在尝试wchar_t从stdin中获取一个字符串,然后通过一个函数将其从unicode转换为ASCII。

该功能某种程度上不允许我在程序中进一步使用std :: string。

#include <iostream>
#include <string>
#include <locale>
#include <cstring>
#include <cwchar>
using namespace std;
bool UnicodeToAscii(wchar_t* szUnicode, char* szAscii);
int main()
{
    wchar_t w[100];
    wcin>>w;
    char* c;
    bool x=UnicodeToAscii(w,c);
    cout<<c<<"\n";
    string s="hi";
    return 0;
}
bool UnicodeToAscii(wchar_t* szUnicode, char* szAscii)
{
    int len, i;
    if((szUnicode == NULL) || (szAscii == NULL))
        return false;
    len = wcslen(szUnicode);
    for(i=0;i<len+1;i++)
        *szAscii++ = static_cast<char>(*szUnicode++);
    return true;
}
雷米·勒博(Remy Lebeau)

您没有为分配任何内存c,因此您正在将字符数据写入随机内存并破坏了程序。

您应该停止使用字符数组和原始指针,而开始使用std::stringstd::wstring让他们为您管理内存。

尝试这个:

#include <iostream>
#include <string>

void UnicodeToAscii(const std::wstring &szUnicode, std::string &szAscii);

int main()
{
    std::wstring w;
    std::wcin >> w; // or std::getline(wcin, w);

    std::string c;
    bool x = UnicodeToAscii(w, c);
    std::cout << c << "\n";

    std::string s = "hi";
    return 0;
}

void UnicodeToAscii(const std::wstring &szUnicode, std::string &szAscii)
{
    szAscii.clear(len);

    int len = szUnicode.length();
    char c;

    szAscii.reserve(len);

    for(int i = 0; i < len; ++i)
    {
        wchar_t w = szUnicode[i];

        if ((w >= 0) && (w < 127))
        {
            // ASCII character
            c = static_cast<char>(w);
        }
        else
        {
            // non-ASCII character
            c = '?';

            // wchar_t is 2 bytes (UTF-16) on some systems,
            // but is 4 bytes (UTF-32) on other systems...
            #if sizeof(wchar_t) == 2
            if ((w >= 0xD800) && (w <= 0xDFFF))
            {
                // skip first unit of a surrogate pair,
                // the loop will skip the second unit...
                ++i;
            }
            #endif
        }

        szAscii.push_back(c);
    }

    return true;
}

当然,这是非常基本的,它只能处理真正的ASCII字符(0x00-0x7F)。正确处理Unicode比这复杂得多。但这回答了您的紧迫问题,即为什么std::string在调用函数后不能使用-因为这浪费了内存。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

std :: string的共享内存给出分段错误(Linux)

来自分类Dev

在结构中分配std :: string的分段错误

来自分类Dev

在结构中分配std :: string的分段错误

来自分类Dev

使用std :: string时出现分段错误

来自分类Dev

提供正确的输出后给出错误分段错误(核心已转储)

来自分类Dev

打印出std :: string崩溃并出现分段错误错误

来自分类Dev

strcmp给出分段错误

来自分类Dev

strcmp给出分段错误

来自分类Dev

到Ascii转换错误

来自分类Dev

类型转换的分段错误

来自分类Dev

使用本地数组作为存储时,带有std字符串参数的模板类给出分段错误

来自分类Dev

将unicode(带有BOM)字符串转换为ASCII std :: string

来自分类Dev

获取分段错误(向量声明)

来自分类Dev

C ++分段错误std :: array

来自分类Dev

返回零后的分段错误

来自分类Dev

SplitFile给出转换错误

来自分类Dev

gfortran编译器给出分段错误

来自分类Dev

fputs中的fgets给出了分段错误

来自分类Dev

读取文件时scanf给出分段错误

来自分类Dev

ID的灵活模式给出“分段错误”

来自分类Dev

为什么vfork()给出分段错误

来自分类Dev

以下代码给出了分段错误

来自分类Dev

变量声明给出错误

来自分类Dev

为什么std :: atomic <std :: string>给出平凡的可复制错误?

来自分类Dev

升级到16.04后,共享库出现分段错误

来自分类Dev

声明Int变量会导致分段错误?

来自分类Dev

字符串声明分段错误

来自分类Dev

十六进制到ASCII错误转换

来自分类Dev

ASCII到十六进制转换错误