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

2022-02-28 21:34:09 浏览数 (1)

字符数组

  • 定义
    • 用来存放字符数据的数组。字符数组中的一个元素存放一个字符
  • 一般形式
    • char c [10];
  • 字符数组也可以是二维或多维数组
    • 例如: char c[5][10]; 即为二维字符数组。

字符数组初始化

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

输出一个字符串。

代码语言:javascript复制
#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");
}

字符串和字符串结束标志

  • 在C语言中没有专门的字符串变量,通常用一个字符数组存放一个字符串
  • 有时,人们关心的是有效字符串的长度而不是字符数组的长度。
    • 例如,定义一个字符数组长度为100,而实际有效字符只有40个。 为了测定字符串的实际长度,C语言规定了一个“字符串生束标志”,以字符''代表。
    • 如果有一个字符串,其中第10个字符为'',则此字符串的有效字符为9个。 也就是说,在遇到字符''时,表示字符串结束,由它前面的字符组成字符串。
  • 可以把一个字符串直接赋给一个字符数组所表示的变量,以初始化字符数组。
    • 例如:char c[]={"l am happy"};
    • 也可以省略花括弧,直接写成 char c[]=“l am happy";
  • 字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志''。

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

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

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

字符数组的输入输出

  • 逐个字符输入输出。用格式符 “%c” 输入或输出一个字符。
  • 将整个字符串一次输入或输出。用符 “%s” 输入或输出一个字符串。
  • 注意:
    • 用%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名,或&c
    • 如果数组长度大于字符串实际长度,也只输出到 '' 结束。
    • 输出字符不包括结束符 '' 。
    • 如果一个字符数组中包含一个以上 '',则遇到第一个 '' 时输出就结束。
    • 可以用scanf函数输入一个字符串。例如:char c[20]; scanf("%s",c);
  • 如果利用一个scanf函数输入多个字符串,则以空格分隔。
    • 例如:
代码语言:javascript复制
#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 %sn", str1, str2, str3);
}
数组首地址
  • 在前面介绍过,scanf的各输入项必须以地址方式出现,如&a, &b等。 但在前例中却是以数组名方式出现的,这是为什么呢?
  • 这是由于在C语言中规定,数组名就代表了数组的首地址。 整个数组是以首地址开头的一个连续的内存单元。

字符串处理函数

  • C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。
  • 使用这些函数可大大减轻编程的负担
    • 用于输入输出的字符串函数,在使用前应包含头文件“stdio.h”
    • 使用其它字符串函数则应包含头文件“string. h”
puts(str)
  • 作用:将一个字符串(以‘0结束的字符序列)输出到终端,并且自动换行。
  • 例如:
代码语言:javascript复制
#include <stdio.h>
#include <string.h>

void main()
{
    char str[] = { "ChinanBeijin" };
    puts(str);
}
gets(str)
  • 作用:从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。
  • 例如:
代码语言:javascript复制
#include <stdio.h>
#include <string.h>

void main()
{
    char str[10];
    gets(str);
    puts(str);
}
  • 注意:用gets和puts函数只能输入或输出一个字符串 不能写成: puts (str1, str2); gets(str1, str2);
  • 当输入的字符串中含有空格时,输出仍为全部字符串。 说明函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。
strcat()
  • 作用:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志"0",结果放在字符数组1中。
  • 本函数返回值是字符数组1的首地址。
  • 一般形式:strcat(字符数组名1,字符数组名2);
  • 要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。
  • 例如:
代码语言:javascript复制
#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);
}
strcpy()
  • 作用:把字符数组2中的字符串拷贝到字符数组1中。 字符串结束标志 "" 也一同拷贝。字符数组2也可以是一个字符串常量。
  • 这时相当于把一个字符串赋予一个字符数组。
  • 一般形式:strcpy(字符数组名1,字符数组名2);
  • 可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。
  • 例如:strncpy( str1,str2,2); 拷贝str2的前两个字符和'O'。
  • 要注意的是字符数组1的值会被覆盖,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。
  • str1="China" ; str1=str2;错误的,把字符串赋给某个字符数组,只能用strcpy函数
  • 例如:
代码语言:javascript复制
#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)  

void main()
{
    char str1[10], str2[]="China";
    strcpy(str1, str2);
    puts(str1);
}
strcmp()
  • 作用:按照ASCII码从左向右逐个比较两个数组中的字符,直到出现不同字符或 '',并由函数返回值返回比较结果。
    • 字符串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");
  • 例如:
代码语言:javascript复制
#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 = str2n");
    if (a > 0) printf("str1 > str2n");
    if (a < 0) printf("str1 < str2n");
}
strlen()
  • 作用:测字符串的实际长度(不含字符串结束标志“10')并作为函数返回值。
  • 一般形式:strlen(字符数组名);
  • 例如:
代码语言:javascript复制
#include <stdio.h>
#include <string.h> 

void main()
{
    int a;
    char str[] = "China";
    a = strlen(str);
    printf("字符串的长度是 %dn", a);
}
strlwr()
  • 格式:strlwr(字符串);
  • 作用:将字符串中大写字母换成小写字母。
strupr()
  • 格式:strupr 宁等串);
  • 作用:将字符串中小写字母换成大写字母。
例子

输入一串字符,统计数字的个数。

代码语言:javascript复制
#include <stdio.h>
#include <string.h>


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

输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。

代码语言:javascript复制
#include <stdio.h>
#include <string.h>

void main()
{
    int i,word=0,num=0;
    char c,str[80];
    gets(str);
    printf("it,str[i]t,wordt,numn");
    for (i = 0; (c = str[i]) != ''; i  ) {
        if (c == ' ') word=0;
        else if (word == 0) {
            word = 1;
            num  ;
        }
        printf("%dt,%ct,%dt,%dn", i, str[i], word, num);
    }
    printf("单词的个数是 %dn", num);
}

0 人点赞