指针应用
指针的实践
题目1
编写函数,将字符串s1中从第n个字符开始的最多k个字符复制到字符串s2中。最多的意思是如果s1从n开始的字符不够k个,则复制到末尾为止。如s1="study",n=4,k=5,则只复制“dy”两个字符。函数返回s2的首地址。函数原型为:
char * copykn(char *s1,char *s2,int n,int k)
编写主函数,输入字符,n和k,调用函数复制,输出结果字符串。主函数为:
int main()
{
char s1[100],s2[100];
int n,k;
gets(s1);
scanf("%d %d",&n,&k);
puts(copykn(s1,s2,n,k));
return 0;
}
【输入输出样例】
输入:
communication
2 3
输出:
omm
`已AC代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int min(int a,int b){return a<b?a:b;}
char * copykn(char *s1,char *s2,int n,int k)
{
int tot=strlen(s1);
int cnt=0;
for(int i=n;i<=min(tot,n+k-1);i++)
{
*s2=*(s1+i-1);//Why not be s2=s1+i-1
s2++;
cnt++;
}
*s2='\0';
return s2-cnt;
}
int main()
{
char s1[100],s2[100];
int n,k;
gets(s1);
scanf("%d %d",&n,&k);
puts(copykn(s1,s2,n,k));
return 0;
}
`
解答:字符指针传递是要传递单个的话必须用所指变量赋值而不能用地址赋值,地址赋值之后输出时会自动输出后面的字符直到结束。若用地址传递可手动在新串末尾加上'\0'即可解决!
题目2
字符串排序,就象单词的字典排序。'a'<'b'等等。
编写函数,实现字符串的排序(从小到大),不区分大小写。函数原型为:
void sortstring(char **r,int n);
其中r表示字符串首地址数组的首地址,n表示字符串个数。字符串的首地址放在字符指针数组中,r是这个指针数组的首地址。
编写主函数,输入n和n个单词,调用函数拍序,在主函数中输出排序的单词,每个一行。每个单词的长度不超过20个字符。
【输入输出样例】
输入:
5
study
student
sting
STRING
STRAY
输出:
sting
STRAY
STRING
student
study
`#include <stdio.h>
#include<string.h>
void sortstring(char **r,int n)//等价于*r[]
{
for(int i=1;i<n;i++)
{
for(int j=1;j<=n-i;j++)
{
if(strcasecmp(*(r+j),*(r+j+1))>0)//r[j]和r[j+1]
{
char *tmp;
tmp=*(r+j);
*(r+j)=*(r+j+1);
*(r+j+1)=tmp;
}
}
}
}
int main()
{
char a[100][25];
char *p[100];
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",a[i]);
p[i]=a[i];
}
sortstring(p,n);
for(int i=1;i<=n;i++) printf("%s\n",p[i]);
return 0;
}
`
经典写法,对上一篇文章中多重指针的补充,注意*(r+j)为行指针,这就是为什么**r是指向指针的指针!安利一个无视大小写对字符串排序的函数strcasecmp