自学C day12-指针和字符串

指针和字符串

当字符串(字符数组)做函数参数时,不需要提供两个参数,因为每个字符串都有\0的结束标记

字符串比较stecmp

两个字符串挨个相比,如果都相等 ,就返回0,不同返回1(第一个字符串大)或-1(第二个字符串大),这与元素个数无关,比出大小了之后就不往后面比了后面直接丢掉
比的是ASCII码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

int strcmp_self(char *str1, char *str2);

int main(void)
{
	char *str1 = "hellor";
	char *str2 = "helloz";

	int a = strcmp_self(str1, str2);
	if (a == 0)
	{
		printf("相同\n");

	}
	else if(a == 1)
	{
		printf("str1 > str2\n");

	}
	else if(a == -1)
	{
		printf("str1 < str2\n");

	}
	else
	{
		printf("异常\n");

	}
	system("pause");
	return EXIT_SUCCESS;
}


//str1和str2比较,如果相等返回0,str1>str2返回1,否则返回-1
int strcmp_self(char *str1, char *str2) {	//光写str1的话是两个字符,字符串要加*
	int i = 0;
	while (*str1 == *str2);
	{
		if (*str1 == '\0')
		{
			return 0;			//字符串一样
		}
		str1++;
		str2++;
	}
	return *str1 > *str2 ? 1 : -1;
}

字符串拷贝

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void strcpy_self(char *src, char *dst);

int main(void)
{
	char *src = "hello";
	char dst[100] = {0};
	strcpy_self(src, dst);
	printf("%s\n", dst);
	system("pause");
	return EXIT_SUCCESS;
}

//src:源,dst:目标
void strcpy_self(char *src, char *dst) {
	int i = 0;
	for (; src[i] != '\0'; i++)
	{
		dst[i] = src[i];
	}
	dst[i] = '\0';

}

字符串去空格

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

void str_nospace(char *src, char *dst);
void str_nospace_zhizhenban(char *src, char *dst);


int main(void)
{
	char src[] = "ni chou sha chou ni za di ";
	char dst[100] = {0};
	str_nospace_zhizhenban(src, dst);
	printf("%s\n", dst);
	system("pause");
	return EXIT_SUCCESS;
}

//src:有空格的字符串 dst:没空格的字符串
void str_nospace(char *src, char *dst) {
	int i = 0, j = 0;			//i遍历字符串src,j记录dst存储位置
	while (src[i] != '\0')
	{	
		if (src[i] != ' ') {
			dst[j] = src[i];
			j++;
		}
		i++;
	}
	dst[j] = '\0';
}

//指针版
void str_nospace_zhizhenban(char *src, char *dst) {
	while (*src != '\0')
	{
		if (*src != ' ')
		{
			*dst = *src;
			dst++;
		}
		src++;
	}
	*dst = '\0';
}

带参数的main函数

指针数组的本质是二级指针

int main(int argc, char *argv[]) == int main(int argc, char **argv)

参数1:表示给main函数传递的参数的总个数
参数2:是一个数组,数组的每一个元素都是char*,即字符串,数组名为argv
这样的话就可以不用写scanf了,默认会等输入的内容,默认不能带空格
测试1:在命令行中,使用gcc编译生成可执行文件,文件名.exe aa b v c d sf g ew er这样对应的结果就是argv[0] = 文件名.exe argv[1] = aa …依次排下去,argc就是10
测试2:在vs中,右键项目名称-> 属性-》调试-》命令行参数,在这里面写要输入的东西

str中找substr第一次出现的位置

char *strstr(char *str,char *substr);
功能:在 str中找substr的位置,从第一次出现的位置开始,把他后面的东西都输出出来
eg:源串:ehlfdfiefdafi,子串:fdf,那么返回值是fdfiefdafi
找不到的话会返回null

统计子串出现的次数

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

int str_count(char *str, char *substr);


//统计字符串中子串出现的次数
int main(void)
{
	char str[] = "helulol9lolulo";
	char substr[] = "llo";
	int ret = str_count(str, substr);
	printf("出现%d次\n", ret);


	system("pause");
	return EXIT_SUCCESS;
}

int str_count(char *str, char *substr) {
	int count = 0;
	char *p = strstr(str, substr);
	while (p != NULL)
	{
		count++;
		p += strlen(substr);		//p = p+strlen(substr)
		p = strstr(p, substr);			//返回"llo"
	}
	return count;
}

求非空字符串的元素个数

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

int no_space_str(char *str) ;

int main(void)
{
	char str[] = "ni chou sha chou ni za di";
	int ret = no_space_str(str);
	printf("%d\n", ret);
	system("pause");
	return EXIT_SUCCESS;
}


int no_space_str(char *str) {
	int count = 0;
	char *p = str;			//常量不能变的话就把他传给变量,让变量变
	while (*p != '\0')
	{
		if (*p != ' ')
		{
			count++;
		}
		p++;
	}
	return count;
}

字符串逆制str_inverse、 判断字符串回文str_reverse

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void str_reverse(char *str);
int str_back(char *str) ;

int main(void)
{
	char str[] = "this is a test";
	char str2[] = "abcdscba";
	int a = str_back(str2);
	if (a == 0)
	{
		printf("不是回文\n");
	}
	else
	{
		printf("是回文\n");
	}

	str_reverse(str);
	printf("%s\n", str);
	system("pause");
	return EXIT_SUCCESS;
}


void str_reverse(char *str) {
	char *start = str;			//首元素地址
	char *end = strlen(str) + str - 1;	//最后一个元素地址
	while (start < end)
	{
		char temp = *start;
		*start = *end;
		*end = temp;
		start++;						//头指针后移
		end--;							//尾指针前移
	}
}

//回文判断
int str_back(char *str) {
	char *start = str;
	char *end = str + strlen(str) - 1;
	while (start < end)
	{
		if (*start != *end)
		{
			return 0;	//0表示非回文
		}
		start++;
		end--;
	}
	return 1;		//1表示回文 
}

和字符串相关的都在string.h里面

包括字符串拷贝、拼接、比较、查找子串

字符串拷贝:strcpy()、strncpy()

char *strcpy(char *dest , const char *src),返回dst,拷贝的过程中要保证dest的空间足够大;如果dest空间不够大的话会溢出但是不会报错,能存多少存多少。(不安全)
strncpty(char **dest,const char *src,size_t n)
这里的n是与dest对应的空间一致,默认不添加\0
当n>src,只拷贝src的大小;
n<src,则拷贝n字节大小;

字符串拼接,strcat()、strncat()

char strcat(char dest ,const char *src):将src的内容拼接到dst之后,返回拼接之后的字符串
char p = strncat(char dest ,const char *src, size_t n); 将src的前n 个字符拼接到dest之后,形成一个新的字符串

字符串比较strcmp()、strncmp()

比较s1和s2两个字符串,如果相等,返回0,如果不相等进一步比较s1和s2对应位的ASCII码
若s1>s2返回1,s1<s2返回-1
,strncmp(s1, s2,size_t n) :n表示比较前n个字符,比的是ASCII的值,不比ASCII的和

格式化读入和写出sprintf、sscanf

sprintf的第一个参数是缓冲区,写入的东西都在缓冲区里,要打印出来的话就打印缓冲区名
sscanf同理。将原来从屏幕获取的格式化字符串,从参数1中获取

字符串查找子串strchr()、strrchr()

在字符串str中找一个字符出现的位置,返回的是字符在字符串中的地址
strchr(In_z char* const _String, In int const _Ch)
strrchr(In_z char* const _String, In int const _Ch)//从右向左找

strstr()

在字符串str中找子串substr的位置返回地址
strstr(In_z char* const _String, In_z char const* const _SubString)

上一篇:Day12_60_多线程的创建和启动(一)


下一篇:设计模式之观察者模式