现场编写strstr,strcpy,strpbrk的函数
库函数,细节的把握,编程能力扎实过硬
==============================================================================
==============================================================================
字符串查找strstr()
int strstr ( char * string, char * substring)
==============================================================================
==============================================================================
查找第一个只出现1次的字符
char FirstNotRepeatChar(char* pString)
{
if(!pString) return '\0';
const int tableSize = 256;
int hashTable[tableSize] = {0};
char* pHashKey = pString;
while(*(pHashKey)! = '\0')
hashTable[*(pHashKey++)]++;
while(*pString != '\0')
{
if(hashTable[*pString] == 1)
return *pString;
pString++;
}
return '\0';
}
ASCII码表:
1 - 49
0 - 48
A - 65
a - 97
==============================================================================
==============================================================================
方法二:
#include<stdio.h>
#include<string.h>
const int N = 26;
int bit_map[N];
void findNoRepeat(char* src)
{
int pos;
chat* str = src;
int i,len = strlen(src);
for(i=0;i<len;i++)
bit_map[str[i]-'a']++;
for(i=0;i<len;i++)
{
if(bit_map[str[i]-'a' == 1)
{
printf("%c",str[i]);
return;
}
}
}
==============================================================================
==============================================================================
char* strncpy(char*strDes,const char* strSrc, unsigned int count)
{
assert(strDes != NULL && strSrc!= NULL);
char* address = strDes;
while(count-- && *strSrc !='\0')
*strDes++ = *strSrc++;
*strDest = '\0';
return address;
}
==============================================================================
==============================================================================
查找字符串中首次出现字符C的位置
char* strchr(const char* str,int c)
{
assert(str != NULL);
while(*s != '\0' && *s != c)
==S;
return (*s == c) ? s:NULL;
}
==============================================================================
==============================================================================
int strcmp(constchar* s,const char* t)
{
assert(s!=NULL && t!=NULL);
while(*s && *t &&*s==*t)
{
++s;
++t;
}
return (*s - *t);
}
==============================================================================
==============================================================================
char* strcat(char* strDes,const char* strSrc)
P184/401
==============================================================================
==============================================================================
C中的qsort()函数
#include<stdlib.h>
void qsort(void* base,int nelem,intwidth,int(*fcmp)(const void*,const void*));
int cmp(const void* a,const void* b)
{
return *(int*)a - *(int*)b;
}
int cmp(const void* a,const void* b)
{
return ((*(double*)a-*(double*)b)>0?1:-1);
}
==============================================================================
==============================================================================
strcpy()手写代码
char * strcpy (char * strDest, const char *strSrc)
{
char* strDestCopy =strDest;
if((strDest == NULL) || (strSrc ==Null))
throw "Invalid argument(s)";
while((*strDest++ = *strSrc++) != '\0')
return strDestCopy;
}
==============================================================================
==============================================================================
反转字符串
void reverse ( char* str )
{
assert(str != NULL); //#include<assert.h>
char* head = str;
while ( *str++ ) { };
str--;
char* tail = str--;
while(head<tail)
{
*head ^= *tail;
*tail-- ^= *head;
*head++ ^= *tail;
}
}
反转字符串(不申请变量和空间) 有道云笔记 |
atoi()函数:字符串转换成整型数 ASCII to Integer 有道云笔记 |
#include<cctype>
int my_atoi (const char* str)
{
assert(str!=NULL);
bool neg_flag = false;
int result = 0;
if(str[0]==’+’ || str[0]==’-’)
reg_flag = (*str++ != ‘+’);
while(isdigit(*str))
result = result * 10 + (*str++ - ‘0’);
return neg_flag ? 0-result : result;
}
strlen()函数:不用任何中间变量实现 |
利用常量OR编译器在递归中栈中申请。(分析过程)
int strlen( const char* )
{
if(str == NULL) return 0;
If(*str !=’\0’)
return 1+strlen(++str);
else return 0;
}
普通:
size_t strlen( const char * str)
{
Assert(str != NULL);
size_t len = 0;
while (*str++ != ‘\0’)
len++;
Return len;
}
strcpy()函数 |
char * strcpy(char* strDest, const char* strSrc)
{
if(strDest == NULL || strsrc == NULL)
Return NULL;
if (strDest == strSrc) //如果是同一个字符串,便不复制
Return strDest;
char* tempptr = strDest;
while( (*strDest++ = *strSrc) !=’\0’) ; //先赋值复制,后判断
return tempptr;
}
strstr()函数:是否有子字符串 finds the first occurrence of string2 in string1 |
char * strstr (const char * str1,const char * str2)
{
char *cp =(char *) str1;
char *s1, *s2;
if ( !*str2 )
return((char *)str1);
while (*cp)
{
s1 = cp;
s2 = (char *) str2;
while ( *s1 && *s2 && !(*s1-*s2) )
s1++, s2++;
if (!*s2)
return(cp);
cp++;
}
return(NULL);
}
char *mystrstr(char *s1 , char *s2)
{
if(*s1==0)
{
if(*s2) return(char*)NULL;
return (char*)s1;
}
while(*s1)
{
int i=0;
while(1)
{
if(s2[i]==0) return s1;
if(s2[i]!=s1[i]) break;
i++;
}
s1++;
}
return (char*)NULL;
}