2014-09-02 99 views
0

我需要開發一個小函數來查找wchar_t序列中的字符。該函數將指針wchar_t *作爲輸入輸入到一個字符串中,但由於它是unicode,因此每個單個字符的值顯示爲一個數字。查找並替換wchar_t發生的事

有沒有一個優雅的方式來做到這一點,而不需要解析字符串中的每一個字母並比較unicode編號?當我嘗試將指針傳遞給函數時,這個函數只取第一個字符,爲什麼?

+0

的 「C++的方式」 來做到這一點很可能是構建一個'性病:: wstring'實例來自'wchar_t *'並且使用'find()'wstring方法,如果我正確理解你的話。澄清你的問題,也許通過發佈一些代碼,會有所幫助。 – cdhowie 2014-09-02 22:58:00

+0

聽起來好像你正試圖將一個寬字符串傳遞給一個需要窄字符串的函數。展示你想要做什麼的例子會讓事情變得更加清晰。 – 2014-09-02 22:58:05

+0

我完全不理解,爲什麼發現一個事件的函數顯示什麼? 「分析」與什麼有什麼關係?你如何傳遞指針,以及什麼功能? – 2014-09-02 23:51:54

回答

0

std::wstringstd::wstream應該做的工作,只要locale是否設置正確:

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

static void searchAndReport(const wstring &line) { 
    wstring::size_type pos = line.find(L"な"); // hiragana "na" 
    if (wstring::npos == pos) { 
     wcout << L"見つかりません" << endl; // not found 
     return; 
    } 
    for (bool first = true; wstring::npos != pos; pos = line.find(L"な", pos + 1)) { 
     if (first) 
      first = false; 
     else 
      wcout << L", " ; 
     wcout << L"第" << pos << L"桁" ; // the pos-th column 
    } 
    wcout << endl; 
} 

static void readLoop(wistream &is) { 
    wstring line; 

    for (int cnt = 0; getline(is, line); ++cnt) { 
     wcout << L"第" << cnt << L"行目: " ; // the cnt-th line: 
     searchAndReport(line); 
    } 
} 

int main(int argc, char *argv[]) { 
// locale::global(std::locale("ja_JP.UTF-8")); 
    locale::global(std::locale("")); 

    if (1 < argc) { 
     wcout << L"入力ファイル: [" << argv[1] << "]" << endl; // input file 
     wifstream ifs(argv[1]); 
     readLoop(ifs); 
    } else { 
     wcout << L"標準入力を使用します" << endl; // using the standard input 
     readLoop(wcin); 
    } 
} 

成績單:

$ cat scenery-by-bocho-yamamura.txt 
いちめんのなのはな 
いちめんのなのはな 
いちめんのなのはな 
いちめんのなのはな 
いちめんのなのはな 
いちめんのなのはな 
いちめんのなのはな 
かすかなるむぎぶえ 
いちめんのなのはな 
$ ./wchar_find scenery-by-bocho-yamamura.txt 
入力ファイル: [scenery-by-bocho-yamamura.txt] 
第0行目: 第5桁, 第8桁 
第1行目: 第5桁, 第8桁 
第2行目: 第5桁, 第8桁 
第3行目: 第5桁, 第8桁 
第4行目: 第5桁, 第8桁 
第5行目: 第5桁, 第8桁 
第6行目: 第5桁, 第8桁 
第7行目: 第3桁 
第8行目: 第5桁, 第8桁 

所有文件都是UTF-8。

要小心,不要混用coutwcout

環境:

$ lsb_release -a 
LSB Version: core-2.0-amd64: [...snip...] 
Distributor ID: Ubuntu 
Description: Ubuntu 12.04.5 LTS 
Release:  12.04 
Codename:  precise 
$ env | grep -i ja 
LANGUAGE=ja:en 
GDM_LANG=ja 
LANG=ja_JP.UTF-8 
$ g++ --version 
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 
Copyright (C) 2011 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.