标题:C++中汉字字符串的操作问题,请大神讲解一下
只看楼主
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
结帖率:100%
已结贴  问题点数:20 回复次数:19 
C++中汉字字符串的操作问题,请大神讲解一下
程序代码:
#include<iostream>
int replace_(char* str,char c1,char c2);////功能:将C风格的str字符串的中c1字符全换成c2字符,并返回替换次数
///字符串为英文时是没问题,中文就有问题了,请问是编译软件不识别中文的问题还是说汉字在字符串中的存储机制导致的呢?
int main()
{
    using namespace std;
    char str[]="李明是个大笨蛋.";
    cout<<"the str[] is: "<<str<<endl;
    cout<<"it's had been changed "<<replace_(str,'','')
    <<" times and after replace function, the str[] is:\n"
    <<str<<endl;
}
int replace_(char* str,char c1,char c2)
{
    int count_=0;
    while(*str!='\0')
    {
        if(*str==c1)
        {
            *str=c2;
            count_++;
        }
        str++;
    }
    return count_;
}



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

搜索更多相关主题的帖子: 字符串 汉字 风格 
2016-01-13 15:35
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:2 
'李','张'
------ 它们不是char类型,而是int类型
2016-01-13 17:23
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
得分:0 
回复 2楼 rjsp
r版,那请问要实现汉字的替换应该怎么做呢?
2016-01-13 17:39
aiyulunhui
Rank: 2
等 级:论坛游民
帖 子:19
专家分:24
注 册:2015-9-9
得分:2 
一个汉字占两个字节,所以用一个字节的char类型无法存储中文
2016-01-13 18:20
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:2 
同意楼上,可能是两个汉字不应该用单引号括起来的问题
2016-01-13 18:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
C++標準庫有現成的函數

授人以渔,不授人以鱼。
2016-01-13 21:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:6 
程序代码:
#include <cstdio>
#include <string>
#include <clocale>

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

    std::wstring str(L"wengbin是个大笨蛋?Tony是个聪明人?");
    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-13 23:15
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
得分:0 
回复 7楼 TonyDeng
感觉要被T版玩坏了呀,CodeBlocks上编译出了错,我打算回去用vs2013编一下
2016-01-14 09:09
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:8 
虽然c++的string类有很强的功能,当然自己写也有自己写的乐趣。楼主需要把字符替换改成字符串替换,就中文英文都行的,修改后的代码及运行效果如下:
程序代码:
#include<iostream>
    using namespace std;

int replace_(char* str,char *c1,char *c2);////功能:将C风格的str字符串的中c1字符串全换成c2字符串,并返回替换字符数
int findc(char* str,char *c)
{
    int i,j;
    for(i=0,j=0;str[i];i++)
    {
        if(str[i]==c[0])
            for(j=0;c[j]&&str[i+j]==c[j];j++);;
        if(!c[j])return i;
    }
    return -1;
}
void main()
{
    char str[100]="李明是个大笨蛋.";
    cout<<"the str[] is: "<<str<<endl;
    cout<<"it's had been changed "<<replace_(str,"","白和杜甫")
    <<" times and after replace function, the str[] is:\n"
    <<str<<endl;
}
int replace_(char* str,char *c1,char *c2)
{
    int i,j,p1,l1,l2,l;
    if((p1=findc(str,c1))<0)return 0;  //没找到要替换的字符串位置直接返回
    for(l1=0;c1[l1];l1++);
    for(l2=0;c2[l2];l2++);
    for(l=0;str[l];l++);              //获取相关字符串长度
    j=l2-l1;
    if(j>0)for(i=l;i>p1;i--)str[i+j]=str[i];;      //如果替换字符串长于被替换字符串则原串部分后移
    if(j<0)for(i=p1+l1;i<=l;i++)str[i+j]=str[i];;  //如果替换字符串短于被替换字符串则原串部分前移
    for(i=0;c2[i];i++)str[p1+i]=c2[i];             //开始替换
    return l2;
}




能编个毛线衣吗?
2016-01-14 09:44
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
findc函数需要做调整,否则被替换字符串为空串时替换出错
程序代码:
#include<iostream>
    using namespace std;

int replace_(char* str,char *c1,char *c2);////功能:将C风格的str字符串的中c1字符串全换成c2字符串,并返回替换字符数
int findc(char* str,char *c)
{
    int i,j;
    for(i=0,j=0;str[i];i++)
    {
        if(str[i]==c[0])
        {
            for(j=0;c[j]&&str[i+j]==c[j];j++);
            if(!c[j])return i;
        }
    }
    return -1;
}
void main()
{
    char str[100]="李明是个大笨蛋.";
    cout<<"the str[] is: "<<str<<endl;
    cout<<"it's had been changed "<<replace_(str,"","白和杜甫")
    <<" times and after replace function, the str[] is:\n"
    <<str<<endl;
}
int replace_(char* str,char *c1,char *c2)
{
    int i,j,p1,l1,l2,l;
    if((p1=findc(str,c1))<0)return 0;  //没找到要替换的字符串位置直接返回
    for(l1=0;c1[l1];l1++);
    for(l2=0;c2[l2];l2++);
    for(l=0;str[l];l++);              //获取相关字符串长度
    j=l2-l1;
    if(j>0)for(i=l;i>p1;i--)str[i+j]=str[i];;      //如果替换字符串长于被替换字符串则原串部分后移
    if(j<0)for(i=p1+l1;i<=l;i++)str[i+j]=str[i];;  //如果替换字符串短于被替换字符串则原串部分前移
    for(i=0;c2[i];i++)str[p1+i]=c2[i];             //开始替换
    return l2;
}


能编个毛线衣吗?
2016-01-14 10:00



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-461067-1-1.html




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

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