字符串

  • 目录:
    * 字符串基础知识
    * 字符串指针指向的内存只可读不可写
    * 字符串指针存储的是首地址,输出中文字符需设定中文环境
    * 字符串拷贝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 (char*pbegin = 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 || sourceNULL)
{
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 (_Str1NULL || _Str2NULL)
{
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");
}



posted @ 2016-11-19 18:54  呉语伦比  阅读(158)  评论(0)    收藏  举报