C语言数据存在形式——数组,字符串

目录

介绍

数组定义

数组初始化

sizeof关键字

数组的访问

数组运用

字符串定义

字符串初始化

字符串函数

strlen和sizeof和陷阱

字符串运用


  • 介绍

 ==》 数组: 在程序设计时,为了处理时的方便,通常把同类型的若干数据变量按有序的组织起来(分配一段连续的储存空间),这些数据元素的集合就是数组。

 ==》 字符串:通俗的讲就是一串字符。这些字符是用数组组织,即就是字符数组。

 ==》 指针在计算机中内存中,每个单元内存都有编号,为了方便访问便有了指针,指针的通俗理解就是内存这个房间的门牌号。(可以点击,进行了解)

  • 数组定义

  • 1、一维数组

                 类型+数组名+[常量表达式]

  •  2、二维数组

                 类型+数组名+[常量表达式][常量表达式]

  •  3、举例
//C语言
//数组的定义。这里简单的举例子。不是整个程序代码。
 int arr[9];
 char arr[9];

//注意!!数组名不能和当前代码块或者全局变量重复。如:下面错误的形式
main()
{
        int arr=0;
        int arr[9];
}
//注意!![ ]里必须是常量或常量表达式,不能是变量,如:

//这里错误的示范
main()
{
       int a=9;
       int arr[a];//即使初始化了变量也不行。
}

//这里正确的示范
#define D 9
main()
{
       int arr[D]; 
}

//二维以上的数组不常用,所以不记录,但定义的方式就是加“[ ]”

  • 数组初始化

          数组的初始化和变量一样可以在定义的时候初识赋值。一般格式如下:

                              类型 + 数组名 + [ ]+ = {, , , };

  • 1、一维数组  &  二维数组
//C语言
//数组的声明。
//一般格式:类型 + 数组名 + [ ]+ = +{, , , };
main(){
           int arr[3]={1,2,3};
           int arr2[3][3]={{1,2,3},{0},{1,2,3}};//这里写0,
                                                //代表arr2[1][0]==arr2[1][1]==arr[1][2]==0
  • 2、细节

           数组的下标是从 0 开始的!!!!!!

  • sizeof关键字

sizeof是关键字,不是函数。它返回一个对象或者类型所占的内存字节数。它在数组计算中有很大的作用。下面举例说明一下

//c语言
//sizeof
//计算类型的字节数
//在说明类型的字节是一定要注意在什么环境下。现在是在32位编译环境下
void test1()
{
    printf("int:%d\n",sizeof(int));//4字节
    printf("char:%d\n",sizeof(char));//1字节
    printf("double:%d\n",sizeof(double));118字节
}
//计算数组的字节数和长度
void test2()
{
    int arr[5];
    printf("char:%d\n",sizeof(arr));//20字节,5个元素 * 4个int所占的4字节 == 20字节
    //这个时候计算数组的长度
    int len = 0;
    len = sizeof(arr)/sizeof(int)
    //对比下面的公式,计算的不就是有多少个元素吗?
    //5个元素 * 4个int所占的4字节 == sizeof(arr)
}
  • 数组的访问

对于数组的访问,因为它是一段连续的空间,所以访问起来很方便,看随机的访问,或通过指针访问。任何数组都可以通过这两种方法访问。

int arr[6] = {1,2,3,4,5,6};这里有一个数组
随机访问:可以访问任何一个数,通过 [],数组的下标是从0开始的,所以访问1的时候,就是arr[0]。
指针访问:因为指针是指向数组首地址,所以访问 1的时候,也可以是*arr,访问5的时候可以是*(arr+5)。

  • 数组运用

  • 1、将数组A中的内容和数组B中的内容进行交换。(数组一样大)
//C语言
#include<stdio.h>
#include<stdlib.h>
//将数组A中的内容和数组B中的内容进行交换。(数组一样大) 
void main() {
	int arr1[10],arr2[10],temp[10];
	printf("请输入10个数A10(空格隔开):");
	for (int i = 0; i < 10;i++) {
          scanf_s("%d",&arr1[i]);
	}
    printf("请再输入10个数B10(空格隔开):");
	for (int j = 0; j < 10;j++) {
          scanf_s("%d",&arr2[j]);
     }
	for (int k = 0; k < 10;k++) {
		temp[k] = arr1[k];
		arr1[k] = arr2[k];
		arr2[k] = temp[k];
	}
	printf("NOW\nA10:");
	for (int i = 0; i < 10;i++) {
	  printf("%d",arr1[i]);
	}
	printf("\nNOW\nB10:");
	for (int i = 0; i < 10;i++) {
	  printf("%d",arr2[i]);
	}
	printf("\n:");
	system("pause");
}
  • 2、创建一个数组,实现函数init()初始化数组、实现empty()清空数组、实现reverse()函数完成数组元素的逆置
  • 要求:自己设计函数的参数,返回值。
//C语言
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

//先逆置,再初始化,再清空。节约时间,不用再定义数组或者初始化数组。
void reverse(int arr[],int len) {
	int right = len-1;
	int left = 0;
	printf("逆置后的数组为");
	while (left<=right) {
		int temp = arr[left];
		arr[left] = arr[right];
		arr[right] = temp;
		--right;
		++left;
	}
	int num = 0;
	while (num<len) {
	printf("%d ",arr[num]);
	++num;
	}
	
}
void init(int arr[],int len) {
	int num = 0;
	printf("\n");
	printf("初始化的数组为:");
	while (num<len) {
		arr[num] = 1;
		printf("%d ",arr[num]);
		++num;
	}
}
void empty(int arr[],int len) {

	int num = 0;
	printf("\n");
	printf("清空后的数组是:");
	while (num<len) {
		arr[num] = '\0';//清空就是为空值
		printf("%d ",arr[num]);
		++num;
	}
	printf("\n");
}
void main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int len=sizeof(arr) / sizeof(arr[0]);//求数组长度,这里我直接使用
	int temp = 0;
	printf("原数组为:");
	while (temp<len) {
		printf("%d ",arr[temp]);
		++temp;
	}
	printf("\n");
	reverse(arr,len);
	init(arr,len);
	empty(arr,len);
	system("pause");
}
  • 字符串定义

其实c语言里面没有字符串这种类型,只是字符串可以理解成字符数组。字符数组有以下两种初始化格式或者是赋值格式。下面介绍

  • 字符串初始化

与数组初始化一样,它也是数组

//C语言
//例子
//字符串

main(){
//这是C风格的字符串,没有'\0'结尾的,所以注意strlen()在这里不能用!!!
     char ch[]={'c','o','m','p','u','t','e','r'};//字符串用char定义

     

//这里是'\0'结尾的,可以用strlen()函数。
 char ch[]="computer";
 char* arr="computer";//字符串指针

//带""都有'\0'
}
  • 字符串函数---strlen、strcpy、strcmp

上面几个函数是经典常用的,所以当作例子介绍。字符串函数有很多,在后面的学习过程中会介绍。

//c语言

//strlen((char *s)函数,求字符串长度,针对字符串
void test1()
{
    char str[] = "string";
    int len = strlen(str);
    //注意strlen函数,是在字符串中找到'\0',然后停下来。如果定义错了,strlen()就凉凉
}
//strcpy(char *dest,char *src)函数,字符产复制函数,把src指针的字符串复制一份到dest
void test2()
{
    char* str = "string";
    char  s[7];
    strcpy(s,str);//一定要保证s的空间是足够容纳*str这个字符串的
}
//strcmp(char *str1, char *str2),根据ASCII码表来比较的。每个字符每个字符来比较。
//这个函数为Windows特有,str1 > str2,则返回大于0,等于则返回0,否则返回小于0.
void test3()
{
    char* str1 = "string";
    char* str2 = "abcdef";
    printf("%d\n",strcmp(str1,str2));
}
  • 说到这儿,请注意strlen和sizeof的区别和陷阱

数组和指针渊源很深,所以对于strlen和sizeof非常有关注的必要,所以专门写了一个专题。对数组和指针理解也有很大的帮助

专题:strlen()和sizeof()的陷阱

  • 字符串运用

  • 1、有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student".
  • 要求:不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
//C语言
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//有一个字符数组的内容为:"student a am i",
//	请你将数组的内容改为"i am a student".
//	要求:
//	不能使用库函数。
//	只能开辟有限个空间(空间个数和字符串的长度无关)。
//
//	student a am i
//	i ma a tneduts
//	i am a student
int leng(char* str) {
	int len=0;
	while(str[len]!='\0'){
		++len;
    }
	return len;
}
void swap_one(char* str, int star, int end) {

	while (star <= end) {
		char temp = str[star];
		str[star] = str[end];
		str[end] = temp;
		++star;
		--end;
	}
}

void swap_two(char* str) {
	int temp = 0; 
	int start = 0; 
	int end = leng(str) - 1;
	swap_one(str,start,end);
	printf("第一次翻转后的字符串:%s\n",str);
	while(str[temp]!='\0') {
		start = temp;
		while((str[temp]!='\0')&&(str[temp]!=' ')) {
			temp++;
		} 
		end = temp - 1;
		swap_one(str,start,end);
		if (str[temp] != '\0') {
			temp++;
		}
	} 
	printf("最后一次翻转后的字符串为:%s\n",str);
}
	
void main() {
	char orig[] = "student a am i";
	printf("原字符串为:%s\n",orig);
	int end = leng(orig)-1;
	int star = 0;
	swap_two(orig);
	system("pause");
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值