C Primer Plus学习笔记----第11章 字符串和字符串函数

字符串和字符串函数

  • 11.1字符串标识和字符串I/O
    • 11.1.1在程序中定义字符串
      • 一,字符串常量(字符串文字)
      • 二,字符串数组及其初始化
      • 三,数组与指针
      • 四,数组和指针的差别
      • 五,字符串数组
    • 11.1.2指针和字符串
    • 11.2字符串输入
      • 11.2.1创建存储空间
      • 11.2.2gets()函数--get string
      • 11.2.3fgets()函数
      • 11.2.4scanf()函数
  • 11.3字符串输出
    • 11.3.1puts()函数
    • 11.3.2fputs()函数 面向文件的puts()
    • 11.3.3printf()函数
  • 11.4自定义字符串输入输出函数
  • 11.5字符串函数
    • 11.5.1 strlen()获得字符串长短

11.1字符串标识和字符串I/O

字符串的实质:以空字符(\0)结尾的char型数组。
程序11.1简单演示一下字符串的操作。

/*string.c---使用字符串与用户交互*/
#include 
#define MSG "You must have many talents. Tell me some"
#define LIM 5
#define LINELEN 81

int main(void)
{
	char name[LINELEN];
	char talents[LINELEN];
	int i;
	const char m1[40]="Limit yourself to one line`s worth.";
	const char m2[]="If you can`t think of anything,fake it";
	const char *m3="\nEnough about me -what`s your name";
	const char *mytal[LIM]={"Adding","Multiplying","Stashing","Following","Understing"};
	printf("Hi!\n");
	puts("what were they?");
	for(i=0;i

C Primer Plus学习笔记----第11章 字符串和字符串函数_第1张图片

11.1.1在程序中定义字符串

一,字符串常量(字符串文字)

字符串:在内存中是以'\0'结尾的一串字符,程序中将字符串至于双引号内,编译器自动添加结尾的空字符。
注意:如果想在字符串中使用双引号可以在双引号前面加一个\。请看示例:

printf("\"Run,Spot,run\"");
//该代码输出为 "Run,Spot,run"

字符串为静态存储类(static storage)
程序清单11.2 quotes.c

/*quotes.c--把字符串看作指针*/
#include 

int main(void)
{
	printf("%s , %p , %c\n","we","are",*"space");
	return 0;
}

C Primer Plus学习笔记----第11章 字符串和字符串函数_第2张图片
输出 we 是按字符格式输出
输出 00405064是按地址输出 是字符串 are的地址(将are看成一个指针)
输出 s 是将字符串的地址的内容输出,类似于数组。数组名即指针,字符串即指针 。数组首元素指针首字母就是该指针指向的内容。

二,字符串数组及其初始化

请看示例:

const char m1[]="hellow";
const char m1[]={'h','e','l','l','o','w','\o'};//主意‘\0’表明是一个字符串,否则是一个数组

三,数组与指针

数组初始化是从静态存储区把一个字符串复制给数组,而指针初始化只是复制字符串的地址。

四,数组和指针的差别

请看以下两个声明:

char heart[]="I love title";//初始化一个存放字符串的数组  heart 是个常量
char *head="I love title";//初始化一个指向字符串的指针  head是个指针变量

代码1:两者均可以使用数组符号

for(i=0;i<6;i++)
	{
		putchar(heart[i]);
	}
for(i=0;i<6;i++)
	{
		putchar(head[i]);
	}
二者输出结果相同

代码2:两者都可以使用指针加法

for(i=0;i<6;i++)
	{
		putchar(*(heart+i);
	}
for(i=0;i<6;i++)
	{
		putchar(*(head+i);
	}
二者输出结果相同

代码3:只有指针可以使用增量运算符

while(*(head)!='\0')//当前指针指向的内容不是结束符则继续循环
{
	putchar(*(head++));//向前推进指针知道结束符退出循环
}

数组元素是变量(除去使用const修饰的情况),数组名不是变量。
推荐用法:`const char *pl=“abcde”;//可以防止通过指针修改字符串内容造成混乱

未完待续。。。。。。。。2019年3月17日 01:38:57`

五,字符串数组

字符串就是指针,所以字符串数组即成员是指针的数组,所以角标加1则指向下一字符串而不是下一字符。每个指针所指向的内容是该字符串的首字母。
示例代码:

const char *arr[3]={"abc","def","hgi"};

11.1.2指针和字符串

程序11.1 p_and_s.c
/p_and.s.c/
#include
int main(void)
{
char* mesg=“don`t be a fool!”;
char* copy;
copy=mesg;
printf("%s\n",copy);
printf(“mesg=%s;&mesg=%p;vale=%p\n”,mesg,&mesg,mesg);
printf(“copy=%s;©=%p;vale=%p”,copy,©,copy);
return 0;
}
C Primer Plus学习笔记----第11章 字符串和字符串函数_第3张图片
可以看到value两次输出相同,value是指针的值(也就是所指向的字符串的地址)相同。可以得出结论copy=mesg完成的功能是创建第2个指针指向同一个字符串。这样做的好处是不用在开辟一个空间存储拷贝的字符串内容。

11.2字符串输入

11.2.1创建存储空间

建立一个空间存放字符串,才能正常接收到输入的字符串。

char arr[5];//最简单的操作
char* name;
scanf("%s",name);//不合理的操作 name可能指向任何一个地方

11.2.2gets()函数–get string

gets()通过检测换行字符(回车可以产生)来结束。获取到换行字符前面所有的字母并添加一个空字符’\0’。
程序11.4 name1.c

/*name.c--读取一个名字*/
#include 
#define LEN	40
int main(void) 
{
	char name[LEN];
	char *pt_name;
	pt_name=name;
	printf("what`s your name?\n");
	gets(name);
	printf("nice name :%s\n",name);
    printf("really good name:");
	unsigned char i;
	while(*(pt_name)!='\0')
		{
			printf("%c",*pt_name++);
		}
	return 0;
}

C Primer Plus学习笔记----第11章 字符串和字符串函数_第4张图片

11.2.3fgets()函数

该函数有三个参数:缓存区,最大长度,读哪一文件;其它与gets()类似。

11.2.4scanf()函数

scanf()更多的应用与读取单个字符,gets()更多应用与读取字符串。

11.3字符串输出

11.3.1puts()函数

使用puts输出字符串很简单,值得主意的是如果输出数组请确保空白字符的存在。

11.3.2fputs()函数 面向文件的puts()

11.3.3printf()函数

优点是在一行内输出多个字符串变得简单

11.4自定义字符串输入输出函数

利用变准输入输出函数重新构造函数

11.5字符串函数

string.h提供了字符串函数的原型:常用的有 strlen() strcat() strnat() strcmp() strncmp()等函数。下面来一一介绍。

11.5.1 strlen()获得字符串长短

请看代码:

/*test.c---缩短字符串*/
#include 
#include 
# define SIZE 4
 
void fix(char*,char);
 
int main(void)
{
	char  mesg[] = "hello world!";
    //char *ptr="hello world";
	fix(mesg,SIZE);
	puts(mesg);
	return 0;
}

void fix(char*string,char size)
{
	if(strlen(string)>size)
		*(string+size)='\0'; 
}

C Primer Plus学习笔记----第11章 字符串和字符串函数_第5张图片
2019年3月17日 13:30:48未完待续 P298

你可能感兴趣的:(C语言自学笔记)