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

网友投稿 942 2023-01-02

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

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

知识点1:字符串

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

1.1字符串作业

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

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

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”

(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二维数组特点:

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

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.二维数组如何访问成员?

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指针的概念

指针变量如何定义?

#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字符串查找函数

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芯片接收到卫星的信号之后,会通过字符串的形式将解析的数据输出。

上一篇:智能家居产品有哪些(功能)_智能家居产品大全_智能家居产品介绍
下一篇:it运维管理书籍推荐(运维工程师推荐书籍)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~