使用字符數組保存字符串,進行操作。
/************************************************************************/
/* 刷題:字符串相關題目 */
/************************************************************************/
/* 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;
}