C语言之字符串处理

目录

字符串长度

显示字符串

数字字符的出现次数

大小写字符转换

 字符串数组的参数传递

非字符串的字符数组


目前我们所学习到的是围绕字符串的处理,仅仅是生成字符串、读取并显示字符串,下面我学习更加灵活处理字符串的方式。


字符串长度

我们来看下述语句声明的数组:

char str[6] = "ABC";

元素个数为6的数组保存了元素个数为3的(算上字符串末尾的null字符,则长度为4)的字符串,因此str[4] str[5]都是空的,由此可知字符串不一定正好撑满字符组。

因为字符串含有表示末尾的null字符,所以第一个字符到\0为止的前一个字符就是该字符串的长度,我们可以据此来计算字符串的长度:

#include

/*返回字符串str的长度*/
int str_length(const char s[])
{
	int len = 0;
	while(s[len])
		len++;
	return len;
}
 int main()
{
	char str[128];
	
	printf("请输入字符串:");
	scanf("%s", str);
	
	printf("字符串\"%s\"的长度为%d.\n", str, str_length(str));
	
	return 0;
}

让我们来分析程序时如何执行的:

1.main函数在调用str_length函数传入的实参str,通过前面的学习可知,实参只有给出数组名称就可以了

2.通过数组的传递,函数str_length所接受的s就是main函数中的str本身

3.在str_length函数中使用变量len,遍历数组使用计算字符串的长度。

4.while语句中表达式正是数组,通过len++是数组下标逐个增加,进而判断数组元素是否为0,即字符串结束的标志“\0”。

下面我们来演示下在遍历过程中使用while语句是如何判断的:

C语言之字符串处理_第1张图片


显示字符串

这次我们不使用printf和puts函数,而只使用putchar函数显示字符串:

#include

/*显示字符串s*/
void put_string(const char s[])
{
	int i = 0;
	while(s[i])
		putchar(s[i++]);
}
 int main()
{
	char str[128];
	
	printf("请输入字符串:");
	scanf("%s", str);
	printf("你输入了:");
	
	put_string(str);
	
	printf("。\n");
	
	return 0;
}

在本程序中对字符串中字符进行遍历时使用的while语句对null字符的查找方式一样。


数字字符的出现次数


#include

/*将字符串s出现的数字字符保存在数组cnt中*/
void str_dcount(const char s[], int cnt[])
{
	int i = 0;
	while(s[i])
	{
		if(s[i]>='0' && s[i]<='9')
			cnt[s[i] - '0']++;
		i++;
	}
}
int main()
{
	int dcnt[10] = {0};
	char str[128];
	int i;
	
	printf("请输入字符串:");
	scanf("%s", str);
	
	str_dcount(str, dcnt);
	
	puts("字符出现的次数");
	
	for(i=0;i<10;i++)
		printf("'%d' :%d\n", i, dcnt[i]);
	
	return 0;
}

大家可能对程序中下面的代码部分有些生疏:

if(s[i]>='0' && s[i]<='9')
			cnt[s[i] - '0']++;
		i++;

特别是关于cnt数组,中表达式的运算:任意的字符减去‘0’,都能得到所需要的下标值

大家可以看下面这个文章是关于字符的介绍:https://blog.csdn.net/W06164932/article/details/135150160?spm=1001.2014.3001.5502


大小写字符转换

我们来编写两个函数,一个字符串中所有的字符转换为大写字母,一个全部转换为小写字母

#include
#include

/*将字符串的字符全部转化为大写*/
void str_toupper(char s[])
{
	int i = 0;
	while(s[i])
	{
		s[i] = toupper(s[i]);
		i++;
	}
}
/*将字符串的字符全部转换为小写*/
void str_tolower(char s[])
{
	int i = 0;
	while(s[i])
	{
		s[i] = tolower(s[i]);
		i++;
	}
}

int main()
{
	char str[128];
	
	printf("请输入字符串:");
	scanf("%s", str);
	
	str_toupper(str);
	printf("大写字母:%s\n", str );
	
	str_tolower(str);
	printf("大写字母:%s\n", str );

	return 0;
}

我们分别来看下关于toupper函数与tolower函数:

toupper
头文件 #include
原型 int toupper(int c);
说明 将小写字母转换为大写字母
返回值 若c是小写字母,则返回转换后的大写字母,否则之间返回c
tolower
头文件 #include
原型 int tolower(int c);
说明 将大写字母转换为小写字母
返回值 若c是大写应为字母,则返回转换后的小写字母,否则之间返回c

在使用这两个函数遍历字符串过程中,当发现目标字符s[i],会为其赋这些函数的返回值。

如果这两个函数是接受的是英文字母以外的字符,则原封不动的返回这些字符


 字符串数组的参数传递

#include

void put_strary(const char s[][6], int n)
{
	int i;
	for(i=0;i

在二维数组的形参声明中只有,只有第一维的数组元素数可以省略。


非字符串的字符数组

看如下声明:

char str[4] = {"ABCD'}; 

算上null字符需要5个字符空间,但数组只能接受4个字符,但是像下面这样进行声明,末尾就会不会加上null字符:

char str[4] = {'A', 'B', 'B', 'D'};

这样声明的变量末尾不会加上null字符,我们把它当做4个字符的集合,也就是“普通的数组”

你可能感兴趣的:(C语言,c语言,开发语言,算法,数据结构,c++)