题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。
处理方法是首先将整个句子翻转,然后再将其中的每个单词翻转。
代码如下:
- #include <iostream>
- using namespace std;
- void myReverse(char*, char*);
- char * senReverse(char*);
- int main()
- {
- char sen[]="hello, I am a student!";
- char *result=senReverse(sen);
- cout << result << endl;
- return 0;
- }
- void myReverse(char *start, char *end)
- {
- char temp;
- while(start<end)
- {
- temp=*start;
- *start=*end;
- *end=temp;
- start++;
- end--;
- }
- }
- char * senReverse(char *sen)
- {
- char *start=sen, *end=sen+strlen(sen)-1;
- myReverse(start, end); //先反转整个句子
- /*此注释部分是另外一种实现,只不过看起来有些繁琐
- int loc; //记录每个单词的长度
- for(start=sen,end=start;(*end)!='\0';start+=loc)
- {
- loc=0;
- while((*end)!=' '&&(*end)!='\0'){end++, loc++;}
- end--;
- myReverse(start, end);
- end+=2;
- loc++;
- }
- */
- end=start;
- while(*start!='\0')
- {
- if(*end==' '||*end=='\0')
- {
- myReverse(start, --end);
- if(*end=='\0')
- break;
- end+=2;
- start=end;
- }
- else
- ++end;
- }
- return sen;
- }
#include <stdio.h>
#include<string.h>
char
*str=
"汉字里有english也能正确显hehe"
;
int
main() {
int
i =
strlen
(str) - 1;
while
(i>=0) {
str[i] < 0?
printf
(
"%c%c%c\n"
, str[i-2], str[i-1],str[i]):
printf
(
"%c\n"
, str[i]);
i--;
}
return
0;
}
#include <stdio.h>
#include<string.h>
char
*str=
"汉字里有english也能正确显hehe"
;
int
main() {
int
i =
strlen
(str) - 1;
while
(i>=0) {
if
(str[i] < 0)
{
printf
(
"%c%c%c\n"
, str[i-2], str[i-1],str[i]);
i = i-2;
}
else
{
printf
(
"%c\n"
, str[i]);
}
i--;
}
return
0;
}
汉字占两个字节,数字和英文字母占一个字节,要输出的话首先判断是英文数字还是汉字,
ANSI:汉字区的内码范围高字节从B0-F7,低字节从A1-FE
Unicode:汉字的Unicode编码范围为\u4E00-\u9FA5 \uF900-\uFA2D
可知我们只要判断高位字节的最高位是否为一就可以
- string s = "一二257【漂亮【jkljl";
- for(int i=0;i<s.length();i++){
- if( s.at(i) & 0x80 ){//s.at(i) < 0
- //中文
- string word;
- word+=s.at(i);
- word+=s.at(i+1);
- cout<< word<<endl;
- i++;
- }else{
- cout<< s.at(i)<<endl;
- }
- }
c++截取汉字和英文混合字符串
在C++里截取字符串可以使用string.substr(),可是这个函数只能按英文来截取,
如果是汉字可能就要计算好字符个数,如果是汉字和英文混合,那就只能望洋兴叹了。
可是恰好我需要这样一个函数,于是就自己实现了一个,其中如何判断汉字和英文
参看了此处。
代码简单也无优化,若有更好的方法欢迎提出,代码如下。
#include <iostream> #include <string> #include<cstdio> #include<vector> #include<typeinfo> using namespace std; int is_zh_ch(char p) { /*汉字的两个字节的最高为都为1,这里采用判断最高位的方法 将p字节进行移位运算,右移8位,这样,如果移位后是0, 则说明原来的字节最高位为0,不是1那么也就不是汉字的一个字节 */ if(~(p >> 8) == 0) { return 1;//代表不是汉字 } return -1; } string sub(string str,int start,int end=-1) { if(typeid(str)==typeid(string) && str.length()>0) { int len=str.length(); string tmp=""; //先把str里的汉字和英文分开 vector <string> dump; int i=0; while(i<len) { if (is_zh_ch(str.at(i))==1) { dump.push_back(str.substr(i,2)); i=i+2; } else { dump.push_back(str.substr(i,1)); i=i+1; } } end=end>0?end:dump.size(); //end默认为dump.size if(start<0||start>end) printf("start is wrong");
//直接从dump里取即可 for(i=start; i<=end; i++) { tmp+=dump[i-1]; } return tmp; } else { printf("str is not string\n"); return ""; } } int main() { string p="半山wuji"; cout<<sub(p,1,1)<<endl; cout<<sub(p,2,2)<<endl; cout<<sub(p,3); }
输出如下:
半
山
wuji
符合我的要求。
#include "stdafx.h"
#include <stdio.h>
#include<string.h>
char *str="汉字里有english也能正确显hehe";
int _tmain(int argc, _TCHAR* argv[])
{
char s[256],ss[256]; int i,k;
scanf("%s",s); k=strlen(s);
for ( i=0;i<k;i+=2 ) { ss[k-i-2]=s[i]; ss[k-i-1]=s[i+1]; } //循环变量+=2,每次处理1个汉字、2个字符
ss[k]=0; //字符串结尾需要赋值
printf("%s\n",ss);
}
![](http://static.blog.csdn.net/images/category_icon.jpg)
版权声明:本文为博主原创文章,未经博主允许不得转载。
之前搞过这个中英文与UNICODE十六进制字符串的互转,但是发现有点小问题。现在重新搞了一个,测试中暂时没有发现什么问题。先记录下来。
我尝试使用过MultiByteToWideChar和WideCharToMultiByte来实现这个功能,但是发现不行。也就是无法实现如:
中文English --> 4e2d65870045006e0067006c006900730068
和
4e2d65870045006e0067006c006900730068 --> 中文English
这么一个转换,上述的都是字符串。
好看下面的源码:YCodec是自己写的一个类
YCodec.h文件源码:
- #include <iostream>
- using namespace std;
- class YCodec
- {
- public:
- YCodec();
- ~YCodec();
- // char to hex code
- int Char2Hex(char ch);
- // hex to char
- char Hex2Char(unsigned int n);
- // num^<span style="background-color: rgb(255, 255, 255); ">index</span>
- long MIndex(int num, int index);
- // string to hex code
- long String2Hex(char* string, int strlen);
- // hex to char*
- int Hex2String(long hex, char* string, int* slen);
- // hex to wchar_t code
- wchar_t Hex2Wchart(long hex);
- // UNICODE十六进制字符串转成中英文
- // hex string to wchar_t*
- int HexStr2WChars(char* hexstr, int hexstrlen, int eachchar, wchar_t* wchs, int* wchslen);
- // wchar_t to hex code
- long Wchart2Hex(wchar_t wch);
- // 中英文转成UNICODE十六进制字符串
- // wchar_t* to char*(hex string)
- int Wchart2HexStr(wchar_t* wchs, int wchslen, int eachchar, char* hexstr, int* hexstrlen);
- };
YCodec.cpp文件源码:
- #include "StdAfx.h"
- #include "YCodec.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- YCodec::YCodec()
- {
- }
- YCodec::~YCodec()
- {
- }
- // char to hex code
- // error: return -1
- int YCodec::Char2Hex(char ch)
- {
- int n = -1;
- switch(ch)
- {
- case '0': n = 0; break;
- case '1': n = 1; break;
- case '2': n = 2; break;
- case '3': n = 3; break;
- case '4': n = 4; break;
- case '5': n = 5; break;
- case '6': n = 6; break;
- case '7': n = 7; break;
- case '8': n = 8; break;
- case '9': n = 9; break;
- case 'A':
- case 'a': n = 10; break;
- case 'B':
- case 'b': n = 11; break;
- case 'C':
- case 'c': n = 12; break;
- case 'D':
- case 'd': n = 13; break;
- case 'E':
- case 'e': n = 14; break;
- case 'F':
- case 'f': n = 15; break;
- default: break;
- }
- return n;
- }
- // hex to char
- // error: return -1
- char YCodec::Hex2Char(unsigned int n)
- {
- char ch;
- if(n>=0 && n<=9) ch = 48 + n;
- else if(n>=10 && n<=15) ch = 65 - 10 + n;
- else ch = -1;
- return ch;
- }
- // num^<span style="background-color: rgb(255, 255, 255); ">index</span>
- long YCodec::MIndex(int num, int index)
- {
- long s = 1;
- int i=0;
- while(i<index)
- {
- s *= num;
- i++;
- }
- return s;
- }
- // string to hex code
- // error: return -1
- long YCodec::String2Hex(char* string, int strlen)
- {
- long hex=-1;
- int i=0, n=0;
- char *p = string;
- p += strlen - 1;
- if(string == NULL) return hex;
- if(strlen <= 0 || strlen > 10) return hex;
- hex = 0;
- do
- {
- n = Char2Hex(*p--);
- hex += n*MIndex(16, i++);
- }while(i<strlen);
- return hex;
- }
- // hex to char*
- // string==NULL,slen = the size of string(slen as output)
- // string!=NULL,input the length of string
- // error: return -1
- int YCodec::Hex2String(long hex, char* string, int* slen)
- {
- char tmp[11] = {0};
- if(hex < 0) return -1;
- if(string == NULL){// count the length it will be used
- sprintf(tmp, "%x", hex);
- *slen = strlen(tmp);
- return 1;
- }
- memset(string, 0, *slen);
- sprintf(string, "%x", hex);
- return 1;
- }
- // hex to wchar_t code
- // eg: input 0x5e74, return 年
- // error: return -1
- wchar_t YCodec::Hex2Wchart(long hex)
- {
- wchar_t wch = -1;
- if(hex <0) return wch;
- wch = (wchar_t)hex;
- return wch;
- }
- // hex string to wchar_t*
- // UNICODE十六进制字符串转成中英文
- // hexstr每eachchar转换为一个wchar_t
- // wchs == NULL, wchsLen as output(the size of wchs will be used)
- // error: return -1
- int YCodec::HexStr2WChars(char *hexstr, int hexstrlen, int eachchar, wchar_t *wchs, int *wchsLen)
- {
- if(hexstr == NULL || hexstrlen <= 0 || eachchar <= 0) return -1;
- if(wchs == NULL){// count the size wchs it will be used
- *wchsLen = hexstrlen/eachchar + (hexstrlen%eachchar>0 ? 1 : 0);
- return 1;
- }
- memset(wchs, 0, *wchsLen * sizeof(wchar_t));
- char* tmp = new char[eachchar+1];
- char* p = hexstr;
- wchar_t* pwch = wchs;
- for(int i=0; i<hexstrlen; i+=eachchar){
- memset(tmp, 0, eachchar+1);
- // get eachchar char
- for(int j=0; j<eachchar; j++){
- if(i+j > hexstrlen) break;
- tmp[j] = *p++;
- }
- // char* to hex
- long hex = String2Hex(tmp, strlen(tmp));
- if(hex == -1) continue;
- // hex to wchar_t
- *pwch++ = Hex2Wchart(hex);
- }
- if(tmp) delete []tmp;
- return 1;
- }
- // wchar_t to hex code
- long YCodec::Wchart2Hex(wchar_t wch)
- {
- return (long)wch;
- }
- // wchar_t* to char*(hex string)
- // 中英文转成UNICODE十六进制字符串
- // eachchar用于控制每个wchar_t转换成多少个char字符
- // hexstr == NULL,hexstrlen as output(the size of hexstr will be used)
- // error: return -1
- int YCodec::Wchart2HexStr(wchar_t *wchs, int wchslen, int eachchar, char* hexstr, int* hexstrlen)
- {
- if(wchs == NULL || wchslen <= 0 || eachchar <= 0) return -1;
- if(hexstr == NULL){// count the size of hexstr will be used
- *hexstrlen = wchslen*eachchar;
- return 1;
- }
- memset(hexstr, 0, *hexstrlen);
- char* p = hexstr;
- wchar_t* pwch = wchs;
- char* tmp = new char[eachchar+1];
- for(int i=0; i<wchslen; i++){
- // wchar_t to hex
- long hex = Wchart2Hex(*pwch++);
- // hex to char*
- int charlen = 0;
- if(Hex2String(hex, NULL, &charlen) != -1){
- char* str = new char[charlen+1];
- memset(str, 0, charlen+1);
- int n = Hex2String(hex, str, &charlen);
- if(n != -1){
- int k=0;
- memset(tmp, 0, eachchar+1);
- for(k=0; k<eachchar-charlen; k++) tmp[k] = '0';
- tmp = strcat(tmp, str);
- p = strcat(p, tmp);
- }
- if(str) delete []str;
- }
- if(i > *hexstrlen) break;
- }
- if(tmp) delete []tmp;
- return 1;
- }
中英文转unicode十六进制字符串实例:
- CString input;
- m_Input.GetWindowTextW(input);
- CString tmp;
- YCodec yCodec;
- // CString to wchar_t*
- int len = input.GetLength();
- wchar_t* wchs = new wchar_t[len+1];
- memset(wchs, 0, sizeof(wchar_t)*(len+1));
- wcscpy(wchs, input.GetBuffer(len) );
- // wchar_t* to hex string
- int hexlen = 0;
- if(yCodec.Wchart2HexStr(wchs, len, 4, NULL, &hexlen) != -1){
- char* hexstr = new char[hexlen+1];
- memset(hexstr, 0, hexlen+1);
- int n = yCodec.Wchart2HexStr(wchs, len, 4, hexstr, &hexlen);
- if(n != -1){
- // char* to CString
- char* p = hexstr;
- for(int i=0; i<hexlen; i++) tmp.AppendChar(*p++);
- }
- if(hexstr) delete []hexstr;
- }
- if(wchs) delete []wchs;
- m_Disp.SetWindowTextW(tmp);
该功能时在MFC程序中测试的。可以做到如下效果:
输入字符串“中文English“ 转换后输出 ”4e2d65870045006e0067006c006900730068“字符串,每个中文或英文转成4个char类型数据。
unicode十六进制字符串转中英文实例:
- <span style="white-space:pre"> </span>CString input;
- m_Input.GetWindowTextW(input);
- CString tmp;
- YCodec yCodec;
- // CString to char*
- int strlen = input.GetLength();
- char* str = new char[strlen+1];
- memset(str, 0, strlen+1);
- for(int i=0; i<strlen; i++) str[i] = input.GetAt(i);
- // hex string to wchar_t*
- int wchslen = 0;
- if(yCodec.HexStr2WChars(str, strlen, 4, NULL, &wchslen) != -1){
- wchar_t* wchs = new wchar_t[wchslen+1];
- memset(wchs, 0, sizeof(wchar_t)*(wchslen+1));
- int n = yCodec.HexStr2WChars(str, strlen, 4, wchs, &wchslen);
- if(n != -1){
- // wchar_t to CString
- wchar_t* pwch = wchs;
- for(int i=0; i<wchslen; i++) tmp.AppendChar(*pwch++);
- }
- if(wchs) delete []wchs;
- }
- m_Disp.SetWindowTextW(tmp);
输入字符串 ”4e2d65870045006e0067006c006900730068“转换后输出“中文English“ 字符串,每4个char类型数据转成1个中文或英文。
上述代码经测试可行,暂时没发现什么问题。
测试程序及源码:(不用分下载)
http://download.csdn.net/detail/brantyou/4241745
int ReplaceStr(char* sSrc, char* sMatchStr, char* sReplaceStr)
{
int StringLen;
char caNewString[64];
char* FindPos;
FindPos =(char *)strstr(sSrc, sMatchStr);
if( (!FindPos) || (!sMatchStr) )
return -1;
while( FindPos )
{
memset(caNewString, 0, sizeof(caNewString));
StringLen = FindPos - sSrc;
strncpy(caNewString, sSrc, StringLen);
strcat(caNewString, sReplaceStr);
strcat(caNewString, FindPos + strlen(sMatchStr));
strcpy(sSrc, caNewString);
FindPos =(char *)strstr(sSrc, sMatchStr);
}
free(FindPos);
return 0;
}
譬如:ReplaceStr("abcd-efgh-ijklm-nopq","-","");//把字符串中的“-”删除掉!
版权声明:本文为博主原创文章,未经博主允许不得转载。
【C风格字符串反转】
自定义函数:
C语言中所谓的字符串不过是字符数组,后跟一个0x00字符标识结尾,所以反转起来很容易,只要一个循环依次将第一个字符和最后一个字符交换,第二个字符和倒数第二个字符交换……如果最中间有两个字符(即需要反转的字符串长度为偶数),那就交换,如果最中间有一个字符(即需要反转的字符串长度为奇数),那就不需要碰它。还有就是最后一个用来标识字符串结尾的0x00字符不用动它。
注意四点:一是对指针和字符串的理解,二是是否进行合法性检查,例如输入参数为空指针时是否进行检查,三是返回值是否是恰当,即使你通过参数返回了反转后的字符串指针,也建议在返回值里再返回一下,就像strcpy函数实现的那样。其实还有第四点往往是大家都忽略了的,那就是Unicode问题,如果传入的字符串指针指向的是Unicode字符串,那么反转的时候就不能一个字符一个字符的处理了。
- char *revstr(char *str, size_t len)
- {
- char *start = str;
- char *end = str + len - 1;
- char ch;
- if (str != NULL)
- {
- while (start < end)
- {
- ch = *start;
- *start++ = *end;
- *end-- = ch;
- }
- }
- return str;
- }
【C++ string字符串反转】
当然string字符串的反转也可以使用上面的方法来实现,此外还可以使用STL<algorithm>文件里的reverse()函数来实现。
- #include <iostream>
- #include <algorithm>
- #include<cstdlib>
- #include<cstring>
- using namespace std;
- int main()
- {
- string ss = "123456";
- reverse(ss.begin(),ss.end());
- cout<<ss<<endl;
- return 0;
- }