c语言-数组(3)

字符串数组例题

注:上一节的函数只能用于字符型数组
例如:strcpy() ,strcat(),strcmp()

注:注意for循环的范围,注意字符串结束符是'\0',注意函数的实现原理。


1、下面程序段的运行结果是_________.
char a[7]="abcdef";
char b[4]="ABC";
strcpy(a,b);
printf("%c",a[5]);
a)空格 b)\0 c)e d)f
答案: D

2、输入一行字符,统计其中大写字母的个数,并将所有的大写字母转化成小写字母后输出

int main()
{
	//输入一行字符
	printf("请输入一行字符串:\n");
	char ch[1024] ="\0";
	scanf("%s",ch);
	//统计其中大写字母的个数
	int count = 0;
	for(int i =0;i<strlen(ch);i++)
	{
		if(ch[i]>='A' && ch[i]<='Z')
		{
			count++;
			//将所有的大写字母转化成小 写字母
			ch[i]+=32;
		}
	}
	printf("大写字母的个数:%d\n",count);
	printf("转换后:%s\n",ch);
	
	
	
	
	
	
	return 0;
}

3、按以下规律翻译密码: 将每一个字母变成它后面的字母,例如,将 A 变成 B,B 变成 C,…,Z 变成 A,非字母字符不变,“!”作为电文结束标志。
注: 要在字符串的最后加个'\0'

int main()
{

	//1.输入密码
	printf("请输入密码:\n");
	char pwd[1024] = "\0";
	scanf("%s",pwd);
	
	//将每一个字母变成它后面的字母,例如,将 A 变成 B,B 变成 C,…,Z 变 成 A,非字母字符不变
	int i = 0;
	for(i = 0;pwd[i] !='\0';i++)
	{
		if(pwd[i]>='A' && pwd[i]<'Z')
		{
			pwd[i]++;
		}
		else if(pwd[i] == 'Z')
		{
			pwd[i] = 'A';
		}
		else if(pwd[i]>='a' && pwd[i]<'z')
		{
			pwd[i]++;
		}
		else if(pwd[i] == 'z')
		{
			pwd[i] = 'a';
		}
	}
	//3. “!”作为电文结束标志
	pwd[i] = '!';
	pwd[i+1] = '\0';
	
	//输出
	printf("%s\n",pwd);
	return 0;
}

4、输入密码,设置一个密码,然后输入密码,机会为 3 次,三次密码错误就直接退出。

int main()
{
	//设置密码
	char pwd[20] = "123456";
	for(int i=0;i<3;i++)
	{
		//输入密码
		printf("请输入密码:\n");
		char mm[20] = "\0";
		scanf("%s",mm);
		//判断密码是否正确
		if(strcmp(pwd,mm) == 0)
		{
			printf("密码正确!\n");
			return 0;
		}
		else
		{
			printf("密码输入错误!");
			if(i == 2)
			{
				printf("您的机会已用完!\n");
			}
			else
			{
				printf("您还有%d次机会!\n",2-i);
			}
			
		}
	}
	return 0;
}

5、不使用 strlen 函数,实现字符串的求长度,复制,比较,连接。

注:ch[i] != '\0' ==> ch[i] != 0 (ASCLL码)

#include <stdio.h>
#include <string.h>
#define N  4
/*
	作者: zcy
	日期:
	功能描述:不使用 strlen 函数,实现字符串的求长度,复制,比较,连接
*/
int main()
{
	
	#if N == 1
	//长度 
	char ch[1024] = "he\0llo";
	//判断该字符是否是\0,若是结束统计,不是 进行统计
	int i = 0; // 默认从第0个字符开始
	while(ch[i])
	{
		i++;
	}
	printf("i = %d\n",i);
	
	
	
	#elif N == 2
	//复制
	char dest[1024] = "hello";
	char src[1024] = "ab\0cd";
	//根据源串中字符是否是\0,若是结束复制 ,不是则把字符赋值给目的串
	int i = 0;
	while(src[i])
	{
		dest[i] = src[i];
		i++;
	}
	dest[i] = '\0';
	printf("dest = %s\n",dest);
	
	
	
	#elif N == 3
	//连接
	char dest[1024] = "he\0llo";
	char src[1024] = "abc\0d";
	//先找到目的串\0的位置
	int i =0;
	while(dest[i])
	{
		i++;
	}
	//根据源串中字符是否是\0,若是结束拼接 ,不是则把字符赋值给目的串
	int j = 0;
	while(src[j])
	{
		dest[i] = src[j];
		i++;
		j++;
	}
	//补'\0'
	dest[i] = '\0';
	printf("dest = %s\n",dest);
	
	

	#elif N == 4
	//比较
	char s1[1024] = "abcd";
	char s2[1024] = "abcd";
	//求两个字符串的长度
	int l1 = 0;
	while(s1[l1])
	{
		l1++;
	}
	int l2 = 0;
	while(s2[l2])
	{
		l2++;
	}
	//获得两个数最长的
	int l = l1>l2?l1:l2;
	//循环比较并相减
	int n = 0;
	for(int i = 0;i<l;i++)
	{
		if(s1[i] - s2[i] != 0)
		{
			n = s1[i] - s2[i];          //只需判断一位不同的差值即可,只要有差值,就说明不同,无需在意差值多少。
			break;
		}
	}
	
	printf("n = %d\n",n);
	#endif

	return 0;
}

6、输入一个字符串,判断是否是回文。(回文:这个字符串顺读和反读是一样的。如“abcba”和”123321”都是回文。

int main()
{
	//输入一个字符串
	printf("请输入一个字符串:\n");
	char ch[1024] = "\0";
	scanf("%s",ch);
	
	int l = strlen(ch);
	int flag = 1;
	for(int i=0;i<l/2;i++)
	{
		if(ch[i] != ch[l-1-i])
		{
			flag = 0;
			printf("%s不是回文!\n",ch);
			//break;
			return 0;
		}
	} 
	//if(flag)
		printf("%s是回文!\n",ch);
	return 0;
}

7、一篇文章,有三行文字,每行有 80 个字符。要求统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。(二维数组)

#include <stdio.h>
/*
	作者: zcy
	日期:
	功能描述:一篇文章,有三行文字,每行有 80 个字符。 要求统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数
		
*/
int main()
{
	//输入三行文字,每行有 80 个字符
	printf("请输入三行文字:\n");
	char ch[3][80] = {0};
	for(int i = 0;i<3;i++)
	{
		gets(ch[i]);
	}
	
	//统计
	int dz=0,xz=0,sz=0,kg=0,qt=0;
	for(int i = 0;i<3;i++)
	{
		for(int j = 0;j<strlen(ch[i]);j++)  //注意范围
		{
			char s = ch[i][j];
			if(s>='A' && s<='Z')
			{
				dz++;
			}
			else if(s>='a' && s<='z')
			{
				xz++;
			}
			else if(s>='0' && s<='9')
			{
				sz++;
			}
			else if(s==' ')
			{
				kg++;
			}
			else
			{
				qt++;
			}
		}
	}
	printf("大写:%d\n",dz);
	printf("小写:%d\n",xz);
	printf("数字:%d\n",sz);
	printf("空格:%d\n",kg);
	printf("其他:%d\n",qt);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值