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");
}
}
例题二:判断字符串中THE
和The
的数目,因为是对于字符串的处理,我们用好用的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))
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]);
}
}
}