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

2023-05-16

一、指向字符串的指针

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(使用前将#替换为@)

c语言之指向字符串的指针学习笔记 的相关文章

  • C++11:noexcept关键字

    1 介绍 C 43 43 11新标准引入的noexcept 运算符 xff0c 可以用于指定某个函数不抛出异常 预先知道函数不会抛出异常有助于简化调用该函数的代码 xff0c 而且编译器确认函数不会抛出异常 xff0c 它就能执行某些特殊的
  • 嵌入式应用程序设计流程

    第三十课 xff1a 应用程序设计流程 哔哩哔哩 bilibili arm linux gcc 交叉编译器 通过挂载实现程序调试 xff1a xff08 省去程序下载环节 xff09 第三十二课 xff1a 文件操作 哔哩哔哩 bilibi
  • uboot和bootloader有啥区别

    uboot和bootloader有啥区别 reboot to bootloader有什么用 IT教学网 片内的ram用来存储启动代码 xff0c 在2440初始化sdram之前 xff0c 代码就在片内ram中运行 片内ram装载的是nor
  • 微内核和宏内核以及混合内核

    操作系统内核的几个重要的特点 xff1a 内核是操作系统的核心部分 xff0c 它管理着系统的各种资源内核可以看成连接应用程序和硬件的一座桥梁 xff0c 是直接运行在硬件上的最基础的软件实体在一些简单的硬件设备上可以没有内核或操作系统而直
  • Adaptive AUTOSAR——Time Synchronization(VRTE 3.0 R21-11)

    15 Time Synchronization 15 1 What is Time Synchronization 时间同步是自适应平台基础中的一个功能集群 时间同步通过库向应用程序提供C 43 43 API xff0c 该库作为RTA V
  • Adaptive AUTOSAR——Update and Configuration Management(VRTE 3.0 R21-11)

    16 1 What is Update and Configuration Management 更新和配置管理 xff08 UCM xff09 是自适应平台服务中的一个功能集群 作为一种自适应平台服务 xff0c UCM实现了自适应平台的
  • Adaptive AUTOSAR 学习笔记 - AP 背景、技术及特征

    本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20 11 版本 本文从AUTOSAR EXP PlatformDesign pdf开始 xff0c 一边学习 xff0c 一边顺带着翻译一下 尽力而为 x
  • gPTP时钟同步(时间同步)协议简介

    一 时间同步要解决的问题 不知道大家还记得军训练习齐步走的场景吗 xff1f 齐步走的动作要领你还记得吗 xff1f 教官首先发出 齐步 走 的命令 xff0c 大家听到 齐步 二字后 xff0c 开始调整动作 xff0c 最终所有人实现动
  • acm有用吗?

    acm有用吗 xff1f 废话 xff0c 没用的话费这么大劲干什么来了 xff0c 但是搞acm需要前期的高付出 xff0c 但是后期会有高回报 xff0c 也不是什么都不管不顾的高付出 xff0c 学好基础课的情况下高付出 中学加小学1
  • std::atomic 原子操作

    类模板 template lt class T gt struct atomic 多线程小结 xff1a 非原子操作 xff0c 不加锁 xff0c 效率很高 xff0c 但无法得到正确的结果非原子操作 xff0c 加锁 xff0c 效率很
  • Adaptive AUTOSAR——Execution Management(VRTE 3.0 R21-11)

    ChatGPT回答 xff1a Adaptive AUTOSAR Execution Management 模块是用于管理软件执行的模块 xff0c 其主要功能包括 xff1a 任务调度 xff1a 支持对任务进行调度和执行 xff0c 以
  • 【C/C++】获取当前系统时间(time_t和tm)清晰梳理

    C C 43 43 获取当前系统时间 xff08 time t和tm xff09 清晰梳理 c 43 43 time t YuXi 0520的博客 CSDN博客 C 43 43 获取系统当前时间 c 43 43 time函数 C 43 43
  • Adaptive AUTOSAR——State Management(VRTE 3.0 R21-11)

    状态管理是自适应平台服务中的一个功能集群 在自适应平台中 xff0c 状态决定了一组活动的自适应应用程序 特定于项目的应用程序 xff0c 即状态管理器 xff0c 决定何时请求状态更改 xff0c 从而更改当前活动的应用程序集 状态管理器
  • Adaptive AUTOSAR 文档官方如何阅读

    目前很多关于 Adaptive AUTOSAR 的文章都是官方文档的简化翻译 xff0c 不如直接看官方文档更全面深入 Adaptive AUTOSAR 文档官方下载地址 Adaptive Platform AUTOSAR https ww
  • Adaptive AUTOSAR-诊断管理-Diagnostic Server概述和诊断通信

    Diagnostic Server 对于AUTOSAR adaptive平台 xff0c 不用重新刷写整个ECU即可添加新的软件包 xff0c 各个软件包描述为SoftwareClusters xff0c 每个SoftwareCluster
  • Linux启动过程

    Linux 系统启动过程 菜鸟教程 Linux 系统启动过程 linux启动时我们会看到许多启动信息 Linux系统的启动过程并不是大家想象中的那么复杂 xff0c 其过程可以分为5个阶段 xff1a 内核的引导运行 init系统初始化建立
  • SOTA技术概述

    SOTA技术概述 懂车帝 懂车帝提供对于整车OTA类型 xff0c 主要分为两类 xff0c FOTA xff08 Firmware over the air xff09 和SOTA xff08 Software over t https
  • 什么是AUTOSAR?为什么汽车公司开始采用AUTOSAR来开发新产品?

    越来越多的车企开始应用ATUOSAR xff0c 也有很多公司在招聘时会在JD里注明 xff0c 应聘者需要熟练掌握AUTOSAR xff0c 那么什么是AUTOSAR xff1f 为什么从奔驰 宝马等传统豪华汽车巨头 xff0c 到新势力
  • 4.5 车载通信技术SOME/IP 白皮书

    1 SOME IP 协议概述 SOME IP xff08 Scalable service Oriented MiddlewarE over IP xff09 是指基于 IP 的可扩展的面向服务的中间件 SOME IP 协议于 2011 年

随机推荐

  • 计算机图形学方向和前景&&3D

    我是刚入坑计算机图形学的小菜鸟 xff0c 在百度上搜索计算机图形学方向和前景和3D xff0c 几乎不能搜到什么有用的东西 xff0c google还能搜到些有用的 xff0c 但是需要翻墙 恰好前几天山大承办的games xff0c 北
  • 在字符串中插入另一个字符串方法二

    算法分析 xff1a 把第一个字符串的前一部分和后一部分分别保存在两个字符串result和tmp中 然后再做一个拼接reslut 61 reslut 43 str2 43 tmp include lt stdio h gt include
  • linux压缩命令学习小结

    1 zip格式压缩 zip 压缩文件名 原文件名 zip命令只能压缩文件 压缩文件Ex xff1a zip file1 zip file1 解压缩 unzip file1 zip zip r 压缩文件名 源目录 加了 r就是压缩目录了 mk
  • c语言之链表学习小结

    1 链表 Typedef struct linkworker 此处Typedef 就是给结构体变量名struct linkworker取别名LINK char id 10 char name 10 struct linkworker nex
  • Linux的vim编辑器的使用方法

    Vim 没有菜单 xff0c 只有命令 vim 编辑器有三种模式 xff1a 1 命令模式 xff08 等待用户输入命令 xff09 xff0c 2 输入模式 xff08 等待用户向文本中输入内容 xff09 xff0c 3 底行模式 xf
  • shell中的俄罗斯方块小游戏

    俄罗斯方块的shell脚本 bin Bash Tetris Game APP declaration APP NAME 61 34 0 34 APP VERSION 61 34 1 0 34 颜色定义 cRed 61 1 cGreen 61
  • 三个方法实现求两个数的最大公约数

    复制而来 xff0c 这不是我写的 xff01 从键盘输入两个整数 xff0c 求着两个整数的最大公约数 解题思路 xff1a 从键盘输入两个数 xff0c 通过以下的三个方法实现求两个数的最大公约数 xff1a 辗转相除法 xff1a 取
  • c语言 一维字符型数组

    什么是一维字符型数组 xff1a char a 5 这个数组中含有5各元素 xff0c 每个元素都是一个字符型变量 如何定义一字符型维数组 xff1a 格式 xff1a char 数组名 长度 ex char a 6 定义了一个含有6个字符
  • c语言常用的几个函数

    strcpy函数 2 xff09 如何给字符串进行赋值 xff1a A 字符串不能直接赋值 B 目前而言 给字符串赋值的方法是通过strcpy函数 C strcpy函数需要string h的头文件的支持 D 在使用strcpy函数时不能把大
  • 两个字符型数组,a[]="abcdefgh",用户输入一个值n,把数组a中右边n个字符复制到数组t中,最后输出数组t的值。

    两个字符型数组 xff0c a 61 34 abcdefgh 34 用户输入一个值n xff0c 把数组a中右边n个字符复制到数组t中 xff0c 最后输出数组t的值 算法分析 xff1a 定义两个字符型数组 char a 61 34 ab
  • 图文详解win10/8.1/7系统cmd命令提示符出现“不是内部或外部命令,也不是可运行的程序或批处理文件”

    声明下 xff1a 本教程支持win10 win8 1 8 win7 winxp等windows桌面系统 首先我们需要打开系统的环境变量 xff0c 那么在哪里能找到环境变量呢 xff1f 当然是在系统属性里了 tips xff1a 按下w
  • 关于字符串前导*的移动/删除的几种情况

    1 编写一个程序把所有字符串的前导 保留 xff0c 其他的 号都删除 效果 xff1a shd swbd dwh 转换成 shdswbddwh 算法分析 xff0c 先研究一个字符串 char a 100 61 34 shd swbd d
  • 函数的嵌套与递归调用

    什么函数的嵌套调用 main gt fun gt fun2 gt fun3 归调用 什么函数的 求1 xff01 43 2 xff01 43 3 xff01 43 4 43 43 n 算法分析 xff1a 写一个函数求n的阶乘 要写一个函数
  • c语言学习之 变量的分类学习笔记

    A 按作用域来分类 全局变量 xff1a 不在任何一个函数里面定义的变量 局部变量 xff1a 在函数里面定义的变量 区别 xff1a 全局变量可以被一个程序中的所有函数都来使用 局部变量只能在定义它的本函数中来使用 所有的函数都共享全局变
  • 以数组作为函数的参数c学习笔记

    以数组作为函数的参数 格式 xff1a 类型标识符 函数名 类型标识符 数组名 int n 处理的代码 A n表示数组的长度 B 在以数组作为函数参数时 xff0c 数组一般不写大小 C 它的大小由变量n来决定 sum int a int
  • c语言之指针之谜

    变量地址的意义 指针的定义 指针的赋初值 通过指针改变变量的值 内存 xff1a xff08 锅 xff09 A 在计算机中有一个很大的处理场 B 程序都是在内存中运行的 C 总结 xff1a 数据的处理场地 外存 xff1a xff08
  • 指向二维数组的指针学习笔记

    二维数组与一维数组的关系 二维数组的指针指向一维数组的指针 一维数组的情况下 xff1a 数组名代表数组首地址 a 43 i 61 a i 二维数组与指针 int a 3 4 61 1 2 3 4 5 6 7 8 9 10 11 12 a
  • 指向一维数组的指针学习笔记

    main int a 61 2 4 6 8 10 y 61 1 x p p 61 amp a 1 for x 61 0 x lt 3 x 43 43 y 43 61 p 43 x 1 43 4 43 6 43 8 printf 34 y 6
  • 生日快乐音乐小程序

    include 34 iostream 34 include 34 time h 34 include lt windows h gt include lt stdio h gt include lt conio h gt using na
  • c语言之指向字符串的指针学习笔记

    一 指向字符串的指针 1 xff1a 什么是字符串 xff1f 用双引号括起来的0个或多个字符 34 123 34 2 xff1a 字符串的结束符号 39 0 39 39 0 39 它是一个字符 xff0c 不是一个字符串 3 xff1a