前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言字符数组-学习十四

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

作者头像
XG.孤梦
发布2022-02-28 21:34:09
1.8K0
发布2022-02-28 21:34:09
举报
文章被收录于专栏:日志随记日志随记

字符数组

  • 定义
    • 用来存放字符数据的数组。字符数组中的一个元素存放一个字符
  • 一般形式
    • 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'};
例子

输出一个字符串。

代码语言: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语言规定了一个“字符串生束标志”,以字符'\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"};

字符数组的输入输出

  • 逐个字符输入输出。用格式符 “%c” 输入或输出一个字符。
  • 将整个字符串一次输入或输出。用符 “%s” 输入或输出一个字符串。
  • 注意:
    • 用%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名,或&c
    • 如果数组长度大于字符串实际长度,也只输出到 '\0' 结束。
    • 输出字符不包括结束符 '\0' 。
    • 如果一个字符数组中包含一个以上 '\0',则遇到第一个 '\0' 时输出就结束。
    • 可以用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 %s\n", 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[] = { "China\nBeijin" };
    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中。 字符串结束标志 "\0" 也一同拷贝。字符数组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码从左向右逐个比较两个数组中的字符,直到出现不同字符或 '\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");
  • 例如:
代码语言: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 = str2\n");
    if (a > 0) printf("str1 > str2\n");
    if (a < 0) printf("str1 < str2\n");
}
strlen()
  • 作用:测字符串的实际长度(不含字符串结束标志“10')并作为函数返回值。
  • 一般形式:strlen(字符数组名);
  • 例如:
代码语言:javascript
复制
#include <stdio.h>
#include <string.h> 

void main()
{
    int a;
    char str[] = "China";
    a = strlen(str);
    printf("字符串的长度是 %d\n", 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]) != '\0'; i++)
        if (c >= '0'&&c <= '9')
            num++;
    printf("%d\n", num);
}

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

代码语言:javascript
复制
#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);
}
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-02-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 字符数组
  • 字符数组初始化
    • 例子
    • 字符串和字符串结束标志
    • 字符数组的输入输出
      • 数组首地址
      • 字符串处理函数
        • puts(str)
          • gets(str)
            • strcat()
              • strcpy()
                • strcmp()
                  • strlen()
                    • strlwr()
                      • strupr()
                        • 例子
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                        http://www.vxiaotou.com