嵌入式工程师学习第五天——字符串数组

本文介绍了多个字符串操作的C语言实现,包括字符串逆置、计算单词个数、字符串移动、单词逆置、空格计数、特定字符计数、字符串匹配、回文判断、字符串排序、删除空格等。通过实例代码详细展示了每个操作的过程,帮助读者深入理解字符串处理技巧。
摘要由CSDN通过智能技术生成

        从整型数组进入字符串数组了,理解难度上加大了一些,不过也不是太难,基本上搞懂概念就行,要背的地方也有不少下面是总结了一写概念的脑图:

 必不可少的练习:

1.字符串逆置

        本题的意思是将字符串倒过来,如xzg逆置为gzx,思路是设置2个移动下标,left和right,循环一次left++;right--;,通过while循环每次将a[left]与a[right]进行交换,循环条件为left<right。下面是代码:

#include <stdio.h> 

int main(int argc, const char *argv[])
{
	char a[]="hellodsadwddwd";
	int n = sizeof(a) - 1;
	int left = 0;
	int right = n - 1;
	while(left < right){
		char c = a[left];
		a[left] = a[right];
		a[right] = c;
		left ++;
		right --;
	}
	puts(a);
	return 0;
}

结果为:

 

2.计算单词的个数

        这题的关键在于空格的判断,当从一个单词→空格时,进行一个记录值的++,下面是代码:

#include <stdio.h> 

int main(int argc, const char *argv[])
{
	char a[]="hello  x  z  g  m";
	int n = sizeof(a) - 1;
	int count = 0;
	for(int i = 0; i < n; i ++){
		if((a[i] != ' ' && a[i+1] == ' ')
				|| (a[i] != ' ' && a[i+1] == '\0')){
			count ++;
		}
	}
	printf("单词个数是%d\n",count);
	return 0;
}

结果如下:

3.实现字符串移动

>char a[]="SDsd13@#$GGty^556"

>输出结果是:sdggSDTY13556@#$^ 

>输出数字的和

>计算特殊字符的个数

        这题的思路是用另一个字符串数组去记录移动后的数组,我的想法是先从大写开始进行一次循环,再从小写进行一次循环,然后是数字字符,最后是特殊字符。这个代码判断比较复杂下面是代码实现:

#include <stdio.h> 

int main(int argc, const char *argv[])
{
	char a[]="SDsd13@#$GGty^556";
	//sdggSDTY13556@#$^
	int n = sizeof(a) - 1;
	char b[n];
	int count=0;
	int sum = 0;
	int type = 0;
	for(int i = 0; i < 4; i ++){
		for(int j = 0;j < n; j ++){
			if(i == 0 && (a[j] >= 'A' && a[j] <= 'Z')){
				b[count] = a[j] + 32;
				count ++;
			}
			if(i == 1 && (a[j] >= 'a' && a[j] <= 'z')){
				b[count] = a[j] - 32;
				count ++;
			}
			if(i == 2 && (a[j] >= '0' && a[j] <= '9')){
				b[count] = a[j];
				sum += a[j] - '0';
				count ++;
			}
			if(i == 3 && !(a[j] >= 'A' && a[j] <= 'Z') 
					&& !(a[j] >= 'a' && a[j] <= 'z') 
					&& !(a[j] >= '0' && a[j] <= '9')){
				b[count] = a[j];
				type ++;
				count ++;
			}
		}
	}
	b[count] = '\0';
	printf("变换后的字符串%s,和为%d,个数%d\n",b,sum,type);
	return 0;
}

结果如下:

4.实现单词的逆置

>char a[]="hello my student"

>输出:student my hello

        这题的思路是先将整体逆置,然后在进行单个单词的逆置,下面是代码:

#include <stdio.h> 

int main(int argc, const char *argv[])
{
	char a[]="hello my student";
	int n = sizeof(a) - 1;
	int left = 0;
	int right = n - 1;
	while(left < right){
		char c = a[left];
		a[left] = a[right];
		a[right] = c;
		left ++;
		right --;
	}
	int left2 = 0;
	int right2 = 0;
	int type = 0;
	for(int i = 0; i < n; i ++){
		if(type == 0 && (a[i] == ' ' || i == n - 1)){
			right2 = i - 1;
			if(i == n-1){
				right2 = n - 1;
			}
			type = 1;
			int left3 = left2;
			int right3 = right2;
			while(left3 < right3){
				char d = a[left3];
				a[left3] = a[right3];
				a[right3] = d;
				left3 ++;
				right3 --;
			}
		}
		if(type == 1 && a[i] != ' '){
			left2 = i;
			type = 0;
		}
	}
	puts(a);
	return 0;
}

结果如下:

5.计算字符串中空格的个数

        这题没什么好说的,一个循环记录空格个数,下面是代码:

#include <stdio.h> 

int main(int argc, const char *argv[])
{
	//计算字符串中空格的个数
	char a[] = "sddw       dawdwdf d awda ss sadwd ";
	int n = sizeof(a) - 1;
	int type = 0;
	for(int i = 0; i < n; i ++){
		if(a[i] == ' '){
			type ++;
		}
	}
	printf("字符串的空格数为%d\n",type);
	return 0;
}

结果如下:

 

6.计算字符串中is的个数

        用单次循环,判断a[i]='i'&&a[i+1]='s'即可。代码如下:

#include <stdio.h> 

int main(int argc, const char *argv[])
{
	//计算字符串中is的个数
	char a[] = "islfidjgis knvois";
	int n = sizeof(a) - 1;
	int type = 0;
	for(int i = 0; i < n ; i ++){
		if(a[i] == 'i' && a[i+1] == 's'){
			type ++;
		}
	}
	printf("is一共有%d个\n",type);
	return 0;
}

结果如下:

7.字符串匹配

        这题的思路是循环主串,然后在主串上进行子串循环,同时用type值记录相等的个数,若type一次子串循环后的值等于子串的长度,那么就输出主串这时候的i值,即为子串第一次出现的下标值。下面是代码:

#include <stdio.h> 

int main(int argc, const char *argv[])
{
	//字符串的匹配
	char a[] = "ababcabcdabcde";
	char b[] = "abcd";
	int n = sizeof(a) - 1;
	int m = sizeof(b) - 1;
	for(int i = 0; i < n; i ++){
		int type = 0;
		for(int j = 0; j < m; j ++){
			if(a[i+j] == b[j] && i + j < n)
				type ++;
		}
		if(type == m){
			printf("子串在主串的下标%d出现\n",i);
			break;
		}
	}
	return 0;
}

结果如下:

 

8.判断字符串是否是回文字符串

        回文字符串,这比之前判断回文数字简单多了,因为我们多学习了数组,可以用第一题的同样思想,只不过这次不用进行交换罢了,只需要进行比较,若不同则不是回文字符串。下面是代码:

#include <stdio.h> 

int main(int argc, const char *argv[])
{
	//回文字符串
	printf("请输入字符串位数n:\n");
	int n;
	scanf("%d",&n);
	getchar();
	char a[n];
	printf("请输入字符串\n");
	scanf("%s",a);
	getchar();
	int left = 0;
	int right = n - 1;
	int type = 0;
	while(left < right){
		if(a[left] != a[right]){
			type ++;
		}
		if(type != 0){
			printf("不是回文字符串\n");
			return 0;
		}
		left ++;
		right --;
	}
	printf("是回文字符串\n");
	return 0;
}

结果如下:

9.实现字符串排序

        本题我使用了冒泡排序,代码如下:

#include <stdio.h> 

int main(int argc, const char *argv[])
{
	//字符串排序
	char arr[10];
	printf("请输入10位字符串\n");
	scanf("%s",arr);
	getchar();
	int n = 10;
	while(n > 0){
		int type = 0;
		for(int i = 0; i < n - 1; i ++){
			if(arr[i] > arr[i + 1]){
				char c = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = c;
				type ++;
			}
		}
		if(type == 0){
			break;
		}
		n --;
	}
	printf("排序后的字符串为:\n%s\n",arr);
	return 0;
}

结果如下:

10.删除字符串中的空格

        简单的字符串平移操作,代码如下:

#include <stdio.h> 

int main(int argc, const char *argv[])
{
	char a[] = "sdas sadwds  sdwsad w ";
	int n = sizeof(a) - 1;
	int count = 0;
	for(int i = 0; i < n ; i ++){
		if(a[i] != ' '){
			a[count ++] = a[i];
		}
	}
	a[count] = '\0';
	puts(a);
	return 0;
}

结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值