请完成以下题目。注意,请勿直接调用ANSI C 函数库中的函数实现。
a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请给出该题的至少一个不同解法。(第二、三种解法范围(0-127)
unsigned int TestOne1(char s)
{
unsigned int num = 0,val;
for(int i = 0; i < 8; i++)
{
val = s >> i;
val &= 0x01;
if(val)
{
num++;
}
}
return num;
}
unsigned int TestOne2(char s1)
{
unsigned int num = 0,val;
int chu = 99,yu;
int s = s1;
while(chu)
{
chu = s/2;
yu = s % 2;
if(yu != 0)
{
num++;
}
s = chu;
}
return num;
}
unsigned int TestOne3(char s)
{
unsigned int num = 0,val;
while(s)
{
if((s & 0x01) != 0)
{
num++;
}
s = s >> 1;
}
return num;
}
b)请编写一个 C 函数,该函数将给定的一个字符串转换成整数。
int str_int(char *str)
{
int num = 0;
while(*str != '\0')
{
int n = *str - 48;
num = num*10 + n;
str = str + 1;
}
return num;
}
c)请编写一个 C 函数,该函数将给定的一个整数转换成字符串。
void int_str(int num,char* pval)
{
char str[100];
int i,j;
int val0 = 0;
int val1 = 0;
val0 = num;
for(i = 0;i < 100;i++)
{
val1 = val0 % 10; // 取余
val0 = val0 / 10; // 取整
str[i] = val1 + 48; // 数字转字符
if(val0 < 10)
{
i++;
str[i] = val0 + 48;
break;
}
}
for(j = 0;j <= i;j++)
{
pval[j] = str[i-j];
}
pval[j] = '\0';
}
d)请编写一个 C 函数,该函数将一个字符串逆序。
char *Reverse1(char *str)
{
char *ptr1;
char *ptr = ptr1;
int i=0;
int len = strlen(str);
while(len--)
{
*ptr1 = str[len];
ptr1 = ptr1 + 1;
}
return ptr;
}
char *Reverse2(char *str)
{
char *ptr1;
char *ptr = ptr1;
int i=0;
while(str[i]!='\0')
{
i++;
}
while(i--)
{
*ptr1 = str[i];
ptr1 = ptr1 + 1;
}
return ptr;
}
e)请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
int Search(char *Startptr,int n,char ch)
{
for(int i=0;i<n;i++)
{
if(*(Startptr + i) == ch)
{
return i;
}
}
return -1;
}
f)请编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的。
int maxlen(char *str)
{
int max = 0;
int i = 1;
char ch1,ch2;
ch1 = str[0];
while(*str != '\0')
{
if(*str != ch1)
{
i = 1;
}
if(max < i)
{
max = i;
ch2 = *str;
}
ch1 = *str;
i++;
str += 1;
}
return max;
}