第六章 指针
1.统计整数个数
【问题描述】输入一个字符串,其包括数字和非数字字符,如:a123x456 17935? 098tab,将其中连续的数字作为一个整数,依次存放到数组a中,统计共有多少个整数,并输出这些数。
【输入形式】数字和非数字字符的字符串
【输出形式】1)整数个数2)分别输出整数
【样例输入】a123x456 17935? 098tab583【注意需要保留带有空格的字符串,请不要使用gets,cin,练习使用cin.getline(char *str, int maxnum)】
【样例输出】
5
123
456
17935
98
583
【样例说明】第一个输出项为整数的个数,后面的分别为具体的整数。注意,不需要输出提示类文字,如:“整数为”,“分别为”等字样。直接输出结果。有一个数字的也要输出。测试用例中没有超过整数范围连续数字。当遇到0开头的数字应舍去0。
#include <iostream>
using namespace std;
int main()
{char str[50],*pstr;
int i,j,k,m,e10,digit,ndigit,a[10],*pa;
cin.getline(str,50);
pstr=&str[0]; //字符指针pstr指向数组str首元素
pa=&a[0]; //指针pa指向a数组首元素
ndigit=0; //ndigit代表有多少个整数
i=0; //i代表字符串中的第几个字符/
j=0; //j代表连续数字的位数
while(*(pstr+i)!='\0')
{if((*(pstr+i)>='0') && (*(pstr+i)<='9'))
j++;
else
{if (j>0)
{digit=*(pstr+i-1)-48; //将个数位赋予digit
k=1;
while (k<j) //将含有两位以上数的其它位的数值累计于digit
{e10=1;
for (m=1;m<=k;m++)
e10=e10*10; //e10代表该位数所应乘的因子
digit=digit+(*(pstr+i-1-k)-48)*e10; //将该位数的数值累加于digit
k++; //位数k自增
}
*pa=digit; //将数值放在数组a中
ndigit++;
pa++; //指针pa指向a数组下一元素
j=0;
}
}
i++;
}
if (j>0) //以数字结尾字符串的最后一个数据
{digit=*(pstr+i-1)-48; //将个数位赋予digit
k=1;
while (k<j) // 将含有两位以上数的其它位的数值累加于digit
{e10=1;
for (m=1;m<=k;m++)
e10=e10*10; //e10代表位数所应乘的因子
digit=digit+(*(pstr+i-1-k)-48)*e10; //将该位数的数值累加于digit
k++; //位数K自增
}
*pa=digit; //将数值放到数组a中
ndigit++;
j=0;
}
cout<<ndigit<<endl;
j=0;
pa=&a[0];
for (j=0;j<ndigit;j++) //打印数据
cout<<*(pa+j)<<endl;
cout<<endl;
return 0;
}
2.字符串排序
【问题描述】有5个字符串,首先将它们按照字符串中字符个数由小到大排序,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。要求:利用字符串指针和指针数组实现。
【输入形式】5个字符串,用回车分隔
【输出形式】输出一个字符串:按5个字符串中字符个数由小到大排序,再分别取出每个字符串的第三个字母合并成一个新的字符串输出,若少于三个字符的输出空格
【样例输入】
test1234
123test
cumt
think
apples
【样例输出】
cumt think apples 123test test1234
concatenate string:mip3s
【样例说明】输出每个字符串之间用一个空格。字符数量相等的串相对顺序不变
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char *pstr[5];
char str[5][50];
for(int i=0;i<5;i++)
{
pstr[i]=str[i];
}
//给指针数组中的指针元素赋值
for(int i=0;i<5;i++)
{
cin>>pstr[i];
}
//输入5个字符串
int i,j;
char *k; //定义指针用于交换
for(i=0;i<4;i++)
{
for(j=0;j<4-i;j++)
{
if(strlen(pstr[j])>strlen(pstr[j+1]))//字符串长度比较
{
k=pstr[j];
pstr[j]=pstr[j+1];
pstr[j+1]=k;
}
}
}
//冒泡排序
for(int i=0;i<5;i++)
{
cout<<pstr[i]<<' ';
}
//排序后输出
cout<<endl<<"concatenate string:";
for(int i=0;i<5;i++)
{
if(*(pstr[i]+2))cout<<*(pstr[i]+2);
else cout<<' ';
}
return 0;
}
3.插入字符串
【问题描述】从键盘输入一个字符串,并在串中的第一次出现的最大元素后边插入字符串”ab”。
【输入形式】任意输入一个字符串
【输出形式】在串中的最大元素后边插入字符串”ab”
【样例输入】
123csCUMT
【样例输出】
123csabCUMT
【样例说明】为了保证输入的字符串有空格,请使用cin.getline(char* , int);不要使用gets,本系统不支持。只插入一次ab。
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char *pstr,str[50];
pstr=str;
cin.getline(str,50);
int len,max=0;//len值字符串的长度,max指最大元素的位置
len=strlen(str);
for(int i=0;i<len;i++)
{
if(*(pstr+i)>*(pstr+max))max=i;
}
//找出最大元素的位置
for(int i=len;i>max;i--)
{
*(pstr+i+2)=*(pstr+i);
}
str[max+1]='a';
str[max+2]='b';
cout<<str;
}