C语言-5、数组和字符串

数组和字符串(越界问题)
特点:同一数组中的所有元素都属于同一种数据类型(int、char、float),数组元素用数组名和相应的下标来确定。
方法:一个数组元素其实就是一个变量,可以称为带下标的变量
一、一维数组
1、一维数组
定义格式:类型名   数组名[常量表达式];
如:float s[25];
float s[5*5];
int a[10];
char b[30];
2、一维数组元素的引用格式:
数组名[下标]
3、一维数组初始化
格式:类型名   数组名[常量表达式] = {初值1,初值2.......}
备注:
(1)花括号里面的初值数量:多则出错,少则补0;
(2)初值全部给出,常量可以省略;
(3)初值一个不给则是随机值。
(4)a[5] = {1,2,3,4,5}-----Error(定义语句没有类型)

二、二维数组
定义格式:类型名   数组名[常量表达式1][常量表达式2];
常量表达式1-------行数
常量表达式2-------列数  

如:int a[10][10];
在内存中二维数组元素的存放也是连续的,先行后列的原则

二维数组的初始化:
法1:int a[2][3] = {1 , 2, 3, 4, 5, 6}
 
法2: int a[2][3] = {{1,2,3}(花括号里面不允许是空值), {4,5,6}}按行进行初始化,每一行的初值均用一对{}括起

备注:定义二维数组的同时给数组初始化,则可以省略行数,但列数不能省略


三、字符数组
存放方法:
(1)字符数组来存放
(2)字符型指针变量

a:字符串常量后有一个'\0'。
如:"abcd"由五个字符组成
""等价于"\0",是一个空字符串。
b:用字符串给一字符数组进行初始化的三种情况:
(1)char a[] = “abcd”;----------长度5
(2)char a[] = {“abcd”};----------长度5
(3)char a[] = {'a', 'b', 'c', 'd'};-----------长度是4
(4)char a[] = {'a', 'b', 'c', 'd', '\0'};-----------长度是5

c:字符串存储(赋值)四种方法
(1)用scanf时不需要再加取地址符号&,因为字符数组本身就是地址
    scanf("%s",a);合法的
    scanf("%s",&a);不合法的
    用%s格式输入时,遇到空格符或者回车符则自动结束输入,若scanf("%s,%s",a,b);不能正确读取数据,不能有逗号。 
(2)
gets()键盘输入
    格式:#include<stdio.h>
    gets(字符数组)
    功能:读取一个字符串赋给字符数组
Note:用该函数输入字符的时候,只要遇到回车符,系统才结束读取
puts()输出
    格式:#include<stdio.h>
    puts(字符数组或字符串常量)
    功能:在终端上输出字符数组中的字符。
Note:用该函数输出与%s格式输出一样,只是该函数将'\0'转换'\n'输出。

d:strcpy();方式

四、字符串函数
第一个函数:strcat()
格式:#include<string.h>
strcat(字符数组1,字符数组2);
功能:连接

第二个函数:strcpy()拷贝
格式:#include<string.h>
strcpy(字符数组1,字符数组2);
功能:将字符串数组2中的字符串(包括\0)替换到字符数组1中。函数值为字符串数组1的首地址

第三个函数:strcmp()数值(0,大于0,小于0)
格式:#include<string.h>
strcmp(字符数组1,字符数组2);
功能:函数返回值相同位置不同字符的ASCII码的差值。
Note:
(1)不能进行字符串的比较如:"abc" == "abc"    或者  "abc" > "ab"这都是不合法的

第四个函数:strlen()
格式:#include<string.h>
strlen(字符数组);
功能:求出字符数组的实际长度(不包括结束符'\0')

\025算1位-----('\'后面放8进制最多三位)
"abc\017\0"的长度是4
"abc\08\0"的长度为3
Note:strcat()第一个'\0'开始连入,第二个串'\0'也连入,返回第一个元素的首地址

#include<iostream>
#include<cstdio>
using namespace std;

int main(){
	char pa[15] = "12345";
	char *pb = "EFG";
	
	//pb = pa;
	//pa = pb;
	//strcpy(pa,"ABCDEFGXYZ");
	puts(pa);
	puts(pb);

	return 0;
}
//预期结果:
12345
EFG
#include<iostream>
#include<cstdio>
using namespace std;

int main(){
	char pa[15] = "12345";
	char *pb = "EFG";
	
	pb = pa;
	//pa = pb;
	//strcpy(pa,"ABCDEFGXYZ");
	puts(pa);
	puts(pb);

	return 0;
}
//预期结果
12345
12345
#include<iostream>
#include<cstdio>
using namespace std;

int main(){
	char pa[15] = "12345";
	char *pb = "EFG";
	
	//pb = pa;
	pa = pb;
	//strcpy(pa,"ABCDEFGXYZ");
	puts(pa);
	puts(pb);

	return 0;
}
//预期结果
Error
/*
原因分析:pa是数组名,实际它就是一个地址常量
在pa = pb 的赋值表达式中pa出现在“=”赋值号的左边,
我们知道赋值号的左边是变量而不是常量,所以程序直接出错

*/

#include<iostream>
#include<string.h> 
#include<cstdio>
using namespace std;

int main(){
	char pa[15] = "12345";
	char *pb = "EFG";
	
	//pb = pa;
	//pa = pb;
	strcpy(pa,"ABCDEFGXYZ");
	puts(pa);
	puts(pb);

	return 0;
}
//预期结果
ABCDEFGXYZ
EFG
#include<iostream>
#include<string.h> 
#include<cstdio>
using namespace std;

int main(){
	char pa[15] = "12345";
	char *pb = "EFG";
	
	pb = pa;
	//pa = pb;
	strcpy(pa,"ABCDEFGXYZ");
	puts(pa);
	puts(pb);

	return 0;
}
//预期结果
ABCDEFGXYZ
ABCDEFGXYZ

 

Note:   
(1)封号不可缺
(2)数组名不能是关键字
(3)方括号里面的常量/常量表达式------数组元素的个数/数组长度/数组的大小
(4)方括号中的表达式不能含变量,另外表达式的值必须要大于0且为正整数。
(5)C语言每个数组在内存中分配空间时是连续分配的 
如: 
int a(10);-----Error
int a{10};-----Error
int N = 10; int a[N];-----Error
#define N 9
int a[N];-------Right  

(6)C语言中不能对数组进行整体引用只能单独引用其中的元素。引用时下标可以是表达式。
(7)数组元素的下标值在(0~N-1之间)

一维数组的使用:

#include<stdio.h>
/*
功能:将数组中的字符转换成十进制数 
*/
int main(){
	int a[] = {1, 2, 3, 4}, i, j, s = 0;
	j = 1;
	for(i = 3; i >= 0; i--){
		s = s + a[i] * j;
		j = j * 10;
	}
	
	printf("s=%d\n",s);
	//预期结果:1234 
	return 0;
} 

二维数组的使用1:

#include<stdio.h>
int main(){
	int a[3][3] = {{1,2}, {3,4}, {5,6}}, i, j, s = 0;
	for(i = 0; i < 3; i++){
		for(j = 1; j <= i; j++){
			s += a[i][j];
		}
		printf("%d\n",s);
		//预期结果:0 4 10 
	}
	printf("s=%d\n",s);
		//预期结果:10 
	return 0;
} 

二维数组的使用2:

#include<iostream>
#include<cstdio>
using namespace std;
/*
3X3矩阵,编写程序求解矩阵B = A + A的转置 
*/ 
int main(){
	int a[3][3] = {0};
	int a1[3][3] = {0}; 
	int b[3][3] = {0};
	int count = 1;
	for(int i = 0; i < 3; i++){
		for(int j = 0; j < 3; j++){
			a[i][j] = count;
			count++;
		}
	}
	//产生转置矩阵(可简化,不需要再定义转置矩阵)
	for(int i = 0; i < 3; i++){
		for(int j = 0; j < 3; j++){
			a1[j][i] = a[i][j];
			
		}
	}
	//矩阵求和 
	for(int i = 0; i < 3; i++){
		for(int j = 0; j < 3; j++){
			b[i][j] = a[i][j] + a1[i][j];	
            //b[i][j] = a[i][j] + a[j][i];如果没有定义转置矩阵的情况求矩阵和
		}
	}
	//打印矩阵
	 for(int i = 0; i < 3; i++){
		for(int j = 0; j < 3; j++){
		printf("%4d",b[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值