字符串

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



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