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管科综合的小伙伴们