c语言之指向字符串的指针学习笔记

一、指向字符串的指针

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);
}

 

 


 

 

 

  • 29
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aFakeProgramer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值