C++ | 指针习题 | 字符串指针、数组指针的应用

C++ | 指针习题总结-随时更新~



前言

题目来自谭浩强c++程序设计第三版,以及网络各大平台。

一、 字符串指针

1.编写一个函数,用来求字符串的长度

使用while循环语句实现,函数的返回值为int类型
代码如下(示例):

#include <iostream>

using namespace std;
int main(int argc, char *argv[]) {
	int length(char *str);
	char str[20];
	cout<<"input string:"<<endl;
	cin>>str;
	cout<<"the length of string is "<<length(str)<<endl;
}
int length(char *str)
{
	int len=0;
	while(*str!='\0')
		{  str++;len++;  }
	return len;
}

2.字符串从第m个字符开始复制

有一个字符串,包含n个字符,编一个函数将此字符串中从第m个字符开始的全部字符复制成另外一个字符串
两种方法

  • 定义str1为原字符串,str2为复制后形成的字符串,m表示从第m个字符开始复制
    代码如下:
#include <iostream>

using namespace std;
int main(int argc, char *argv[]) {
	void string_copy(char *,char *,int m);
	char *str1="hello  everyone!";
	char str2[20];
	int m;
	cout<<"请输入开始复制的字符位置:"<<endl;
	cin>>m;
	if(m>strlen(str1)) cout<<"输入错误"<<endl;
	else {
		string_copy(str1,str2,3);
		cout<<str2<<endl;
	}
}
void string_copy(char *str1,char *str2,int m)
{
	
	while(*(str1+m-1)!='\0')
	{
		*str2=*(str1+m-1);
		str2++;
		m++;
	}
	*str2='\0';
	//或者
	/*
	for(int i=m-1;i<len;i++)
	{
		*str2++=*(str1+i);
	}
	*str2='\0';
	*/
}

  • 第二种
#include <iostream>

using namespace std;
int main(int argc, char *argv[]) {
	void string_copy(char *,char *,int m);
	char str1[20],str2[20];
	cout<<"input string:"<<endl;
	gets(str1);//注意这里最好使用gets函数,因为cin>>在输入时遇到空格即停止输入
	int m;
	cout<<"请输入开始复制的字符位置:"<<endl;
	cin>>m;
	if(m>strlen(str1)) cout<<"输入错误"<<endl;
	else {
		string_copy(str1,str2,3);
		cout<<str2<<endl;
	}
}
void string_copy(char *str1,char *str2,int m)
{
	int n=0;
	while(n<m-1)
	{
		n++;str1++;//先将str1与str2的初始位置对齐
	}
	while(*str1!='\0')
	{
		*str2=*str1;
		str1++;
		str2++;
	}
	*str2='\0';
}

2.1 延伸-字符串str1从第m个字符开始截取长度为len的字符串str2

#include <iostream>

using namespace std;
int main(int argc, char *argv[]) {
	void string_copy(char *,char *,int m,int len);
	char str1[20],str2[20];
	cout<<"input string:"<<endl;
	gets(str1);
	int m,len;
	cout<<"请输入开始复制的字符位置:"<<endl;
	cin>>m;
	cout<<"请输入需要复制的字符数:"<<endl;
	cin>>len;
	if(m>strlen(str1)||len<0||m<1||len>(strlen(str1)-m+1)) cout<<"输入错误"<<endl;
	else {
		string_copy(str1,str2,m,len);
		cout<<str2<<endl;
	}
}
void string_copy(char *str1,char *str2,int m,int len)
{
	int n=0,i=0;
	while(n<m-1)
	{
		n++;str1++;//先将str1与str2的初始位置对齐
	}
	for(int i=0;i<len && *str1!='\0';i++)
	{
		*str2++=*str1++;
	}
	*str2='\0';
}

2.2 延伸-删除字符串str中从第m个字符开始的n个字符

#include <iostream>

using namespace std;
int main(int argc, char *argv[]) {
	void string_dele(char *,int m,int n);
	char str[20];
	cout<<"input string:"<<endl;
	gets(str);
	int m,n;
	cout<<"请输入要删掉的字符位置:"<<endl;
	cin>>m;
	cout<<"请输入需要删除的字符数:"<<endl;
	cin>>n;
	if(m>strlen(str)||n<0||m<1||n>(strlen(str)-m+1)) cout<<"输入错误"<<endl;
	else {
		string_dele(str,m,n);
		cout<<str<<endl;
	}
}
void string_dele(char *str,int m,int n)
{
	int i=0;
	for(i=m-1;i<strlen(str)-n;i++)
	{
		*(str+i)=*(str+i+n);
	}
	*(str+i)='\0';
}

3.字符串排序

在主函数中输入5个等长的字符串,用一个函数对它们进行排序,在主函数中输出这五个已经排好序的字符串

这个题目可以用三种方法实现

1.用字符型二维数组 void sort_string(char str[][10]);
2.用指向一维数组的指针作函数参数 void sort_string(char (*p)[10]);
3.用string数组 void sort_string(string *);//记得加头文件

代码如下:

  • 字符型二维数组
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){
	void sort_string(char str[][6]);
	char str[5][6];
	cout<<"input:"<<endl;
	for(int i=0;i<5;i++)
	{  cin>>str[i]; }
	sort_string(str);
	cout<<"排序后:"<<endl;
	for(int i=0;i<5;i++)
	{
		cout<<str[i]<<endl;
	}
	return 0;
}
void sort_string(char str[][6])
{
	int i,j;
	char *p,temp[6];
	p=temp;
	for(i=0;i<4;i++)
	{
		for(j=0;j<4-i;j++)
		{
			if(strcmp(str[j],str[j+1])>0)
			{
				strcpy(p,str[j]);
				strcpy(str[j],str[j+1]);
				strcpy(str[j+1],p);
			}
		}
	}
}
  • 用指向一维数组的指针做函数参数
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
	void sort_string(char (*str)[6]);
	char str[5][6];
	char (*p)[6];
	cout<<"input:"<<endl;
	for(int i=0;i<5;i++)
		{  cin>>str[i]; }
	p=str;
	sort_string(p);
	cout<<"排序后:"<<endl;
	for(int i=0;i<5;i++)
		{
			cout<<str[i]<<endl;
		}
	return 0;
}
void sort_string(char (*str)[6])
{
	int i,j;
	char temp[6],*t=temp;
	for(i=0;i<4;i++)
	{
		for(j=0;j<4-i;j++)
			{			
				if(strcmp(str[j],str[j+1])>0)
				{
					strcpy(t,str[j]);
					strcpy(str[j],str[j+1]);
					strcpy(str[j+1],t);
				}
		}
	}
}
  • string数组实现
#include <iostream>
#include<string>
using namespace std;
int main(int argc, char *argv[]) {
	void sort (string *s);
	void sort2(string *s);
	string str[5];
	cout<<"input:"<<endl;
	string *p;
	p=str;
	for(int i=0;i<5;i++)
		{	cin>>str[i];}
	cout<<endl;
	
	sort2(str);
	for(int i=0;i<5;i++)
		{  cout<<str[i]<<endl;	}
	return 0;
}
void sort(string *s)//冒泡
{
	int i,j;
	string temp;
	for(i=0;i<4;i++)
		{
			for(j=0;j<4-i;j++)
				{
					if(s[j]>s[j+1])
						{
							temp=s[j];
							s[j]=s[j+1];
							s[j+1]=temp;
						}
				}
		}
}
void sort2(string *s)//选择排序
{
	int i,j,max;
	string temp;
	string *p;
	p=s;
	for(i=0;i<4;i++)
		{
			max=i;
			for(j=i+1;j<5;j++)
				{
					if(s[j]>s[max]){	max=j; }
				}
			if(max!=i)
			{
				temp=s[max];
				s[max]=s[i];
				s[max]=temp;
			}
		}
}

4.连接两个字符串

写一个函数,使其能够实现两个字符串的连接
代码如下:

#include <iostream>
using namespace std;
int n=10;
int main(int argc, char *argv[]) {
	void connect_string(char *str1,char *str2);
	char str1[40];
	char str2[10];
	gets(str1);
	gets(str2);
	connect_string(str1,str2);
	cout<<str1<<endl;
}
void connect_string(char *str1,char *str2)
{
	int i=0,j=0;
	while(*(str1+i)!='\0') i++;
	while(*(str2+j)!='\0')
	{   *(str1+(i++))=*(str2+(j++));  }
	*(str1+i)='\0';
}

4.1延伸-从start位置插入字符串

编写一个函数实现将字符串substr插入到字符串str的第start个字符后面
代码如下:

#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
	void insert_string(char *str,char *substr,int start);
	int start;
	char str[40];
	char substr[10];
	cout<<"请输入字符str:"<<endl;
	gets(str);
	cout<<"请输入字符substr:"<<endl;
	gets(substr);
	cout<<"请输入插入字符的位置:"<<endl;
	cin>>start;
	while(start>strlen(str))
	{
		cout<<"输入的位置超过字符串str的长度,请重新输入:"<<endl;
		cin>>start;
	}
	insert_string(str,substr,start);
	cout<<str<<endl;
}
void insert_string(char *str,char *substr,int start)
{
	int len=strlen(str);
	int sublen=strlen(substr);
	for(int i=len-1;i>=start-1;i--)
	{
		str[i+sublen]=str[i];
	}
	for(int i=0;i<sublen;i++)
	{
		str[i+start-1]=substr[i];
	}
	str[len+sublen]='\0';
}

5.将字符串中下标为奇数位置上的字母转换为大写

编写一个函数,将字符串中所有下标为奇数位置上的字母转换为大写,若该位置上不是字母,则不转换
如,字符串为 student,转换后为sTuDeNt

代码如下:

#include <iostream>

using namespace std;
int main(int argc, char *argv[]) {
	void change(char *str);
	char str[10]="student";
	change(str);
	cout<<"转换后: "<<str<<endl;
}
void change(char *str)
{
	int len=strlen(str);
	for(int i=1;i<len;i=i+2)
	{
		if(*(str+i)>='a'&&*(str+i)<='z')
			*(str+i)=*(str+i)-32;
	}
}

6.统计字符串substr在字符串str中出现的次数

代码如下:

#include <iostream>

using namespace std;
int main(int argc, char *argv[]) {
	int count(char *str,char *substr);
	char *str="hello,world,hello,boys,hello,everyone";
	char *substr="o";
	int num=count(str,substr);
	cout<<substr<<"在"<<str<<"中出现了"<<endl;
	cout<<num<<"次"<<endl;
}
int count(char *str,char *substr)
{
	int i,j,k,num=0;
	for(i=0;i<strlen(str);i++)
	{
		for(j=i,k=0;*(str+j)==*(substr+k);k++,j++)
		{
			if(*(substr+k+1)=='\0') 
				{ num++;break;}
		}
	}
	return num;
}

7.编写程序:输入一行英文字符串,统计单词的个数(单词和单词以空格分隔)。

代码如下:

#include <iostream>

using namespace std;
//编写程序:输入一行英文字符串,统计单词的个数(单词和单词以空格分隔
int main(int argc, char *argv[]) {
	int count01(char *str);
	int count02(char *str);
	char str[30] ;
	
	gets(str);
	int c=count01(str);
	cout<<"单词个数为"<<c<<endl;
	cout<<"单词个数为"<<count02(str)<<endl;
}
int count01(char *str)
{
	int num=0;
	int j=0;
	if(str[j]==' ') j++; 
	if(str[j]!='\0') {num++;j++;} 
	for(int k=j;k<strlen(str);k++) 
		{
			if(str[k]==' '&& str[k+1]!=' '&& str[k+1]!='\0')
				num++; 
			if(str[k]=='\0') break; 
		}
	return num;
}
int count02(char *str)
{
	int num=0;
	int len=strlen(str);
	for(int i=0;i<len;i++)
		{
			if(str[i]!=' '&&(str[i+1]==' '||str[i+1]=='\0'))
				{
					num++;
				}
		}
	return num;
}

8.字符串删除-将字符串str中大于等于字符ch的所有字符全部删除,结果仍然保留在原字符串中

例如输入”abcde“,指定字符为’d’,则输出”abc“
代码如下:

#include <iostream>

using namespace std;
//将字符串str中大于等于字符ch的所有字符全部删除,结果仍然保留在原字符串中
//例如输入”abcde“,指定字符为'd',则输出”abc“
int main(int argc, char *argv[]) {
	void delete_str(char *str,char ch);
	char str[30] ;
	gets(str);
	delete_str(str,'z');
	cout<<str<<endl;
}
void delete_1(char *str,char ch)
{
	char *p = str;
	int i = 0;
	while(*p)
		{
			if (*p <ch)
				str[i++] = *p;
			p++;
		}
	str[i] = '\0';
}

9.字符串替代-写一个函数将字符串str中所有子串s1用s2字符串替代

代码如下:

#include <iostream>

using namespace std;
int main(int argc, char *argv[]) {
	void sub_str(char *str,char *s1,char *s2);
	char *str="hello,my name is Herry";
	char *s1="Herry";
	char *s2="Amily";
	sub_str(str,s1,s2);
	cout<<str<<endl;
}
void sub_str(char *str,char *s1,char *s2)
{
	int i,j,k,flag;
	for(i=0;str[i]!='\0';i++)
	{
		for(j=i,k=0;s1[k]!='\0';j++,k++)
		{
			if(s1[k]==str[j]) flag=1;
			else flag=0;break;
		}
		if(flag)
		{
			for(k=0;s2[k]!='\0';k++)
			{
				str[i++]=s2[k];
				
			}
			i--;
		}
	}
}



二、 数组指针

1. 有n个整数,使前面各个数的顺序向后移m个位置,最后m个数变成最前面m个数,写一个函数实现该功能。

该题目有两种思路,一是用递归,调用m次自身,二是用for循环循环m次

  • 递归方法
    代码如下:
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
	void move(int *arr,int n,int m);
	int m;
	int arr[10];
	cout<<"Please enter 10 numbers: ";
	for (int i=0;i<10; i++)
	{
		cin>>arr[i] ;
	}
	cout<<"Please enter move number: ";
	cin>>m;
	while (m<0||m>10){
		cout<<"Error! Retry!\nPlease enter 10 numbers: ";
		cin>>m;
	}
	cout<<"改变前:";
	for(int i=0;i<10;i++)
		{
			cout<<*(arr+i)<<"  ";
		}
	cout<<endl;
	move(arr,10,3);
	cout<<"改变后:";
	for(int i=0;i<10;i++)
		{
			cout<<*(arr+i)<<"  ";
		}
}
void move(int *arr,int n,int m)
{
	int arr_end,*p;
	arr_end=*(arr+9);
	for(p=arr+9;p>arr;p--)
	{
		*p=*(p-1);
	}
	*arr=arr_end;
	m--;
	if(m>0)
		move(arr,n,m);
}
  • 利用for循环语句实现
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
	void input(int *arr,int n);
	void change_number(int *arr,int m,int n);
	void output(int *arr,int n);
	int arr[10];
	input(arr,10);
	change_number(arr,3,10);
	output(arr,10);	
}
void input(int *arr,int n)
{
    cout<<"Please enter 10 numbers: ";
	for(int i=0;i<n;i++)
	{
		cin>>arr[i];
	}
}
void change_number(int *arr,int m,int n)
{
	int temp;
	int *p;
	p=arr;
	for(int i=0;i<m;i++)
	{ 
		temp=*(arr+n-1);
		for(int j=n-1;j>=0;j--)
		{
			*(p+j)=*(p+j-1);
		}
		*p=temp;
	}
}
void output(int *arr,int n)
{
	for(int i=0;i<n;i++)
		{
			cout<<"  "<<arr[i];
		}
	cout<<endl;
}


2. 编写一个函数能够删除整型数组arr中所有值为num的元素,num在主函数中输入

这里引入一个全局变量n,用来标记数组的位置
代码如下:

#include <iostream>
using namespace std;
int n=10;
int main(int argc, char *argv[]) {
	void del_number(int *arr,int num);
	int arr[10]={5,2,5,4,5,6,7,8,9,10};
	int num;
	cout<<"请输入要删除的数:"<<endl;
	cin>>num;
	del_number(arr,num);
	for(int i=0;i<n;i++)
	{
		cout<<arr[i]<<"   ";
	}
}
void del_number(int *p,int num)
{
	for(int i=0;i<n-1;i++)
	{
		if(*(p+i)==num)
		{
			for(int j=i;j<n-1;j++)
			{
				*(p+j)=*(p+j+1);
			}
			n--;
		}
	}
	if(*(p+n-1)==num) n--;
}

3. 判断一个数组是否“回文”

回文即正向和反向的顺序一样,如abcba

#include <iostream>

using namespace std;
bool judgehuiwen(int *arr,int len)
{
	for (int i = 0; i < len/2; i++)
		{
			if (arr[i] != arr[len-1-i])
				{
					return 0;
				}
		}
	return 1;
}
int main(int argc, char *argv[]) {
	int arr[]={1,2,3,4,5,4,3,2,1};
	if(judgehuiwen(arr,9))
	{
		cout<<"是回文"<<endl;
	}
	else cout<<"不是回文"<<endl;
}

三、 指针的其他应用

1.输入一行文字,找出大写字母、小写字母、空格、数字以及其他字符各有多少

代码如下:

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
	int upper=0,lower=0,dig=0,space=0,other=0,i=0;
	char *p,s[20];
	cout<<"输入:"<<endl;
	while((s[i]=getchar())!='\n')
		i++;
	p=&s[0];
	while(*p!='\n')
		{
			if(('a'<=*p)&&(*p<='z'))
				{  ++lower;  }
			else if(('A'<=*p)&&(*p<='Z'))
				{  ++upper; }
			else if(('0'<=*p)&&(*p<='9'))
				{  ++dig; }
			else if(*p==' ')
				{  ++space; }
			else {++other;}
			p++;
		}
	cout<<"大写字母个数为:"<<upper<<endl;
	cout<<"小写字母个数为:"<<lower<<endl;
	cout<<"数字个数为   :"<<dig<<endl;
	cout<<"空格个数为   :"<<space<<endl;
	cout<<"其他字符个数为:"<<other<<endl;
	
}








总结

11.20更新
12.01更新3题
谨以此文献给考843管科综合的小伙伴们

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值