C语言基础练习(2023-01-09)

问题描述

1、实现字符串移动。

例如char str[]=“AGAB%Sr67gs5ffwt+%”

​ 得到结果是AABGS567grstw%%+

​ 1.1 先对字符串实现升序排序 voidSort(char *p,int n)

​ 1.2 从字符串中挑出大写 char *DaXie(char *p,int n)

​ 1.3 从字符串中挑出数字 char *ShuZi(char *p,int n)

​ 1.4 从字符串中挑出小写 char *XiaoXie(char *p,int n)

​ 1.5 从字符串中挑出特殊字符 char *TeShu(char *p,int n)

​ 1.6 在主函数使用字符指针数组接收返回的字符串地址 char *p[4] p[0]

​ 1.7 按照顺序,实现字符串连接【使用strcat就行,或者调用自己封装的函数】

​ char t[100];

​ strcat(t,p[0]) strcat(t,p[1])

2、判断二维字符数组是否存在回文字符串

​ 例如:char a[] [10]={“asd”,“asa”,“werew”,“yuyu”};

​ 提示存在回文字符串,回文字符串对称

头文件

#include <string.h>
#define N 25

//函数声明
void str_rev_new(char* p);
void str_rev_digui(char str[], int len);
char* str_cat_32(char* dest, const char* src);

//字符串移动的函数声明
void sort_up(char* p, int len);
char* da_xie(char* p, int len);
char* shu_zi(char* p, int len);
char* xiao_xie(char* p, int len);
char* te_shu(char* p, int len);
void huiwen32(char* p);

函数集

#include <stdio.h>
//#include "head.h"


//对字符串实现升序排列
void sort_up(char* p, int len)
{
	char temp;
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - 1 - i; j++)
		{
			if (*(p+j) > *(p+j+1))
			//if (strcmp(*(p + j), *(p + j + 1)) > 0)
			{
				temp = *(p + j);          //单个字符不需要用strcpy来实现交换
				*(p + j) = *(p + j + 1);
				*(p + j + 1) = temp;
			}
		}
	}
}

//从字符串中挑选出大写
char* da_xie(char* p, int len)
{
	static char new[50] = "";
	int temp,j = 0;
	for (int i = 0; i < len; i++)
	{
		temp = *(p + i);
		if ((temp >= 65) && (temp <= 90))
		{
			new[j] = *(p + i);
			j++;
		}
	}
	return new;
}

//从字符串中选择出数字
char* shu_zi(char* p, int len)
{
	static char new[50] = "";
	int temp, j = 0;
	for (int i = 0; i < len; i++)
	{
		temp = *(p + i);
		if ((temp >= 48) && (temp <= 57))
		{
			new[j] = *(p + i);
			j++;
		}
	}
	return new;
}

// 从字符串中选择出小写字母
char* xiao_xie(char* p, int len)
{
	static char new[50] = "";
	int temp, j = 0;
	for (int i = 0; i < len; i++)
	{
		temp = *(p + i);
		if ((temp >= 97) && (temp <= 122))
		{
			new[j] = *(p + i);
			j++;
		}
	}
	return new;
}

//特殊字符
char* te_shu(char* p, int len)
{
	static char new[50] = "";
	int temp, j = 0;
	for (int i = 0; i < len; i++)
	{
		temp = *(p + i);
		if ((temp >= 32) && (temp <= 47))
		{
			new[j] = *(p + i);
			j++;
		}
	}
	return new;
}

//判断字符串是否为回文字符串
void huiwen32(char *p)
{
	int len = strlen(p);
	int j = len - 1, i = 0;
	int flag = 0;
	while (i < j)
	{
		if (*(p + i) == *(p + j))
		{
			i++; j--;
		}
		else
		{
			flag = 1;
			break;
		}
	}
	if (flag == 0)
	{
		printf("%s是回文字符串\n", p);
	}
	else
	{
		printf("%s不是回文字符串\n", p);
	}
}



//指针指向字符串,实现字符的逆置
void str_rev_new(char *p)
{
	int len = strlen(p);
	int i = 0, j = len - 1;
	char temp;
	while (i < j)
	{
		temp = *(p + i);
		*(p + i) = *(p + j);
		*(p + j) = temp;
		i++; j--;
	}
	puts(p);
}

//通过递归实现字符串的逆置(未完成)
void str_rev_digui(char str[], int len)
{
	static int i = 0;
	char str_temp[50] = "";
	strcpy_s(str_temp[i] = str[len - 1]);
	str_rev_digui(str, len - 1);
	i++;
	puts(str_temp);
}

//字符串连接
char* str_cat_32(char* dest, const char* src)
{
	int i = 0, j = 0;
	while (*(dest+i))
	{
		i++;
	}
	while (*(src+j))
	{
		*(dest+i) = *(src+j);
		i++; j++;
	}
	*(dest+i) = '\0';
	return dest;
}

主函数

#include <stdio.h>
#include "head.h"


int main()
{
    char str[] = "AGu12cKCOCh)%s49gaBRIkedn+_(6581";
    int len = strlen(str);
    char* p1 = str;
    printf("bifore = %s\n", str);
    //sort_up(p1, len);
    printf("after = %s\n", str);

    char *p2 = da_xie(p1, len);
    printf("大写字母为:%s\n", p2);
    printf("大写字母地址为:%p\n", p2);
    char* p3 = shu_zi(p1, len);
    printf("数字为:%s\n", p3);
    printf("数字地址为:%p\n", p3);
    char* p4 = xiao_xie(p1, len);
    printf("小写字母为:%s\n", p4);
    printf("小写字母地址为:%p\n", p4);
    char* p5 = te_shu(p1, len);
    printf("特殊字符为:%s\n", p5);      // 未加static之前,所有返回的地址值是相同的

    //使用字符指针数组接收返回的字符串地址
    char* p6[4] = { da_xie(p1, len) ,shu_zi(p1, len) ,xiao_xie(p1, len),te_shu(p1, len) };

    for (int i = 0; i < 4; i++)
    {
        printf("字符指针数组第%d个数组为:%s\n",i+1, p6[i]);
    }

    //再拼接起来
    char temp_str[100] = "";
    char* p7 = temp_str;
    p7 = str_cat_32(p6[0], p6[1]);
    p7 = str_cat_32(p6[0], p6[2]);
    p7 = str_cat_32(p6[0], p6[3]);
    printf("拼接后:%s\n", p7);  //拼接后,p6[0]的内容也随之改变


    char str1[][10] = { "asa","jgjgjghjg","oldasijgo","asdfdsa","ggggggggg"};
    char* p8[5] = { str1[0],str1[1], str1[2] ,str1[3] ,str1[4] };
    for (int i = 0; i < 5; i++)
    {
        //huiwen32(p8[i]);
        huiwen32(*(p8 + i));
    }


    //char str1[25] = "helloworld";
    //char str2[] = "testtest";
    int len = strlen(str1);
    //char* p = str1;
    str_rev_new(p);
    str_rev_digui(str, len);

    //printf("brfore = %s\n", p);
    //char * p1 = str_cat_32(str1, str2);
    //printf("after = %s\n", p1);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值