文章目录
字符串特性
"hello bit.\n"
- 这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。
- 不存在字符串类型,只有char字符类型不存在字符串类型,只有char字符类型。
- 字符串以隐藏的
\0
作为结束标志。 - 求字符串长度
sizeof();
,比如sizeof("abc")
,结果就是4,因为还有字符字符结束标志0
。
转义字符
问题
在屏幕上打印出My English name is "xiaosan"
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("My English name is \"xiaosan\"\n");
system("pause");
return 0;
}
在字符串中的"
前必须加上\
,才能达到预期效果,\
的功能就是转义,顾名思义就是转变它默认的含义。聪明的你肯定也看到了\n
,没错\n
也是转义字符。
常见的转义字符及其含义
模拟实现strcpy
#include<stdio.h>
#include<Windows.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
assert(dest);
assert(src);
while ((*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char a1[50];
char a2[] = { "哈哈哈!" };
my_strcpy(a1, a2);
printf("%s\n", a1);
return 0;
}
模拟实现strcat
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>
#include<assert.h>
char* my_strcat(char* dest,const char* src)
{
char*ret=dest;
assert(dest);
assert(src);
while(*dest)
{
*dest++;
}
while((*dest++=*src++))
{
;
}
return ret;
}
int main()
{
char a1[50]={"我是一个小笨蛋!!!"};
char a2[]={"对,你就是小笨蛋!!!"};
my_strcat(a1,a2);
printf("%s\n",a1);
system("pause");
return 0;
}
模拟实现strstr
#include <stdio.h>
#define pragma warning:4996
#include<Windows.h>
#include<assert.h>
const char *my_strstr(const char*str1, const char *str2)
{
assert(str1);
assert(str2);
const char*cp = (char*)str1;
const char*substr = (char*)str2;
const char*s1 = NULL;
if (*str2 == '\0')
return NULL;
while (*cp)
{
s1 = cp;
substr = str2;
while (*s1&&*substr && (*s1 == *substr))
{
s1++;
substr++;
}
if (*substr == '\0')
return cp;
cp++;
}
return NULL;
}
//const char *my_strstr(const char *str, const char *sub_str)
//{
// for (int i = 0; str[i] != '\0'; i++)
// {
// int tem = i; //tem保留主串中的起始判断下标位置
// int j = 0;
// while (str[i++] == sub_str[j++])
// {
// if (sub_str[j] == '\0')
// {
// return &str[tem];
// }
// }
// i = tem;
// }
//
// return NULL;
//}
int main()
{
char *s = "1233345hello";
char *sub = "345";
printf("%s\n", my_strstr(s, sub));
system("pause");
return 0;
}
模拟实现strchr
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
#include<assert.h>
char *my_strchr(char *s, char c)
{
assert(s);
while (*s != !'\0'&&*s!= c)
{
++s;
}
return *s == c ? s : NULL;
}
int main()
{
char* tmp = 0;
char string[] = { "I love studying " };
char c = 's';
tmp=my_strchr(string, c);
printf("%s", tmp);
system("pause");
return 0;
}
模拟实现strcmp
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
int my_strcmp(char*src, char*dest)
{
int ret = 0;
while (!(ret = *(unsigned char*)src - *(unsigned char*)dest) && *dest)
++src , ++dest;
if (ret < 0)
ret = -1;
else if (ret>0)
ret = 1;
return ret;
}
int main()
{
char str1[12] = "I love zou!";
char str2[13]= "I love zhou!";
printf("%d\n", my_strcmp(&str1, &str2));
system("pause");
return 0;
}
模拟实现memcpy
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
void* my_memcpy(void* dest, const void* src, size_t count)
{
void *ret = dest;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
char mem1[30] = { "This a memcpy test!" };
char mem2[30] = { 0 };
int i = 0;
my_memcpy(mem2, mem1, 20);
for (i=0; i < 30; i++)
{
printf("%c", mem2[i]);
}
system("pause");
return 0;
}
模拟实现memmove
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
void*my_memmove(void*dest,const void*src,size_t count)
{
char*ret = (char*)dest;
if (dest <= src || (char*)dest >= (char*)src + count){
while (count--){
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else{
dest = (char*)dest + count - 1;
src = (char*)src + count - 1;
while (count--){
*(char*)dest =*(char*) src;
dest = (char*)dest - 1;
src = (char*)src - 1;
}
}
return ret;
}
int main()
{
int arr1[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int arr2[10] = { 0 };
int i = 0;
my_memmove(arr2,arr1,40);
for (; i < 10; i++)
{
printf("%d,", arr2[i]);
}
printf("\n");
system("pause");
return 0;
}
模拟实现strncpy
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>
#include<assert.h>
char* my_strncpy(char*dest,const char*src,size_t num)
{
char* ret=dest;
unsigned int i=0;
assert(dest);
assert(src);
for(i=0;i<num;i++)
{
*dest++=*src++;
}
return ret;
}
int main()
{
char s1[50]="I don't want to break!!!";
char s2[]="But vacation is coming!!!";
my_strncpy(s1,s2,40);
system("pause");
return 0;
}
模拟实现strncat
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>
#include<assert.h>
char* my_strncat(char* dest,const char* src,size_t num)
{
char* ret=dest;
unsigned int i=0;
assert(dest);
assert(src);
while(*dest)
{
dest++;
}
for(i=0;i<num;i++)
{
*dest++=*src++;
}
return ret;
}
int main()
{
char s1[100]="I don't want to break!!!";
char s2[]="But the vacation is coming!!!";
my_strncat(s1,s2,50);
system("pause");
return 0;
}
模拟实现strncmp
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
#include<assert.h>
int my_strncmp(char*s1, char*s2, size_t n )
{
assert(s1);
assert(s2);
int tmp=0;
int count=0;
tmp = ((*((int*)s1) - *((int*)s2)) && (s1++) && (s2++)&&((count++)<((int*)n)));
if (tmp>0)
return 1;
else if (tmp < 0)
return -1;
else
return 0;
}
int main()
{
int tmp;
char str1[] = { "This a test for strncmp!" };
char str2[] = { "This a test for strcmp!" };
tmp=my_strncmp(str1, str2, 10);
printf("%d\n", tmp);
system("pause");
return 0;
}