| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4099 人关注过本帖
标题:C++中汉字字符串的操作问题,请大神讲解一下
只看楼主 加入收藏
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
回复 10楼 wmf2014
感谢w版
2016-01-14 11:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
那个方法是错的,想想我为什么刻意把测试文本弄成中英混杂吧。

授人以渔,不授人以鱼。
2016-01-14 17:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
單獨針對全英文或全漢字的文本進行搜索替換,都很簡單,但對中英文混雜的文本,就沒那麽簡單了,因爲此時你要識別每一個字符到底是不是漢字的首字符。不動手實操,永遠都不知道現實會遇到什麽情形,而自以爲自己的程序可以滿足要求。

授人以渔,不授人以鱼。
2016-01-14 22:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
C++11標準、《C++ Primer》第五版,都強調C++編程不應再使用C風格字符串,後者的教學內容編排甚至一開始就教string類型字符串,目的就是不希望新培训的C++程序员还存留充满缺陷的C风格习惯。既然是明確要寫C++程序,最好不要再糾纏這種技能,又不是被迫要用C++寫C程序。

[此贴子已经被作者于2016-1-14 22:27编辑过]


授人以渔,不授人以鱼。
2016-01-14 22:24
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 13楼 TonyDeng
请教Tony版:就我那代码,应该在什么情况下可以发现中英混杂的bug?
我一直认为只有中英混排,那种移动光标编辑的需要识别所在字符是否为汉字首字节,而搜索替换应该不会搜进汉字的后半截吧,我目前使用了各种中英混杂的replace,还没测试出bug(数组不溢出)
当然,在c++下,应当使用string类,对中英混排还应该像Tony版主那样使用wstring,这样既不用考虑数组溢出的问题,也不用考虑半个汉字问题。

[此贴子已经被作者于2016-1-14 23:43编辑过]


能编个毛线衣吗?
2016-01-14 23:41
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
回复 14楼 TonyDeng
嗯嗯,string类对象确定很有优势,C++ PP第六版前七章基本用的还都是C风格字符串,只到第16章才正式介绍string,有些不合理
2016-01-15 10:29
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
以下是引用TonyDeng在2016-1-13 23:15:10的发言:


程序代码:
#include <cstdio>
#include <string>
#include <clocale>

int wmain()
{
    _wsetlocale(LC_ALL, L"chs");

    std::wstring str(L"wengbin是个大笨蛋?Tony是个聪明人?");
    const std::wstring s1(L"是个");//T版,我现在只看到一个问题,那就是让s1为空(什么也没有),const std::wstring s1(L"");
//这样时,就不能继续下去了,应该要返回原字符串才对,其他还有什么问题嘛?我找不到了呀
    const std::wstring s2(L"是不是");

    std::wstring::size_type pos = 0;
    while ((pos = str.find(s1, pos)) != str.npos)
    {
        str.replace(pos, s1.size(), s2);
    }
    wprintf_s(L"字符串: %s\n", str.c_str());

    getwchar();
    return EXIT_SUCCESS;
}
2016-01-15 10:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 14楼 wmf2014
不考虑字符计数是可以的

授人以渔,不授人以鱼。
2016-01-15 15:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 16楼 wengbin
那个是需要被搜索替换的串,不能为空。

授人以渔,不授人以鱼。
2016-01-15 15:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
用C風格字符串,搜索替換操作在原串進行,則總會遇到邊界問題需要對字符計數,而且要防止漢字在末尾被裁剪成半個造成亂碼。使用ANSI編碼,也會遇到在漢字的中間插入問題,同樣會造成亂碼。

其實,在C中,要搜索和替換字符串,最直接的辦法是依次接駁,把搜到被替換文字之前的文本复製到新串中,捨棄被替換串,在新串中追尾替換文本,再把原串剩餘的文本追尾過去,這用不著什麽高深的算法,也不會破壞原串——有些東西被篡改過是找不回來的,但偏偏又經常遇到要翻查原串的時候。

C++的string類,是一個引用,事實上在多次編輯字符串動作之後,這個串的內存入口地址是可能會變化的(它使用了realloc()函數重新分配空間,故對大內存字符串進行大量編輯尤其是涉及長度擴張的動作,有時會出現呆滯現象,因此它有一個遞進的緩衝區,真實佔用內存不是表面上那個尺度的)。由於字符串的內存空間會改變,所以在C++中經常勸誡程序員少用指針,也是這個緣故。對象的地址變了,指針的値也變,但是指向對象的指針卻可能不止一個,於是你得把所有這些指向同一個對象的指針都同步起來(那工作量嚇死你),引用卻不會,它不管對象地址變到哪了,都是直接這個對象的真身,而指針就像孫悟空的毫毛化身。用C寫多了程序,自然會遇到這些問題,才會感受到C++這種改變的精粹是什麽,所有新型語言,都力戒用指針,道理也在這裏。在這裏提到指針和引用,與樓主新帖提及引用的理解有關,把引用理解爲指針模型,那就是偏差。

[此贴子已经被作者于2016-1-15 22:38编辑过]


授人以渔,不授人以鱼。
2016-01-15 22:34
快速回复:C++中汉字字符串的操作问题,请大神讲解一下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039442 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved