其中的大部分答案都是自己整理,难免有出错的地方请大家批评指正!!
1.计算一个字节中1的个数,例如00001001中1的个数为2
#include<iostream>
using namespace std;
int CalculateOne(char x)
{
int count=0;
while(x)
{
count++;
x=x&(x-1);
}
return count;
}
void main()
{
char number=9;
int n;//统计1的个数
n=CalculateOne(number);
cout<<n<<endl;
}
2.编写一个类,要求该类不能被继承,且只能实例化三次
#include<iostream>
using namespace std;
class FinalClass1
{
public :
static int count ;//实例化次数
static FinalClass1* GetInstance()
{
if(count<=0)
return NULL;
count--;
return new FinalClass1;
}
static void setCount(int n)
{
count = n;
}
static void DeleteInstance( FinalClass1* pInstance)
{
delete pInstance;
pInstance = 0;
}
private :
FinalClass1() {}
~FinalClass1() {}
};
int FinalClass1::count=0;
void main()
{
FinalClass1::setCount(3);
FinalClass1 *f1 = FinalClass1::GetInstance();
FinalClass1 *f2 = FinalClass1::GetInstance();
FinalClass1 *f3 = FinalClass1::GetInstance();
if (f3==NULL)
{
printf("f3 NULL\n");
}else{
printf("f3 Not NULL\n");
}
FinalClass1 *f4 = FinalClass1::GetInstance();
if (f4==NULL)
{
printf("f4 NULL\n");
}
FinalClass1 *f5 = FinalClass1::GetInstance();
if (f5==NULL)
{
printf("f5 NULL\n");
}
}
3.字符串的逆序
#include<iostream>
using namespace std;
void Reverse(char* s)
{
char* p = s ;
int i=0;
while(*p!='\0')
{p++ ;
i++;
}
p--;
while(i--)
cout<<*(p--);
}
void main()
{
char* src="abcdef";
Reverse(src);
}
4.字符串函数的实现
(1)strcpy的实现
#include<iostream>
using namespace std;
char*mystrcpy(char*dest,const char*src)
{
if((dest!=NULL)&&(src!=NULL))
{
char *ret=dest;
while((*dest++=*src++)!='\0');
return ret;
}
else
cout<<"输入错误"<<endl;
}
int main()
{
char* str1=(char*)malloc(10);
char* str2="abcd";
mystrcpy(str1,str2);
cout<<str1<<endl;
}
(2)strncpy的实现
#include<iostream>
using namespace std;
char* mystrncpy(char* dest,const char* src,size_t n)
{
char*rec=dest;
if((dest!=NULL)&&(src!=NULL))
{ while(n)
{
*dest++=*src++;
n--;
}
*dest='\0';
return rec;
}
else
cout<<"出现错误!"<<endl;
}
int main()
{
char* str1=(char*)malloc(10);
char* str2="abcdefg";
mystrncpy(str1,str2,2);
cout<<str1<<endl;
}
(3)strcat的实现
#include<iostream>
using namespace std;
char* mystrcat(char*dest,const char*src)
{
char *rec=dest;
while(*dest)
dest++;
while(*dest++=*src++);
return rec;
}
void main()
{
char *src1="ab";
char *src2="cdef";
mystrcat(src1,src2);
cout<<*src1<<endl;
}
(4)strcmp
#include<iostream>
using namespace std;
int mystrcmp(const char*dest,const char*src)
{
int len1=strlen(dest);
int len2=strlen(src);
while((*dest!='\0')&&(*src!='\0')&&(*dest==*src))
{
dest++;
src++;
}
return (*dest-*src);
}
void main()
{
char *src1="ab";
char *src2="a";
int n=mystrcmp(src1,src2);
cout<<n<<endl;
}
5.String类的实现(构造函数,析构函数,拷贝构造函数,赋值函数的实现等)
class String
{
public:
String(const char *str = NULL); //
通用构造函数
String(const String &another); //
拷贝构造函数
~ String(); //
析构函数
String & operater =(const String &rhs); //赋值函数
private:
char *m_data; //
用于保存字符串
};
构造函数的实现:
String::String(const char*str=NULL)
{
if(str==NULL)
{ m_data=new char[1];
m_data='\0';
}
else
{
m_data=new char[strlen(str)+1];
strcpy(m_data,str);
}
}
析构函数的实现:
String::~String()
{
delete []m_data;
}
拷贝构造函数的实现
String::String(const String &another)
{
m_data=new char[strlen(another.m_data)+1];
strcpy(m_data,another.m_data);
}
赋值函数的实现
String&String::operater =(const String &rhs)
{
if(this==&rths)//检查自赋值
return *this;
delete[] m_data;//删除原来的数据,新开一块内存
m_data=new char[strlen(rhs.m_data)+1]
strcpy(m_data,rths.m_data)
return *this;
6.括号匹配问题
#include<iostream>
using namespace std;
void main()
{
char a[50],b[50];
int i,j,flag;
flag=i=j=0;
gets(a);
for(i=0;a[i]!='\0';i++)
{
if(a[i]=='(')
b[j++]=1;
if(a[i]==')')
if(b[--j]!=1)
{
flag=1;
break;
}
if(a[i]=='[')
b[j++]=2;
if(a[i]==']')
if(b[--j]!=2)
{
flag=1;
break;
}
if(a[i]=='{')
b[j++]=3;
if(a[i]=='}')
if(b[--j]!=3)
{
flag=1;
break;
}
}
if(flag==0)
printf("\nYES\n");
if(flag==1)
printf("\nNO\n");
}
7.字符串倒置,单词顺序不变。例如:“i love you”倒置后“you love i”
#include<iostream>
using namespace std;
void strReverse(char *str)
{
int i = 0;
int j = 0;
int begin;
int end;
char temp;
//...............第一步:整体倒置......................//
j = strlen(str)-1;
while (j>i)
{
temp = str[i];
str[i] = str[j];
str[j] = temp;
i++;
j--;
}
printf("after reversing wholly string = %s\n",str);
//...............第二步:按单词部分倒置......................//
i = 0;
while (str[i]!='\0')
{
begin = i;
while((str[i]!='\0') && (str[i]!=' '))
{
i++;
}
end = i-1;
while (begin<end)
{
temp = str[begin];
str[begin] = str[end];
str[end] = temp;
begin++;
end--;
}
i++;
}
}
int main()
{
char str[] = "i love you";
printf("Original string = %s\n",str);
strReverse(str);
printf("reverse string = %s\n",str);
return 0;
}
8.去除字符串多余的空格 例如:" ab c de "转化为“ab c de”
#include<iostream>
using namespace std;
void RemoveExtraSpace(char* str)
{
bool flag=false;//表示还没有遇到空格
int newstr=0; //新字符串
if(str == NULL)
return ;
for(int i=0; str[i]; i++)
{
if(str[i] != ' ')
{
str[newstr++]=str[i];
flag=true;
}
else if(flag){//遇到空格,将第一个空格存放到结果字符串中
str[newstr++]=str[i];
flag=false;
}
else //前面遇到的是空格,现在也是空格,不处理。这也直接将字符串前面的空格字符去掉了。
continue;
}
//剔除字符结尾的空格,并加上结束符
if(newstr>0 && str[newstr-1]==' ')
str[newstr-1]='\0';
else//newstr总是指向最后一个字符的后面
str[newstr]='\0';
}
void main()
{
char s[]=" ab c de ";
RemoveExtraSpace(s);
cout<<s<<endl;
}