C语言_二维数组与一维指针

描述

知识点1:字符串

字符串:本身属于字符数组、字符串结尾有’\0’。

1.1 字符串作业

1. 从键盘上输入一串字符串,计算字符串里的空格、大写字母、小写字母、数字个数

2. 字符串比较:从键盘上录入2个字符串,判断是否相等。

#include

int main()

{

   char str1[100];

   char str2[100];

   int i=0;

   /*1.  录入数据*/

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

   scanf("%s",str1);

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

   scanf("%s",str2);

   /*2.  比较字符串*/

   while(str1[i]!='\0'||str2[i]!='\0')

   {

       if(str1[i]!=str2[i])break;

       i++;

   }

   if(str1[i]=='\0'&&str2[i]=='\0')

   {

       printf("字符串相等.\n");

   }

   else

   {

       printf("字符串不相等.\n");

   }

   return 0;

}

3. 字符串删除:从键盘上录入一个字符串,删除字符串里指定的单词,输出结果。

   比如:原字符串”akjbcds123dfjvbf123fdvbfd123”

   删除单词:“123”

   输出的结果:”akjbcdsdfjvbffdvbfd”

#include

#include

 

int main()

{

   char str1[100];

   char str2[100];

   int i=0,j=0;

   int str2_len=0;

   /*1.  录入数据*/

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

   scanf("%s",str1);

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

   scanf("%s",str2);

   /*2.  计算要删除字符串的长度*/

   str2_len=strlen(str2);

              

   /*3.  查找字符串*/

   for(i=0;str1[i]!='\0';i++)

   {

       //比较字符串

       for(j=0;str2[j]!='\0';j++)

       {

          if(str1[i+j]!=str2[j])break;

       }

       if(str2[j]=='\0')

       {

          //4.  删除字符串---后面向前面覆盖

          for(j=i;str1[j]!='\0';j++)

          {

              str1[j]=str1[j+str2_len];

          }

          str1[j]='\0';

          i--;

       }

   }

   //5.  输出结果

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

   return 0;

}

 

4. 字符串查找:从键盘上录入一个字符串,查找字符串里有几个特定的单词。再输出结果。

  比如:原字符串”akjbcds123dfjvbf123fdvbfd123”

   查找的单词:“123”

输出结果:3

 

  5. 字符串排序:从键盘上录入一个字符串,按照小到大的顺序排序。

#include

#include

 

int main()

{

   char str1[100];

   int len=0;

   int i,j;

   int tmp;

   printf("输入要排序的字符串:");

   scanf("%s",str1);

   len=strlen(str1);

   //开始排序

   for(i=0;i;i++)<>

   {

       for(j=0;j;j++)<>

       {

          if(str1[j]>str1[j+1])

          {

              tmp=str1[j];

              str1[j]=str1[j+1];

              str1[j+1]=tmp;

          }

       }

   }

   printf("排序之后的字符串:%s\n",str1);

   return 0;

}

 

6. 字符串的插入:从键盘上录入一个字符串,从指定位置插入一个字符串,再输出结果。

   比如:原字符串“1234567890”

(1). 从指定位置插入新的单词。 比如 从第2个下标插入一个“ABC”字符串。

结果: “123ABC4567890”

#include

#include

 

int main()

{

   char str1[100];

   char str2[100];

   int addr=0;

   int str1_len;

   int str2_len;

   int i;

   /*1.  录入数据*/

   printf("录入源字符串:");

   scanf("%s",str1);

   printf("录入要插入的字符串:");

   scanf("%s",str2);

   printf("输入要插入的下标位置:");

   scanf("%d",&addr);

   str1_len=strlen(str1); //3

   str2_len=strlen(str2); //2

   

   /*2.  完成插入*/

   //完成数据移动

   for(i=str1_len-1;i>=addr;i--)

   {

       str1[i+str2_len]=str1[i];

   }

   //数据替换

   for(i=0;i;i++)<>

   {

       str1[i+addr]=str2[i];

   }

   str1[str1_len+str2_len]='\0';

   /*3.  输出数据*/

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

   return 0;

}

 

(2). 从指定单词后面插入新的单词。 比如 从”123”这个单词后插入一个“ABC”字符串。

结果: “123ABC4567890”

7. 字符串替换: 从键盘上录入一个字符串,将指定单词替换成想要的单词。

   比如:原字符串“123jfvfdj123dkfvbfdvdf”

   想要将“123”替换成“888”或者“8888”或者“88”

#include

#include

 

int main()

{

   char str1[100];

   char str2[100];

   char str3[100];

   int str1_len=0;

   int str2_len=0;

   int str3_len=0;

   int i,j;

   int cnt=0;

   /*1.准备数据*/

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

   scanf("%s",str1);

   printf("输入查找的字符串:");

   scanf("%s",str2);

   printf("输入替换的字符串:");

   scanf("%s",str3);

   /*2.  计算长度*/

   str1_len=strlen(str1);

   str2_len=strlen(str2);

   str3_len=strlen(str3);

   /*3.  字符串替换*/

   for(i=0;i;i++)<>

   {

       //查找字符串

       for(j=0;j;j++)<>

       {

          if(str1[i+j]!=str2[j])break;

       }

       //如果查找成功就进行替换

       if(j==str2_len)

       {

          //总长度变短了

          if(str2_len>str3_len)

          {

              cnt=str2_len-str3_len; //差值

              //完成数据向前移动--覆盖

              for(j=i+str2_len-cnt;j;j++)<>

              {

                 str1[j]=str1[j+cnt];

              }

              str1[str1_len-cnt]='\0';

          }

          //总长度变长了

          else if(str2_len)<>

          {

              cnt=str3_len-str2_len; //差值

              //完成数据向后移动

              for(j=str1_len;j>=i+str2_len;j--)

              {

                 str1[j+cnt]=str1[j];

              }

              str1[str1_len+cnt]='\0';

          }

          //替换

          for(j=0;j;j++)<>

          {

              str1[i+j]=str3[j];

          }

          //重新计算长度

          str1_len=strlen(str1);

       }

   }

   /*4.  完成字符串打印*/

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

   return 0;

}

 

 8. 从键盘上输入一个整数:将整数转为字符串输出。

  比如:int a; scanf(“%d”,&a); 使用字符串形式打印出a的值。

#include

#include

 

int main()

{

   char str[100];

   char str1[100];

   int data=0;

   int j=0,i=0;

   printf("从键盘上输入整数:");

   scanf("%d",&data);

   // 123 -->'1' '2' '3'

   while(data)

   {

       str[i++]=data%10+'0';

       data=data/10;

   }

   for(j=0;j;j++)<>

   {

       str1[j]=str[i-j-1];

   }

   str1[j]='\0';

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

   return 0;

}

 

 9. 从键盘上输入一个字符串,转为整数输出。

#include

#include

int main()

{

   //"123"

   char str[100];

   int data=0;

   int i=0;

   printf("从键盘上输入字符串:");

   scanf("%s",str);

   while(str[i]!='\0')

   {

       data*=10;//data=0 data=10 data=120

       data+=str[i]-'0';//data=1 data=12 data=123

       i++;

   }

   printf("data=%d\n",data);

   return 0;

}

 

10. 回文字符串。 “121”,“1221”

11. 将第8题和第9题转成浮点数。

12. 将10进制数据转为16进制输出。 比如: 3  --->0x3

13. 将10进制数据转为二进制输出。

 

知识点2:字符串到整数-浮点数的格式化转换

//输出的都是字符串

#include

int printf(const char *format, ...); 

int fprintf(FILE *stream, const char *format, ...);

int sprintf(char *str, const char *format, ...); //格式化转换函数

int snprintf(char *str, size_t size, const char *format, ...);

 

#include

#include

int main()

{

    char str[100];

    sprintf(str,"%s%s%s%d%c%f","123","456","789",666,'A',123.456);

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

    return 0;

}

//输入的是字符串

#include

int scanf(const char *format, ...);

int fscanf(FILE *stream, const char *format, ...);

int sscanf(const char *str, const char *format, ...);

 

#include

#include

int main()

{

    float a;

    char str[]="123.456";

    sscanf(str,"%f",&a); //"123"

    printf("a=%f\n",a);

    return 0;

}

 

//字符串转整数

#include

int atoi(const char *nptr);

long atol(const char *nptr);

long long atoll(const char *nptr);

long long atoq(const char *nptr);

 

知识点3:多维数组

一维数组和二维数组使用频率较高。

一维数组:  定义的时候只有一个下标。 char buff[100];

二维数组:  定义的时候只有二个下标。 char buff[10][100];

二维数组可以看成一个矩阵。char buff[行][列];

3.1 二维数组特点:

  1. 二维数组定义的时候,如果赋了初始值,行可以省略掉,列不可用省略。

int main()

{

    char data1[3][3]={{1,2,3},{4,5,6},{7,8,9}};

    char data2[3][3]=

    {

       {1,2,3},

       {4,5,6},

       {7,8,9}

    };

    //第1个[]指定有多少个一维数组,第2个指定1维数组有多大

    char data3[][5]=

    {

       1,2,3,

       4,5,6,

       7,8,9

    };

    return 0;

}

3.2. 二维数组如何访问成员?

#include

#include

int main()

{

   char data[3][3]=

   {

       {1,2,3},

       {4,5,6},

       {7,8,9}

   };

   printf("第1行的第2列:%d\n",data[1][2]);

   

   char str[][100]={"123","456","789","中国","嵌入式"};

   printf("%s\n",str[3]);// str[3]== char str[]="中国";

   return 0;

}

3.3 作业

定义一个int类型的二维数组,比如:[400][400],从键盘上向这个二维数组录入数据,计算二维数组交叉数据之和。  ---计算矩阵交叉—对角线数据的和。

#include

#include

int main()

{

    int data[4][4];

    int i,j;

    //从键盘上录入数据

    for(i=0;i<4;i++)

    {

       for(j=0;j<4;j++)

       {

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

       }

    }

    return 0;

}

知识点4:一行代码上字符串太长该如何定义?

#include

#include

int main()

{

    //第一种方法:

    char str1[]="1234567890123456789012 \

    34567890123456789012345678901234567 \

    89012345678901234567890123456789012 \

    345678901234567890";

    //第二种方法:

    char str2[]="1234567890"

    "123456789012345678901234"

    "567890123456789012345678"

    "9012345678901234567890";

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

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

    return 0;

}

知识点5:一维指针

5.1 指针的概念

指针就是地址。C语言里指针可以直接访问地址,计算机的CPU、外设硬件都是依靠地址操作的。

指针变量如何定义?

#include

#include

int main()

{

    char *p1;   //定义一个char类型的指针变量

    int *p2;    //定义一个int类型的指针变量

    //int类型的指针变量: 存放地址数据。

    

    int data=123; //定义一个int类型的变量

    //int类型的变量: 存储整数数据。

    return 0;

}

指针如何使用?

#include

#include

int main()

{

    // &data  取地址    a&b 按位与   a&&b  并且

    // int *p 定义一个int类型的指针

    // *p   取出指针指向空间中的数据--取数据

    // a*b a和b乘法

    

    int *p; //指针变量本身就是存放地址的

    int data=123; 

    //p=data; //错误:data本身只是一个变量标识符,不是地址

    p=&data;  //将data的地址赋值给指针p

    

    printf("*p=%d\n",*p); //取出指针p指向空间中的数据

    *p=666; //给指针指向的空间赋值

    printf("data=%d\n",data);

    return 0;

}

什么是野指针?

野指针就是本身没有合法地址空间---非法指针。

野指针会导致的常见错误:段错误。

下面代码就会导致段错误:

#include

#include

int main()

{

    int *p;//指针只能存放地址

    *p=123;

    printf("*p=%d\n",*p);

    return 0;

}

指针本身占的空间是多少?

所有指针类型都占4个字节空间。和类型没有关系。

#include

#include

int main()

{

    int *int_p;//指针只能存放地址

    int int_a;

    char *char_p;//指针只能存放地址

    char char_a;

    float *float_p;//指针只能存放地址

    float float_a;

    double *double_p;//指针只能存放地址

    double double_a;

    printf("int_a=%d\n",sizeof(int_a));//4

    printf("int_p=%d\n",sizeof(int_p));//4

    

    printf("char_a=%d\n",sizeof(char_a));

    printf("char_p=%d\n",sizeof(char_p));

    

    printf("float_a=%d\n",sizeof(float_a));

    printf("float_p=%d\n",sizeof(float_p));

    

    printf("double_a=%d\n",sizeof(double_a));

    printf("double_p=%d\n",sizeof(double_p));

    return 0;

}

5.2 指针访问数组成员

访问一维数组成员的方式有哪些?

#include

#include

int main()

{

    int a[]={1,2,3,4,5,6,7,8,9,0};

    int *p;

    p=a;

    printf("下标4的值:%d\n",a[4]); //5

    printf("下标4的值:%d\n",*(a+4)); //5

    printf("下标4的值:%d\n",*(p+4)); //5

    return 0;

}

指针访问一维数据常用的操作方式:字符串

#include

#include

int main()

{

    char str[]="1234567890";

    char *p=str;

    int len=0;

    printf("p=%s,str=%s\n",p,str);

    //计算字符串的长度

    while(*p++!='\0')

    {

       len++;

    }

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

    return 0;

}

指针自增和自减?++和—运算符

#include

#include

int main()

{

    int a[]={1,2,3,4,5,6,7,8,9,0};

    int *p=a;

    printf("%d\n",*p);   //1

    printf("%d\n",*p++); //1

    printf("%d\n",*p);   //2

    printf("%d\n",*(p+3));//5

    printf("%d\n",*p);//2

    printf("%d\n",*(++p));//3

    printf("%d\n",*p);//3

    printf("%d\n",*p--);//3

    printf("%d\n",*p);//2

    return 0;

}

指针自增自减偏移字节是多少? 与指针本身的类型有关系。

#include

#include

int main()

{

    /*

    int a[]={1,2,3,4,5,6,7,8,9,0};

    int *p=a;

    printf("偏移之前的地址:p=%#x\n",p);

    *(p++);

    printf("%d\n",*p);   //2

    printf("偏移之后的地址:p=%#x\n",p);

    */

    char a[]={1,2,3,4,5,6,7,8,9,0};

    char *p=a;

    printf("偏移之前的地址:p=%#x\n",p);

    *(p++);

    printf("%d\n",*p);   //2

    printf("偏移之后的地址:p=%#x\n",p);

    return 0;

}

 

数组本身可以当做指针使用吗?不可以

指针特点: 自增、自减、可以改变指向。

#include

#include

int main()

{

    int a[]={1,2,3,4,5}; //*(a+3)

    int b[]={11,12,13,14,15};

    //下面3行代码是错误的

    a--;

    a++;

    a=b;

    return 0;

}

指针可以当做数组使用吗? 可以

数组特点: 可以通过下标访问数组成员。

#include

#include

int main()

{

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

    int *p=a;

    printf("%d\n",a[0]);

    printf("%d\n",p[0]); //*p

    return 0;

}

5.3 数组指针

数组指针可以指向一个一维数组,行指针也叫一维数组指针

定义语法:  char (*p)[5]; 该指针指向一个二维数组里的一个一维数组地址,一维数组的成员是5个字节。

二维数组的定义方法: char a[10][5];

#include

#include

int main()

{

    int (*p)[5]; //定义一个一维数组指针---行指针

    int a[2][5]=

    {

       {1,2,3,4,5},

       {6,7,8,9,10}

    };

    p=a; //将a地址给p指针

    printf("%d\n",p[0][2]);

    

    p++; //加一个一维数组的大小

    printf("%d\n",p[0][2]);

    return 0;

}

5.4 指针数组

指针数组:  表示该数组成员可以存放指针。

指针数组定义语法:int *p[5]; 表示定义一个int数组,该数组的类型可以存放5个int类型的指针变量(地址)。

#include

#include

int main()

{

    int a,b,c;

    int *p[3]; //一次定义3个int类型的指针变量

    //存放地址

    p[0]=&a;

    p[1]=&b;

    p[2]=&c;

    //对空间赋值

    *p[0]=123;

    *p[1]=456;

    *p[2]=789;

    //取出数据

    printf("%d\n",*p[0]);

    printf("%d\n",*p[1]);

    printf("%d\n",*p[2]);

    return 0;

}

 

#include

#include

int main()

{

    char a[][100]={"小明","小白","小李"};

    char *p[]={"小明","小白","小李"};

    

    printf("%s\n",a[0]);

    printf("%s\n",p[0]);

    return 0;

}

5.5 字符串查找函数

#include

char *strstr(const char *源字符串, const char *要查找的字符串);

函数功能: 就是在源字符串里查找指定的字符串,查找到之后就返回该字符串的地址。

 

#include

#include

int main()

{

    char str[]="123abc4567890";

    char *p;

    p=strstr(str,"abc");

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

    return 0;

}

5.6 指针类型常见的初始化值:NULL

#include

#include

int main()

{

    char *p=NULL; // (void*)0 == NULL

    printf("%#x\n",p);

    if(p!=NULL)

    {

       //判断指针是否可以使用

    }

    return 0;

}

5.7 作业:字符串解析

1. 练习上午学习的新知识。

2. 解析GPS的数据。GPS芯片接收到卫星的信号之后,会通过字符串的形式将解析的数据输出。

#include

#include

int main()

{

    char gps_data[]=

    {

        "$GNGGA,114955.000,2842.4158,N,11549.5439,E,1,05,3.8,54.8,M,0.0,M,,*4F"

       "$GNGLL,2842.4158,N,11549.5439,E,114955.000,A,A*4D"

       "$GPGSA,A,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37"

       "$BDGSA,A,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2A"

       "$GPGSV,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7B"

       "$GPGSV,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7C"

       "$GPGSV,3,3,10,31,50,287,36,32,66,018,*7F"

       "$BDGSV,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62"

        "$GNRMC,114955.000,A,2842.4158,N,11549.5439,E,0.00,44.25,061117,,,A*4D"

       "$GNVTG,44.25,T,,M,0.00,N,0.00,K,A*14"

       "$GNZDA,114955.000,06,11,2017,00,00*47"

       "$GPTXT,01,01,01,ANTENNA OK*35"

    };

    return 0;

}

 

 

 

 

  审核编辑:汤梓红

 

 

 

 

 

 

 

 

 

 

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分