2024.7.29c指针

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] = ' ';
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值