数组,指针练习题
1.大小端判断
bool IsBig()
{
int a = 0x12345678;
char *p = (char *)&a;
if(*p == 0x78)
{
return false;//小端
}
else
{
return true;//大端
}
}
bool IsBig()//方法二
{
int a = 0x12345678;
char *p = (char *)&a;
if(*p == 0x78)
{
return false;//小端
}
else
{
return true;//大端
}
}
小端转化为大端
unsigned int Fun(unsigned int n)//小端变大端
{
return ( ((n&0xff000000) >>24) | ((n&0x00ff0000) >>8)
| ((n&0x0000ff00) <<8) | ((n&0x000000ff) <<24) );
}
2.“abcdef” ===>“fedcba” []
void Reverse(char *pbegin,char *pend)
{
assert(pbegin != NULL && pend != NULL);
char tmp = 0;
while(pbegin < pend)
{
tmp = *pbegin;
*pbegin = *pend;
*pend = tmp;
pbegin++;
pend--;
}
}
3.“Here is Tulun”====>“Tulun is Here”
char * RevreSentence(char *str)//逆置句子
{
assert (str!=NULL);
char* pbegin=str;
char* pend=str;
while(*pend!='\0')
{
pend++;
}
pend--;//pend指向末尾字母
Reverse(pbegin, pend);//逆置整个句子
pbegin=str;
pend=str;
while (*pbegin!='\0')
{
if (*pbegin==' ')
{
pbegin++;
pend ++;
}
else if(*pend==' '||*pend=='\0')
{
Reverse(pbegin,--pend);
pbegin=++pend;//pb指向空格,pbegin++ ,pend++
}
else
{
pend++;
}
}
return str;
}
4.回文字符串的判断
//abcba 回文字符串123321 判断是否为
bool IsPalindrome(const char* str)
{
assert(str!=NULL);//DEBUG
if(str == NULL || strlen(str) <= 0)//release
{
return false;
}
const char* pbegin=str;
const char* pend=str+strlen(str)-1;
while(pend>pbegin)//没有相遇
{
if(*pbegin==*pend)
{
pend--;
pbegin++;
return true;
}
else
{
return false;
//printf("这不是一个回文串");不能写,不会执行return后的语句
}
}
return true;
}
5.二分查找,折半查找
int Binarserach(int *arr,int len,int key)
{
int low=0;
int high =len-1;
while(low<=high)
{
int mid=(low+high)>>1;//移位比除法快
if (arr[mid]==key)
{
return mid;
}
else if(arr[mid]>key)
{
high=mid-1;
}
else
{
low=mid+1;
}
}
return -1;
}
6. My_strlen函数
int My_strlen(char *src)
{
int len = 0;
while(*src++ != '\0')//'0' '\0' 0 0x00
{
len++;
//src = src+1;
//src++;
}
return len;
}
7.My_strcpy4函数
char * My_strcpy4(char *dest,const char *src)
{
//char *p = dest;
assert(dest != NULL && src != NULL);
while(*dest++ = *src++) {}
return dest;//走到最后\0
//return p;
}
8. int 指针 float 和零值如何比较
1、
int 指针 float 和零值如何比较
int ==
int a,b;
if(a>b)//a-b>0
if(ab)//a-b=0
if(a<b)//a-b<0
float
float a=0.0
if((a>=-EPSINON)&&(a<=EPSINO));//EPSINO是定义好的精度如果一个数落在【-0.0-EPSINO,0.0+EPSINO】之间,与0相等,否则不等。
if(a-EPSINON<0&&a+EPSINON>0)//a0;
两个数的比较
if(a-b<EPSINON)//a=b
if(a-bEPSINON)//a!=b
指针=====>
int *p=NULL;
if(NULL==p);
if(NULL!=0);
bool====>bool b=FALSE;
if(b); if(!b);
9.“ABC DE F” 求单词的个数
void NumberOfSentence( char* str)
{
assert(str!=NULL);
int count=0;
char* pbegin=str;
char* pend=str;
while(*pbegin!='\0')
{
if (*pbegin==' ')
{
pbegin++;
pend ++;
}
else if(*pend==' '||*pend=='\0')
{
count=count++;
pbegin= ++pend;
}
else
{
pend++;
}
}
printf("%d\n",count);
//return str;
}
10.打印一个数组中的奇数
int Fun(int *arr,int len)
{
int j = 0;//放奇数的下标
for(int i = 0;i < len;i++)
{
if(arr[i] % 2 != 0) //奇数
{
arr[j] = arr[i];
j++;
}
}
//Show(arr,j);
return j;
}
void Show(int *arr,int len)
{
for(int i = 0;i < len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
11.只出现一次的字符
char *FirstNotrepeate1(char *str)
{
int arr[256]={0};//字符的大小不会超过256,所以设置一个256大小的数组
char *tmp=str;
while(*str!='\0')
{
arr[*str]++;//把字符的ASCII码值作为数组下标
str++;
}
str=tmp;
while(*str!='\0')
{
if(arr[*str] == 1)//找到字符出现一次的字符
{
return str;
}
str++;
}
char firstNotRepeate(char* str)
{
assert(str != NULL);
const int SIZE = 256;
int hashTable[SIZE] = {};
char *phash = str;
while(*phash != '\0')
{
hashTable[*(phash++)]++;
/*hashTable[*phash]++;
phash++;*/
}
phash = str;
while(*phash != '\0')
{
if(hashTable[*phash] == 1)
{
return *phash;
}
phash++;
}
return '\0';
}
12.左旋数组
//左旋数组
void Reverse(char *begin,char *end)
{
char tmp;
while(begin < end)
{
tmp = *begin;
*begin = *end;
*end = tmp;
begin++;
end--;
}
}
char *Left_Arry(char *str,int num)
{
assert(str != NULL && num > 0);
int len = strlen(str);
if(len > 0 && num < len)
{
char *firstbegin = str;
char *firstend = firstbegin+num-1;
char *secondbegin = firstend+1;
char *secondend = str+len-1;
Reverse(firstbegin,firstend);
Reverse(secondbegin,secondend);
Reverse(firstbegin,secondend);
}
return str;
}