ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

自学C day12-指针和字符串

2021-03-11 22:02:36  阅读:158  来源: 互联网

标签:src day12 int dst char str 自学 include 指针


指针和字符串

当字符串(字符数组)做函数参数时,不需要提供两个参数,因为每个字符串都有\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)

标签:src,day12,int,dst,char,str,自学,include,指针
来源: https://blog.csdn.net/weixin_45467012/article/details/114552369

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有