使用字符数组保存字符串,进行操作。
/************************************************************************/
/* 刷题:字符串相关题目 */
/************************************************************************/
/* 1.统计一行字符中单词数目 */
int WordCount(string s)
{
int count=0;
int worldFlag=0;
char c;
for (int i=0;(c=s[i])!='\0';i++)
{
if (c==' ')
{
worldFlag=0;
}
else if (worldFlag ==0)
{
worldFlag=1;
count++;
}
}
printf("%d\n",count);
return count;
}
/************************************************************************/
/* 2.字符串逆序 */
/************************************************************************/
// /******* (1)直接分配一个与原字符串等长的字符数组,然后反向拷贝即可 *******/
char *Reverse(char * s) //main函数中实参用字符数组,所以这里用一个字符指针
{
char *q=s;
while(*q++)
; //这个空语句不做任何操作,只是让q指针找到最后一个元素
q-=2; //减2是因为while循环中q为空的时候,q又向后移动了1位
char *p= new char[sizeof(char) *(q-s+2)]; //字符个数计算,要考虑结束符
char *r=p;
//逆序存储
while(q>=s)
{
*p++=*q--;
}
*p='\0';
return r;
}
/**** (2)原地逆序,不分配新的存储空间 ****/
//① 设置两个指针
char *Reverse2(char *s)
{
char *p=s;//设置两个指针:指向头和尾
char *q=s;
while (*q++)
;
q-=2;
while(p<=q)
{
char temp;
temp=*p;
*p++=*q;
*q--=temp;
}
return s;
}
// ②递归法,从两边向中间,互相交换数据
char *Reverse3(char *s, int left, int right)
{
if (left>=right)
return s;
char temp=s[left];
s[left]=s[right];
s[right]=temp;
Reverse3(s,left+1,right-1);
}
//③非递归法。从两边向中间,交换数据
char *Reverse4(char *s, int left, int right)
{
if (left>=right)
return s;
while(left<=right)
{
char temp=s[left];
s[left++]=s[right];
s[right--]=temp;
}
return s;
}
/**** (3)原地逆序,不允许有临时变量 ****/
//①异或操作
//②使用字符串结束符‘\0’作为交换空间
/**** (4)按照单词逆序:先将每个单词反转,然后再将整个字符串反转 ****/
void ReverseSingleWord(char *p, char *q)
{
while(p<q)
{
char temp=*p;
*p++ =*q;
*q-- =temp;
}
}
char *WordReverse(char *s)
{
char *p= s;
char *q=s;
while(*q !='\0')
{
if (*q == ' ')
{
ReverseSingleWord(p,q-1);
q++; //指针后移,找下一个单词
p=q;
}
else
q++;
}
ReverseSingleWord(p,q-1);
ReverseSingleWord(s,q-1);
return s;
}
/************************************************************************/
/* 3. 找出一个字符串中第一个只出现一次的字符 */
/************************************************************************/
char GetFirstSingleChar(char s[])
{
if (s==NULL)
return 0;
const int size=256;
unsigned count[size]={0};
char buffer[size];
char* q=buffer;
for (const char *p=s; *p!=0; p++) //这里不用const也可以,为什么要用??
{
if ( ++count[(unsigned char)*p] ==1)
*q++ =*p;
}
for (const char *p=buffer; p<q; p++)
{
if (count[(unsigned char)*p]==1)
return *p;
}
return 0;
}
//判断是否为数字
void IsInt(char c)
{
if (c>='0' && c<='9')
{
cout<<"c是整数:"<<c<<endl;
}
else
cout<<"c不是整数"<<endl;
}