一、指向字符串的指针
1: 什么是字符串?
用双引号括起来的0个或多个字符。"123"
2: 字符串的结束符号'\0'
'\0'它是一个字符,不是一个字符串
3: 字符串的输出:
printf("%s",数组名);
puts(字符串);
输入:
scanf(); 或者 gets();
4: strlen:用来测量一个字符串中所包含的字符个数
二、 指向变量的指针:
int a=3,*p=&a; p--->a
指向一维数组元素的指针:
int a[4]={1,2,3,4},*p=a; p--->a[0]=1
指向一维数组的指针:
int a[3][4],(*p)[4]=a; p--->a[0]---->a[0][0]
一个指针也可以指向字符串:
char *指针名;
char *p; 定义了一个指针p以后这个指针可以指向一个字符串
如何给指向字符串的指针赋初值:
1: 在定义的时候赋初值
char *p="abcd";
2: 在定义之后赋初值
char *p;
p="abcd";
p---->a
b
c
d
\0
说明:
1) 可以把字符串直接赋给一个指针
2) 但是这并不是说吧字符串中的所有字符都赋给了p,而事实上指针p永远只能指向一个字符
指针p一开始指向字符串的第一个字符
3) 一般经常把一维字符型数组与指向字符串的指针结合
4 ) 数组名a是常量,不能自加,而指针p可以移动,p是变量
5 ) 如何把一个指向字符串的指针移动到一个数组的末尾 p=a+strlen(a)-1;
6)讨论 *p
7) 指向字符串的指针就是一个字符串
char *p="abcd" 我们可以说p就是"abcd"
8) 如何通过指针来访问每一个字符:
p=数组名;
while(*p!= '\0')或者while(*p)
{
p++;
}
比如:讨论 *p
char a[100]="1234",*p=a; //定义时候的* 是一个指针标识,以后使用的时候p是指针, *p就是a[0],是一个字符
printf("%c",*p);//*p是一个字符
printf("%s",*p);//错误
printf("%s",p); //p指向字符串
a---->1<----p
2<----p+1
3
4
\0
4) 数组名a是常量,不能自加,而指针p可以移动,p是变量
指向字符串的指针的输出:
puts(指针名);
printf("%s",指针名);
%c输出的是字符
%s输出的是字符串
5) 以字符串作为函数参数的几种格式:
A:型参与实参都用数组
型参: fun(char a[])
实参: fun(a)
B:型参用数组,实参用指针
型参: fun(char a[])
实参: fun(p)//p是指针
C:型参用指针,实参用数组
型参: fun(char *p) p可以当成数组使用
实参: fun(a)//a是数组名
6) 一维字符型数组就是字符串
7) 以数组作为函数的参数,型参数组就是实参数组,实参数组就是型参数组,因为数组名是首地址,实参把数组的地址传给了实参数组,传址关系 。
输出的原理:
以当前指针的位置开始,一直向下输出,直到遇到 \0 为止
main()
{
char a[100]={"abcd123"},*p;
p++;
puts(p);
puts(a);
printf("%s",p);
printf("%d",strlen(p));
p=a+strlen(a)-1; //就可以让指针p直接指向数组的最后一个元素
}
char a[100]={"abcd123"},*p=a;
while(*p!= '\0')
{
p++;
}
指向字符串指针应用举例
strlen(s): 用来返回字符串含有的字符个数,不包含'\0'
sizeof(a): 用来返回一个数组的大小,如果是动态数组,包含最后的\0
指向同一个数组元素的两个指针可以相减,相减的结果是两个指针中间所含有的元素个数。
include "string.h"
void main()
{
char s[100]={"\n123\\"};//s[]
printf("%d\n",strlen(s));//5
printf("%d",sizeof(s)); //100,c 程序会为s分配100个单位的内存地址
}
void main()
{
char s[]={"\n123\\"}; //s[]动态数组,会根据实际情况来分配内存单元
printf("%d\n",strlen(s));//5
printf("%d",sizeof(s)); //6
}
void main() str--->A<---p
{ B
char str[]="ABCD,*p=str; C
printf("%d\n",*(p+4));//0 D
printf("%c\n",*(p+4));// \0<---p+4
}
void main()
{
char s[]="ABCD",*p;
for(p=s;p<s+4;p++)
printf("%s\n",p));
}
key A
B
C
D
void main()
{
char str[]="xyz",*ps=str;
while(*ps)
{
ps++;
}
printf("%d",ps-str);
for(ps--;ps-str >= 0;ps--)
puts(ps); //zyx
}
3
z
yz
xyz
void main()
{
char str[][20]={"hello","beijing"},*p=str[0];
printf("%d",strlen(p+20));//7
}
str --> str[0]--->h <---p
e
l
l
o
\0<---p到这里就跑不动了,下不去了。从这里往下数,后面正好是7个字符
str +1-->str[1]-->b
e
i
j
i
n
j
\0
void main()
{
char s[]="159123",*p;
p=s;
printf("%c",*p++);//1
printf("%c",*p++);//5
printf("%s",p);//"9123"
}
%c 输出的是字符
%s 输出的是字符串
指向字符串的指针二
void fun(char *s,int p,int k)
{
int i;
for(i=p;i<k-1;i++)
{
s[i]=s[i+2];
}
}
main()
{
char s[]="abcdefg";
fun(s,3,strlen(s));
puts(s);//abcfg
}
-------------------------------------------------
void fun(char a[])//把字符串的每一个元素都加一
{
int i;
for(i=0;a[i];i++)
{
a[i]=a[i]+1;
}
}
void move(char *str,int n)//把字符串向右移动一位,并把末尾的字符放到首位。
{
int i;
char temp=str[n-1];//n=5,n表示从哪里开始移
for(i=n-1;i>0;i--)
{
str[i]=str[i-1];
}
str[0]=temp;
}
main()
{
char s[50]="abcde";
int n=3,i,z;
z=strlen(s);//5
for(i=1;i<=n;i++)//移动了3次
{
move(s,z);
}
printf("%s",s);//cdeab
}
一维字符型数组就是字符串
char *p; 这个指针也指向字符串
如果把一个数组的首地址赋给了某个指针,这个指针就可以当数组来使用。
fun(char *p)
{
p[0]
}
main()
{
char a[]={"abcd"};
fun(a);
}
编写一个程序,统计一个字符串中所有字母的出现,不区分大小写
"abcdeabcder"
void fun(char *a,int *b)
{
while(*a)
{
b[*a-'a']++;
*a++;
}
}
void main()
{
}
编写一个函数,它的功能是把字符串str下标为偶数位置上的字符,紧随其后重复出现一次,放在一个新串t中,且t中的字符要按顺序来存放
str="123456" "113355"
t="553311"
void fun(char *str,char *t)
{
int i,j=0;
for(i=strlen(str)-1;i>=0;i--)//倒过来访问字符串的所有字符
{
if(i%2==0)
{
t[j++]=str[i];
t[j++]=str[i];
}
}
t[j]='\0';
}
main()
{
char st[100],t[100];
printf("请输入一个字符串:");
gets(str);
fun(str,t);
puts(t);
}
编写一个函数,目的是把一个字符串的所有单词第一个字母都变成大写字母
字符串的字符都是空格隔开的,并且第一个字符不是空格
"i am a student to take the test" ------>"I Am A Student To Take The Test"
//方法一
void fun(char *a)
{
int i=1,j=0;
if(a[0]>='a' && a[0]<='z') //首字母单独处理
{
a[0]-=32;
}
while(a[i])
{
if((a[i]>='a' && a[i]<='z') && a[i-1]==' ')
{
a[0]-=32;
}
i++;
}
}
//方法二,用指针
void fun(char *a)
{
int i=1,j=0;
if(*a>='a' && *a<='z')
{
*a-=32;
}
while(*a)
{
if((*a>='a' && *a<='z') && *(a-1)==' ')
{
*a-=32;
}
a++;
}
}
题目:
编写一个函数,它的功能是将未在字符串s中出现,而在字符串t中出现的字符,型参一个新的字符串放在u中,
u中的字符按原字符的顺序排列,但要去掉重复字符
至少会想到去考察t,以t为标准
s="12345";
t="224677";
u="67"
//方法一:
void funa(char *s,char *t,char *u)
{
int i,j,k=0,m;
for(i=0;i<strlen(t);i++)
{
for(j=0;j<strlen(s);j++)
{
if(t[i]==s[j])//t[i]包含在s中
{
break;
}
}
if(j==strlen(s))//如果t[i]不存在于s中
{
if(k==0)//第一个时
{
u[k++]=t[i];
}
for(m=0;m<k;m++)//第二个开始检查u中是否已经存在
{
if(t[i]==u[m])
break;
}
if(m==k)
{
u[k++]=t[i];
}
}
}
u[k]='\0';
}
方法二:
int find(char *str,char findcahr)
{
int i;
for(i=0;str[i];i++)
{
if(str[i]==findchar)
return 1;
}
return 0;
}
void funa(char *s,char *t,char *u)
{
int i,j=0,k=0,m;
for(i=0;t[i];i++)//如果t[i]不在s中并且不在u中就放入到u中
{
if(findchar(s,t[i])==0 && findchar(u,t[i])==0)
{
u[j++]=t[i];//表示吧t[i]放入u[j]里面去
}
}
//退出循环后,应该把t[j]做成\0
u[j]='\0';
}
main()
{
char s[20]="13745";
char t[20]="2246778899";
char u[20]="";
funa(s,t,u);
puts(u);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)