目录:
* 字符串基础知识
* 字符串指针指向的内存只可读不可写
* 字符串指针存储的是首地址,输出中文字符需设定中文环境
* 字符串拷贝strcpy
* 计算长度函数实现strlen
* 检索字符串函数strstr
* 排序函数qsort
* 比较两个字符串是否相等strcmp
* 将一个串中的所有字符都设为指定字符strcat
* 查找字符串s中首次出现字符c的位置strchr(s,c)
* 宽字符处理字符串结束必须有\0,不然会出现烫烫烫
char str[5] = { 'a', 'b', 'c', 'd', '\0' }; printf("%s", str);//整体显示必须要有‘\0’
char str1[5] = { 'a', 'b', 'c', 'd', 'e' };//单个显示 for (int i = 0; i < 5;i++) { putchar(str1[i]); }
使用指针移动位置打印出字符串
```
void main5()
{
char p = "iloveyou";
//指针循环输出字符的办法
p = p + 5;//指针的位置决定从哪里开始
for (charpbegin = p; pbegin != '\0';pbegin++)
{
putchar(pbegin);
}system("pause");
}
```- 字符串存储在代码区,代码区内容不允许修改
char str[100]=“123”
可通过str="abc"
改变str内容,因为str在静态区
```
void main()
{
char *p = "iloveyou";
printf("%s", p+1+4);//改变指针的位置输出不同的字符p[3] = 'X';//*(P+3) 代码区不允许修改 *(p + 4) = 'Y'; system("pause");
}
```
字符串指针指向的内存只可读不可写
void main3()
{
char *p = "notepad";
printf("%d", sizeof(p));
printf("\n%d", sizeof("notepad"));
printf("%p", p);
*p = 'A';//指针指向的这片内存,只读不可写
//"notepad" 属于代码区的 常量表,符号表
//3,notepad字符串都在符号表,非字符串变量拷贝到寄存器,
//字符串就是传递地址
system("pause");
}
字符串指针存储的是首地址,输出中文字符需设定中文环境
void main()
{
char str1[100] = "calc";
char str2[100] = "calc";
//char *p
//str1 == str2;//比较的是指针的值
if (strcmp(str1,str2)==0)
{
printf("相等");
}
else
{
printf("不相等");
}
wchar_t strX[100] = L"你好天朝";
printf("%d", sizeof(strX));
}
计算长度函数实现
unsigned int mystrlen(const char *str)
{
int length = 0;
for (int i = 0;;i++)//下标法
{
/* if (*(str+i)=='\0')
{
break;
}*/
if (str[i] == '\0')
{
break;
}
length++;
}
return length;
}
unsigned int mystrlenaddr(const char *str)
{
int length = 0;
for (char *p = str; *p != '\0';p++)//指针法
{
length++;
}
return length;
}
void main1()
{
char str[100] = "calc123";
int length = mystrlenaddr(str);
printf("%d", length);
system("pause");
}
检索一个字符中是否包含另一个字符
char *strstrint(const char * _Str, const char * _SubStr)
{
if (_Str == NULL || _SubStr == NULL)
{
return NULL;
}
char *pres = NULL;
int alllength = strlen(_Str);//母串的长度
int sublength = strlen(_SubStr);//子串的长度
for (int i = 0; i < alllength - sublength;i++)//获取要前进的尺度
{
int flag = 1;//假定相等
for (int j = 0; j < sublength;j++)
{
if (_SubStr[j]!=_Str[i+j])//循环对比
{
flag = 0;
break;
}
}
if (flag)
{
pres = _Str + i;//找到的地址
return pres;
}
}
return pres;
}
char *strstraddr(const char * _Str, const char * _SubStr)
{
if (_Str == NULL || _SubStr == NULL)
{
return NULL;
}
char *pbak = _Str;//备份首地址
while (*pbak!='\0')
{
int flag = 1;//假定相等
char *pfind = pbak;//从当前字符串循环母串
char *psub = _SubStr;//从当前字符循环子串
while (*psub!='\0')
{
if (*pfind!='\0')//母串提前结束
{
if (*pfind !=*psub)//判断字符不等
{
flag = 0;
break;
}
else
{
pfind++;
psub++;//往前移动
}
}
else
{
flag = 0;
break;;
}
}
if (flag)
{
return pbak;//保存当前地址
}
pbak++;//指针不断向前移动,遍历母串的每一个字符
}
return NULL;
}
void main()
{
char str[100] = "abc124刘海华善于泡妞";
char name[40] = "124刘海华";
char *p = strstraddr(str, name);
if (p!=NULL)
{
printf("找到%p,%c",p,*p);
}
else
{
printf("找不到");
}
system("pause");
}
字符串拷贝strcpy
char * mystrcpy(char *dest, const char *source)
{
if (dest ==NULL || source==NULL)
{
return NULL;
}
for (int i = 0;;i++)//下标法
{
dest[i] = source[i];//一次搞定
if (*(source+i)=='\0')
{
//dest[i] = source[i];//附加\0
break;
}
//dest[i] = source[i];
}
return dest;
}
char * mystrcpyaddr(char *dest, const char *source)
{
if (dest == NULL || source == NULL)
{
return NULL;
}
char *phead = dest;
//while (*source!='\0')//终止
//{
// *dest = *source;//赋值
// dest++;//指针前进
// source++;
//}
//*dest = *source;//处理\0
while ( (*dest++= *source++))//装逼写法
{
}
return phead;
}
void main2()
{
char str[100];
char *p = "大熊1231312321";
;//字符串拷贝
printf("%s", mystrcpyaddr(str, p));
//str = p;
system("pause");
}
qsort排序函数
void fill(int *a,int n)//填充随机数
{
time_t ts;
unsigned int num = time(&ts);
srand(num);
for (int i = 0; i < n;i++)
{
a[i] = rand() % n;
}
}
void print(int *a, int n)
{
for (int i = 0; i < n; i++)
{
printf("\n%d", a[i]);//打印
}
}
int com(const void *p1, const void *p2)
{
const int *pint1 = p1;//指针的类型转换,
const int *pint2 = p2;
//*pint2 = 1;限定权限
if (*pint1 == *pint2)
{
return 0;
}
else if (*pint1 < *pint2)
{
return 1;
}
else
{
return -1;
}
}
void main()
{
int a[100];
fill(a, 100);
print(a, 100);
//qsort()
qsort(a, 100, sizeof(int), com);
printf("快速排序以后");
print(a, 100);
system("pause");
}
比较两个字符串是否相等strcmp
#include <stdio.h>
#include <string.h>
int mystrcmp( const char * _Str1, const char * _Str2)
{
if (_Str1==NULL || _Str2==NULL)
{
return 0;
}
//下标法
//int i = 0;
//while (_Str1[i]==_Str2[i] && _Str1[i]!='\0')//一直循环到相等结束
//{
// i++;
//}
//if (_Str1[i] == '\0' && _Str2[i] == '\0')//相等
//{
// return 0;
//}
//else
//{
// //return _Str1[i] - _Str2[i];
// if (_Str1[i] - _Str2[i]>0)//字符相减
// {
// return 1;
// }
// else
// {
// return -1;
// }
//}
//指针法
char *str1 = _Str1;
char *str2 = _Str2;
while (*(str1)==*(str2) && *str1!='\0')
{
str1++;//一直相等就一直继续
str2++;
}
if (*(str1)=='\0' && *(str2)=='\0')//结束了
{
return 0;
}
else
{
if (*(str1)-*(str2) > 0)//字符相减
{
return 1;
}
else
{
return -1;
}
}
}
void main()
{
char str1[100] = "jello wolrd";
char str2[100] = "jello wolrd";
//printf("%d", str1 == str2);str1,str2代表常量地址
printf("\n%d\n", mystrcmp(str1, str2));
if (mystrcmp(str1, str2) == 0)//判定相等或者不等
{
printf("==");
}
else
{
printf("!=");
}
char strX[10][10] = { "calc", "apple", "run", "123", "boat", "dead", "father", "son", "hello", "world" };//二维数组存储是字符串内容
for (int i = 0; i < 10 - 1; i++) //
{
for (int j = 0; j < 10 - 1 - i; j++)
{
if (mystrcmp(strX[j], strX[j + 1])>0)
{
char strtemp[100] = { 0 };//交换内容
strcpy(strtemp, strX[j]);
strcpy(strX[j], strX[j + 1]);
strcpy(strX[j + 1], strtemp);//字符串可以写入
}
}
}
for (int i = 0; i < 10; i++)
{
printf("\n%s", strX[i]);
}
system("pause");
}
将一个串中的所有字符都设为指定字符
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//函数名: strset
// 功 能 : 将一个串中的所有字符都设为指定字符
// 用 法 : char *strset(char *str, char c);
char *mystrset(char *str, char c)
{
for (char *pnew = str; *pnew != '\0'; *pnew = c,pnew++)
{
;
}
}
void *mystrsetdg(char *str, char c)
{
if (*str=='\0')
{
return;
}
else
{
*str = c;
mystrsetdg(++str, c);
}
}
void main()
{
char *p = (char[10]){ 0 };
strcpy(p, "123456");
printf("%s", p);
mystrsetdg(p, 'a');
printf("\n%s", p);
system("pause");
}
查找字符串s中首次出现字符c的位置strchr(s,c)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *mystrchr(const char *str, const char c)
{
char *p = NULL;
//for (char *newp = str; *newp != '\0'; newp++)
//{
// if (*newp== c)
// {
// p = newp;//查找
// break;
// }
//}
for (int i = 0;i<strlen(str);i++)
{
if (str[i]==c)
{
p = &str[i];//str+i
break;
}
}
return p;
}
char *mystrchrdg(const char *str, const char c)
{
if (*str=='\0')
{
return NULL;//终止
}
else
{
if (*str==c)//判断
{
return str;
}
mystrchrdg(++str, c);//循环趋于终止
}
}
void main1111()
{
char *p = mystrchrdg("calc", 'p');
if (p==NULL)
{
printf("can not find");
}
else
{
printf("can find%p,%c",p,*p);
}
system("pause");
}
宽字符处理
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int mywcslen(wchar_t * wstr)
{
int i = 0;
while (*wstr !=L'\0')
{
i++;
wstr++;
}
return i;
}
void mainh()
{
setlocale(LC_ALL, "zh-CN");//设定中文
wchar_t wch[10] = L"我是男神爱女神";
wprintf(L"%ls", wch);
system("pause");
}
void main()
{
setlocale(LC_ALL, "zh-CN");//设定中文
wchar_t wch[10] = L"a男神爱女神12";
//strlen
int length = mywcslen(wch);
printf("%d", length);
system("pause");
}
void mains()
{
setlocale(LC_ALL, "zh-CN");//设定中文
wchar_t wch = L'我';
putwchar(wch);
system("pause");
}
void mainp()
{
wchar_t wch = L'A';
char ch = 'A';
printf("%d,%d", ch, wch);
system("pause");
}
wchar_t * mywcscpy(wchar_t * dest, const wchar_t * source)
{
if (dest ==NULL || source ==NULL)
{
return NULL;
}
else
{
wchar_t *p = dest;
while (*dest++ =*source++)
{
}
return p;
}
}
void mainty()
{
setlocale(LC_ALL, "zh-CN");//设定中文
wchar_t *p = (wchar_t[100]){ 0 };//栈上分配上数组
wchar_t wch[10] = L"我是男神爱女神";
mywcscpy(p, wch);
wprintf(L"%ls", p);
system("pause");
}