C语言基础(二)数组和字符串

一、数组

1.一维数组

在这里插入图片描述

假如我们需要定义1000个变量怎么办?

C语言提供了一个方便的方式数组
数组定义
type arrayName [ arraySize ];
如:
double balance[10];
数组初始化
int a[3] = {1,2,3};
访问数组
a[0] = 1;
printf(“%d”,a[1]);

char array[3]={‘a’,‘b’,‘c’}; //要用单引号
char a[] = {‘1’,‘2’,‘3’,‘4’};
printf("%c\n",array[2]);
printf("%c\n",a[2]);

数组是一个整体,它的内存是连续的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。

2.多维数组

多维数组
简单理解,
二维数组就是有多少个一维数组,三维数组就是有多少个二维数组。
四维数组就是有多少个三维数组。
…以此类推
二维数组
int a[2][3];
三维数组
int a[3][3][3];
四维数组
int a[3][3][3][3];
一般使用最多的是一维数组和二维数组

数组定义示例:
#include <stdio.h>
int main()
{
	int a[2][3] = {1,2,3,4,5,6};
    int i,j;
    printf("%d\n",a[1][2]);
    for(i=0;i<2;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%2d",a[i][j]);
        }
        printf("\n");
    }
} 

二、字符串

1.字符串数组(字符串)

字符数组实际上是一系列字符的集合,也就是字符串(String)。在 C 语言中,没有专门的字符串变量,没有 string类型,通常就用一个字符数组来存放一个字符串。

C 语言规定,可以将字符串直接赋值给字符数组,例如

char str[20] = { "hello,world" };
char str[20] = "hello,world"; //这种形式更加简洁,实际开发中常用

数组第 0 个元素为’h’,第 1 个元素为’e’,第 2 个元素为’l’,后面的元素以此类推。

为了方便,你也可以不指定数组长度,从而写作:

char str[] = { "hello,world" };
char str[] = "hello,world"; //这种形式更加简洁,实际开发中常用

给字符数组赋值时,我们通常使用这种写法,将字符串一次性地赋值(可以指明数组长度,也可以不指明),而不是一个字符一个字符地赋值,那样做太麻烦了。

千万要注意字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字
符一个字符地赋值了
。请看下面的例子:

char str[7];
str = "abc123"; //错误
//正确
str[0] = 'a'; str[1] = 'b'; str[2] = 'c';
str[3] = '1'; str[4] = '2'; str[5] = '3';

字符串结束标志(划重点)
在 C 语言中,字符串总是以’\0’作为结尾,所以’\0’也被称为字符串结束标志,或者字符串结束符。

 \0'是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在 C 语言中唯一的作用就是作为字符串结束标志。 

需要注意的是,逐个字符地给数组赋值并不会自动添加’\0’,例如:

char str[] = {'a', 'b', 'c'};

数组 str 的长度为 3,而不是 4,因为最后没有’\0’。

当用字符数组存储字符串时,要特别注意’\0’,要为’\0’留个位置;这意味着,字符数组的长度至少要比字符串的长度大 1。请看下面的例子:

char str[7] = "abc123";

abc123"看起来只包含了 6 个字符,我们却将 str 的长度定义为 7,就是为了能够容纳最后的’\0’。如果将 str 的长度定义为 6,它就无法容纳’\0’了。

操作示例:

#include <stdio.h>

int main()
{
    char a[]="abc123"; //自动添加 '\0'在末尾
    char b[]={'a','b','c','1','2','3'};
    printf("a[]_size:%d\n",sizeof(a));
    printf("b[]_size:%d\n",sizeof(b));
    return 0;    
}

在这里插入图片描述

2.字符串的输入和输出

字符串的输出
在 C 语言中,有两个函数可以在控制台(显示器)上输出字符串,它们分别是:
 puts():输出字符串并自动换行,该函数只能输出字符串。
 printf():通过格式控制符%s 输出字符串,不能自动换行。除了字符串,printf() 还能输出其他类型的数据。

字符串的输入
在 C 语言中,有两个函数可以让用户从键盘上输入字符串,它们分别是:
 scanf():通过格式控制符%s 输入字符串。除了字符串,scanf() 还能输入其他类型的数据。
 gets():直接输入字符串,并且只能输入字符串。

但是,scanf() 和 gets() 是有区别的:
 scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
 gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。换句话说,gets() 用来读取一整行字符串。

3.字符串相关的函数

需要带入相关库的头文件
#include <stdio.h>

①复制函数 strcpy()
strcpy(arrayName1, arrayName2);

strcpy() 会把 arrayName2 中的字符串拷贝到 arrayName1 中,字符串结束标志’\0’也一同拷贝

示例代码:

#include <stdio.h>
#include <string.h>
int main()
{
    char str1[20] = "abc";
    char str2[10] = "qwert";
    strcpy(str1,str2);
    printf("str1:%s",str1);
    return 0;
}

注意:
将 str2 复制到 str1 后,str1 中原来的内容就被覆盖了。另外,strcpy() 要求 arrayName1 要有足够的长度,否则不能全部装入所拷贝的字符串

②字符串比较函数 strcmp()
strcmp(arrayName1, arrayName2);

返回值:若 arrayName1 和 arrayName2 相同,则返回 0;若 arrayName1 大于 arrayName2,则返回大于 0 的
值;若 arrayName1 小于 arrayName2,则返回小于 0 的值。

#include <stdio.h>
#include <string.h>
int main()
{
    char str1[] = "abc";
    char str2[] = "qwert";
    char str3[] = "abc";
    printf("vs:%d\n",strcmp(str1,str2));
    printf("vs:%d\n",strcmp(str2,str1));
    printf("vs:%d\n",strcmp(str1,str3));
    return 0;
}

在这里插入图片描述

③字符串长度

所谓字符串长度,就是字符串包含了多少个字符(不包括最后的结束符’\0’)。例如"abc"的长度是 3,而不是 4。 在 C 语言中,我们使用 string.h 头文件中的 strlen() 函数来求字符串的长度,它的用法为:

length strlen(strname);

strname 是字符串的名字,或者字符数组的名字;length 是使用 strlen() 后得到的字符串长度,是一个整数。

#include <stdio.h>
#include <string.h>
int main()
{
    char str[] = "qwert";
    int len;
    len = strlen(str);
    printf("The lenth of the string is %d.\n", len);
    return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值