浅谈使用C++多级指针存储海量qq号和密码

指针是c++中很重要的一部分内容。

可以认为,指针是C++这把宝剑最锋利的部分,当然,如果你使用不当,也会伤到自己的

本篇博客,将尝试用11级指针这个结构来存储海量的QQ号和密码。首先,郑重声明,我没有海量的QQ号和密码,只是想用这种结构来解决这个不存在的问题,不存在只是对我而言的,据称,腾讯内部的一些代码对QQ的处理就是用的这种结构

何为11级指针,其实,就是在指针前面加了11个*,加一个*就是1级指针,加两个*就是二级指针

char *********** QQptr = NULL; 

指针和数组有着扯不清的关系,这个11级指针,你可以理解为11维度的数组,平日里见得最多的恐怕也就是二维数组了,11维,只能脑补了。如果QQ号长度不够10位,则在前面补0,那么这个QQ号的10位数字就可以用来做数组的下角标了,最后的那个维度我们用来存储密码。

坦率的讲,我脑子里也对这个模型很是模糊,无法建立起一个有效的概念,所以,还是直接上代码吧,或许代码比语言有更好的解释效果:

#include <iostream>
using namespace std; 

#define POINTER_SIZE 10 

int CharToInt(char ch)
{
  return ch - '0';
}
char *********** QQptr = NULL;
void addQQ(char *qq,char* pass)
{
  if(NULL==qq || NULL==pass)
  {
    return ;
  } 

  if(strlen(qq)!=10)
  {
    return;
  } 

  int index[10];
  for(int i =0;i<10;i++)
  {
    index[i] = CharToInt(qq[i]);
  } 

  if(QQptr[index[0]]==NULL)
  {
    QQptr[index[0]] = (char **********)malloc(sizeof(char*)* POINTER_SIZE);
    memset(QQptr[index[0]], 0, sizeof(char*)* POINTER_SIZE);//清零
  } 

  if(QQptr[index[0]][index[1]]==NULL)
  {
    QQptr[index[0]][index[1]] = (char *********)malloc(sizeof(char*)* POINTER_SIZE);
    memset(QQptr[index[0]][index[1]], 0, sizeof(char*)* POINTER_SIZE);//清零
  } 

  if(QQptr[index[0]][index[1]][index[2]]==NULL)
  {
    QQptr[index[0]][index[1]][index[2]] = (char ********)malloc(sizeof(char*)* POINTER_SIZE);
    memset(QQptr[index[0]][index[1]][index[2]], 0, sizeof(char*)* POINTER_SIZE);//清零
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]]==NULL)
  {
    QQptr[index[0]][index[1]][index[2]][index[3]] = (char *******)malloc(sizeof(char*)* POINTER_SIZE);
    memset(QQptr[index[0]][index[1]][index[2]][index[3]], 0, sizeof(char*)* POINTER_SIZE);//清零
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]]==NULL)
  {
    QQptr[index[0]][index[1]][index[2]][index[3]][index[4]] = (char ******)malloc(sizeof(char*)* POINTER_SIZE);
    memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]], 0, sizeof(char*)* POINTER_SIZE);//清零
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]]==NULL)
  {
    QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]] = (char *****)malloc(sizeof(char*)* POINTER_SIZE);
    memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]], 0, sizeof(char*)* POINTER_SIZE);//清零
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]]==NULL)
  {
    QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]] = (char ****)malloc(sizeof(char*)* POINTER_SIZE);
    memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]], 0, sizeof(char*)* POINTER_SIZE);//清零
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]]==NULL)
  {
    QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]] = (char ****)malloc(sizeof(char*)* POINTER_SIZE);
    memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]], 0, sizeof(char*)* POINTER_SIZE);//清零
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]]==NULL)
  {
    QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]] = (char ***)malloc(sizeof(char*)* POINTER_SIZE);
    memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]], 0, sizeof(char*)* POINTER_SIZE);//清零
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]]==NULL)
  {
    QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]] = (char **)malloc(sizeof(char*)* POINTER_SIZE);
    memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]], 0, sizeof(char*)* POINTER_SIZE);//清零
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]][index[9]]==NULL)
  {
    QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]][index[9]] = (char *)malloc(sizeof(char*)* 1024);
    memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]][index[9]], 0, sizeof(char*)* POINTER_SIZE);//清零
  } 

  strcpy(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]][index[9]],pass);
} 

bool isExist(char *qq)
{
  if(NULL==qq)
  {
    return NULL ;
  } 

  if(strlen(qq)!=10)
  {
    return NULL;
  } 

  int index[10];
  for(int i =0;i<10;i++)
  {
    index[i] = CharToInt(qq[i]);
  } 

  if(QQptr[index[0]]==NULL)
  {
    return false;
  } 

  if(QQptr[index[0]][index[1]]==NULL)
  {
    return false;
  } 

  if(QQptr[index[0]][index[1]][index[2]]==NULL)
  {
    return false;
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]]==NULL)
  {
    return false;
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]]==NULL)
  {
    return false;
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]]==NULL)
  {
    return false;
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]]==NULL)
  {
    return false;
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]]==NULL)
  {
    return false;
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]]==NULL)
  {
    return false;
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]]==NULL)
  {
    return false;
  } 

  if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]][index[9]]==NULL)
  {
    return false;
  }
  return true;
}
char* getPass(char* qq)
{
  if(NULL==qq)
  {
    return NULL ;
  } 

  if(strlen(qq)!=10)
  {
    return NULL;
  } 

  if(!isExist(qq))
  {
    return NULL;
  } 

  int index[10];
  for(int i =0;i<10;i++)
  {
    index[i] = CharToInt(qq[i]);
  }
  return QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]][index[9]];
}
int main()
{ 

  QQptr = (char ***********)malloc(sizeof(char*)* POINTER_SIZE);
  memset(QQptr, 0, sizeof(char*)* POINTER_SIZE);//清零 

  char *qq = "0381084992";
  char *pass = "314krtqw"; 

  addQQ(qq,pass);
  cout<<getPass(qq)<<endl;
  return 0;
} 

总结

以上就是本文关于浅谈使用C++多级指针存储海量qq号和密码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

(0)

相关推荐

  • C++实现将简单密码译回原文的方法

    本文实例讲述了C++实现将简单密码译回原文的方法.分享给大家供大家参考,具体如下: /* * 作 者: 刘同宾 * 完成日期:2012 年 11 月 28 日 * 版 本 号:v1.0 * 输入描述: * 问题描述: 有一行电文,已按下面规律译成密码: * A-->Z a-->z * B-->Y b-->y * C-->X c-->x * 即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变 * 要求将密码译回原文. * 程序输出: *

  • C++实现单置换密码

    单表置换密码的C++代码实现,供大家参考,具体内容如下 本程序使用方法:需要在本程序所在的文件夹创建一个"密码学.txt"文档. 该程序所需要的数据全部由该文档提供,然后运行即可得到结果,如需要修改数据,必须从文档中人工修改 文档格式的要求:文档总共包含两行.第一行由一个1或2的数字和一个字符串组成,数字1代表加密,2代表解密,字符串表示密钥 第二行仅包含一个字符串,这个字符串是需要加密或解密的内容. 该程序运行结果直接由控制台输出 运行结果: 代码: #include<iost

  • C++全密码生成的实现代码

    这里所谓的"全密码"指的是指定字符串中所有可能出现的密码.以字符串"0123456789"为例,可能出现的2位密码会有100个,即L^N个.(L代表字符串的长度,N代表要生成密码的位数). 第一种方法:递归.这个比较容易理解,每分解出一个字符,设成新串,然后靠到上一个串上即可.代码如下: void CpasswordCreateDlg::CreatePass1(CString inStr,int m,CString outStr) { if (m==0) { fp.

  • 浅谈使用C++多级指针存储海量qq号和密码

    指针是c++中很重要的一部分内容. 可以认为,指针是C++这把宝剑最锋利的部分,当然,如果你使用不当,也会伤到自己的 本篇博客,将尝试用11级指针这个结构来存储海量的QQ号和密码.首先,郑重声明,我没有海量的QQ号和密码,只是想用这种结构来解决这个不存在的问题,不存在只是对我而言的,据称,腾讯内部的一些代码对QQ的处理就是用的这种结构 何为11级指针,其实,就是在指针前面加了11个*,加一个*就是1级指针,加两个*就是二级指针 char *********** QQptr = NULL; 指针和

  • 浅谈C/C++中指针和数组的不同

    这边先简单介绍一下内存分区. 内存按照用途划分为五个区: 1.栈区:由系统控制分配和回收. 例如定义变量 int x = 0; int *p = NULL; 变量所占的内存都是分配在栈区的. 2.堆区:由程序员管理. 在C语言中由 malloc 申请的内存,或者在C++中,用 new 申请的内存,是在堆区中申请的.用完之后需要程序员自己回收,否则会造成内存泄漏. 3.全局区:存储全局变量及静态变量 4.常量区:存储常量. 5.代码区:存储编译之后的二进制代码. 数组和指针具有很大的相似性,实际上

  • 浅谈C++ 基类指针和子类指针的相互赋值

    首先,给出基类animal和子类fish //============================================================== // animal.h // // author : zwq // describe: 非虚函数情况下,将子类指针赋给积累指针,验证最终调用 // 基类函数还是子类函数. //============================================================== #ifndef ANIMA

  • 浅谈Java中的集合存储数据后,输出数据的有序和无序问题

    HashSet , TreeSet , 无序是指存储数据的顺序和取出数据的顺序不一致:但是TreeSet 是按照指定的顺序排个序出来: 如果,我们想按照数据输入的顺序依次输出数据(即,如果依次输入4.1.7.3,输出时依次是4.1.7.3),此时需要用LinkedHashMap ,LinkedHashSet package Demo; import java.util.*; import java.util.Map.*; public class DemoMap { public static

  • 浅谈在eclipse中如何修改svn的用户名和密码

    在eclipse中经常用到用svn进行代码版本控制,为了提交或更新代码的时候不反复地提示我们输入用户名和密码,于是我们就习惯把访问SVN的用户名密码自动保存起来.以便下次自动使用,不要再次手工输入,但是有些时候需要变更密码或者用户名, 就有些麻烦了,下面是二种解决办法: 1.通过删除SVN客户端的账号配置文件 1)查看你的Eclipse中使用的是什么SVN Interface(中文:svn接口)windows > preference > Team > SVN 在右边的设置面板中可以看到

  • Android实现保存QQ账号与密码功能(文件存储)

    目录 1.UI界面 2.构建工具类 3.编写界面交互代码 4.运行程序 大家好,我是汤姆凯特. 写在前面:今天用保存QQ账号和密码的实战演练,带大家掌握Android存储中最基本的文件存储方式 文件存储是Android中最基本的一种数据存储方式,它与Java中的文件存储类似,都是通过I/O流形式把数据直接存储到文件中,下面我们一起来看一下如何用Android实现文件存储功能吧! 1.UI界面 1)垂直线性布局为整体框架 2)头像获取 3)子线性布局编辑框和密码框 4)登录button按钮 <?x

  • 浅谈java+内存分配及变量存储位置的区别

    Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象) ◆堆:存放用new产生的数据 ◆静态域:存放在对象中用static定义的静态成员 ◆常量池:存放常量 ◆非RAM存储:硬盘等永久

  • 浅谈android获取存储目录(路径)的几种方式和注意事项

    通常, 我们创建文件/目录, 或者存储图片什么的, 我们都需要拿到手机的存储路径, 现在我们就来看一下获取手机存储路径的几种方式(作为工具类方法调用即可): 第一种: 获取 /storage/emulated/0 public static boolean sdCardIsAvailable() { //首先判断外部存储是否可用 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File

  • 浅谈C++指针(必看)

    指针在编程中有时很重要的作用 我们可以用它完成一些看似不可能完成的任务 #include<iostream> using namespace std; void square(int *n){ *n=*n**n; } int main(){ int num = 2; cout<<"The original number is "<<num<<endl; square(&num); cout<<"The new

  • 浅谈c/c++中使用指针需要注意的问题

    一.使用指针的时候需要注意几点: • 分配空间 • 初始化 • 释放 二.常见的错误有几种: 1)内存分配未成功,却使用了它 编程新手常犯这种错误,因为他们没有意识到内存分配会不成功.常用解决办法是,使用内存之前检查指针是否为Null. 如果指针p是函数的参数,那么在函数的入口处用assert(p != NULL)进行检查.如果使用malloc或new来申请内存,应该用if(p == NULL)或if(p != NULL)进行放错处理. 2)内存分配虽然成功,但是尚未初始化就引用它 犯这种错误主

随机推荐