指针的用处可以节省内存空间,同时为我们的数据处理更加方便
1:编写一函数,将字符串s中的所有字符左移n个位置,串中前n个字符移动最后
第一种方法:假设字符串为abcd, n=1,输出bcda, n=2,输出cdab, n=3,输出dabc,
思路:创建一个新的数组存放数据,两步走,以n为界限,先把n后面的移动到数组里面去,在进行前面的数据的存放,可以借用指针进行移动
n后面字符放到新数组的存放,指针往后移动,一个一个的存放
while(*end!='\0')
{
sstr[i]=*end;
end++;
i++;
}
n前面的字符串到新数组的存放
注意:不可用上面的那个指针,end指针已经指向最后一个了,需重新定义指向分界线的指针newend
while(first<newend)
{
sstr[i]=*first;
first++;
i++;
}
总代码
#include<stdio.h>
int main()
{
char str[50],sstr[50]={0};
char *first,*end;
char *newend;
int n,i=0;
printf("input the string:");
gets(str);
printf("move location number:");
scanf("%d",&n);
first=str;
end=str+n;
newend=str+n;
//同时记得判断n的位置 条件
while(*end!='\0')
{
sstr[i]=*end;
end++;
i++;
}
while(first<newend)
{
sstr[i]=*first;
first++;
i++;
}
sstr[i]='\0';
puts(sstr);
return 0;
}
第二种方法:
思路:使用strncpy函数进行,从第二个字母开始以后的单词对前面进行覆盖,定义一个变量保存第一个字符,循环用来控制移动的次数
void strlshif(char *s,int n)
{
int i,len;
char ch;
len=strlen(s);
for(i=0;i<n;i++)//控制复制的次数
{
ch=s[0];
strncpy(s,s+1,len-1);//strncpy函数的用法:从第二个字符串开始,把后面的字符串覆盖原来完整
//的字符串,同时空出开一个位置,把首位置移动到最后面,进行三次
s[len-1]=ch;
}
总代码:
//优化程序-新的方法
#include<stdio.h>
#include<string.h>
void move(char *s,int n);
int main()
{
char str[50]="0123456789";
move(str,3);
printf("%s\n",str);
return 0;
}
void move(char *s,int n)
{
int i,len;
char ch;
len=strlen(s);
for(i=0;i<n;i++)//控制复制的次数
{
ch=s[0];
strncpy(s,s+1,len-1);//strncpy函数的用法:从第二个字符串开始,把后面的字符串覆盖原来完整
//的字符串,同时空出开一个位置,把首位置移动到最后面,进行三次
s[len-1]=ch;
}
}
2:输出子串的长度
定义char *first指针指向子串第一个的地址,同时定义char *end指向末尾的字符的内存空间
同时运用新的数组进行子串的存放操作
startloc指向起始位置,其位置随用户手动定义,len指从起始位置开始要输出字符的数量
那么字符串的尾指针可表现为:end=s+startloc+len;
结束条件:随着头指针的移动,first到尾指针就要结束此次循环
char *substr(char *s,int startloc,int len)
{
static char sstr[50];//需要借用另外一个数组去储存
int i;
char *first,*end;
first=s+startloc;
end=s+startloc+len;//一个指向初始位置,一个指向末尾
while(first<end)
{
sstr[i]=*first;
first++;
i++;
}
return (sstr);
}
总代码:
#include<stdio.h>
//指针的使用
char *substr(char *s,int startloc,int len);
int main()
{
char str[50];
int length,start;
gets(str);
printf("input the start location:");
scanf("%d",&start);
printf("input the length:");
scanf("%d",&length);//记得判断初始和末尾不存在的可能性
printf("the substrimg is %s",substr(str,start,length));
return 0;
}
char *substr(char *s,int startloc,int len)
{
static char sstr[50];//需要借用另外一个数组去储存
int i;
char *first,*end;
first=s+startloc;
end=s+startloc+len;//一个指向初始位置,一个指向末尾
while(first<end)
{
sstr[i]=*first;
first++;
i++;
}
return (sstr);
}
3:判断回文也可以使用指针啦;方法也是一样的,同样是定义一个头指针和一个尾指针
头指针逐渐往后移动,尾指针逐渐往前移动,判断两个指针指向的字符是否相等
while(first<=end)
{
if(*first==*end)
{
first++;
end--;
}
else
{
return(-1);//如果用exit的话,直接退出整个程序,则不在执行后面的程序
}
}
return (1);
#include<stdio.h>
#include<string.h>
int fun(char *first,char *end);
int main()
{
char str[50];
int len;
int c;
printf("input the string:");
gets(str);
len=strlen(str)-1;
c=fun(str,str+len);
if(c==1)
printf("the string is right");
else
printf("no");
return 0;
}
int fun(char *first,char *end)
{
while(first<=end)
{
if(*first==*end)
{
first++;
end--;
}
else
{
return(-1);//如果用exit的话,直接退出整个程序,则不在执行后面的程序
}
}
return (1);
}