5.一维数组与字符数组

5.2 一维数组

数组:指一组具有相同数据类型的数据的有序集合。

一维数组的定义格式为

类型说明符 数组名[常量表达式];
如 int a[10]; 表示一个整型数组,数组名为a,它有10个元素

  • 常量表达式中可以包含常量和符号常量,但不能包含变量
  • 可以只给一部分元素赋值,如int a[10]={0,1,2,3,4};后面的值会默认为0
  • 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组的长度
//debug运行以下代码
#include <stdio.h>

int main() {
    int a[]={1,2,3,4};
    int b[10] = {1,2,3,4};
    printf("a=\n");
    return 0;
}

在这里插入图片描述

5.3 数组访问越界与数组的传递

#include <stdio.h>

int main() {
    int i[5] = {1,2,3,4,5};
    int j = 10;
    int k = 20;
    i[5] = 6;//越界访问
    i[6] = 7;//越界访问会造成数据异常
    printf("k=%d\n",k);
    return 0;
}

因为越界访问,导致变量k存储地址的值被修改
在这里插入图片描述
数组另一个值得关注的地方是,编译器并不检查程序对数组下标的引用是否在数组的合法范围内

数组传递

#include <stdio.h>
void print(int b[],int len)
{
    int i;
    for(i=0;i<len;i++){
        printf("%3d",b[i]);
    }
    b[4]=20;
    printf("\n");
}

#define N 5
int main() {
    int a[5]={1,2,3,4,5};
    print(a,5);
    printf("a[4]=%d\n",a[4]);
    return 0;
}

数组传递时,只是把数组的起始地址传递给了子函数,长度不能传递给子函数,我们需要使用额外的变量,来把长度传递给子函数

5.4 字符数组与scanf读取字符串

字符数组初始化及传递

#include <stdio.h>

int main() {
    char c[]={'h','e','l','l','o'};
    char d[]="how";
    printf("c=%s\n",c);
    printf("d=%s\n",d);
    return 0;
}

D:\CProject\5\5.3-char_array\cmake-build-debug\5_3_char_array.exe
c=hello€?
d=how
进程已结束,退出代码为 0

对数组赋值"hello"却打印出乱码,这是因为printf 通过%s打印字符串时,原理是依次输出每个字符,当读到结束符’\0’时,结束打印

我们通过print 函数模拟实现printf 的%s 打印效果,当c[i]为’\0’时,其值是0,循环结束,也可以写为c[i]!=‘\0’。

scanf读取字符串

#include <stdio.h>

int main() {
    char c[10];
    char d[10];
    scanf("%s",c);
    printf("%s\n",c);
    scanf("%s%s",c,d);
    printf("c=%s,d=%s\n",c,d);
    return 0;
}

scanf 通过%s 读取字符串,对c 和d 分别输入"are"和"you"(中间加一个空格),scanf在使用%s 读取字符串时,会忽略空格和回车(这一点与%d 和%f 类似)。

5.5 gets与puts,str系列字符串操作函数

gets 函数与puts 函数

gets 函数类似于scanf 函数,用于读取标准输入。前面我们已经知道scanf 函数在读取字符串时遇到空格就认为读取结束,所以当输入的字符串存在空格时,我们需要使用gets 函数进行读取

函数puts 把str(字符串)写入STDOU(标准输出),相对于printf 函数,**puts 只能用于输出字符串,同时多打印一个换行符,**等价于printf(“%s\n”,c)。

#include <stdio.h>

int main() {
    char c[20];
    gets(c);
    puts(c);
    return 0;
}

str系列字符串操作函数

函数作用格式备注
strlen统计字符串长度size_t strlen(char *str);strlen 是通过结束符’\0’来判断字符串长度的,如果没有结束符,无法统计字符串长度
strcpy将某个字符串复制到字符数组中char *strcpy(char *to, const char *from);
strcmp比较两个字符串的大小int strcmp(const char *str1, const char *str2);str1中str2相等,返回值为0。str1大于str2,那么返回值为1;str1小于str2,那么返回值为−1
strcat将两个字符串连接到一起char *strcat(char *str1, const char *str2);
#include <stdio.h>

int mystrlen(char c[]){
    int i = 0;
    while (c[i++]);
    return i - 1;
}

int main() {
    int len;
    char c[20];
    char d[100] = "world";
    gets(c);
    puts(c);
    len = strlen(c);
    printf("strlen len=%d\n",len);
    len = mystrlen(c);
    printf("mystrlen len=%d\n",len);
    strcat(c,d);
    strcpy(d,c);
    puts(d);
    printf("c?d %d\n",strcmp(c,d));
    puts(c);
    return 0;
}

D:\CProject\5\5.4-strlen\cmake-build-debug\5_4_strlen.exe
hello,
hello,
strlen len=6
mystrlen len=6
hello,world
c?d 0
hello,world
进程已结束,退出代码为 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值