C 语言初级入门(10)--字符串




1、用一维字符数组存放字符串

C 语言对字符串的约定:
字符串是借助于字符型一维数组存放的,并规定以字符‘\0’作为字符串的结束标志
;'\0' 作为标志占用存储空间,但不计入串的实际长度;



C 语言中表示字符串常量的约定:
虽然C语言中没有字符数据类型,但却允许是字符串常量,由双引号括起来的一串字符;


C 语言中字符串常量给出的是地址值:
每个字符串在内存中占用一串连续的存储空间,这些连续的存储空间实际上就是
字符型一维数组。不同的字符串在内存中占有不同的存储空间;也就是说,在
C语言中,字符串常量被隐含处理成一个以'\0' 结尾的无名字符型一维数组;


例如:char *sp; sp = "hellow";
说明:这个语句并不是把字符串的内容放到了sp中,而只是把字符串中的内存
中所占的首地址赋予了char类型的指针变量sp,使指针变量sp指向该字符串;


2、字符数组与字符串的区别:
字符数组的每一个元素可存放一个字符,但它并不限定最后一个字符应该是什么,
而字符串则要求最后一个必须是'\0'作为结束标示。在字符数组中可以存放
字符串,但不能通过赋值语句将字符串常量或其它字符数组中的字符串直接赋给
字符串数组变量;


3、通过赋初值的方式给一维字符数组赋初值:

    char str[10] = {'2','3','A'};



4、在赋值时直接赋字符串常量
char str[10] ={"string"};  //习惯上省略{}
char str[10]="string!";(这种方式会自动给字符串的末尾添加结束标识,
但需要注意的是字符串数组的长度一定要比赋值的长度多一个)


(数组名是一个地址常量,地址常量时不能被改变的)


5、给数组元素逐个赋字符值,最后加入串结束标志;


6、使指针指向一个字符串:
6.1、通过赋值的方式使指针指向一个字符串
char *psl = "form one"; (后面的这个字符串代表的是一个地址,首地址)
意思:把存放字符串的无名存储区首地址赋给指针变量psl,(不要误以为是将字符串
赋给了psl)


6.2、通过赋值运算使指针指向一个字符串:
char *psl;
psl="form one";


6.3、用字符数组作为字符串和用指针指向的字符串之间的区别:
char mak[] = "program";
char *pmark = "program";
区别:
mak 代表的是一个固定的存储空间,但指针变量pmark中的地址可以改变而
指向另外一个长度不同的字符串,一旦pmark指向新的字符串而没有另一个指针
指向原来的字符串,则此字符串将会“丢失”,其所占的存储空间也将无法引用;


7、字符串的输入和输出:
7.1、输入和输出字符串时的必要条件
  当对字符串进行办出时,输出项可以是字符串常量或字符数组名,也可以是已经指向字符串的字符指针变量;
  当对字符串进行输入时,输入项可以是字符数组名,也可以是字符指针变量;


7.2、用格式说明%s进行整串输入和输出
7.2.1、scanf();函数
scanf("%s",str_adr);
这里的str_adr 是地址值,它可以是字符数组名,字符数组元素的地址或
字符指针变量。


注:用%s 格式符输入字符串时,空格和回车符都作为输入数据的分隔符而不能被读入;
若输入字符串的长度超过数组所能容纳的字符个数时,系统并不报错;
当输入项是数组元素的地址时,输入字符将从这一元素开始依次存放在该数组中
当输入项是字符指针变量时,该指针变量必须已指向确定的有足够空间的连续存储单元;


7.2.2、print();函数中使用格式说明%s 可以实现字符串的整体输出;
printf("%s",str_adr);


7.2.3、调用gets();puts();函数在终端输入或输出一行字符串


8、字符串数组
:字符串数组就是数组中每个元素都是一个存放字符串的一维数组;


8.1、字符串数组可以在定义的时候同时赋初值
char ch[]3[5] = {"aaa","bb","ccc"}; =={{},{},{}}
或者写成:char ch[][5] = .......


8.2、可以定义字符型数组并通过赋初值来构成一个类似的字符串数组
char *pa[3] = {"a","bb","ccc"};
说明:指针数组pa的每个元素指向一个字符串,也就是说,数组pa的每个元素中存放着一个
字符串的首地址;

9、用于字符串处理的函数:
9.1、字符串复制函数strcpy(s1,s2);
将s2的值复制到s1所指向的空间,返回s1的值,即目的的首地址;注意:为保证
复制的合法性,s1必须指向向下足够 容纳s2串的存储空间;


9.2、字符串连接函数strcat(s1,s2);
该函数将s2 所指字符串的内容连接到s1所指向的字符串后面,并自动覆盖s1串末尾的
\0,注意:s1所指的字符串应有足够的空间容纳两种合并后的内容;


9.3、求字符串的长度:strlen(s);
求字符串s的长度,这个长度不包括串尾的结束标志0;


9.4、字符串比较函数:strcmp(s1,s2);
s1>s2 === >0
s1==s2==== =0;
s1<s2==== <0

 案例:编写函数slength(char *s),函数返回指针s所指向字符串的长度,即相当于库函数strlen的功能;

 要求:形参s是指向字符串首地址的指针,计算字符串的长度,只需逐个统计串中字符个数,直到遇到串结束标志\0为止

#include<stdio.h>
int slength(char *s)
{
	int n=0;
	while(*(s+n)!='\0')
	{
		n++;
		
	}
	return (n);
}
main()
{

	char str[]="ABCDEF";
	int len1,len2;
	len1=slength(" ");
	len2=slength(str);
	printf("len2=%d \n",len2);

	/*
	char str[10]; int i;
	for(i =0;i<9;i++)
	{
		scanf("%c",&str[i]);  //输入值
	}
	str[i]='\0';
	*/
}

转载于:https://my.oschina.net/lazyou/blog/126744

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值