第十章 字符串 【JOANNE FIRST】



第十章 字符串

10.1 字符串的存储

C语言没有为字符串提供数据类型,因此字符串存取用字符数组实现

为便于确定字符串长度,编译器会在字符串末尾自动加'\0',因此定义字符数组时留出'\0'位置

10.2 字符串定义和初始化

-char a[]="asdfghjk";

扫描二维码关注公众号,回复: 4941661 查看本文章

-char a[][10]="dhjahrugfhjkajgkfyrkjkj";

【注意】二维数组必须知道每一列的元素个数才能为数组分配存储单元

-char longstring[]="dkafhgajfgjhfdjahjfkjjalklf"
                   "and dfhjalgkgklfhkksjfgl";
字符串太长可以分成几个小段,在最后一段加“;"

10.3 字符指针

-char *p="hello";

同数组名是数组首地址,函数名是函数入口地址,字符串本身代表存储区的首地址

【注意】hello存储在只读区,p可以改变指向,但不可以改变hello

*p='W'[×]

-char str[10]="hello";
 char *p=str;

p的指向可以被修改,hello也可以被修改

*p='W'相当于str[0]='W'

10.4 字符串的输入和输出


(1)  for(i=0;str[i]!='\0';i++)
     scanf("%d",&str[i]);
     同理输出

(2)  scanf("%s",str);
     printf("%s",str);

【注意】scanf读入一个字符串,直到遇到空白符,空格符,回车符,制表符为止
        若输入asd fgh,则asd读入,fgh和它前面的空格留在输入缓冲区内,下次scanf输出

(3) gets(str);
    puts(str);
    另一种用法*p,puts(p)

【注意】 gets将'\n'读走,并换成'\0',scanf则将'\n'留在缓冲区内
         puts遇到第一个'\n'输入结束,并自动输入一个换行符

(4) fgets(name,sizeof(name),stdin);

【注意】scanf gets 均不能限制输入字符的个数,会造成缓冲区溢出
        fgets 限制了输入字符个数不能超过数组长度,比较安全

10.5 字符串处理函数

一想到对字符串的操作,应先到用字符串处理函数,不能像普通类型一样操作

1.strlen(str) 函数返回值是str实际长度,不包括'\0'
  sizeof(str) 值等于函数下标*数据类型大小

2.strcpy(str1,str2) str2复制到str1当中,应确保str1的大小大于str2

3.strcmp(str1,str2) str1>str2 返回值大于0
                    str1=str2 返回值等于0
                    str1<str2 返回值小于0

4.strcat(str1,str2) str1的'\0'被str2的第一个值覆盖,应将str1定义的足够大

5.strncpy(str1,str2,n) 将str2的前n个字符复制到str1当中

6.strncmp(str1,str2,n) 最多比较n个字符

7.strncat(str1,str2,n)

search 例10.4

10.6 向函数传递字符串

两种方法 字符函数做函数参数,靠i动;字符指针做函数参数,靠p++动

search 例10.5,10.6

10.7 从函数返回字符串指针
-实际上,字符串的很多处理函数没有返回值,但它们原型,返回值是字符指针的值

e.g char *strcpy(char *str1,const char *str2)
返回值是字符指针str1,即str1的首地址

-接到第九章的问题
指针的作用:指针作为函数参数传递实参的地址
            函数指针:int asd();int (*p)=&asd,p指向函数名
在第十章
指针的作用:函数可以返回实参地址

search 例10.7

猜你喜欢

转载自blog.csdn.net/weixin_40490632/article/details/79612749