版权声明:所有分享的源代码仅供学习使用,欢迎分享转载,请注明出处 https://blog.csdn.net/weixin_43328024/article/details/84765020
密钥格式化
题目
给定一个密钥字符串S,只包含字母,数字以及 ‘-’(破折号)。N 个 ‘-’ 将字符串分成了 N+1 组。给定一个数字 K,重新格式化字符串,除了第一个分组以外,每个分组要包含 K 个字符,第一个分组至少要包含 1 个字符。两个分组之间用 ‘-’(破折号)隔开,并且将所有的小写字母转换为大写字母。
给定非空字符串 S 和数字 K,按照上面描述的规则进行格式化。
示例:
1.输入:S = “5F3Z-2e-9-w”, K = 4
输出:“5F3Z-2E9W”
解释:字符串 S 被分成了两个部分,每部分 4 个字符;
注意,两个额外的破折号需要删掉。
2.输入:S = “2-5g-3-J”, K = 2
输出:“2-5G-3J”
解释:字符串S被分成了3个部分,按照前面的规则描述,第一部分的字符可以少于给定的数量,其余部分皆为 2 个字符。
代码分享:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
int main()
{
char array1[N] = "\0";
char array2[N] = "\0";
char array3[N] = "\0";
int i = 0;
int j = 0;
int m = 0; //字符串中除去‘-’剩下的字符个数
int K; //密钥
printf("请输入一串字符:\n");
gets(array1);
printf("请输入密钥K:\n");
scanf("%d", &K);
//删掉数组1中的‘-’, 并将其存储到数组2
for(i = 0; array1[i] != '\0'; i++)//循环录入用户输入的字符串
{
if(array1[i] != '-')
{
array2[j] = array1[i];//将用户录入的字符串删除-后存储至array2
j++;
}
}
m = strlen(array2); //计算数字符串组中字符的个数
//将数组2中的数据逆向存储到数组3,方便对其添加‘-’
for(i = 0, j = m - 1; j >= 0; j--, i++)//利用循环将array2反向存储至array3
{
array3[i] = array2[j];
}
//利用对密钥K取余,对数组3进行添加‘-’操作
for(i = 0; i < N; i++)
{
if(i % (K + 1) == 0 )
{
for(j = N; j != (i - 1); j--)
{
array3[j + 1] = array3[j];
}
array3[i] = '-';
}
}
m = strlen(array3);
//若末元素为破折号,则删去
if(array3[m - 1] == '-')
{
array3[m - 1] = "\0";
m = m - 1;
}
//将数组3逆向输出,就是对数组1操作的结果
printf("格式化后的结果是:\n");
for(i = m - 1; i >= 1; i--)//利用ASCAII码进行大小写变换
{
if(array3[i] >= 'a' && array3[i] <= 'z')
{
printf("%c", array3[i] - 32);
}
else
printf("%c", array3[i]);
}
return 0;
}
运行结果:
以上是关于密钥格式化用C语言的一种解决方案,希望对大家有帮助,也希望大佬评论一些自己的建议。