C语言初阶小练习(7)——指针(1)

以下所有题都是用指针实现的,你可能会想,这些题目不用指针也可以写出来,干嘛要多次一举呢?非也,这些只是初级指针,先把基础打好,后来指针的用途可大着呢,可以解决很多其他方法解决不了的问题,所以一起来和菜菜看看下面的题吧~ 


目录

//递减输出三个整数

//逆序打印字符串

//删除其前导星号,中部和尾部不得删除

//删除其前导和尾部星号,中间星号不得删除

//删除其中间星号,前导和尾部星号不得删除 

//用指针编程复制字符串,要求每复制三个字符后插入一个空格

//输入一行字符,统计其中单词的个数


//递减输出三个整数

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int a, b, c;
    printf("请输入三个整数:");
    scanf("%d%d%d", &a, &b, &c);
    int* pa, * pb, * pc, * tmp;
    pa = &a;
    pb = &b;
    pc = &c;
    if (*pa < *pb)
    {
        tmp = *pa;
        *pa = *pb;
        *pb = tmp;
    }
    if (*pa < *pc)
    {
        tmp = *pa;
        *pa = *pc;
        *pc = tmp;
    }
    if (*pb < *pc)
    {
        tmp = *pb;
        *pb = *pc;
        *pc = tmp;
    }
    printf("递减排列为 %d %d %d\n", *pa, *pb, *pc);
    return 0;
}

3c54e85396004ef5b99cff23112172dd.png

//逆序打印字符串

输入字符串:1>gets(arr);2>scanf("%[^\n]",arr)  直到读到\n结束

这里我们就使用gets了,简洁明了。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void reverse(char* str)
{
	int left = 0;
	int right = strlen(str) - 1;
	while (left < right)
	{
		char tmp = *(str + left);
		*(str + left) = *(str + right);
		*(str + right) = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[100000];
	printf("请输入一个字符串:");
	gets(arr);
	reverse(arr);
	printf("%s", arr);
	return 0;
}

这种写法可能有点啰嗦,且还是用到了下标,我们再来用纯指针试一试:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void reverse(char* str)
{
	char* left = str;
	char* right = str + strlen(str) - 1;
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[100000];
	printf("请输入一个字符串:");
	gets(arr);
	reverse(arr);
	printf("%s", arr);
	return 0;
}

fa5b22a13a414b2fb8ec509e35120461.png

· 不使用C语言字符串库函数,编程输入一个只包含字母和*号的字符串有以下要求:

//删除其前导星号,中部和尾部不得删除

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	char arr[30];
	printf("请输入一个字符串:");
	gets(arr);
	char* p = arr;
	while (*p == '*')//直到指向非 * 的位置
	{
		p++;
	}
	while (*p)//打印之后的所有字符
	{
		printf("%c", *p);
		p++;
	}
	return 0;
}

527008ce397847bb86fcb665c241f4ed.png

//删除其前导和尾部星号,中间星号不得删除

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	char arr[30];
	printf("请输入一个字符串:");
	gets(arr);
	char* p1 = arr;//指向第一个非*字符
	char* p2 = arr;//先指向字符串结束符'\0'
	               //后指向尾部第一个非*字符
	//寻找第一个非*字符
	while (*p1 == '*')
	{
		p1++;
	}
	//寻找字符串结束符'\0'
	while (*p2)
	{
		p2++;
	}
	//寻找尾部第一个非*字符
	p2--;
	while (*p2 == '*')
	{
		p2--;
	}
	//打印中间所有字符
	printf("删除后的字符串为:");
	for (; p1 <= p2; p1++)
	{
		printf("%c", *p1);
	}
	return 0;
}

b23d556d52d84adbb7dc8cae59e67e86.png

//删除其中间星号,前导和尾部星号不得删除 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	char arr[30];
	printf("请输入一个字符串:");
	gets(arr);
	char* p1 = arr;//指向第一个非*字符
	char* p2 = arr;//先指向字符串结束符'\0'
	               //后指向尾部第一个非*字符
	char* p3 = arr;
	//寻找第一个非*字符
	while (*p1 == '*')
	{
		p1++;
	}
	//寻找字符串结束符'\0'
	while (*p2)
	{
		p2++;
	}
	//寻找尾部第一个非*字符
	p2--;
	while (*p2 == '*')
	{
		p2--;
	}
	//分三段打印
	printf("删除后的字符串为:");
	while (*p3 == '*')
	{
		printf("%c", *p3);
		p3++;
	}
	while (p1 <= p2)
	{
		if (*p1 != '*')
		{
			printf("%c", *p1);
		}
		p1++;
	}
	p2++;
	while (*p2)
	{
		printf("%c", *p2);
		p2++;
	}
	return 0;
}

38344f4edb994608ab5d893940da8b30.png

//用指针编程复制字符串,要求每复制三个字符后插入一个空格

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	char arr1[100];
	char arr2[100];
	printf("请输入一个字符串:");
	gets(arr1);
	char* p1 = arr1;
	char* p2 = arr2;
	int i = 1;
	for (p1 = arr1, p2 = arr2; *p1 != '\0'; i++)
	{
		if (i % 4 == 0)
		{
			*p2 = ' ';
			p2++;
		}
		else
		{
			*p2 = *p1;
			p1++;
			p2++;
		}
	}
	*p2 = '\0';
	printf("复制后的字符串为:");
	puts(arr2);
	return 0;
}

d20d0968ca2e43299050293507cd3c48.png  

//输入一行字符,统计其中单词的个数

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	char arr[100];
	printf("请输入一行字符:");
	gets(arr);
	int count = 0;
	char* p = arr;
	while (*p)
	{
		if (*p == ' ')
		{
			count++;
		}
		p++;
	}
	printf("有%d个单词\n", count+1);
	return 0;
}

abf2c273127f4116a9361883e76059e3.png


That's all , see you next blog!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值