C++指向函数的指针

题目内容:
编写两个加密函数,第一个函数使用凯撒加密法,即将将原来的小写字母用字母表中其后面的第3个字母的大写形式来替换,大写字母按同样规则用小写字母替换,可将字母表看成是首末衔接的。例如"AMDxyzXYZ" 加密为 “dpgABCabc”。第二个函数使用单双号加密法,即将字符串"abcde",根据单双号区分为两个字符串"ace"和"bd",再连接在一起成为密文"acebd"。
代码:

#include<iostream>
#include<string.h>     //strlen()函数包含在其中
#include<stdio.h>
int length=0;    //全局变量lemgth的声明,也可改为static int length=0,在声明时尽量初始化,否则系统会自动初始化为1
using namespace tsd;
void caesar(char s[])
{
  if(int i=0;i<length:i++)                               
   { 
      if(s[i]>='A'&&s[i]<='Z')        //凯撒加密的“公式”
           {
              s[i]='a'+(s[i]-'A'+3)%26;
           }
      else if(s[i]>='a'&&s[i]<='z')
           { 
             s[i]='A'+(s[i]-'a'+3)%26;
           }
    }
   cout<<"加密后的暗文为:";
   cout<<s<<endl;
}
void oddeven(char s[])
{
   int i=0;
   for(i=0;i<length;i++)
   {
     char b[100],c[100];   
     int num_1=0,num_2=0;        //每个数组下标不一样
     if(i%2==0{
             b[num_1]=s[i];
             num_1++;
           }
     else
           {
             c[num_2]=s[i];
             num_2++;
           }
     cout<<"加密后的暗文为:";
     cout<<c<<b<<endl;
}
void cipher(char (*f)char s[],char s[])    //cipher函数有两个形参,一个是函数的指针,一个是字符串数组s
{
  f(s);        //函数指针的调用
}
int main()
{
  char str[100];
  int opt=0;
  cout<<"请输入一个字符串:"<<endl;
  gets();
  length=strlen(str);
  cout<<"选择你需要的加密方式:"<<endl;
  cout<<"      1.凯撒加密     "<<endl;
  cout<<"      2.单双号加密   "<<endl;
  cin>>opt;
  if(opt==1cipher(caesar,str);
  else
      cipher(oddeven,str);
  }

输出结果为:在这里插入图片描述
在这里要注意凯撒加密
若写成以下这样,则输出是一个很奇怪的数:

void caesar(char s[])
{
  if(int i=0;i<length:i++)                               
   { 
      if(s[i]>='A'&&s[i]<='Z')     
           {
              s[i]='a'+(s[i]-'A'+3)%26;
           }
      if(s[i]>='a'&&s[i]<='z')      //和上面正确的这里不一样
           { 
             s[i]='A'+(s[i]-'a'+3)%26;
           }
    }

输出为:在这里插入图片描述

原因是:
当s[i]为大写字母,则满足第一个if的条件,那么当它从大写转化到小写时,就会满足第二个if的条件,就会再次进行大小写以及加3的转化!相当于一个大写字母进行了两次转化。所以,错误的输出值"GSJABCDEF",中间的xyz->ABC是正确的,两端的GSJ分别是AMD加6之后的值!所以在写凯撒加密时不能用两个if,用if else也不好,万一输入的有非字母的字符串就不好处理了,所以万全之策就是if-else if。


函数指针(指向函数的指针):
1.定义:(函数返回值类型)(*函数名)(函数参数列表);
该函数为一个指向另一个函数的指针

void error(string s)
{
   ......
}
void (*efct)(string);
int main()
{ 
  efct=&error;  //或是  efct=error
  efct("Vasa");  //或是  (*efct)(""Vasa)
}

2.函数指针所指向的函数的返回值类型和参数类型必须与函数指针一致
例如:

void (*pf)(string);  //指向参数类型为string,返回值为void的函数的指针
void f1(string);  //指向参数类型为string,返回值为void的函数f1
int f2(string);  //指向参数类型为string,返回值为整型的函数f2
void f3(int*);   //指向参数类型为整型指针,返回值为void的函数f3

void f()
{
  pf=&f1;   //对
  pf=&f2;  //错
  pf=&f3;  //错
  
  pf("Hera");  //对
  pf(1);  //错
  int i=pf("Zeus");  //pf的返回值为void,不是int,故错
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值