C语言的字符串函数

关于字符串函数

字符串:
一个或多个字符的序列 如:’‘hello world’’ (双引号进告知编译器他括起来的是字符串)
字符串都被存储在char类型的数组中。数组又连续的存储单元组成,字符串中的字符被存储在相邻的存储单元中,每个单元存储一个字符。
字符串常量’‘X’'和字符’X’的区别:
1.‘X’是基本类型,而’‘X’‘是派生类型。
2.’‘X’'实际上由两个字符组成:'X’和空字符\0

字符串输入函数

简单的汇总一下:
scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
getchar()、getche()、getch():这三个函数都用于输入单个字符。
gets():获取一行数据,并作为字符串处理
scanf()这里不细说了哈。

1.getchar()
从键盘上读入一个字符,并显示该字符(称为回显),通常把输入的字符付给一个字符变量,构成一个赋值语句。
要注意的是,getchar()函数的括号中没有参数,该函数的输入一直到回车才结束。回车前的所有输入字符都会逐个显示在屏幕,但**只有第一个字符作为函数的返回值。**同时。getchar()用户在键盘上输入一个字符需要按一次回车键才能被接受。

2.getche()与getch()
格式:

ch=getch();
putchar(ch);

getch()函数不将键盘上输入的字符回显在屏幕上,所以如果用在密码输入上,是比较好的选择。
getcge()将输入的字符会回显屏幕上。与getchar()不同的是,两者都只接受一次输入。

3.gets()函数
调用形式:gets(字符串数据);
==在输入字符串时,必须使用回车作为输入结束。==当然,这个回车符不属于这个字符串,有字符串结束标志\0在字符串的最后来替代它。gets()函数返回一个指针。

字符串输出函数

puts()函数
puts函数很容易使用,只需要把字符串的地址作为参数传递给它即可。

#include<stdio.h> 
int main(void) 
{    
	char str[80]="An array was initialized to me";    
      	const char *str2="A pointer was initialized to me";    
      	puts(str1);   
       	puts(str2);    
       	puts(&str1[5]);    
       	puts(str2+4);   
        return 0;   
   } 

该程序输出如下:

An array was initialized to me
A pointer was initialized to me
ray was initialized to me
inter was initialized to me

如上图所示,puts()函数输出时会自动在字符串末尾添加一个换行符。
该实例说明,用双引号括起来的内容是字符串常量,且被视为该字符串的地址。另外存储字符串的数组名也被看作是地址。其中表达式:&str1[5]时str1数组的第6 个元素(r),puts()函数从该元素开始输出。同理,最后一个puts()调用时,str2+4指向储存"pointer"中i的存储单元,puts()从这里开始输出。
puts()函数在遇到空字符的时候就停止输出,所以必须确保有空字符。

fputs()函数
fputs()函数是针对文件定制的版本。与puts()函数区别如下:

  1. fputs()函数的第二个参数指明要写入数据的文件。
  2. 与puts()函数不同,fputs()函数不会自动在输出的末尾添加换行符
    注意,gets()函数丢弃输入中的换行符,但是puts()函数在输出中添加换行符。另一方面fgets()函数保留输入中的换行符,fputs()函数不在输出的末尾添加换行符。

printf()函数
printf()函数的执行机制在站上申请存储空间,规则为先进后出。printf()不会自动在每个字符串末尾加上一个换行符。因此,b必须在参数中指明在哪里使用换行符。格式:printf("%s",字符串名称); 若输出的为字符则使用%c。

字符串函数

字符串函数所属函数库:<string.h>

strlen( )函数
计算字符串中的字符长度。包括空格与标点符号,不包括字符串末尾的空字符。(可参考上一篇博客)

strcat( )函数
用于拼接字符串
格式:strcat(字符数组1,字符串2)
接受两个字符串作为参数,该函数把第二个字符串的备份附加在第一个字符串的末尾,并把拼接后的新字符串作为第一个字符串,第二个字符串不变。字符数组1只能是字符数组名,字符数组2可以是字符串常量或字符数组名。strcat()函数类型为char*(指向char的指针),strcat函数返回第一个参数,即字符数组1的首地址。

注意:第一个字符串所在的数组必须要能够容纳第二个字符串。所以分配给第一个数组的空间一定要足够大。否则会造成越界上的混乱。
例如:

char str1[30]="I am a ";
puts(stract(str1,"student. "););

运行时输出:I am a student.

strncat( )函数
与strcat()函数不同的是,该函数无法检查第一个数组是否能容纳第二个字符串。

注意,要给拼接后的字符串长度加1才够空间存放末尾的空字符。或者,用strncat()该函数的第3个参数指定了最大添加字符
例如:strncat(bugs,addon,13)将把addon字符串的内容附加给bugs,在加到第13个字符时或者遇到空字符时停止。
因此,算上空字符,bugs数组应当足够大,以容纳原始字符串,添加在原始字符串后面的13个字符以及空字符串。

strcpy( )函数
字符串复制函数。
格式:
strcpy(字符数组1,字符串2);
功能:讲一个一直的字符串拷贝复制到指定的字符数组或字符指针中。该函数返回新复制的字符串的首地址。
执行该函数将字符串2复制到字符数组1的地址空间中,复制的时候包括字符串2的结束符’\0’。
注意:字符串的复制一定不能采用赋值运算符(=)进行复制。
strcpy()函数还有另外两个有用的属性:

  1. strcpy()的返回类型为char *,该函数返回的是第一个参数的值,及第一个字符的地址。
  2. 第一个参数不必指向数组的开始。

strcmp( )函数
字符串比较函数
格式:strcmp(字符串1,字符串2);
功能:字符串内容的比较,返回比较结果。首先强调的是内容,不是字符串的地址!,也不是比较数组。
它对字符串1和字符串2中的所有字符从左至右逐个按照其ASCII码值进行比较,直到字符值不相等或遇到字符串的结束标志’\0’时结束。

比较结果:如果两个字符串相等返回整数0。如果两个字符串不相等且字符串1的字符较大,则函数返回正整数,否则函数返回负整数。

注意:大写字母比相应小写字母的ASCII码值小32
字符串的比较不可使用关系运算符进行比较。
下面是例子参考:

#include<stdio.h>
#include<string.h>
int main(void)
{     
	printf("strcmp(\"A''\,\''A\'') is );
	printf("%d\n",strcmp(''A'',''A'');
	
	printf("strcmp(\"A''\,\''B\'') is );
	printf("%d\n",strcmp(''A'',''B'');
	
	printf("strcmp(\"B''\,\''A\'') is );
	printf("%d\n",strcmp(''B'',''A'');
	
	printf("strcmp(\"C''\,\''A\'') is );
	printf("%d\n",strcmp(''C'',''A'');
	
	printf("strcmp(\"Z''\,\''a\'') is );
	printf("%d\n",strcmp(''Z'',''a'');
	
	printf("strcmp(\"apples''\,\''apple\'') is );
	printf("%d\n",strcmp(''apples'',''apple'');
		return 0;
}

输出结果:

strcmp("A","A") is 0
strcmp("A","B") is -1
strcmp("B","A") is 1
strcmp("C","A") is 1
strcmp("Z","a") is -1
strcmp("apples","apple") is 1

有的系统的返回值可能不一样,例如“C”和"A"的比较,就可能返回2,即两者的ASCII码差值。
那如果像最后一组字符串的比较,开始的几个字符都相同会怎样?一般而言,strcmp()回一次比较每个字符,直到发现第一对不同的为止。然后返回相应的值。

例如上述的最后一个比较中,只有最后一对字符不同(apples的s和apple的空字符。)由于空字符在ASCII码表里面排第一。字符s一定在她后面。所以返回一个正数。
最后一个例子表明,strcmp()函数比较所有的字符,不只是字母。所以与其说该函数按照字母顺序进行比较,但不如说是按机器排序序列进行比较。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值