Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++ -将一个字符转换为wchar_t。

C++ -将一个字符转换为wchar_t。
EN

Stack Overflow用户
提问于 2016-03-07 11:47:41
回答 1查看 2.4K关注 0票数 0

我正在编写一个小程序,从istream中读取字符并将其转换为wchar_t,我得到了一个分段错误。这是我的密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;

wchar_t read(istream &stream) {
 char *c;
 stream.read(c, sizeof(*c));
 cout << *c << endl;
 wchar_t retChar = static_cast<wchar_t>(*c);
 return retChar;
}

int main() {
 cout << "Write something" << endl;    
 read(cin);
}

我的逻辑是:

  1. 创建一个字符数组,因为read只接收字符数组。
  2. 以等于字符大小的字节读取。即读取字符并将其存储在数组c中。
  3. 创建一个wchar_t并将该字符*c转换为一个wchar_t。
  4. 返回wchar_t

既然我有段错,这里显然出了点问题。不过我看不见。任何帮助都将不胜感激。

谢谢你

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-07 12:45:36

通过遍历代码,让OP了解发生了什么,以及为什么它不能工作。然后,我们将看一个方法来做他们想做的,这是尽可能接近他们的意图。然后介绍一下如何在C++世界中更好地做到这一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wchar_t read(istream &stream) {
 char *c;

声明一个指针c,它没有指向任何东西。c是一个未初始化的变量。想想看,就像被邀请去史蒂夫家参加聚会一样,但没人告诉你他住在哪里。不管你去哪里,它都不会是史蒂夫的家,这是很好的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 stream.read(c, sizeof(*c));

sizeof(*c)将返回一个字符的大小。可能是8位1字节,但c仍然没有指向任何东西,所以这是未定义行为。不知道程序将做什么,但很可能它会将一个字节读入内存中的某个未知空间。也许这会导致崩溃,因为你不能在那里写字。也许它写的东西,它被允许写下来,并搞砸了其他的东西。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 cout << *c << endl;

试图打印出c。如果程序在上面的read中幸存下来,几率是很好的--它也能存活下来,但这也是不确定的行为。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 wchar_t retChar = static_cast<wchar_t>(*c);

这实际上会将一个字符的价值数据填充到一个宽字符中。它不会根据地区或任何其他字符编码来转换它。char是被定义为字符的数字代码。一个演员会愚蠢地将字符值,例如'A‘和ASCII编码到retChar中。retChar现在等于65。65可能意味着任何东西,这取决于wchar_t使用的编码。它的意思可能仍然是' A ',但对不起,艾恩兰德,这是一个情况下,A很可能不是A。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 return retChar;
}

去做OP想要做的事情(并且暂时忽略了有更好的方法来做这件事):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;
wchar_t read(istream &stream) {
 char c[2];

分配一个字符数组。为什么?因为我所知道的最简单的方法是对字符串进行转换。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 stream.read(c, sizeof(c[0]));

c现在是一个衰减到指针的数组。我们只想读取一个char,因此sizeof(c[0])获得数组中第一个元素的大小。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 c[1] = '\0';
 cout << c << endl;

Null终止并打印。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 wchar_t retChar[2];

再一次,一个数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 mbstowcs(retChar, c, 1);

使用已设置的任何区域设置将一个字符从字符转换为宽字符。在这里阅读更多关于地区的信息:http://en.cppreference.com/w/cpp/locale/setlocale

和关于mbstowcs的文档:http://en.cppreference.com/w/cpp/string/multibyte/mbstowcs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 return retChar[0];
}

用一个快速测试器把所有的东西组合在一起:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <cstdlib>

wchar_t read(std::istream &stream)
{
    char c[2];
    stream.read(c, sizeof(c[0]));
    c[1] = '\0';
    std::cout << c << std::endl;
    wchar_t retChar[2];
    mbstowcs(retChar, c, 1);
    return retChar[0];
}

int main()
{
    std::wcout << read(std::cin) << std::endl;
}

这很简单,但在C++世界中,您应该尽可能地坚持使用string皈依。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35852656

复制
相关文章
动态加载子类热更
上一篇《JAVA热更新1:Agent方式热更》我们讲解了JDK提供的Agent方式来实现代码不停服更新, 受限于JDK的Agent一些限制,这种方式无法实现以下功能:只能修改方法体,不能变更方法签名、不能增加和删除方法/类的成员属性。
Qwe7
2022/03/23
4320
CRT改时间
抓log时时间和实时时间不匹配(差5小时),故修改时间 改完后出现一堆log(不管他,ctrl+C退出打印) 将当前时间和日期写入BIOS,避免重启后失效 具体步骤如下: console:/ $date Tue Oct 18 11:23:19 CEST 2022 console:/ $ su console:/ # date 17:23:00 console:/ #hwclock -w su date 17:23:00 hwclock -w
天天Lotay
2022/11/11
1.1K0
CRT改时间
Linux修改时间
查看当前系统时间 date 修改时间 date -s "yyyyMMdd mm:hh:ss" [如果只是修改时分秒,那么可以把年月日省略]
Java架构师必看
2021/09/07
4.7K0
jenkins修改时区
查看jenkins目前的时区 访问http://your-jenkins/systemInfo,查看user.timezone变量的值 默认是纽约时间 修改时区 查https://wiki.jenki
千往
2018/01/24
2.7K0
jenkins修改时区
[Concent小课堂]认识组合api,换个姿势撸更清爽的react
开源不易,感谢你的支持,❤ star me if you like concent ^_^
fantasticsoul
2020/08/16
1.5K0
[Concent小课堂]认识组合api,换个姿势撸更清爽的react
【春节日更】JS延迟加载的几种方式
用途:表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕之后再执行。
用户9914333
2022/07/22
1.9K0
【春节日更】如何判断多图片加载完毕
注:readyState为complete和loaded则表明图片已经加载完毕。测试IE6-IE10支持该事件,其它浏览器不支持。
用户9914333
2022/07/22
9230
Centos系统修改时区
今天在操作系统的时候创建了一个文件,ls了一下发现时间和本地时间不对,date看了一下后发现时区是EDT(Eastern Daylight Timing)指美国东部夏令时间)。时区这玩意,百年难得修改一次,几乎算是最不常用的操作了(除了运维NTP服务器的大神们),记录一下。 [root@dbback ~]# date Mon Mar 27 01:26:48 EDT 2017 一、设置Centos系统的时区 输入命令: tzselect 依次输入:5)Asia → 9)china → 1)eas
行 者
2018/03/26
2.6K0
Centos系统修改时区
centos永久修改时间
修改硬件时间 hwclock --set --date "2019-08-12 10:18:30"
似水的流年
2019/12/07
1.5K0
Linux (RHEL)修改时区
注意: 1)时区一般建议在安装系统时就选择正确,不建议后期更改 2)tzselect可以指导你如何选择正确的时区,但并不会修改时区
Alfred Zhao
2019/05/24
3.5K0
CentOS 7修改时区
在线上环境遇到时间差八小时,怀疑是时区的原因: 然后在linux上运行: date 发现输出的是UTC时间,时间与现在差八个小时 然后通过以下命令去修改时区: ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 然后再次运行date,发现时间为CST时间,即上海时区
院长技术
2021/02/19
7280
CentOS 7 修改时区
Linux 系统(我特指发行版, 没说内核) 下大部分软件的风格就是不会仔细去考虑向后 的兼容性, 比如你上个版本能用这种程序配置, 没准到了下一个版本, 该程序已经不见了. 比如 sysvinit 这种东西.
yaohong
2019/09/11
1.1K0
linux设置和修改时间与时区命令_linux 文件修改时间
时区设置用tzselect 命令来实现。但是通过tzselect命令设置TZ这个环境变量来选择的时区,需要将变量添加到.profile文件中。
全栈程序员站长
2022/11/17
6.4K0
vscode源码分析【八】加载第一个画面
先复习一下! 在第一节中,我们提到: app.ts(src\vs\code\electron-main\app.ts)的openFirstWindow方法中, 有个WindowsMainService
liulun
2019/07/02
9990
React框架-第一个React+Node.js组合实例
通常情况下Web应用的数据都是由存储在服务端的数据库中。前端往往通过基于HTTP的接口来完成数据的增、删、改、查等操作。
Baige
2022/03/22
1.2K0
React框架-第一个React+Node.js组合实例
Ubuntu 系统如何修改时间
在Ubuntu上,你可以使用以下三种方法来修改时间:date命令,timedatectl命令和hwclock命令。
用户8418197
2023/07/02
6.4K0
Linux 修改时区和时间
CentOS 和 Ubuntu 的时区文件是 /etc/localtime , 但是在 CentOS7 以后 localtime 以及变成了一个链接文件 :
全栈程序员站长
2022/07/18
3.7K0
ubuntu18.04修改时区
运行如下命令: sudo tzselect 然后选择亚洲Asia,继续选择中国China,最后选择北京Beijing。 baoguoxiao@bogon:~/windows/lumen$ sudo tzselect Please identify a location so that time zone rules can be set correctly. Please select a continent, ocean, "coord", or "TZ". 1) Africa 2) Americas
魔王卷子
2019/05/31
1.6K0
拖拽,自由组合,让你的开发更加简单,用户更方便
今天给大家推荐一个自由拖拽,自由组合的控件,这个控件是我自定义写的。通过它,我们可以自由拖拽,自由组合实现一个界面,满足一个用户自由组合界面的需求。这里不是通过自由拖拽控件,来快速开发一个界面,而且更人性化的让用户去自由组合一个界面。 1 前言 最近有一个项目,有一个主界面,界面上有很多控件或者有多个 fragment 组成,大小不一,而且由于用户需要,需要自由拖动和自由组合,形成用户自己需要的组合成的模样。所以就写了一个 DragerViewLayout ,只要在 DragerViewLayout 下,写
非著名程序员
2018/02/09
1.1K0
拖拽,自由组合,让你的开发更加简单,用户更方便
点击加载更多

相似问题

通过web钩子发送FulfillmentMessage和FollowupEventInput

13

如何使用动作sdk在web钩子中添加建议芯片

16

捕获对话流建议芯片响应

10

用于显示设备的建议芯片

113

条纹Web钩子响应

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文