0
点赞
收藏
分享

微信扫一扫

C语言必练-字符串、字符经典题(附字符串加密问题代码)

雨鸣静声 2022-01-09 阅读 35

C语言字符串、字符经典练习题

例题1:编写函数判断一个字符串是否是 回文串,回文串的定义就是从前向后读取都是一样的。注意:函数应该忽略所有的非字母字符,进行字符串比较时候,不区分大小写

函数接口如下:bool isPalindrom(const chat *string)

#include <stdio.h>
#include <ctype.h>
#include <string.h>
bool isPalindrom(const char * string)
{
    const char * string_end;
    string_end = string + strlen(string) - 1;       //调用strlen函数
    //函数不区分非字母型的字符,并且不区分大小写
    while (true)
    {
        //过滤掉非字符
        while ( !isalpha(* string)) string++;
        while ( !isalpha(*string_end)) string_end--;
        if (string >= string_end) return true;
        //都转换为小写的字符
        if (tolower(*string) != tolower(*string_end)) return false;
        string++,string_end--;
    }
    //当出现交际的时候就代表是回文串
    return true;
}

int main()
{
    const char a[] = "  45aa45  kl  lk a 56a1";
    //包含的字母组成的字符串是:aakllkaa
    bool judge = isPalindrom(a);
    if (judge) {
        printf("是回文串\n");
    }else {
        printf("不是回文串\n");
    }
}

例题二:判断字符串中THEThe的数目,因为是对于字符串的处理,我们用好用的C++中的stringstream进行流的控制

#include <iostream>
#include <cstring>
#include <sstream>
#include <fstream>
using namespace std;
int main()
{
    string string1;
    string1 = "THE egjio the The  THE  The the The eji";
    stringstream ss;
    ss << string1;
    int number1 = 0, number2 = 0;
    string tmp;
    while (ss >> tmp) {
        if (tmp == "The") number1++;
        if (tmp == "THE") number2++;
    }
    cout << "The 的个数是:" << number1 << endl;
    cout << "THE 的个数是:" << number2 << endl;
}

编码加密

在这里插入图片描述

[strchr()函数用法](C 库函数 – strchr() | 菜鸟教程 (runoob.com))

strcpy()函数的用法

bool prepare_key(char * key)
{
    //用register 是暗示编译器用寄存器计算,加快运行速度
    register char *keyp;
    register char *dup;            //用于消除重复的字符
    register int character;         //int类型的表示字符,因为接口是int型的

    if ( *key == '\0') return false;

    //将所有的字符变成小写的
    for ( keyp = key; (character = *keyp) != '\0'; keyp++) {
        if ( !islower(character) ) {
            if (!isupper(character)) return false;
            else *keyp = tolower(character);
        }
    }

    //清除重复的元素,请一定要理解好 strchr 和 strcpy函数的返回值和参数的意义
    for ( keyp = key; (character = *keyp) != '\0'; ) {
        dup = ++keyp;

        //while循环中,dup就是第一次出现字符的位置
        //用strcpy(dup, dup + 1)就会将第一次出现的位置被后面的覆盖掉,从而实现删除
        while ((dup = strchr(dup, character)) != NULL)
            strcpy(dup, dup+1);
    }

    //将剩余的字母填充上去
    for (character = 'a'; character <= 'z'; character++) {
        //判断每一个字符是否出现过
        if ((keyp = strchr(key, character)) == NULL) {
            *keyp++ = character;
            *keyp = '\0';
        }
    }
}

编码

void enctypt(char * data, char const * key)
{
	cout << "调用了加密\n";
    register int character;
    for (; (character = *data) != '\0'; data++ ) {
        //判断是否是字符,进行赋值
        if ( islower(character) ) {
            //key中其实就是数组,有点哈希的意思
            *data = key[character - 'a'];
        }else if (isupper(character) ) {
            *data = toupper(key[character - 'A']);  
        }
        //不是字符的就不用管了
    }
}

解码

void decrypt(char *data, char const * key)
{
	cout << "调用了解密\n";
    register int character;
    for (; (character = *data) != '\0'; data++) {
        if (islower(character)) {
            //我们要找到character在key编码中的第一位,从而所引到原编码 顺序的abcdefg....
            //strchr(key,charavter) - key就是character在key这个字符串中的*位置*(int型的)
            *data = alphabet[strchr(key, character) - key];
        }else if (isupper(character)) {
            *data = toupper(alphabet[strchr(key, to_lower(character)) - key]);
        }
    }
}
举报

相关推荐

0 条评论