在字符数组中存入汉字,如何把汉字再提出来?

Rischaos 2017-04-08 07:50:15
for example

#include<stdio.h>
#include<string>
using namespace std;
void main()
{
char x[20];
string str0, str1,str2,str3;
printf("请输入要写的字:");
scanf("%s",&x);
printf("%s\n",x); // 1
printf("%c%c\n",x[0],x[1]); // 2
}

我输入汉字“一二三四”,输出1可以输出“一二三四”。输出2可以输出“一”。
因为一个汉字占用两个字符空间,所以第一个汉字占用了x[0].x[1]。
我的问题是,如何把第一个汉字付给str0,第二个付给str1,以此类推
...全文
2823 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2017-04-11
  • 打赏
  • 举报
回复
引用 9 楼 Rischaos 的回复:
[quote=引用 5 楼 paschen 的回复:]
建议使用wchar_t和wstring

这样不管是汉字还是英文,都是一个元素一个

#include<stdio.h>
#include<string>
#include <locale>
using namespace std;
void main()
{
setlocale(LC_ALL, "");
wchar_t x[20];
wstring str0, str1, str2, str3;
printf("请输入要写的字:");
wscanf(L"%ls", x);
printf("%ls\n", x); // 1
printf("%C%C\n", x[0], x[1]); // 2

str0 = x[0];
str1 = x[1];
}


有效果。但是大神,我在下面的代码遇到了一个很严重的问题,我想逐个取出每一个字来用条件语句执行一些对应的语句,就是判断一下这是不是我要取得字。但我单独试验比较第一个字时,发现我分别用两种方式都无法在条件语句中比较,编译报错说“==”两边不匹配。求救!

#include<stdio.h>
#include<string>
#include <locale>
using namespace std;
void main()
{
setlocale(LC_ALL, "");
wchar_t x[20];
wstring str0, str1, str2, str3;
printf("请输入要写的字:");
wscanf(L"%ls", x);
printf("%ls\n", x);

str0 = x[0];
str1 = x[1];
str2 = x[2];
str3 = x[3];

// if(x[0] == "长") printf("长\n"); //1
// if(str0 == "长") printf("长\n"); //2
}
[/quote]

这是宽字符啊,所以你要各函数与常量都全用成宽字符版的

其次是单引号啊

if(x[0] == L'长')
Rischaos 2017-04-11
  • 打赏
  • 举报
回复
引用 5 楼 paschen 的回复:
建议使用wchar_t和wstring 这样不管是汉字还是英文,都是一个元素一个
#include<stdio.h>
#include<string>
#include <locale>
using namespace std;
void main()
{
	setlocale(LC_ALL, "");
	wchar_t x[20];
	wstring str0, str1, str2, str3;
	printf("请输入要写的字:");
	wscanf(L"%ls", x);
	printf("%ls\n", x); // 1
	printf("%C%C\n", x[0], x[1]); // 2

	str0 = x[0];
	str1 = x[1];
}
有效果。但是大神,我在下面的代码遇到了一个很严重的问题,我想逐个取出每一个字来用条件语句执行一些对应的语句,就是判断一下这是不是我要取得字。但我单独试验比较第一个字时,发现我分别用两种方式都无法在条件语句中比较,编译报错说“==”两边不匹配。求救!
#include<stdio.h>
#include<string>
#include <locale>
using namespace std;
void main()
{
    setlocale(LC_ALL, "");
    wchar_t x[20];
    wstring str0, str1, str2, str3;
    printf("请输入要写的字:");
    wscanf(L"%ls", x);
    printf("%ls\n", x); 

    str0 = x[0];
    str1 = x[1];
    str2 = x[2];    
    str3 = x[3];

//	if(x[0] == "长")	printf("长\n");  //1 
//	if(str0 == "长")	printf("长\n");  //2
}
赵4老师 2017-04-11
  • 打赏
  • 举报
回复
仅供参考:
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
extern "C" HWND WINAPI GetConsoleWindow();
void HideTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = FALSE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
void ShowTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = TRUE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
int main() {
    HWND  hwnd;
    HDC   hdc;
    HFONT hfont;
    wchar_t wc[2];

    system("color F0");
    system("cls");
    HideTheCursor();
    hwnd  = GetConsoleWindow();
    hdc   = GetDC(hwnd);
    hfont = CreateFont(48,0,0,0,0,0,0,0,GB2312_CHARSET ,0,0,0,0,"宋体-方正超大字符集");
    SelectObject(hdc,hfont);
    wc[0]=0xD854u;
    wc[1]=0xDC00u;
    TextOutW(hdc,10,10,wc,2);
    DeleteObject(hfont);
    ReleaseDC(hwnd,hdc);
    getch();
    system("color 07");
    system("cls");
    ShowTheCursor();
    return 0;
}
#if 0
代理项或代理项对是一对共同表示单个字符的 16 位 Unicode 编码值。需要记住的关键一点是:
代理项对实际上是 32 位单个字符,不能再假定一个 16 位 Unicode 编码值正好映射到一个字符。

使用代理项对
代理项对的第一个值是高代理项,包含介于 U+D800 到 U+DBFF 范围内的 16 位代码值。
该对的第二个值是低代理项,包含介于 U+DC00 到 U+DFFF 范围内的值。通过使用代理项对,
16 位 Unicode 编码系统可以对已由 Unicode 标准定义的一百多万个其他字符 (220) 进行寻址。

在传递给 XmlTextWriter 方法的任何字符串中都可以使用代理项字符。不过,代理项字符在编写的
XML 中应该有效。例如,万维网联合会 (W3C) 建议不允许在元素或属性的名称中使用代理项字符。
如果字符串包含无效的代理项对,则引发异常。

另外,可以使用 WriteSurrogateCharEntity 写出与代理项对相对应的字符实体。字符实体以十六
进制格式写出,并用以下公式生成:

(highChar -0xD800) * 0x400 + (lowChar -0xDC00) + 0x10000

如果字符串包含无效的代理项对,则引发异常。下面的示例显示将代理项对作为输入的 WriteSurrogateCharEntity 方法。

C#复制
 // The following line writes 𐀀.
WriteSurrogateCharEntity ('\uDC00', '\uD800');
下面的示例生成一个代理项对文件,将其加载到 XmlReader 中,并用新的文件名保存文件。
然后,原始文件和新文件被加载回应用程序的 XML 文档对象模型 (DOM) 结构中以进行比较。

C#复制
 char lowChar, highChar;
char [] charArray = new char[10];
FileStream targetFile = new FileStream("SurrogatePair.xml",
      FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

lowChar = Convert.ToChar(0xDC00);
highChar = Convert.ToChar(0xD800);
XmlTextWriter tw = new XmlTextWriter(targetFile, null);
tw.Formatting = Formatting.Indented;
tw.WriteStartElement("root");
tw.WriteStartAttribute("test", null);
tw.WriteSurrogateCharEntity(lowChar, highChar);
lowChar = Convert.ToChar(0xDC01);
highChar = Convert.ToChar(0xD801);
tw.WriteSurrogateCharEntity(lowChar, highChar);
lowChar = Convert.ToChar(0xDFFF);
highChar = Convert.ToChar(0xDBFF);
tw.WriteSurrogateCharEntity(lowChar, highChar);

// Add 10 random surrogate pairs.
// As Unicode, the high bytes are in lower
// memory; for example, word 6A21 as 21 6A.
// The high or low is in the logical sense.
Random random = new Random();
for (int i = 0; i < 10; ++i) {
      lowChar = Convert.ToChar(random.Next(0xDC00, 0xE000));
      highChar = Convert.ToChar(random.Next(0xD800, 0xDC00));
      charArray[i] = highChar;
      charArray[++i] = lowChar;
}
tw.WriteChars(charArray, 0, charArray.Length);

for (int i = 0; i < 10; ++i) {
      lowChar = Convert.ToChar(random.Next(0xDC00, 0xE000));
      highChar = Convert.ToChar(random.Next(0xD800, 0xDC00));
      tw.WriteSurrogateCharEntity(lowChar, highChar);
}

tw.WriteEndAttribute();
tw.WriteEndElement();
tw.Flush();
tw.Close();

XmlTextReader r = new XmlTextReader("SurrogatePair.xml");

r.Read();
r.MoveToFirstAttribute();
targetFile = new FileStream("SurrogatePairFromReader.xml",
       FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

tw = new XmlTextWriter(targetFile, null);
tw.Formatting = Formatting.Indented;
tw.WriteStartElement("root");
tw.WriteStartAttribute("test", null);
tw.WriteString(r.Value);
tw.WriteEndAttribute();
tw.WriteEndElement();
tw.Flush();
tw.Close();

// Load both result files into the DOM and compare.
XmlDocument doc1 = new XmlDocument();
XmlDocument doc2 = new XmlDocument();
doc1.Load("SurrogatePair.xml");
doc2.Load("SurrogatePairFromReader.xml");
if (doc1.InnerXml != doc2.InnerXml) {
      Console.WriteLine("Surrogate Pair test case failed");
}
在使用 WriteChars 方法(一次写出一个缓冲区的数据)写出时,输入中的代理项对可能
会在一个缓冲区内被意外拆分。由于代理项值是定义完善的,如果 WriteChars 遇到来自
较低范围或者较高范围的 Unicode 值,它将该值标识为代理项对的一半。当遇到
 WriteChars 将导致从拆分代理项对的缓冲区写入的情况时,将引发异常。使用
  IsHighSurrogate 方法检查缓冲区是否以高代理项字符结束。如果缓冲区中的最后一个
  字符不是高代理项,可以将该缓冲区传递给 WriteChars 方法。

请参见
概念
使用 XmlTextWriter 创建格式正确的 XML
XmlTextWriter 的 XML 输出格式设置
XmlTextWriter 的命名空间功能

#endif
Rischaos 2017-04-11
  • 打赏
  • 举报
回复
引用 10 楼 paschen 的回复:
[quote=引用 9 楼 Rischaos 的回复:] [quote=引用 5 楼 paschen 的回复:] 建议使用wchar_t和wstring 这样不管是汉字还是英文,都是一个元素一个
#include<stdio.h>
#include<string>
#include <locale>
using namespace std;
void main()
{
	setlocale(LC_ALL, "");
	wchar_t x[20];
	wstring str0, str1, str2, str3;
	printf("请输入要写的字:");
	wscanf(L"%ls", x);
	printf("%ls\n", x); // 1
	printf("%C%C\n", x[0], x[1]); // 2

	str0 = x[0];
	str1 = x[1];
}
有效果。但是大神,我在下面的代码遇到了一个很严重的问题,我想逐个取出每一个字来用条件语句执行一些对应的语句,就是判断一下这是不是我要取得字。但我单独试验比较第一个字时,发现我分别用两种方式都无法在条件语句中比较,编译报错说“==”两边不匹配。求救!
#include<stdio.h>
#include<string>
#include <locale>
using namespace std;
void main()
{
    setlocale(LC_ALL, "");
    wchar_t x[20];
    wstring str0, str1, str2, str3;
    printf("请输入要写的字:");
    wscanf(L"%ls", x);
    printf("%ls\n", x); 

    str0 = x[0];
    str1 = x[1];
    str2 = x[2];    
    str3 = x[3];

//	if(x[0] == "长")	printf("长\n");  //1 
//	if(str0 == "长")	printf("长\n");  //2
}
[/quote] 这是宽字符啊,所以你要各函数与常量都全用成宽字符版的 其次是单引号啊 if(x[0] == L'长')[/quote]非常感激,感激涕零,五体投地
棉猴 2017-04-11
  • 打赏
  • 举报
回复
引用 6 楼 Rischaos 的回复:
[quote=引用 4 楼 hou09tian 的回复:] scanf("%c%c",&x[1],&x[2]); 汉字是两个字节,每个汉字对应的是x[0]/x[1]、x[2]/x[3]以此类推 你的代码中scanf的参数是x[1]和x[2],这样组合的汉字是不对的 另外可以考虑将 printf("%s",strarray[i]); 改为 printf("%s",strarray[i].c_str());
我在网上看的用scanf获得汉字就是那样用:scanf("%c%c",&x[1],&x[2]),如果单个输出汉字也可以:printf("%c%c\n",x[1],x[2])。 这些都可以正常执行 [/quote] 一个汉字对应两个字节,这两个字节要比配啊。比如x[0]与x[1]匹配在一起组成一个汉字,x[2]与x[3]匹配在一起组成一个汉字。但是x[1]和x[2]不匹配啊,没办法组成汉字
Rischaos 2017-04-10
  • 打赏
  • 举报
回复
引用 4 楼 hou09tian 的回复:
scanf("%c%c",&x[1],&x[2]); 汉字是两个字节,每个汉字对应的是x[0]/x[1]、x[2]/x[3]以此类推 你的代码中scanf的参数是x[1]和x[2],这样组合的汉字是不对的 另外可以考虑将 printf("%s",strarray[i]); 改为 printf("%s",strarray[i].c_str());
我在网上看的用scanf获得汉字就是那样用:scanf("%c%c",&x[1],&x[2]),如果单个输出汉字也可以:printf("%c%c\n",x[1],x[2])。 这些都可以正常执行
棉猴 2017-04-09
  • 打赏
  • 举报
回复
scanf("%c%c",&x[1],&x[2]); 汉字是两个字节,每个汉字对应的是x[0]/x[1]、x[2]/x[3]以此类推 你的代码中scanf的参数是x[1]和x[2],这样组合的汉字是不对的 另外可以考虑将 printf("%s",strarray[i]); 改为 printf("%s",strarray[i].c_str());
paschen 版主 2017-04-09
  • 打赏
  • 举报
回复
建议使用wchar_t和wstring 这样不管是汉字还是英文,都是一个元素一个
#include<stdio.h>
#include<string>
#include <locale>
using namespace std;
void main()
{
	setlocale(LC_ALL, "");
	wchar_t x[20];
	wstring str0, str1, str2, str3;
	printf("请输入要写的字:");
	wscanf(L"%ls", x);
	printf("%ls\n", x); // 1
	printf("%C%C\n", x[0], x[1]); // 2

	str0 = x[0];
	str1 = x[1];
}
Rischaos 2017-04-08
  • 打赏
  • 举报
回复
引用 2 楼 hou09tian 的回复:
汉字保存在string数组stringarray中,每个元素是一个汉字 char x[20] = {0}; string strarray[10] = {0}; printf("请输入要写的字:"); scanf("%s",&x); printf("%s\n",x); // 1 printf("%c%c\n",x[0],x[1]); // 2 char temp[3] = {0}; for(int i=0; i<10; i++) { strncpy(temp, &x[i*2], 2); strarray[i] = temp; }
为什么我这样编译后执行会停止工作呢?

#include<stdio.h>
#include<string>
using namespace std;
void main()
{
	 char x[20];
	 printf("请输入要写的字:");
	 string strarray[10] ;
	 scanf("%c%c",&x[1],&x[2]);
	 printf("%c%c\n",x[1],x[2]);
	 char temp[3];
	 for(int i=0; i<10; i++)
	 {
	 strncpy(temp, &x[i*2], 2);
	 strarray[i] = temp;
	 printf("%s",strarray[i]);
	 }
}
棉猴 2017-04-08
  • 打赏
  • 举报
回复
汉字保存在string数组stringarray中,每个元素是一个汉字 char x[20] = {0}; string strarray[10] = {0}; printf("请输入要写的字:"); scanf("%s",&x); printf("%s\n",x); // 1 printf("%c%c\n",x[0],x[1]); // 2 char temp[3] = {0}; for(int i=0; i<10; i++) { strncpy(temp, &x[i*2], 2); strarray[i] = temp; }
Rischaos 2017-04-08
  • 打赏
  • 举报
回复
help me

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧