字符数组与字符串的应用(详细)

文章目录


前言

C语言的基本数据类型中没有字符串类型,通常要用字符数组来存储字符串。字符串在实际问题中应用非常广泛。


一、字符数组

字符数组的定义与一维数组相同,一般形式如下:

    char 数组名 [ 常量表达式 ] ;                                       //定义一维字符数组

    char 数组名 [ 常量表达式 1 ] [ 常量表达式 2 ] ;          //定义二维字符数组

例如:

    char string [10] ;

    char string [3][10];                                                     

        上面定义了字符数组string[10]和string[3][10]。string[10]是可以储存10个字符的一维字符数组,如果结尾字符是'\0',代表这是一个字符串;string[3][10]是一个二维字符数组,表示三行十列,每行都可以存储一个字符串,共可以存储3个字符串,每行字符串都包含10个字符。

        如果提供的初始值字符个数比事先定义的数组长度小,则只将这些字符赋给数组中前面那些元素,其余的自动被定义为空字符(即'\0')。

        需要注意的是,由于字符型数据是以整数形式(ASCII代码)存放的,因此也可以用整型数组来存放字符数据。例如:

        int c[10];

        c[0]='H';c[1]='e';c[1]='1';

这样赋值是合法的,但是很浪费空间。如果定义成char型,则每个字符占1字节;但是如果定义成int型,用整型空间存储字符,则每个存储单元就要占据4字节。

Example:我们可以通过输入一个字符串“I love 优快云”,在输出到显示屏上。

#include<stdio.h>
int main()
{
    char string[12];
    int i;
    for(i=0;i<12;i++)
       scanf("%c",&string[i]);
    for(i=0;i<12;i++)
       printf("%c",string[i]);
    return 0;
}

【运行结果】

I love 优快云

I love 优快云

        字符数组同一维数值型数组一样,需要先定以后使用。字符数组的引用与普通数组的引用完全相同,需要用数组下标来引用对应的数组元素。

        单个字符的输入/输出除了scanf()和printf()结合格式符%c,还有另一个对专门只针对字符的输入/输出函数:getchar()和putchar()。getchar()函数用于从终端输入一个字符,输入的字符可以是任意的ASCII码字符(包含回车符);putchar(ch)函数用于将另一个字符ch输出到终端。

Example:用单个字符输入/输出函数输入一个字符并输出到屏幕上。

#include<stdio.h>
int main()
{
    char ch;
    int i;
    ch=getchar();
    putchar(ch);
    putchar('\n');
    return 0;
}

          从键盘输入任意一个字符,原样输出并回车换行。

二、字符串

        字符串常量是由双引号引起来的字符序列,例如:

        “hello world!”  “优快云”

        字符串常量和字符常量的差别在于,编译系统会在每个字符串的后面自动加上一个空操作符'\0',作为字符串结束标记。字符数组里存储的都是单个字符,字符数组的重要作用就是存储和处理字符串,但是一个字符数组存储的并不一定就是字符串,仅当其最后一个元素是'\0'时才表示字符串。'\0'是字符串结束的标志,输出是不会显示到屏幕上,他在内存中占1字节,但不计入字符串的实际长度,只计入数组的长度。在定义字符数组时,要考虑到2,如果存储的是一个字符串,则数组长的就要大于实际字符串的长度,至少多留一个'\0'的存储单元。例如,要存储“china”字符串,需要定义的字符数组长度至少是6.

        利用字符数组对字符串进行初始化的方式如下:

        char s[]={"I love math"};

或者简写成:

        char s[]="I love math";

        按照上面的语句初始化后,字符串在内存中的存储方式如下:

Ilovemath'\0'
s[0]s[1]s[2]s[3]s[4]s[5]s[6]s[7]s[8]s[9]s[10]s[11]

        因此,下面两个赋值语句是不同的。

        char str[]={'C','S','D','N'};

        char str[]={"CSND"};

        后者的数组长度比前者大1,'\0'在初始化时不需要放在字符串后,输出时也不显示在屏幕上。但它作为字符串结束标志会自动加在字符串结尾,占据一个字符空间。

        若字符数组定义时没有同步进行初始化,如果后面想赋值,则只能对单个字符元素赋值,不能整体赋值。下面的赋值是错误的:

        char str[20];

        str="优快云";

        只能对单个赋值,如:

        str[0]='C';str[1]='S';str[2]='D';str[3]='N';

        如果在程序运行中想高效便捷地一次性输出字符串,则可以使用scanf()函数结合字符串格式符%s实现,输出函数则用printf()结合格式符%s实现。

Example:从键盘输入一个字符串,并将其输出到屏幕上。

#include<stdio.h>
int main()
{
    char str[20];
    scanf("%s",str);  //str前面不需要加&,由于str是数组名,数组名就是数组的首地址
    printf("%s",str);
    return 0;
}

【运行结果】

【结果1】

student

student

【结果2】

today is Thursday

today

        由于printf()是从首地址开始输出,输出过程中会逐个检查字符,如果遇到'\0'就会立刻结束输出所以会出现【结果2】中的输出。同时,在scanf()中也是,遇到空格就会当作字符串输入分隔符,因此scanf()里面碰到空格就结束。

三、字符串处理函数

        由于字符串特殊性,很多常规操作与数值型数据的处理方法不同,而是由专门的字符串处理数组。C语言字符串处理函数库提供了很多有用的函数,如字符串赋值,连接等。若要使用这些函数,必须在程序的开头将头文件<string.h>包含到源文件中。常见字符串处理函数如下:

(1)gets(str):从终端输入一个字符串到字符数组str,输入回车结束(空格可读入数组)如

char str[20];
gets(str);

(2)puts(str):将字符串str或字符串常量输出到终端,遇到'\0'则结束。如:

char str[20]="china";
puts(str);
//或者puts("china");

(3)strlen(str):求字符串str的实际长度,即不包括'\0'的实际字符数,遇到'\0'则结束。如:

char str[20]="china";
printf("%d",strlen(str));
//输出结果是5

(4)strcpy(str1,str2):将字符串str2复制到字符串str1中,全部覆盖str1的内容,要求str1的长度要大于或等于str2。如:

char s1[100];
char s2[]={"test"};
puts(strcpy(s1,s2));
//输出结果:test

(5)strcmp(str1,str2):比较两个字符串str1和str2的大小,str1和str2可以是字符串常量,也可以是字符数组名。用二者的ASCII码从左往右逐一比较,直到遇到第一各不相同的字符或字符串结束标志'\0',ASCII码大则该字符串大。

 比较结果如下:

str1大于str2,返回值为正整数;

str1等于str2,返回值为负整数;

str1小于str2,返回值为0;

char s1="math";
char s2="man";
n=strcmp(s1,s2);
//n结果为1
n=strcmp(s1,"math");
//n结果为0
n=strcmp("com",s2);
//n结果为-1

(6)strcat(str1,str2):将字符串str2连接到字符串str1,合并成一个字符串,存储到str1中,要求定义时str1的大小能放下连接后的字符串,两个字符串中任意一个均可以是字符串常量。如:

char s1[100]="Hello";
char s2[]="world!";
puts(strcaat(s1,s2));
//输出结果为 Hello world!

(7)strncpy(s1,s2,n):将s2最前面的n个字符复制到s1中,取代s1中原有的n个字符,但复制的字符个数n不应多于s1中原有的字符(不包括'\0').如:

char s1[]="teach";
char s2[]="health";
strncpy(s1,s2,3);
puts(s1);
//输出结果为 heach

(8)strlwr(str):将字符串str中的大写字母转化为小写字母。如:

char str[]="BeiJing";
puts(strlwr(str));
//输出结果为:beijing

(9)strupr(str):将字符串str中的大写字母转化为大写字母。如:

char str[]="BeiJing";
puts(strupr(str));
//输出结果为:BEIJING

好的,到这就结束了,希望大家多多评论点赞鼓励。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值