c++中關於中文字符的處理問題


/*
【編程題】(滿分19分)

    在很多軟件中,輸入拼音的首寫字母就可以快速定位到某個詞條。
    比如,在鐵路售票軟件中,輸入: “bj”就可以定位到“北京”。怎樣在自己的軟件中實現這個功能呢?
問題的關鍵在於:對每個漢字必須能計算出它的拼音首字母。

    GB2312漢字編碼方式中,一級漢字的3755個是按照拼音順序排列的。
    我們可以利用這個特征,對常用漢字求拼音首字母。

    GB2312編碼方案對每個漢字采用兩個字節表示。
    第一個字節為區號,第二個字節為區中的偏移號。為了能與已有的ASCII編碼兼容(中西文混排),
    區號和偏移編號都從0xA1開始。

    我們只要找到拼音a,b,c,...x,y,z 每個字母所對應的GB2312編碼的第一個漢字,
    就可以定位所有一級漢字的拼音首字母了(不考慮多音字的情況)。下面這個表給出了前述信息。
請你利用該表編寫程序,求出常用漢字的拼音首字母。


a 啊 B0A1
b 芭 B0C5
c 擦 B2C1
d 搭 B4EE
e 蛾 B6EA
f 發 B7A2
g 噶 B8C1
h 哈 B9FE
j 擊 BBF7
k 喀 BFA6
l 垃 C0AC
m 媽 C2E8
n 拿 C4C3
o 哦 C5B6
p 啪 C5BE
q 期 C6DA
r 然 C8BB
s 撒 C8F6
t 塌 CBFA
w 挖 CDDA
x 昔 CEF4
y 壓 D1B9
z 匝 D4D1


【輸入、輸出格式要求】

    用戶先輸入一個整數n (n<100),表示接下來將有n行文本。
    接着輸入n行中文串(每個串不超過50個漢字)。

    程序則輸出n行,每行內容為用戶輸入的對應行的漢字的拼音首字母。

    字母間不留空格,全部使用大寫字母。

    例如:
    用戶輸入:
3
大家愛科學
北京天安門廣場
軟件大賽

    則程序輸出:
DJAKX
BJTAMGC
RJDS

【注意】

    請仔細調試!您的程序只有能運行出正確結果的時候才有機會得分!

    在評卷時使用的輸入數據與試卷中給出的實例數據可能是不同的。

    請把所有函數寫在同一個文件中,調試好后,拷貝到【考生文件夾】下對應題號的“解答.txt”中即可。

    相關的工程文件不要拷入。

    源代碼中不能使用諸如繪圖、Win32API、中斷調用、硬件操作或與操作系統相關的API。

    允許使用STL類庫,但不能使用MFC或ATL等非ANSI c++標准的類庫。

    例如,不能使用CString類型(屬於MFC類庫),不能使用randomize, random函數(不屬於ANSI C++標准)

*/

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

enum Letter{
A = 0XB0A1,B = 0XB0C5,C = 0XB2C1,
D = 0XB4EE,F = 0XB7A2,G = 0XB8C1,
H = 0XB9FE,J = 0XBBF7,K = 0XBFA6,
L = 0XC0AC,M = 0XC2E8,N = 0XC4C3,
O = 0XC5B6,P = 0XC5BE,Q = 0XC6DA,
R = 0XC8BB,S = 0XC8F6,T = 0XCBFA,
W = 0XCDDA,X = 0XCEF4,Y = 0XD1B9,
Z = 0XD4D1
};

char fun(Letter temp)
{
    if(temp < B) return 'A';
    if(temp < C) return 'B';
    if(temp < D) return 'C';
    if(temp < F) return 'D';
    if(temp < G) return 'F';
    if(temp < H) return 'G';
    if(temp < J) return 'H';
    if(temp < K) return 'J';
    if(temp < L) return 'K';
    if(temp < M) return 'L';
    if(temp < N) return 'M';
    if(temp < O) return 'N';
    if(temp < P) return 'O';
    if(temp < Q) return 'P';
    if(temp < R) return 'Q';
    if(temp < S) return 'R';
    if(temp < T) return 'S';
    if(temp < W) return 'T';
    if(temp < X) return 'W';
    if(temp < Y) return 'X';
    if(temp < Z) return 'Y';
    return 'Z';
}

int main()
{
    int n;
    cin >> n;
    wstring s;
    while(n--)
    {
        //cout << sizeof(0xB0A1) << endl << "wchar_t :"<< sizeof(wchar_t) << endl << "Letter : " << sizeof(Letter) << endl;
        wcin >> s;
        //wcout << s;
        int len = s.size();
        //cout << len << endl;
        string ans;
        for(int i = 0;i < len;i ++)
        {
            //Letter temp = static_cast<Letter>(static_cast<Letter>(s[i] << 16) + static_cast<Letter>(s[i + 1]));
             //ans.push_back(fun(temp));
            wcout << s[i];
            //cout << cout.setf(ios::hex) << s[i] << ",";
            ans += fun((Letter)s[i]);
             //cout  << cout.setf( ios::hex)<< int32_t(temp);
             //ans += fun(temp);
        }
        cout << endl;
        cout << ans << endl;
    }
    return 0;
}

/*
int main()
{
    int n;
    cin >> n;
    wstring s;
    while(n--)
    {

        wcin >> s;
        wcout << s;
        int len = s.size();
        string ans;
        for(int i = 0;i < len;i ++)
        {
             ans += fun(Letter(s[i]));
        }

       cout << ans << endl;
    }
    return 0;
}*/

這個代碼是有問題的,請高手指教指教,我該怎么處理?

22 个解决方案

#1


無人問津?……

#2


求高手……

#3


大神移駕http://bbs.csdn.net/topics/390418553
看看為什么 沒有分可憐,給點分吧謝謝有分的大神。

#4


這個題目邏輯很簡單,但調試比較麻煩--凡是涉及到編碼問題的,我覺得調試起來都很頭疼。

#5


貼一版我的測試代碼:

// ConsoleApplicationTest.cpp : 定義控制台應用程序的入口點。
//

#include "stdafx.h"

int nsp[] = {
0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,
0xB8C1,0xB9FE,0xBBF7,0xBFA6,0xC0AC,0xC2E8,
0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,
0xCBFA,0xCDDA,0xCEF4,0xD1B9, 0xD4D1};
int nsc[] = {
'A','B','C','D','E','F',
'G','H','J','K','L','M',
'N','O','P','Q','R','S',
'T','W','X','Y','Z'};

struct ws {
char ch;
char cl;
};

union zh{
int c;
struct ws zc;
};

int _tmain(int argc, _TCHAR* argv[])
{
char data[100] = {0};
scanf("%s", data);
zh demo;
demo.c = 0;
demo.zc.ch= data[1];
demo.zc.cl = data[0];
for(int i = 0; i < 24; i++)
if(demo.c < nsp[i]){
printf("%c", nsc[i-1]);
break;
}
return 0;
}



#6


單步調試和設斷點調試是程序員必須掌握的技能之一。

#7


對電腦而言沒有亂碼,只有二進制字節;對人腦才有亂碼。啊 GBK:0xB0 0xA1,Unicode:0x4A 0x55,UTF-8:0xE5 0x95 0x8A

_wsetlocale(LC_ALL,L"chs");

#8


引用 5 樓 super_admi 的回復:
貼一版我的測試代碼:
C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041// ConsoleApplicationTest.cpp : 定義控制台應用程序的入口點。// #include "stdafx.h" int nsp[] = {    0xB0A……

我測試你的代碼是不過的,你的環境是vs2010還是?   如果用c++標准庫的功能可以解決不?

我的代碼能改改么?

#9


引用 7 樓 zhao4zhong1 的回復:
對電腦而言沒有亂碼,只有二進制字節;對人腦才有亂碼。啊 GBK:0xB0 0xA1,Unicode:0x4A 0x55,UTF-8:0xE5 0x95 0x8A

_wsetlocale(LC_ALL,L"chs");
那么在讀入中文字符的時候,用的是GB碼還是Unicode編碼呢?

#10


我試了一下,有以下發現供樓主參考:
wchar_t a = L'啊';
wchar_t b = '啊';
printf("0X%X\n", a);
printf("0X%X\n", b);
顯示的是:
0X554A
0XB0A1
我查了下554A是啊的UNICODE編碼。所以問題就是怎么把UNICODE跟GB2312聯系起來的問題了。

#11


引用 6 樓 zhao4zhong1 的回復:
單步調試和設斷點調試是程序員必須掌握的技能之一。

請大神移駕 http://bbs.csdn.net/topics/390418045?page=1#post-394145579

#12


引用 10 樓 pengjialaosan 的回復:
我試了一下,有以下發現供樓主參考:
wchar_t a = L'啊';
wchar_t b = '啊';
printf("0X%X\n", a);
printf("0X%X\n", b);
顯示的是:
0X554A
0XB0A1
我查了下554A是啊的UNICODE編碼。所以問題就是怎么把UNICODE跟GB2312聯系起來的問題了。

也就是說在c++讀入字符串的時候,存儲的是Unicode的編碼?

#13


引用 12 樓 u010067960 的回復:
引用 10 樓 pengjialaosan 的回復:我試了一下,有以下發現供樓主參考:
wchar_t a = L'啊';
wchar_t b = '啊';
printf("0X%X\n", a);
printf("0X%X\n", b);
顯示的是:
0X554A
0XB0A1
我查了下554A是啊的UNICODE編碼。所以問題就是怎么把UNICODE跟……

我試了一下這樣:
char s[] = "啊";
unsigned short c = '啊';
unsigned short a = *(unsigned short*)(s);
printf("0X%X\n", a);
printf("0X%X\n", c);
結果顯示:
0XA1B0
0XB0A1
這是什么情況?字符和字符串里的內容好像是大小端存儲似的。

#14


對於你的回復,我表示很無語,因為你居然是來求答案,而不是來求思想的。我用的測試環境是VS 2012。
引用 8 樓 u010067960 的回復:
我測試你的代碼是不過的,你的環境是vs2010還是?   如果用c++標准庫的功能可以解決不?
 
我的代碼能改改么? ……

#15


在鐵路售票軟件中,輸入: “bj”就可以定位到“北京”。

其實這種很簡單,無非就是在數據庫保存 bj-北京 beijing-北京 ,在你輸入字母時檢索罷了,所以沒什么難度。 但是如果你切換到中文輸入法,比如正在輸入bj,他就無法提示。

#16


'***************************************************************************
'*
'* MODULE NAME:     HzToPy
'* AUTHOR & DATE:   tt.t
'*                  03 Apirl 2007
'*
'* DESCRIPTION:     將中文字符串轉換為拼音,就這些~
'*                  有漢字得到拼音其實並不是我很關心的一個問題,只是發現已經公開
'*                  的方法有很大的缺陷,但WORD卻做得很好,因此才嘗試解決這個問題。
'*                  過程比我預期的要曲折的多,主要是VBA實在是一種很受限制的語言。
'*                  不過好在有Google和Olldbg,難題也僅僅是如何找到繞過限制的途徑,
'*                  終於在5個小時內搞定了一切~
'*                  時間比我預計的長了很多,因為我實在是不了解VBA,也不很熟悉OLE:"(
'*                  不過好在一切都解決了~~終於從VBA小白成長了一些。
'*                  其實VBA也是很強大的~
'*
'* Theory:         廢話了好多還是說說原理吧,雖然不是每個人都很關心~
'*                  WORD的拼音向導能夠將漢字轉成拼音全是倚仗微軟拼音的幫助,
'*                  微軟拼音2.0以上版本都提供了漢字到拼音的轉換功能。
'*                  微軟拼音MSIME.China類中的IFELanguage接口具體實現了轉換功能
'*                  不過MSIME.China中沒有提供IDispatch接口,VBA的CreateObject不支持
'*                  調用這樣的類,因此我們只好手工調用。CoCreateInstance可以創建類
'*                  並獲取IFELanguage接口,但我們無法直接調用,因為VBA不知道如何調用
'*                  IFELanguage接口的Method。這里困擾了我好久,原本希望能向其他語言那樣
'*                  聲明接口結構,但VBA並不支持。萬般無奈下只好在OLE相關DLL中尋找,期待能
'*                  找到代理函數簡介調用接口的Method。呵呵~功夫不負苦心人終於在OLEAUT32中
'*                  找到了DispCallfunc。Google了一下,果然是我需要的。接口知道了,如何調用也
'*                  清楚了,剩下的問題就是如何取得轉換后的結果。IFELanguage.GetMorphResult會將
'*                  轉換的結果存在一個叫做tagMORRSLT的結構中,並返回指向tagMORRSLT的指針。
'*                  新問題又來了,VBA不支持指針...sigh,為什么其他語言很容易實現的功能VBA用起來
'*                  就這么煩呢~幸好VBA讀取內存的限制也好突破,只需調用ntdll的RtlMoveMemory。
'*                  好了~一切限制都已解除,HzToPy終於正常工作了~~
'*                  說起來一切順理成章,可是尋找解決方法的過程真的很痛苦,不過VBA經驗值大漲也算有所收獲。
'*                  下面就讓代碼來說話吧。
'*
'* Memo:            改成類了,加入了拼音間加入分隔符和去掉注音的功能,請參照“模塊1”中的例子,用起來很簡單:)
'*                  更正了一個錯誤,redim時vba數組默認起始搞錯了
'*
'***************************************************************************

Option Explicit

Public Enum PhoneticNotation
pnDefault = 0
pnNoNotation = 1
End Enum

Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type

Private Type TinyMORRSLT
dwSize As Long
pwchOutput As Long
cchOutput As Integer
End Type

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)

Private Declare Function CoCreateInstance Lib "ole32" ( _
rclsid As GUID, ByVal pUnkOuter As Long, _
ByVal dwClsContext As Long, riid As GUID, _
ByRef ppv As Long) As Long

Private Declare Function DispCallFunc Lib "oleaut32" _
(ByVal pvInstance As Long, ByVal oVft As Long, _
ByVal cc As Long, ByVal vtReturn As Integer, _
ByVal cActuals As Long, prgvt As Integer, _
prgpvarg As Long, pvargResult As Variant) As Long

Private Declare Sub CoTaskMemFree Lib "ole32" (pv As Long)

Dim MSIME_GUID As GUID 'MSIME's GUID
Dim IFELanguage_GUID As GUID 'IFELanguage's GUID
Dim IFELanguage As Long 'Pointer to IFELanguage interface
Dim sNotation1
Dim sNotation2
Dim dNotation

Dim pvSeperator As String
Dim pvUseSeperator As Boolean
Dim pvInitialOnly As Boolean
Dim pvOnlyOneChar As Boolean

Private Sub InitalArray()
sNotation1 = Array("ā", "á", "ǎ", "à", "ē", "é", "ě", "è", "ī", "í", "ǐ", "ì", "ō", "ó", "ǒ", _
  "ò", "ū", "ú", "ǔ", "ù", "ǖ", "ǘ", "ǚ", "ǜ", "ü", "", "ń", "ň", "", "ɡ")

sNotation2 = Array("a1", "a2", "a3", "a4", "e1", "e2", "e3", "e4", "i1", "i2", "i3", "i4", "o1", "o2", "o3", _
  "o4", "u1", "u2", "u3", "u4", "v1", "v2", "v3", "v4", "v", "m2", "n2", "n4", "n2", "g")

dNotation = Array("a", "a", "a", "a", "e", "e", "e", "e", "i", "i", "i", "i", "o", "o", "o", _
  "o", "u", "u", "u", "u", "v", "v", "v", "v", "v", "m", "n", "n", "n", "g")
End Sub

Private Sub GenGUID()

InitalArray
'MSIME.China GUID = "{E4288337-873B-11D1-BAA0-00AA00BBB8C0}"
With MSIME_GUID
.Data1 = &HE4288337
.Data2 = &H873B
.Data3 = &H11D1
.Data4(0) = &HBA
.Data4(1) = &HA0
.Data4(2) = &H0
.Data4(3) = &HAA
.Data4(4) = &H0
.Data4(5) = &HBB
.Data4(6) = &HB8
.Data4(7) = &HC0
End With
'IFELanguage GUID = "{019F7152-E6DB-11d0-83C3-00C04FDDB82E}"
With IFELanguage_GUID
.Data1 = &H19F7152
.Data2 = &HE6DB
.Data3 = &H11D0
.Data4(0) = &H83
.Data4(1) = &HC3
.Data4(2) = &H0
.Data4(3) = &HC0
.Data4(4) = &H4F
.Data4(5) = &HDD
.Data4(6) = &HB8
.Data4(7) = &H2E
End With

End Sub

Private Sub IFELanguage_Open()
Dim ret As Variant

DispCallFunc IFELanguage, 4, 4, vbLong, 0, 0, 0, ret
DispCallFunc IFELanguage, 12, 4, vbLong, 0, 0, 0, ret
End Sub

Private Sub IFELanguage_Close()
Dim ret As Variant

If IFELanguage = 0 Then Exit Sub
DispCallFunc IFELanguage, 8, 4, vbLong, 0, 0, 0, ret
DispCallFunc IFELanguage, 16, 4, vbLong, 0, 0, 0, ret
End Sub


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''' Subroutine: GetPinYin
'''
''' Purpose:    返回漢字的拼音
'''
''' Arguments:  HzStr - 待轉換的拼音
'''
'''
''' Date            Developer           Action
''' --------------------------------------------------------------------------
''' 02 April 2007   tt.t                更正ReDim Py時的錯誤
'''
Private Function IFELanguage_GetMorphResult(HzStr As String) As String
Dim ret As Variant
Dim pArgs(0 To 5) As Long
Dim vt(0 To 5) As Integer
Dim Args(0 To 5) As Long
Dim ResultPtr As Long
Dim TinyM As TinyMORRSLT
Dim py() As Byte
Dim i As Integer

IFELanguage_GetMorphResult = ""
If IFELanguage = 0 Then Exit Function

Args(0) = &H30000
Args(1) = &H40000100
Args(2) = Len(HzStr)
Args(3) = StrPtr(HzStr)
Args(4) = 0
Args(5) = VarPtr(ResultPtr)

For i = 0 To 5
vt(i) = vbLong
pArgs(i) = VarPtr(Args(i)) - 8
Next

DispCallFunc IFELanguage, 20, 4, vbLong, 6, vt(0), pArgs(0), ret

MoveMemory TinyM, ByVal ResultPtr, 4 * 3
If TinyM.cchOutput > 0 Then
ReDim py(0 To TinyM.cchOutput * 2 - 1)
MoveMemory py(0), ByVal TinyM.pwchOutput, TinyM.cchOutput * 2
IFELanguage_GetMorphResult = py
End If
CoTaskMemFree (ResultPtr)
End Function

Private Function GetInitial(py As String) As String
Dim Char1 As String
Dim Char2 As String

Char1 = Left(py, 1)
Char2 = Mid(py, 2, 1)

GetInitial = Char1
If Not pvOnlyOneChar Then
Select Case Char1
Case "z", "c", "s"
If Char2 = "h" Then GetInitial = GetInitial + Char2
End Select
End If

End Function


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''' Subroutine: GetPinYin
'''
''' Purpose:    返回漢字的拼音
'''
''' Arguments:  HzStr - 待轉換的拼音
'''
'''
''' Date            Developer           Action
''' --------------------------------------------------------------------------
''' 02 April 2007   tt.t                Create
'''
Public Function GetPinYin(HzStr As String) As String
Dim i As Integer
Dim tmpStr As String

GetPinYin = ""
If HzStr <> "" Then
If pvUseSeperator Or pvInitialOnly Then
For i = 1 To Len(HzStr)
tmpStr = IFELanguage_GetMorphResult(Mid(HzStr, i, 1))
If tmpStr <> "" Then
If pvInitialOnly Then
GetPinYin = GetPinYin & GetInitial(tmpStr) & pvSeperator
Else
GetPinYin = GetPinYin & tmpStr & pvSeperator
End If
End If
Next
If Len(GetPinYin) > 0 Then GetPinYin = Left(GetPinYin, Len(GetPinYin) - 1)
Else
GetPinYin = IFELanguage_GetMorphResult(HzStr)
End If
End If
End Function

Public Function AdjustPhoneticNotation(Hz As String, pn As PhoneticNotation) As String
Dim i As Integer

AdjustPhoneticNotation = Hz
'未進行優化
Select Case pn
Case pnNoNotation
For i = LBound(dNotation) To UBound(dNotation)
AdjustPhoneticNotation = Replace(AdjustPhoneticNotation, sNotation1(i), dNotation(i))
Next
For i = LBound(dNotation) To UBound(dNotation)
AdjustPhoneticNotation = Replace(AdjustPhoneticNotation, sNotation2(i), dNotation(i))
Next
End Select
End Function

Private Sub Class_Initialize()
IFELanguage = 0
InitalArray
InitialOnly = False
GenGUID
If CoCreateInstance(MSIME_GUID, 0, 1, _
IFELanguage_GUID, IFELanguage) = 0 Then
IFELanguage_Open
pvUseSeperator = False
pvSeperator = " "
Else
Err.Raise "OLE error!!"
End If
End Sub

Private Sub Class_Terminate()
If IFELanguage <> 0 Then IFELanguage_Close
End Sub

Property Get Seperator() As String
Seperator = pvSeperator
End Property

Property Let Seperator(Value As String)
pvSeperator = Value
End Property

Property Get UseSeperator() As Boolean
UseSeperator = pvUseSeperator
End Property

Property Let UseSeperator(Value As Boolean)
pvUseSeperator = Value
End Property

Property Get InitialOnly() As Boolean
UseSeperator = pvInitialOnly
End Property

Property Let InitialOnly(Value As Boolean)
pvInitialOnly = Value
End Property

Property Get OnlyOneChar() As Boolean
UseSeperator = pvOnlyOneChar
End Property

Property Let OnlyOneChar(Value As Boolean)
pvOnlyOneChar = Value
End Property

#17


Public Function HzToPy(Hz As String, Optional Sep As String = "", Optional ShowNotation As Boolean = True, Optional ShowInitialOnly As Boolean, Optional ShowOnlyOneChar As Boolean = True) As String
    Dim hp As HZ2PY

    Set hp = New HZ2PY          '創建類
    If Sep <> "" Then
        hp.Seperator = Sep
        hp.UseSeperator = True
    End If
    hp.InitialOnly = ShowInitialOnly
    hp.OnlyOneChar = ShowOnlyOneChar
    HzToPy = hp.GetPinYin(Hz)
    If Not ShowNotation Then HzToPy = hp.AdjustPhoneticNotation(HzToPy, pnNoNotation)
    Set hp = Nothing            '釋放類

End Function

#18


漢字拼音對照表 拼音漢字對照表 支持GBK同音字
http://download.csdn.net/detail/zhao4zhong1/1675950

#19


引用 18 樓 zhao4zhong1 的回復:
漢字拼音對照表 拼音漢字對照表 支持GBK同音字
http://download.csdn.net/detail/zhao4zhong1/1675950

謝了

#20


引用 14 樓 super_admi 的回復:
對於你的回復,我表示很無語,因為你居然是來求答案,而不是來求思想的。我用的測試環境是VS 2012。
引用 8 樓 u010067960 的回復:我測試你的代碼是不過的,你的環境是vs2010還是?   如果用c++標准庫的功能可以解決不?
 
我的代碼能改改么? ……

但是算法的優化和代碼的實現本身不就是兩個概念么?  這個問題本身算法很簡單,但是就是牽扯到很多問題,比如說在人機交互的時候,輸入流是如何保存字符串的? 比如說,應該如何設計數據結構,是用string還是wstring  ,比如說,讀入的是Unicode編碼還是 GB碼 ? 讀入的方式和平台有關么? 存儲的結構又和機器有關么?  這些不都是問題么? 不僅僅是算法那么簡單吧……

#21


引用 15 樓 zhoujielunzhimi 的回復:
在鐵路售票軟件中,輸入: “bj”就可以定位到“北京”。

其實這種很簡單,無非就是在數據庫保存 bj-北京 beijing-北京 ,在你輸入字母時檢索罷了,所以沒什么難度。 但是如果你切換到中文輸入法,比如正在輸入bj,他就無法提示。

這道題目的要求沒那么大,也不需要做什么數據庫的檢索,只是做一個小小的程序,然后可以返回讀入的漢字的首字母就OK了。

#22


char fun(wchar_t temp)
{
    if(temp < B) return 'A';
    if(temp < C) return 'B';
    if(temp < D) return 'C';
    if(temp < F) return 'D';
    if(temp < G) return 'F';
    if(temp < H) return 'G';
    if(temp < J) return 'H';
    if(temp < K) return 'J';
    if(temp < L) return 'K';
    if(temp < M) return 'L';
    if(temp < N) return 'M';
    if(temp < O) return 'N';
    if(temp < P) return 'O';
    if(temp < Q) return 'P';
    if(temp < R) return 'Q';
    if(temp < S) return 'R';
    if(temp < T) return 'S';
    if(temp < W) return 'T';
    if(temp < X) return 'W';
    if(temp < Y) return 'X';
    if(temp < Z) return 'Y';
    return 'Z';
}
 
int main()
{
    int n;
    cin >> n;
    wstring s;
    while(n--) {
wcin >> s;
int len = s.size();
for(int i = 0; i < len; i += 2) {
wchar_t c = s[i] * 256 + s[i+1];
cout << fun(c);
}
}
    return 0;
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com