【拓展】数组

  • 创建:
  1. 在 C 中要声明一个数组,指定元需要素的类型和元素的数量

C99标准支持”可变长数组”,也就是说,数组对象的长度在运行时(而不是编译时)确定。也就是说 我们可以在程序中用一个变量从键盘上获取数组的长度。

怎么实现动态数组呢?第一种不赘述了,大家应该都快用烂了。讲下第二种。

c语言提供了一系列内存管理函数来帮助我们按需要动态地分配和回收内存空间。

#include <stdio.h>

#include <stdlib.h>

int main() {

        int *arr=NULL,*new_arr=NULL,size,new_size;

        printf("请输入数组长度:");

        scanf("%d",&size);

//     arr=(int*)malloc(sizeof(int)*size);

        arr=(int*)calloc(size,sizeof(int));

       

        if(arr==NULL) {

                 printf("内存申请失败!");

                 exit(1);

        }

       

        printf("请输入数组元素:");

        for(int i=0; i<size; i++) {

                 scanf("%d",&arr[i]);

        }

       

        printf("打印数组元素:\n");

        for(int i=0; i<size; i++)

                 printf("%d\t",arr[i]);

        new_arr=(int*)realloc(arr,2*size*sizeof(int));

        printf("\n容量扩大为原来2倍,请输入数组元素:");

        for(int i=0; i<2*size; i++) {

                 scanf("%d",&new_arr[i]);

        }

       

        printf("\n再次打印数组元素:\n");

        for(int i=0; i<2*size; i++)

                 printf("%d\t",new_arr[i]);

        free(arr);

        return 0;

}

扩展:二维、三维数组的动态创建(鼠标放在下面的文字上,按住crtl键再点击即可访问)

 C语言的那些小秘密之动态数组_bigloomy的专栏-CSDN博客_c语言 动态数组

  • 数组传参问题

#include<stdio.h>

void test1(int arr[]){

      int len = sizeof(arr) / sizeof(arr[0]);

      printf("test1.len=%d\n", len);

}

int main(){

      int arr[5] = { 1, 2, 3, 4, 5 };

      int len = sizeof(arr) / sizeof(arr[0]);

      printf("main.len=%d\n", len);

      test1(arr);

      return 0;

}

Main.lentest1.len分别是多少?

2.1数组做为函数参数传递时传入的不是数组本身,而是数组首元素的地址,本质上是一个指针。上例中,传int *arr也是一样的。

#include<stdio.h>

void test1(int arr[],int arrSize){

        printf("test1.len=%d\n", arrSize);

}

int main(){

        int arr[5] = { 1, 2, 3, 4, 5 };

        int len = sizeof(arr) / sizeof(arr[0]);

        printf("main.len=%d\n", len);

        test1(arr,len);

        return 0;

}

注:如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。当操作数具有数组类型时,其结果是数组的总字节数。

再简述个招新考试碰到的小问题

在主函数里应该怎么写来调用judgeShuDu函数?

  • 二维数组

由此可以看出二维数组在c语言中是按行存储的,你可以认为,二维数组是由多个长度相同的一维数组组成的。如二维数组a[3][4],可分解为三个一维数组,其数组名分别为:

a[0] a[1] a[2],这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0],a[0][1],a[0][2],a[0][3]

测试代码:

#include <stdio.h>

#include <string.h>

int main()

{

    int a[3][2] = {1,2,3,4,5,6};

    printf("以十进制的方式打印地址值\n");

    printf("a:%13d\na[0]:%10d\na[0][0]:%d\n",a,a[0],&a[0][0]);

    printf("a[1]:%10d\na[1][0]:%d\n",a[1],&a[1][0]);

    printf("a[2]:%10d\na[2][0]:%d\n",a[2],&a[2][0]);

}

你能得到什么?

  • 字符串

 字符串和字符数组

#include <stdio.h>

#include <string.h>

int main() {

       char sname[] = "Embedded";

       char cname[] = {'E','m','b','e','d','d','e','d'};

       //观察是否能正常输出Embedded  为什么是这样?

       printf("%s\n",cname);

      

       printf("sname的长度为:%d\n",sizeof(sname));

       printf("cname的长度为:%d\n",sizeof(cname));

    char sdemo[5] = {'T','e','a','m'};

    char cdemo[4] = {'T','e','a','m'};

    //两者输出有何不同  造成这样的原因?

    printf("sdemo = %s\n",sdemo);

    printf("cdemo = %s\n",cdemo);

       return 0;

}

字符串输入输出

scanf("%s",str)

        gets(str)

注意:scanf不能用来读取空格 Tab键等,而gets是遇到回车为止。

#include <stdio.h>

int main() {

       char str[10];

       scanf("%s",str);

       //gets(str);

       printf("输出结果:%s",str);

       return 0;

}

  • 缓冲区问题

题目:删除一个字符串中的指定字母,如:字符串 "aca",删除其中的 a 字母。(可以自己先做一下试试哦)

杨可心写了半天,想出可以再用一个字符数组来存储结果,但她又碰到了新的问题。

这是为什么?怎么解决?

C语言中的缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。接下来我们要清楚为什么要清空缓存区。这是因为在你有的时候在输入一个字符后,在输入一个字符,如果你不清空缓冲区,那上一个字符还在你的缓冲区内.....这样~你猜猜会咋样

解决办法:

1.使用fflush()函数

fflush()函数冲洗流中的信息,该函数通常用于处理磁盘文件。清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时。fflush()函数包含在stdio.h头文件中。用法示例:fflush(stdin)刷新标准输入缓冲区。

  1. 使用setbuf(stdin,null);可以使stdin输入流由默认缓冲区转为无缓冲区,这样scanf输入完毕后,缓冲区内的东西就消失了。

#include <stdio.h>

#include <string.h>

int main()

{

    char s[128] = {0}, s1[128] = {0}, ch;

    int i = 0, j = 0;

    printf("请输入字符串:");

    scanf("%s",s);

       setbuf(stdin, NULL);//使stdin输入流由默认缓冲区转为无缓冲区

    printf("请输入要删除的字符:");

       scanf("%c",&ch);

    for (i = 0; i < strlen(s); i++)

    {

        if (s[i] == ch)

            continue;

        s1[j++] = s[i];

    }

    printf("%s",s1);

    return 0;

}

  1. getchar()吃掉回车

getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了,第一次调用getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取。

  1. 垃圾桶

不停地使用getchar()获取缓冲中字符,直到获取的c是“\n”或文件结尾符EOF为止

  int ch1;

while((ch1 = getchar()) != '\n' && ch1 != EOF);

    1.  ch1为什么是int型?

   getchar()函数返回类型为int型,为用户输入的ASCII码或EOF。

4.2  EOF是什么东东?

它被定义在stdio.h文件中:

#define EOF (-1) ,它用来结束文本流的输入。

在windows系统中,用户可以用Ctrl+Z来表示EOF,以结束文本流的输入。

4.3 为什么是 -1?

因为getchar()函数虽是int类型,但返回值通常都介于0~127,也就是ASCII码的范围,因此-1这个字符不会对应任意一个字符,所以它可以作为文件结尾的标志,用来结束文件的输入。

  1.  scanf("\n%c", &ch);
  • 常用字符串处理函数

size_t  strlen( const char*  str)

功能:计算字符串长度,不包含’\0’

返回值:返回字符串的字符数

char* strcpy(char* dest,char* src)

功 能: 将参数src字符串拷贝至参数dest所指的地址

返回值: 返回参数dest的字符串起始地址

char* strcat(char* dest,const char* src)

功能: 字符串拼接

返回值:返回dest字符串起始地址

int strcmp (const char* str1,const char* str2)

功能:字符串比较

返回值:若参数s1和s2字符串相同则返回0,s1若大于s2则返回大于0的值,s1若小于s2则返回小于0的值

char* strstr(const char* str,const char* substr)

功能:检索子串在字符串中首次出现的位置

返回值:返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL  

  • 字符检查函数

int isalnum(int c)

该函数检查所传的字符是否是字母和数字。

int isalpha(int c)

该函数检查所传的字符是否是字母。

int islower(int c)

该函数检查所传的字符是否是小写字母。

int isspace(int c)

该函数检查所传的字符是否是空白字符。

int isupper(int c)

该函数检查所传的字符是否是大写字母。

我在这里只罗列了些较常用的,完整的看这里

标准库还包含了两个转换函数,它们接受并返回一个 "int"

int tolower(int c)

该函数把大写字母转换为小写字母。

int toupper(int c)

该函数把小写字母转换为大写字母。

C 标准库 – <ctype.h> | 菜鸟教程 (runoob.com)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值