C语言字符数组-学习十四
C语言字符数组-学习十四
2022-02-07 / 0评论 / 304阅读 / 0点赞
-- XG.孤梦

C语言字符数组-学习十四

XG.孤梦
2022-02-07 / 0 评论 / 304 阅读 / 正在检测是否收录...

字符数组

  • 定义

    • 用来存放字符数据的数组。字符数组中的一个元素存放一个字符
  • 一般形式

    • char c [10];
  • 字符数组也可以是二维或多维数组

    • 例如: char c[5][10]; 即为二维字符数组。

字符数组初始化

  • 逐个字符赋给数组中各元素。

    • 例如:char c[10]={'A','b',' ','2',' ','h','a','b','c','d'};
  • 如果花括号中提供的初值个数大于数组长度,则语法错误;
  • 如果初值个数小于数组长度只将这符赋给数组中前面那些元素,其余为'\0';
  • 如果初值个数与预定的数组长度相同,在定义时可以省略各数组长度,系统会自动根据初值个数确定数组长度。

    • 例如:char c[]={'A','b',' ','2',' ','h','a','b','c','d'};

例子

输出一个字符串。
#include <stdio.h>

void main()
{
    char c[15] = { 'M','y',' ','n','a','m','e',' ','i','s',' ','X','G','G','M'};
    for (int i = 0; i < 15; i++)
        printf("%c", c[i]);

    printf(" \n");
}

17590-r1z0mbr8n7b.png


字符串和字符串结束标志

  • 在C语言中没有专门的字符串变量,通常用一个字符数组存放一个字符串
  • 有时,人们关心的是有效字符串的长度而不是字符数组的长度。

    • 例如,定义一个字符数组长度为100,而实际有效字符只有40个。
      为了测定字符串的实际长度,C语言规定了一个“字符串生束标志”,以字符'\0'代表。
    • 如果有一个字符串,其中第10个字符为'\0',则此字符串的有效字符为9个
      也就是说,在遇到字符'\0'时,表示字符串结束,由它前面的字符组成字符串。
  • 可以把一个字符串直接赋给一个字符数组所表示的变量,以初始化字符数组。

    • 例如:char c[]={"l am happy"};
    • 也可以省略花括弧,直接写成 char c[]=“l am happy";
  • 字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志'\0'。

注意:这里不用单个字符作为初值。而是用一个字符串作为初值。数组c的长度不是10,而是11,因为字符串常量的最后由系统加上一个'\0'

因此,初始化 char c[]="I am happy";char c[]={'I',' ','a','m',' ','h','a','p','p','y','\0'}; 等价。

char c[10]={"China"};

1.png


字符数组的输入输出

  • 逐个字符输入输出。用格式符 “%c” 输入或输出一个字符。
  • 将整个字符串一次输入或输出。用符 “%s” 输入或输出一个字符串。
  • 注意:

    • 用%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名,或&c
    • 如果数组长度大于字符串实际长度,也只输出到 '\0' 结束。
    • 输出字符不包括结束符 '\0' 。
    • 如果一个字符数组中包含一个以上 '\0',则遇到第一个 '\0' 时输出就结束。
    • 可以用scanf函数输入一个字符串。例如:char c[20]; scanf("%s",c);
  • 如果利用一个scanf函数输入多个字符串,则以空格分隔。

    • 例如:
#include <stdio.h>
#pragma warning(disable:4996)  

void main()
{
    char str1[5], str2[5], str3[5];
    scanf("%s%s%s", str1, str2, str3);

    printf("%s %s %s\n", str1, str2, str3);
}

43950-68p8yxq31ky.png

数组首地址

  • 在前面介绍过,scanf的各输入项必须以地址方式出现,如&a, &b等。
    但在前例中却是以数组名方式出现的,这是为什么呢?
  • 这是由于在C语言中规定,数组名就代表了数组的首地址
    整个数组是以首地址开头的一个连续的内存单元。

字符串处理函数

  • C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。
  • 使用这些函数可大大减轻编程的负担

    • 用于输入输出的字符串函数,在使用前应包含头文件“stdio.h”
    • 使用其它字符串函数则应包含头文件“string. h”

puts(str)

  • 作用:将一个字符串(以‘\0结束的字符序列)输出到终端,并且自动换行。
  • 例如:
#include <stdio.h>
#include <string.h>

void main()
{
    char str[] = { "China\nBeijin" };
    puts(str);
}

03799-v2tqdnj8v2c.png


gets(str)

  • 作用:从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。
  • 例如:
#include <stdio.h>
#include <string.h>

void main()
{
    char str[10];
    gets(str);
    puts(str);
}

75734-qwxxosl73w.png

  • 注意:用gets和puts函数只能输入或输出一个字符串
    不能写成: puts (str1, str2); gets(str1, str2);
  • 当输入的字符串中含有空格时,输出仍为全部字符串。
    说明函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。

strcat()

  • 作用:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志"\0",结果放在字符数组1中。
  • 本函数返回值是字符数组1的首地址。
  • 一般形式:strcat(字符数组名1,字符数组名2);
  • 要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。
  • 例如:
#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)  

void main()
{
    char str1[10],str2[5];
    printf("输入数组1的值:\n");
    gets(str1);
    printf("输入数组2的值:\n");
    gets(str2);
    strcat(str1, str2);
    puts(str1);
}

20507-eq0pjf60mst.png


strcpy()

  • 作用:把字符数组2中的字符串拷贝到字符数组1中。
    字符串结束标志 "\0" 也一同拷贝。字符数组2也可以是一个字符串常量。
  • 这时相当于把一个字符串赋予一个字符数组。
  • 一般形式:strcpy(字符数组名1,字符数组名2);
  • 可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。
  • 例如:strncpy( str1,str2,2); 拷贝str2的前两个字符和'\O'。
  • 要注意的是字符数组1的值会被覆盖,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。
  • str1="China" ; str1=str2;错误的,把字符串赋给某个字符数组,只能用strcpy函数
  • 例如:
#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)  

void main()
{
    char str1[10], str2[]="China";
    strcpy(str1, str2);
    puts(str1);
}

03853-nzqkp125mp.png


strcmp()

  • 作用:按照ASCII码从左向右逐个比较两个数组中的字符,直到出现不同字符或 '\0',并由函数返回值返回比较结果。

    • 字符串1 = 字符串2,返回值 = 0;
    • 字符串1 > 字符串2,返回值 > 0;
    • 字符串1 < 字付串2,返回值 < 0;
  • 一般形式:strcmp(字符数组名1,字符数组名2);
  • 注意:对两个字符串比较,不能以下形式:

    • if(str1>str2) printf("yes");
    • 而只能用 if(strcmp(str1,str2)>O) printf("str1>str2");
  • 例如:
#include <stdio.h>
#include <string.h>

void main()
{
    int a;
    char str1[10], str2[]="China";
    gets(str1);
    a = strcmp(str1, str2);
    if (a == 0) printf("str1 = str2\n");
    if (a > 0) printf("str1 > str2\n");
    if (a < 0) printf("str1 < str2\n");
}

29102-hudxw2anns9.png


strlen()

  • 作用:测字符串的实际长度(不含字符串结束标志“10')并作为函数返回值。
  • 一般形式:strlen(字符数组名);
  • 例如:
#include <stdio.h>
#include <string.h> 

void main()
{
    int a;
    char str[] = "China";
    a = strlen(str);
    printf("字符串的长度是 %d\n", a);
}

51521-qh6vv628aci.png


strlwr()

  • 格式:strlwr(字符串);
  • 作用:将字符串中大写字母换成小写字母。

strupr()

  • 格式:strupr 宁等串);
  • 作用:将字符串中小写字母换成大写字母。

例子

输入一串字符,统计数字的个数。
#include <stdio.h>
#include <string.h>


void main()
{
    char str[10],c;
    int i, num=0;
    gets(str);
    for (i = 0; (c = str[i]) != '\0'; i++)
        if (c >= '0'&&c <= '9')
            num++;
    printf("%d\n", num);
}

92354-a93lthmeav.png

输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
#include <stdio.h>
#include <string.h>

void main()
{
    int i,word=0,num=0;
    char c,str[80];
    gets(str);
    printf("i\t,str[i]\t,word\t,num\n");
    for (i = 0; (c = str[i]) != '\0'; i++) {
        if (c == ' ') word=0;
        else if (word == 0) {
            word = 1;
            num++;
        }
        printf("%d\t,%c\t,%d\t,%d\n", i, str[i], word, num);
    }
    printf("单词的个数是 %d\n", num);
}

31429-jgsj1e1okaa.png


0

评论

博主关闭了所有页面的评论