1、 计 算 字 符 串 中 子 串 出 现 的 次 数 。 要 求 :用 一 个 子 函 数 subString()实 现 ,参 数 为 指
向 字 符 串 和 要 查 找 的 子 串 的 指 针 ,返 回 次 数 。
#include <stdio.h>
#include <string.h>
int my_subString(char* str, char* sub);
int main()
{
char str[] = "hello world world";
char sub[] = "world";
int count = my_subString(str, sub);
printf("这个字符串中共有%d个'%s'子串\n",count,sub);
return 0;
}
int my_subString(char* str, char* sub)
{
int len = strlen(str);
int sub_len = strlen(sub);
int count = 0;
if (sub_len == 0 || len < sub_len) // 处理特殊情况
return count;
for (int i = 0; i <= len - sub_len; i++)
{
int j;
for (j = 0; j < sub_len; j++)
{
if (*(str + i + j) != *(sub + j))
break;
}
if (j == sub_len) // 完全匹配
{
count++;
}
}
return count;
}
加 密 程 序 :由 键 盘 输 入 明 文 , 通 过 加 密 程 序 转 换 成 密 文 并 输 出 到 屏 幕 上 。 算 法 :明 文 中 的 字 母 转 换 成 其 后 的 第 4 个 字 母 ,例 如 , A 变 成 E(a 变 成 e), Z 变 成 D,非字 母 字 符 不 变 ; 同 时 将 密 文 每 两 个 字 符 之 间 插 入 一 个 空 格 。 例 如 , China 转 换 成密 文 为 G l m r e。 要 求 : 在 函 数 change 中 完 成 字 母 转 换 , 在 函 数 insert 中 完 成 增加 空 格 , 用 指 针 传 递 参 数 。
#include <stdio.h>
#include <string.h>
void change(char plain[], char cipher[]);
void insert(char cipher[], int len);
int main()
{
char plain[100];
printf("请输入明文:\n");
fgets(plain, 100, stdin);
// 去掉 fgets 自动添加的换行符
plain[strcspn(plain, "\n")] = 0;
char cipher[200]; // 由于插入空格,需要更大的数组
change(plain, cipher);
insert(cipher, strlen(cipher));
printf("密文为:%s\n", cipher);
return 0;
}
void change(char plain[], char cipher[])
{
int i;
for (i = 0; plain[i] != '\0'; i++)
{
if (plain[i] >= 'a' && plain[i] <= 'z')
{
cipher[i] = plain[i] + 4;
if (cipher[i] > 'z')
cipher[i] = 'a' + (cipher[i] - 'z' - 1);
}
else if (plain[i] >= 'A' && plain[i] <= 'Z')
{
cipher[i] = plain[i] + 4;
if (cipher[i] > 'Z')
cipher[i] = 'A' + (cipher[i] - 'Z' - 1);
}
else
{
cipher[i] = plain[i];
}
}
cipher[i] = '\0';
}
void insert(char cipher[], int len)
{
int new_len = 2 * len - 1; // 新长度,因为每两个字符之间会插入一个空格
cipher[new_len] = '\0'; // 设置新字符串的末尾
for (int i = len - 1; i >= 0; i--)
{
cipher[2 * i] = cipher[i]; // 把字符移动到新位置
if (i > 0) // 在每两个字符之间插入空格
{
cipher[2 * i - 1] = ' ';
}
}
}