0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-05-21 09:11 次阅读

知识点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;

}

审核编辑:汤梓红

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

    关注

    180

    文章

    7530

    浏览量

    128532
  • 字符串
    +关注

    关注

    1

    文章

    551

    浏览量

    20109
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25595
收藏 人收藏

    评论

    相关推荐

    数组写入二维数组

    labview如何将数组写入二维数组某列或某行
    发表于 12-27 17:04

    labviEW中二维数组排序问题

    问题是这样的,我不断采集过来的两种参数,都是成对出现的,我把它们组成了二维数组,现在就想以其中的个参数按大小排序,另个参数不排序但是
    发表于 03-31 13:48

    LabVIEW中怎样将数组转换成二维数组

    点击学习&gt;&gt;《龙哥手把手教你学LabVIEW视觉设计》视频教程个比较长的数组(长度实时变化,但始终为4的整数倍),怎样将其转换成
    发表于 04-01 11:20

    labview二维数组问题

    二维数组数组每个元素又包含3个元素,将两数组比较找出个和另个相同或接近的元素,用labv
    发表于 05-04 17:25

    数组生成二维数组时项数太多导致缓慢

    数组生成二维数组时项数太多导致缓慢,就是几千个数以后就特别缓慢,怎么解决
    发表于 03-12 08:44

    数组二维数组的删重处理

    本帖最后由 zzc_px 于 2015-9-25 09:55 编辑 附件为对二维数组数组的删重处理,求大神指点更加效率的方案。
    发表于 09-24 11:26

    如何将端口读入的数组变为N*7的二维数组

    现在要把个从端口读入的数组变为二维数组,这个
    发表于 09-21 18:22

    labview二维数组提取几行组成新数组

    想问下大家,labview里二维数组通过对其中列的元素进行阈值判断,然后将满足条件的
    发表于 02-16 17:47

    二维数组指针的问题?

    比如定义二维数组int a[3][5], 我们知道a是这个二维数组的首地址,a[0]是第
    发表于 05-09 11:28

    C语言二维数组的定义和引用

    今天用二维数组时不知道怎么用了,网上查了下,摘到这里来了。数组只有个下标,称为
    发表于 07-12 08:55

    在LABVIEW中怎么将二维数组转化为数组

    `在LABVIEW中怎么将二维数组转化为数组并且如何将数据显示到波形图中... 并且如何将数据显示到波形图中在“
    发表于 02-14 16:56

    二维数组冒泡排序

    Labview中对于数组可以直接排序,但如果是二维数组时,特别是字符串类型二维
    发表于 09-30 16:06

    请问C语言怎么实现在二维数组里循环遍历呢?

    怎么用C语言实现在二维数组里循环遍历呢?
    发表于 03-17 04:35

    二维数组

    如图,如何得到二维数组滚动条的位置, 持续写入数据时,想让滚动条显示在最新数据的位置
    发表于 01-11 17:14

    ​​​LabVIEW DLL传递二维数组报错

    ​​​LabVIEW DLL传递二维数组报错当调用个LabVIEW DLL时,首先需要声明处理程序变量并将其初始化为NULL,比如,在C
    发表于 02-19 20:44