C语言中如何利用函数将字符串逆置、拷贝、追加、查找等操作

1、指针与字符串的关系

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

int main0101()
{
	//char ch[] = "hello wrold";
	//char* p = ch;
	//printf("%s\n", p);
	//printf("%c\n", *p); 


	char ch[] = "hello wrold";//栈区字符串可以修改
	char* p = "hello world";//数据区常量区字符串不可修改
	char* p1 = "hello world";

	printf("%p\n", p);
	printf("%p\n",p1);
	//ch[2] = 'm';
	//p[2] = 'm';//err
	//*(p + 2) = 'm';//err
	printf("%s\n", p);
	printf("%s\n", ch);
	return 0;
}

int main0102 ()
{
	//字符串数组
	//指针数组  下4行
	//char ch1[] = "hello";
	//char ch2[] = "world";
	//char ch3[] = "dabaobei";
	//char* arr[] = { ch1,ch2,ch3 };
	
	char* arr[] = { "hello","world","dabaobei" };//字符串数组

	//for (int i = 0; i < 3; i++)
	//{
	//	printf("%c\n", arr[i][0]);//打印3个字符串的首字母
	//}

	for (int i = 0; i < 3 - 1; i++)//字符串排序
	{
		for (int j = 0; j < 3 - 1 - i; j++)
		{
			if (arr[j][0] > arr[j + 1][0])//找首字符进行比较
			{
				char* temp = arr[j];//交换指针数组元素进行排序
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	for (int i = 0; i < 3; i++)
	{

		printf("%s\n", arr[i]);
	}

	return 0;

}

2、字符指针作为函数参数

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

int my_strlen01(char* ch)
{
	//计算字符串有效长度
	int i = 0;
	while (ch[i] != '\0')
	{
		i++;
	} 
	return i;
}
int my_strlen(char* ch)
{
	char* temp = ch;
	while (*temp != '\0')
	{
		temp++;
	}
	return temp - ch;
}

int main02()
{
	char ch[] = "hello world";
	//printf("%s\n", ch);
	int len = my_strlen(ch);
	printf("%d\n", len);
	return 0;

}

3、const修饰指针


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

int main0301()
{
	const int a = 10;
	//a = 100;//err
	int* p = &a;//通过一级指针间接修改变量的值
	*p = 100;
	return 0;
}

int main0302()
{
	char ch1[] = "hello";
	char ch2[] = "world";
	//指向常量的指针 可以修改指针变量的值 不可以修改指针变量指向内存空间的值
	const char* p = ch1;

	//*p = 'm';//err
	//p[2] = 'm';//err 等同于  *(p+2)='m';
	//p = ch2;//ok
}

int main0303()
{
	char ch1[] = "hello";
	char ch2[] = "world";
	//常量指针
	//可以修改指针变量指向内存空间的值
	//不可以修改指针变量的值

	char* const p = ch1;
	//p = ch2;//err
	//p[2] = 'm';//ok
	*(p + 2) = 'm';
	printf("%s\n", p);
	printf("%s\n", ch1);
	return 0;
}

int main0304()
{
	char ch1[] = "hello";
	char ch2[] = "world";


	const char* const p = ch1;
	//p = ch2;//err
	//*p = 'm';//err
	//p[2] = 'm';//err
 	char** p1 = &p;
	//*p1 = ch2;//ok
	*(*p1 + 1) = 'm';
	return 0;

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


//gcc -o hello hello.c(4个参数 "gcc"   "-o"   "hello"   "hello.c")
//int argc 表示传递参数的个数
//char* argv[]={"gcc"   "-o"   "hello"   "hello.c"};表示参数具体内容
int main04(int argc, char* argv[])
{  
	if (argc < 3)
	{
		printf("缺少参数\n");
		return -1;
	}
	for (int i = 0; i < argc; i++)
	{
		printf("%s\n", argv[i]);
	}
	return 0;  
}

5、统计字符串出现次数

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


char* my_strstr(char* src, char* dest)
{
	char* fsrc = src;//遍历源字符串指针
	char* rsrc = src;//记录相同字符串首地址
	char* tdest = dest;
	while (*fsrc)
	{
		rsrc = fsrc;
		while (*fsrc == *tdest && *fsrc != '\0')
		{
			fsrc++;
			tdest++;
		}
		if (*tdest == '\0')
		{
			return rsrc;
		}
		tdest = dest;//目标字符串更新到起始位置
		fsrc = rsrc;
		fsrc++;
	}
	return NULL;
}

int main0501()
{
	char *str = "11abcd111122abcd333abcd3322abc33333222qqq";
	char ch[] = "abcd";
	char* p = my_strstr(str, ch);
	int count = 0;//记录个数
	while (p != NULL)
	{
		count++;
		p = p + strlen(ch);
		p = my_strstr(p, ch);
	}
	printf("abcd在字符串中出现:%d次\n",count);
	return 0;
}

int main0502(void)
{
	char* str = "11abcd111122abcd333abcd3322abc33333222qqq";
	char ch[] = "abcd";
	char* p = my_strstr(str, ch);
	int count = 0;//记录个数
	do
	{
		if (p)
		{
			count++;
			p += strlen(ch);
			p = my_strstr(p, ch);
		}
	} while (p);
	printf("%dn", count);
	return 0; 
}

6、计算非空字符串个数

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


int getstrcount01(char* ch)//统计非空字符串个数
{
	int count = 0;
	int i = 0;
	while (ch[i])
	{
		if (ch[i] != ' ')
		{
			count++;
		}
		i++;
	}
	return count;
}
int getstrcount(char* ch)
{
	int count = 0;
	while (*ch)
	{
		if (*ch != 32)
		{
			count++;
		}
		ch++;
	}
	return count; 
}

int main0601()//统计非空字符串个数
{
	char ch[] = "    hello world  ";
	int len =getstrcount(ch);
	printf("%d\n", len);
	return 0;

}

int main0602()
{
	//统计字符串出现次数
	char ch[] = "helloworldjintianshishiyiyueshirinihao";
	//存储字符串出现次数
	int arr[26] = { 0 };
	for (int i = 0; i < strlen(ch); i++) 
	{
		arr[ch[i] - 'a']++;
	}
	for (int i = 0; i < 26; i++)
	{
		if(arr[i]!=0)//出现次数为0的字母不打印出来
		printf("字母:%c出现次数:%d\n", i + 'a', arr[i]);
	}
	return 0;
}

7、将字符串逆置

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

void inverse01(char* ch)
{
	int i = 0;
	int j = strlen(ch) - 1;//最后一个字符的个数
	while (i < j)
	{
		char temp = ch[i];
		ch[i] = ch[j];
		ch[j] = temp;
		i++;
		j--;
	}
}

void inverse(char* ch)
{
	char* ftemp = ch;
	char* btemp = ch + strlen(ch) - 1;
	printf("%c\n", *btemp);
	while (ftemp < btemp)
	{
		char temp = *ftemp;
		*ftemp = *btemp;
		*btemp = temp;
		ftemp++;
		btemp--;
	}
	return;
}

int main0701()
{
	char ch[] = "hello world";
	inverse(ch);
	printf("%s\n", ch);
	return 0;
}

//回文字符串
//abcba  abccba  abcbcba

int symm(char* ch)
{
	char* ftemp = ch;
	char* btemp = ch + strlen(ch) - 1;

	while (ftemp < btemp)
	{
		if (*ftemp ==! *btemp)
			return 1;
		ftemp++;
		btemp--;
	}
	return 0;
}

int main0702(void)
{
	char ch[] = "abcba";
	int value = symm(ch);
	if (!value)
	{
		printf("相同\n");
	}
	else 
	{
		printf("不相同\n");
	}
}

8、将字符串拷贝strcpy函数

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


void my_strcpy(char* dest, char* src)
{
	while (*dest++ = *src++);
}
void my_strncpy(char* dest, const char* src, size_t n)
{
	while ((*dest++ = *src++) && --n);

}

int main0801()//拷贝字符串
{
	char ch[] = "hello world";
	char str[100] = { 0 };
	//my_strcpy(str, ch); //字符串拷贝
	//strncpy(str, ch, 5);//系统自带函数 字符串有限拷贝
	my_strncpy(str, ch, 5);
	//strcpy(str, ch);//系统自带函数  将ch中的字符串拷贝到str中
	printf("---%s---\n", str);

}

9、将字符串追加strncat函数

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

void my_strcat(char*dest,const char* src)
{
	while (*dest)dest++;//找到dest字符串中\0位置
	while (*dest++ = *src++);
}

void my_strncat(char* dest, char* src, size_t n)
{
	while (*dest)dest++;
	while ((*dest++ = *src++)&&--n);

}
int main09()// 系统函数strcat 追加字符串
{
	char dest[100] = "hello";
	char src[] = "world";
	//strncat(dest, src, 30);
	my_strncat(dest, src, 30);
	//strcat(dest, src);
	//my_strcat(dest, src); 
	printf("%s\n", dest);
	return 0;
}

10、字符串比较strcmp函数

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


int my_strcmp01(const char* s1, const char* s2)
{
	while (*s1 == *s2)
	{
		if (!*s1 )
		{
			return 0;
		}
		s1++;
		s2++;
	}
	return *s1 > * s2 ? 1 : -1;
}
//int my_strcmp(const char *s1, const char *s2)
//{
//	while (*s1++ = *s2++ && !*s1);
//	if (!*--s1&&!*--s2)return 0;
//	return *s1 > * s2 ? 1 : -1;
//}

int my_strncmp(const char* s1, const char* s2, size_t n)
{
	for (int i = 0; i < n&&s1[i]&&s2[i];i++)
	{
		if (s1[i] != s2[i])
		{
			return s1[i] > s2[2] ? 1 : -1;
		}

	}

}
int main010()
{
	char ch1[] = "hello world";
	char ch2[] = "hello world";
	//int value = strcmp(ch1, ch2);
	//比较两个字符串'\0'之前大小 相等返回0 第一个大于第二个返回1  小于返回-1  


	//int value = strncmp(ch1, ch2, 5);
	//比较'\0'前n个字符大小,相等返回0 第一个大于第二个返回1  小于返回-1 
	//int value = my_strcmp(ch1, ch2);
	//int value = my_strncmp(ch1, ch2, 5);
	//printf("%d\n", value);
	if (!strcmp(ch1, ch2))
	{
		printf("相同\n");
	}
	else
	{
		printf("不相同\n");
	}

	return 0; 
}

11、字符串格式化sscanf、sprintf函数

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

int main11_01()
{
	char ch[100];
	//sprintf(ch, "hello world");
	//sprintf(ch, "%d+%d=%d", 1, 2, 3);
	//sprintf(ch, "%02d+%02d=%02d",1,2,3);
	sprintf(ch, "%x+%o=%d", 0xabc, 110, 17);

	printf("%s\n", ch);


}


int main011()
{
	//char ch[] = "1+2=3";
	char ch[] = "hello world"; 
	int a, b, c;
	char str1[100];
	char str2[100];
	//sscanf(ch, "%[^\n]",str);//正则表达式 读取空格字符 
	sscanf(ch, "%5s%s", str1,str2);
	printf("%s\n%s\n", str1,str2);
	//printf("%d\n", a);
	//printf("%d\n", b);
	//printf("%d\n", c);
	return 0;
}

12、字符串查找strstr函数

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

char* my_strchr(const char* s, int c)
{
	while (*s)
	{
		if (*s == c)
		{
			return s;
		}
		s++;
		NULL;
	}

}

int main12_01()
{
	char ch[] = "hello world";
	char c = 'o';
	//char* p = strchr(ch, c);
	char* p = my_strchr(ch, c);
	printf("%s\n", p);
	return 0;

}

int main12_02(void)
{
	char ch[] = "hello world";
	char str[] = "llo";
	char* p = strstr(ch,str);
	printf("%s\n", p);
}
举报
评论 0