C语言提高-37讲: 操作字符串数组(带姓名的成绩单)
2017-11-01 09:31
337 查看
任务和代码:
运行结果:
上述代码将字符串数组定义成char *name[],接下来定义成char name[][10]试试:
运行结果:
知识点总结:
操作字符串二维数组;
将下标对应的一维数组元素和二维字符串数组中的字符串同时交换;
冒泡法和选择法排序的使用。
char *a 与 char a[] 的区别(指针和数组的区别)
理解二维数组和二级指针的区别
Q1:
在第一段代码中,字符串必须使用赋值的方式;而在第二段代码,则必须strcpy。Why?
A1:
首先字符串二维数组可以定义成char *name[],也可定义成char name[][10]
char *name[]的类型char ** name是一个二级指针,name[i]为指向第i行字符串的指针
char name[][10]的类型char (*)[10] name是二维数组的行数组指针,name[i]为第i行的字符数组
Q2:
在确定name[i]的类型之后,要定义一个临时变量temp进行交换操作,发现:
代码段一中char *temp=name[0];换成char temp[10];出错,代码段二中却能互换。Why?
A2:
char a[10] Vs char *a
数组一旦定义好,数组地址a及数组容量不会改变,只有内容可以改变;
指针可以指向不同的内存区域,当指向常量字符串时(char *a="hello";),不能修改其内容。
故,代码段一中,char temp[10]; temp是数组名代表了数组地址,不能更改;
代码段二中,char *temp=name[0]; name[0]是字符串变量,若换成字符串常量则出错。
/* *All rights reserved *文件名称:main.c *作者: Osseyda 完成日期:2017.11.1 *版本号:v2. *问题描述:设score数组中存储8名同学的C语言成绩,字符串数组name中存储同学们的姓名。这两个数组中,每名同学的姓名与成绩的下标要始终保持一致(例如name[i]和score[i]表示同一位同学(下标为i)的姓名和C语言成绩,否则会张冠李戴)。 (1)输出按成绩排序后的同学的名单; (2)输出按同学姓名排序后的成绩单(排序对象是字符串)。 */ #include<stdio.h> #include<string.h> #define num 8 void sort_grade(char *name[] ,double score[],int); void sort_name(char *name[] ,double score[],int); void print(char *name[] ,double score[],int); int main(){ char *name[]={"zhao","qian","sun","li","zhou","wu","zheng","wang"}; double score[num]={79,84,65,89,60,92,78,56}; //(1)按成绩排序并输出结果 sort_grade(name,score,num); print(name,score,num); printf("\n"); //(2)按姓名排序并输出结果 sort_name(name,score,num); print(name,score,num); return 0; } void print(char *name[] ,double score[],int n){ int i; for(i=0;i<n;i++) printf("%s\t%.2f\n",name[i],score[i]); } void sort_grade(char *name[] ,double score[],int n){ int i,j,t; char *temp=name[0]; //换成char temp[10];再用strcpy,出错 for(i=0;i<num-1;i++) //仅换成char temp[10];出错 for(j=0;j<num-i-1;j++) if(score[j]>score[j+1]){ t=score[j]; score[j]=score[j+1]; score[j+1]=t; temp=name[j]; name[j]=name[j+1]; name[j+1]=temp; } } void sort_name(char *name[] ,double score[],int n){ char *temp=name[0]; int i,j,k,t; for(i=0; i<n-1; i++){ k=i; for(j=i+1; j<n; j++) if(strcmp(name[k],name[j])>0) k=j; temp=name[i]; name[i]=name[k]; name[k]=temp; t=score[i]; score[i]=score[k]; score[k]=t; } }
运行结果:
上述代码将字符串数组定义成char *name[],接下来定义成char name[][10]试试:
/*只输出按成绩排序后的同学的名单;*/ #include<stdio.h> #include<string.h> #define num 8 void sort_grade(char name[][10] ,double score[],int); void print(char name[][10] ,double score[],int); int main(){ char name[][10]={"zhao","qian","sun","li","zhou","wu","zheng","wang"}; double score[num]={79,84,65,89,60,92,78,56}; //(1)按成绩排序并输出结果 sort_grade(name,score,num); print(name,score,num); printf("\n"); return 0; } void print(char name[][10] ,double score[],int n){ int i; for(i=0;i<n;i++) printf("%s\t%.2f\n",name[i],score[i]); } void sort_grade(char name[][10] ,double score[],int n){ int i,j,t; char temp[10]; //char *temp=name[0]; for(i=0;i<num-1;i++) for(j=0;j<num-i-1;j++) if(score[j]>score[j+1]){ t=score[j]; score[j]=score[j+1]; score[j+1]=t; strcpy(temp,name[j]); strcpy(name[j],name[j+1]); strcpy(name[j+1],temp); } }
运行结果:
知识点总结:
操作字符串二维数组;
将下标对应的一维数组元素和二维字符串数组中的字符串同时交换;
冒泡法和选择法排序的使用。
char *a 与 char a[] 的区别(指针和数组的区别)
理解二维数组和二级指针的区别
Q1:
在第一段代码中,字符串必须使用赋值的方式;而在第二段代码,则必须strcpy。Why?
A1:
首先字符串二维数组可以定义成char *name[],也可定义成char name[][10]
char *name[]的类型char ** name是一个二级指针,name[i]为指向第i行字符串的指针
char name[][10]的类型char (*)[10] name是二维数组的行数组指针,name[i]为第i行的字符数组
Q2:
在确定name[i]的类型之后,要定义一个临时变量temp进行交换操作,发现:
代码段一中char *temp=name[0];换成char temp[10];出错,代码段二中却能互换。Why?
A2:
char a[10] Vs char *a
数组一旦定义好,数组地址a及数组容量不会改变,只有内容可以改变;
指针可以指向不同的内存区域,当指向常量字符串时(char *a="hello";),不能修改其内容。
故,代码段一中,char temp[10]; temp是数组名代表了数组地址,不能更改;
代码段二中,char *temp=name[0]; name[0]是字符串变量,若换成字符串常量则出错。
相关文章推荐
- C语言及程序设计提高例程-37 操作字符串数组
- 第10章 C语言及程序设计提高例程-37 操作字符串数组
- 第7周 C语言及程序设计提高例程-28 字符串、字符数组、字符指针
- 编程能力提高-----C语言字符串的基本操作
- C语言及程序设计提高例程-28 字符串、字符数组、字符指针
- C语言:操作字符串数组
- C语言提高-28讲: 字符串、字符数组、字符指针
- C语言中文件操作--如何将文本数据正确读到字符串数组中
- 【C语言提高14】字符串的基本操作
- Python学习笔记5-字符串、bool、数值操作和数组字典排序
- c语言字符数组与字符串的使用详解
- 简单的数组操作字符串,加密可用
- C语言字符串操作函数
- 【C语言提高16】数组中括号与指针关系和数组名常量指针分析
- C语言中字符数组和字符串指针分析
- C语言之指针与字符串的相关操作
- C语言定义字符串和字符数组
- C语言字符串操作
- C语言及程序设计提高例程-26 实现线性表基本操作的函数
- C语言字符串操作总结大全(超详细)