C语言----数组(字符数组)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41026740/article/details/79595206

软件中,文本处理比数字处理更重要,而处理文字时需要用到字符串,所以掌握字符串的知识很重要。

字符串一定有‘\0’结尾,只有以‘\0’结尾的字符数组才能称为字符串。

'\0'是字符串的标志,也是字符串结束的标志。

一、字符串的定义

    char arr[10];
    char brr[5] = {'a','b','c','d','e'};//不是字符串,没有'\0'
    char crr[5] = {"abcd"};//最后一个元素crr[4] = '/0',是字符串
    //字符串:用“”包含,它一定以'/0'结尾
    char drr[5] = "abcd";//字符串:用“”包含,它一定以'/0'结尾

    char err[10] = {'a','b','\0','\0','e'};//是字符串,输出:ab 
    char brr[10] = {'a','b','c','d','e'};//brr[5]~brr[9]的值都是'\0'

错误定义:
int n = 10;
int a[n];//不合法

字符'\0'代表ASCII码为0的字符。即‘\0’就是0。

ASII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。

用'\0'来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。

注:字符串本身里不能包含'\0'.

因为字符串遇到第一个'\0'结束,后面元素无需再看,如下:

#include <stdio.h>
#include <string.h>
int main()
{char err[10] = {'a','b','\0','\0','e'};//是字符串
printf("%s\n",err);//输出:ab }

判断字符串,代码例子如下:
char arr[10] = {'a','b','c'}; //是
 char brr[] = "abcd";          //是
 char crr[] = {'a','b','c'};   //不是,没有‘\0’
 char drr[3] = "abc";          //不是
 char err[3] = {'a','b','d'};  //不是
 char frr[10] = "abcd";        //是

二、字符串的操作
char arr[] = "abcde";
char brr[10] = "x";
以下希望能支持的操作,实际不能做到,需要自己实现

1、brr = arr;   //复制 error,数组不能整体赋值
2、brr += arr; //链接 error
3、if(arr > brr); 
{ printf("arr > brr\n");}
else {printf("arr <="brr\n);}  //比较 error,语句正常,语法错误
(一)字符串复制操作
因为数组是集合,字符串不能整体复制,可分别给每个元素赋值。
字符串无需传长度,遇到‘\0’则结束。

1、遍历字符数组的第一种方式
void Mystrcpy1(char *des,char *src)
{
	int i;
	for(i=0;src[i]!='\0';i++)//遍历字符数组的第一种方式
	{
		des[i] = src[i];//des[i] == *(des+i);
	}
	des[i] = '\0';
}
des[i] == *(des+i),将以上代码转化如下:
void Mystrcpy2(char *des,char *src)
{
	int i;
	for(i=0;*(src+i)!='\0';i++)
	{
		*(des+i) = *(src+i);
	}
	*(des+i) = '\0';
}
2、遍历字符数组的第二种方式
void Mystrcpy3(char *des,const char *src){while(*src != '\0')//遍历字符数组的第二种方式{*des = *src;
des++;src++;}*des = '\0';}
3、第二方式中while语句里的内容可换成 *des++ = *src++,如下:
void Mystrcpy4(char*des,char *src)
{
	while(*src != '\0')
	{
		*des++ = *src++;
	}
	*des = '\0';
}
4、
void Mystrcpy5(char *des,char *src)
{
	while(*des++ = *src++) ;//*****
}      
//后置++先不加,循环为真时,继续下一次的操作,遇'\0'跳出。
注:0是判断while循环的条件。
此种方法虽语句简洁,但可读性差,不可取。

根据while循环举个例子如下:
int a = 100;
    while(a = 5)
	    printf("true\n");

output: true
a = 5是赋值语句,非0永真
5、常用方法引用strcpy()库函数
  需加头文件 #include<string.h>

三、assert断言的使用
加头文件#include<assert.h>
一定不允许某种情况出现(客观情况)
char * Mystrcpy(char *des,const char *src)
{
	assert(des!=NULL && src!=NULL);//断言
	//断定表达式一定为真.如果为假程序崩溃,为真则什么也不做
	if(des==NULL || src==NULL)
	{
		return ;
	}
	char *p = des;

	while(*des++ = *src++);
	
	return p;
}

int Div(int a,int b)
{
	assert(b != 0);//
	return a/b;
}
四、求字符串的长度
①库函数strlen();
需加头文件#include<string.h>
#include <stdio.h>
#include <string.h>

int main()
{
	char *str = "abcde";
	printf("%d\n",strlen(str));
	return 0;
}
//output:5

注意:统计字符串的有效长度,不包含'\0'
②不用库函数,自己编写函数实现求字符串长度,如下:
int Mystrlen(const char *str)
{
	assert(str != NULL);
	if(str == NULL)
	{
		return 0;
	}
	int count = 0;
	while(*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
问题:求字符数组所占的字节数sizeof,及长度strlen.
#include <stdio.h>
#include <string.h>

int main()
{
	char str1[100]  = "abcde";              //100,5
	char str2[] = "abcde";                  //6,5
	char *str3 = "abcde";                   //4,5
	char str4[100] = "abcd\0ef\n";          //100,4
	char str5[] = "abcd\0ef\n";             //9,4
	char *str6 = "abcd\0ef\n";              //4,4
	printf("%d,%d\n",sizeof(str1),strlen(str1));
	printf("%d,%d\n",sizeof(str2),strlen(str2));
	printf("%d,%d\n",sizeof(str3),strlen(str3));
	printf("%d,%d\n",sizeof(str4),strlen(str4));
	printf("%d,%d\n",sizeof(str5),strlen(str5));
	printf("%d,%d\n",sizeof(str6),strlen(str6));

	return 0;
}
总结:sizeof表示实际占用的字节数,而数组里不考虑‘\0’。



猜你喜欢

转载自blog.csdn.net/qq_41026740/article/details/79595206