目录
1.4. strcmp 比较字符串,一般用来判断两个字符串是否相等
1.5. 长度受限制的字符串函数strncpy、strncat、strncmp
1.7. strtok 用特定字符集合(可以有多个)来分割字符串
3.4 memset函数:将某一块内存中的内容全部设置为指定的值
C语言中本身是没有字符串类型的,字符串通常存放在常量字符串或者字符数组中,字符串常量使用于那些对他不做修改的字符串函数。
下面对字符串相关的函数进行介绍。
- //模拟实现strlen函数
- //方法一:计数器方式
- int my_strlen(const char * str)
- {
- int count = 0;
- while(*str)
- {
- count++;
- str++;
- }
- return count;
- }
-
- //方法二:不能创建临时变量计数器
- int my_strlen(const char * str)
- {
- if(*str == '\0')
- return 0;
- else
- return 1+my_strlen(str+1);
- }
-
- //方法三:指针-指针的方式
- int my_strlen(char *s)
- {
- char *p = s;
- while(*p != ‘\0’ )
- p++;
- return p-s;
- }
- //模拟实现
- char *my_strcpy(char *dest, const char*src)
- {
- char *ret = dest;
- assert(dest != NULL);
- assert(src != NULL);
- while((*dest++ = *src++))
- { ; }
- return ret;
- }
-
- char arr1[] = "hello";
- char arr2[] = "zzzz";
- strcpy(arr1, arr2);//返回类型为arr1的首地址
- printf("%s\n",arr1);
char * strcat ( char * destination, const char * source );
- //模拟实现strcat
- char *my_strcat(char *dest, const char*src)
- {
- char *ret = dest;
- //while(*dest)
- //{
- // dest++;
- //}//找到\0
- dest += strlen(dest);
-
- //while(*src)
- //{
- // *dest = *src;
- // dest++; src++;
- //}
- while((*dest++ = *src++))
- {}
- return ret;
- }
- int main(){
- char arr1[30] = "hello ";
- char arr2[] = "bit";
- //strcat(arr1, arr2);
- //strncat(arr1, arr1, 5);//自己给自己追加
- my_strcat(arr1, arr2);
- printf("%s", arr1);}
int strcmp ( const char * str1, const char * str2 );
- //模拟实现strcmp
- int my_strcmp (const char * src, const char * dest)
- {
- assert(src != NULL);
- assert(dest != NULL);
- while(*src == *dest)
- {
- if(*src == '\0')
- return 0;
- src++; dest++;
- }
- /*if ( *src < *dest )
- return -1 ;
- else if ( *src > *dest )
- return 1;*/
- return *src - *dest;//这样是返回一个正数或者负数
- }
(1)strncpy 拷贝souce中的前num个
char * strncpy ( char * destination, const char * source, size_t num );
(2)strncat 追加souce中的前num个
char * strncat ( char * destination, const char * source, size_t num );
(3)strncmp 比较两个字符串的前num个
int strncmp ( const char * str1, const char * str2, size_t num );
- char a1[] = "abcdef";
- char a2[] = "abcxyz";
- if(strncmp(a1, a2, 3) == 0)
- printf("前3个字母相同\n");
char* strstr(const char* str1, const char* str2);
返回子串在原串中的指针位置,找不到则返回NULL
- //模拟实现strstr
- char* my_strstr(char* p1, char* p2)
- {
- char* s1 = p1;char* s2 = p2;
- char* cur = p1;
- assert(p1 && p2);
- if(*p2 == '\0')
- return p2;
- while(*cur){
- s1 = cur;
- s2 = p2;
- while((*s1 != '\0')&&(*s2 != '\0')&& (*s1 == *s2)){
- s1++; s2++;
- }
- if(*s2 == '\0')
- return cur;//找到了
- cur++;
- }
- return NULL;//找不到的情况
- }
- int main(){
- char a1[] = "abcdeflib";
- char a2[] = "def";
- //char* p = strstr(a1, a2);
- char* p = my_strstr(a1, a2);//返回子串在原串中的指针位置
- //即p指向"abcdeflib"中的d
- if(p != NULL)
- printf("%d\n", p-a1);
- else
- printf("not find\n");}
- int main ()
- {
- char str[] ="- This, a sample string.";
- char * pch;
- printf ("Splitting string \"%s\" into tokens:\n",str);
- pch = strtok (str," ,.-");
- while (pch != NULL)
- {
- printf ("%s\n",pch);
- pch = strtok (NULL, " ,.-");
- }
- return 0; }
- FILE * pFile;
- pFile = fopen ("unexist.ent","r");
- if (pFile == NULL){
- printf("error no : %d\n",errno);
- printf ("Error details: %s\n",strerror(errno));
- }
- else
- printf("open success\n");
- //errno: Last error number
islower函数:判断是否为小写字符
isdigit函数:判断是否为数字
tolower转小写
toupper转大写
- char c1 = tolower('A');
- char c2 = toupper('b');
- putchar(c1);
- putchar(c2);
- //模拟实现memcpy
- void * my_memcpy ( void * dst, const void * src, size_t count)
- {
- void * ret = dst;
- assert(dst);
- assert(src);
- //copy from lower addresses to higher addresses
- while (count)
- {
- *(char *)dst = *(char *)src;
- dst = (char *)dst + 1;
- src = (char *)src + 1;
- count--;
- }
- return(ret);
- }
-
- int a1[] = {1,2,3,4,5};
- int a2[5] = {0};
- my_memcpy(a2,a1,sizeof(a1));第三个参数为拷贝的大小,以字节为单位;
- //a2为1 2 3 4 5
以上涉及重叠元素时不能完成拷贝,因为是一个一个字节拷贝的
- int a1[] = {1,2,3,4,5,6,7,8,9,10};
- int i;
- memmove(a1+2, a1, 32);//把a1移动到a1+2的位置上,移动32个字节
- for(i=0; i<10; i++)
- {printf("%d ",a1[i]);}//输出为1 2 1 2 3 4 5 6 7 8
或者将原数组临时拷贝一份
按照字节进行比较,比较的是ascll值
- char buffer1[] = "DWgaOtP12df0";
- char buffer2[] = "DWGAOTP12DF0";
- int n;
- n=memcmp ( buffer1, buffer2, sizeof(buffer1) );
- if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
- else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
- else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);
void *memset(void *s, int ch, size_t n);
- char a[10] = {0};
- memset(a, '*', 9);//第三个参数以字节为单位;
- puts(a);//*********