Visual C++ 2008入门经典 第四章数组 字符串

/*
//学习内容
数组及其使用方法
如何声明和初始化不同类型的数组
如何声明和使用多维数组
指针及其使用方法
如果声明和初始化不同类型的指针
数组和指针之间的关系
引用的概念及声明方法,关于使用引用的几点初步建议
如何在本地C++程序中给变量动态分配内存
如何在CLR程序中动态分配内存
跟踪句柄和跟踪引用的概念,CLR程序中需要它们的原因
如何在C++/CLI程序中处理字符串和数组
内部指针的概念,创建和使用内部针的方法4.1 处理多个相同类型的数据值4.1.2 声明数组#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{const int MAX = 20;double gas[MAX];long miles[MAX];int count = 0;char ch = 'y';while((ch=='Y' || ch=='y') && count < MAX){cout<<"气油的价格:";cin>>gas[count];cout<<endl;cout<<"请输入miles数值:";cin>>miles[count];count++;cout<<"是否继续执行(y/n)"<<endl;cin>>ch;}if(count <= 1){cout<<"对不起,没有有效数据"<<endl;return 0;}for(int i=1; i<count; i++){cout<<setw(2)<<i<<" . ";cout<<" Gas purchased = "<<gas[i]<<" gallons ";cout<<((miles[i]-miles[i-1])/gas[i])<<" miles per gallon.";cout<<endl;}system("pause");return 0;
}*///4.3.1 初始化数组/*#include "stdafx.h"#include <iostream>#include <iomanip>using namespace std;int main(){int value1[5]={1,2,3};int value2[5];for(int i=0; i<5; i++){cout<<setw(2)<<value1[i]<<" ";}cout<<endl;for(int i=0; i<5; i++){cout<<setw(2)<<value2[i]<<" ";}cout<<endl;system("pause");return 0;}//4.1.4 字符数组和字符串处理//注意:字符串中每个字符占用一个字节,因此算上最后的空字符,字符串需要的字节数要比包含的字符数多一个//wchar_t president[] = L"Ulysses Grant";前缀L表示字符串字面值是一个宽字符串,因此字符串的每个字符(包括终止空字符)都会占两个字节,当然,对字符串的索引会引用字符,而不是字节    1 字符串输入const int MAX = 80;char name[MAX];cin.getline(name,MAX,'\n');name: char[]类型数组的名称,从cin读取的字符存储在该数组中MAX:  要读取的字符的最大数量,当读取了最大数量的字符数后,停止输入'\0': 结束输入过程的字符,在此可以指定任一字符,且该字符在首次出现时就将结束输入过程
*/
/*#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{const int AMX = 80;char buffer[AMX];int count=0;cout<<"请输入一串字符:"<<endl;cin.getline(buffer,AMX,'\n');while(buffer[count] !='\0'){count ++;}cout<<"输入的字符串为:"<<buffer<<" 长度为:"<<count<<endl;system("pause");return 0;
}*///4.1.5  多维数组//1初始化多维数组
/*#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{//int ch[3][4]={0};//char ch[3][4] = {s}; //这里默认声明字符串数组好像不行char ch[3][4] = {'s','v','v','t','s','v','t','e','s','v','t','e'}; //注意:数组中有多少维,初值组就需要多少层嵌套的大括号,这句话么意思哦,不懂啊 是等号右边吗?不行哦for(int i=0; i<3; i++){cout<<setw(2)<<i;for(int j=0; j<4; j++){cout<<setw(2)<<ch[i][j]<<" ";}cout<<endl;}system("pause");return 0;
}#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{char ch[][80]= {"Robert RedFord","Gioakibg Cassudt","Lassie","Slim Pickens","Boris Karloff","Oliver Hardy"}; //注意:数组中有多少维,初值组就需要多少层嵌套的大括号,这句话么意思哦,不懂啊 是等号右边吗?不行哦int i;cout<<"请输入1 to 6 数字:";cin>>i;if(i>=1 && i<=6){cout<<"ch["<<i<<"]:"<<ch[i-1]<<endl;}else{cout<<"输入的值不合法"<<endl;}system("pause");return 0;
}*///4.2 间接数据存取//4.2.1 指针的概念//4.2.2 声明指针//long * pnumber;//long *pnumber;//long* pnumber, number = 99;//操这里蛋疼了,pnumber是long型的指针,而number只是一个long型的变量,//在C++中,使用以字母p开始的变量名表示指针的通用惯例,这使我们能更容易看清程序中哪里些变量是指针,从而使程序更易于理解//取地址运算符//我们需要的是取地运算符符&,该运算符是一元运虎符,用于获得变量的地址,又名引用运算符。//pnumber = &number;//4.2.3  使用指针//1 间接运算符//2 需要使用指针的原因
/*#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{long* pnumber = NULL;long number1 = 55, number2=99;pnumber = &number1;*pnumber +=11; //66cout<<"number1:"<<number1<<endl;cout<<"&number1="<<hex<<pnumber<<endl;pnumber = &number2;  //99number1 = *pnumber * 10; //990//number1=990cout<<"number1="<<dec<<number1<<endl; //990cout<<"pnumber="<<hex<<pnumber<<endl;; //99cout<<"*pnumber="<<dec<<*pnumber<<endl;; //99system("pause");return 0;
}*///*pnumber +=11;//间接运算符使我们将pnumber所指变量--number1的内容加上班11,如果忘记在这条语句中写上*号,则计算机将使该指针存储的地址加上11//那不就是内存地址的加11//4.2.4 初始化指针//int* pnumber = NULL;//if(pnumber == NULL) cout<<"pnumber is null.";//int* pnumber = 0;//if(pnumber == NULL) cout<<"pnumber is 0.";//if(!pnumber){ cout<<"pnumber is null."}//NULL指针指向的地址包含无用数据,我们永远不应该解除对某个空指针的引用,因为那样将使程序立即终止//1 指向char类型的指针//char * proverb = "A miss is as good as a mile";//看起来类似初始化char数组,但二者细微的区别,这条语句用引号之间的字符串创建某个以/0终止的字符串字面值(实际上是const char类型的数组),并将该字面值的地址存储在指针proverb中,该字面值的地址将是其第一个字符的地址/*#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{char* pstr1 = "Robert Redford";char* pstr2 = "Hopalong Cassidy";char* pstr3 = "Lassie";char* pstr4 = "Slim Pickens";char* pstr5 = "Boris Karloff";char* pstr6 = "Oliver Hardy";char* pstr = "Your lucky star is ";int dice = 0;cout<<"Pick a lucky star 1 and 6:";cin>>dice;switch(dice){case 1: cout<<pstr<<pstr1<<endl;break;case 2: cout<<pstr<<pstr2<<endl;break;case 3: cout<<pstr<<pstr3<<endl;break;case 4: cout<<pstr<<pstr4<<endl;break;case 5: cout<<pstr<<pstr5<<endl;break;case 6: cout<<pstr<<pstr6<<endl;break;default:cout<<"sorry 输入的值不正确"<<endl;break;}//输出指针指向的字符串简单得不能再简单了,//显示出来的是该指针包含的地址,为里却不同呢,//在于输出操作看待char*类型指针的方式,输出操作以一种特殊的方式来看待这种类型的指针,即将其视为字符串(即char数组)//因些输出字符串本身,而不是字符串的地址system("pause"); return 0;
}*//*
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{char* pstr[] ={ "Robert Redford","Hopalong Cassidy","Lassie","Slim Pickens","Boris Karloff","Oliver Hardy",};char* pFirstStr = "Your lucky star is ";int dice = 0;cout<<"Pick a lucky star 1 and 6:";cin>>dice;if(dice >= 1 && dice <= 6){cout<<pFirstStr<<pstr[dice-1]<<endl;}else{cout<<"sorry 输入的值不正确"<<endl;}//输出指针指向的字符串简单得不能再简单了,//显示出来的是该指针包含的地址,为里却不同呢,//在于输出操作看待char*类型指针的方式,输出操作以一种特殊的方式来看待这种类型的指针,即将其视为字符串(即char数组)//因些输出字符串本身,而不是字符串的地址system("pause"); return 0;
}*///4.2.5 sizeof运算符//cout<<(sizeof pstr)/(sizeof pstr[0])//记住,pstr是一个指针数组,对该数组或元素使用sizeof运算会不能获得任何文本字符中内存占用情况
/*#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{char* pstr[] ={ "Robert Redford","Hopalong Cassidy","Lassie","Slim Pickens","Boris Karloff","Oliver Hardy",};char* pFirstStr = "Your lucky star is ";int count = (sizeof pstr) / (sizeof pstr[0]);cout<<"count:"<<count<<endl;//这里计算一共有多省个字符串int dice = 0;cout<<"Pick a lucky star 1 and "<<count<<":";cin>>dice;if(dice >= 1 && dice <= 6){cout<<pFirstStr<<pstr[dice-1]<<endl;}else{cout<<"sorry 输入的值不正确"<<endl;}//输出指针指向的字符串简单得不能再简单了,//显示出来的是该指针包含的地址,为里却不同呢,//在于输出操作看待char*类型指针的方式,输出操作以一种特殊的方式来看待这种类型的指针,即将其视为字符串(即char数组)//因些输出字符串本身,而不是字符串的地址system("pause"); return 0;
}*///4.2.6 常量指针和指向常量的指针//const int count = (sizeof / pstr) / (sizeof pstr[0])
//#include "stdafx.h"
//#include <iostream>
//#include <iomanip>
//#include <string>
//#include <cstring>
//using namespace std;
//int main()
//{/*char* pstr[] ={ "Robert Redford","Hopalong Cassidy","Lassie","Slim Pickens","Boris Karloff","Oliver Hardy",};*///char* pFirstStr = "Your lucky star is ";//修改pstr[0]所指向的字符内容//pstr[0]="Xlc";//cout<<pstr[0]<<endl;//cout<<*pstr[0]<<endl;//*pstr[0] = "Stan Laurel"; //书上说这样不可以编译,但我这里却可以//*pstr[0] = 'x'; ///*const char* pstr[] ={ "Robert Redford","Hopalong Cassidy","Lassie","Slim Pickens","Boris Karloff","Oliver Hardy",};*///指针数组的元素指向const字符串,如果我们现在试图修必这些字符串,则次被编译器在编译时标记为错误//*pstr[0] = 'x'; 不可以修改//当然,我们仍然可以合法地编写下面的语句//pstr[0] = pstr[1];//注意,这条语句并没有改变指针数组元素指向的对像的值,改变的只是pstr[0]中存储的指针的值,我们应该禁止这种修改,/*const char* const pstr[] ={ "Robert Redford","Hopalong Cassidy","Lassie","Slim Pickens","Boris Karloff","Oliver Hardy",};*///总之,我们应该区分下面这三种const,指针及指针指向的对像有关的情形//指向常量对像的指针//const char* pstr[]={};//指向某个对像的常量指针//char* const pstr[]={}//指向常量对像的常量指针//const char* const pstr[]={}//第一种情况,我们不能修改被指向的对像,但可以使指针指向其它对像//const char* pstring = "Some text";//const char* pstring = "Some text";//如果修改指针指向其它对像, 这里需要知道这么回事,但还是不太理解,其它的对像,是指一个"I some text"吗?//但我用 const char _str[] = "I some text"; 然后赋值给pstring还是不成功//pstring="I some text";//cout<<"pstring:"<<pstring<<endl;	// *pstring = "xxdxxd"; 不能修改被指向的对像//第二种情况,我们不能修改指针中存储的地址,但可以修改指针指向的对像//char* const pstring = "Some text";//常指针就是创建不能移动的固定指针,但是它所指的数据是可以改变的//pstring[0] = 's';// char * const pc ="abcd";// cout <<pc<<endl;// pc[3]='x';// cout<<pc<<endl;//网上指的,也不起做用//pstring = "I Some text"; //不能修改指针中存储的地址//*pstring = "I some text";//不知道怎么来描述或者说怎么来写,“可以修改指针指向的对像”//在最后一种情况下,指针和被指向的对像都被定义成常量,因此都不能被修改//const char* const pstring="Some Texst";//4.2.7 指针和数组//double* pdata;//double date[5];//则可以进行下面的赋值操作//pdata = data;//该语句将数组data中第一个元素的地址赋给指针pdata,单独使用数组名称将引用该数组的地址,如果我们使用带索引仁政的数组名data,//则引用的是对应于索引值的那个元素的内容,因此,如果我们希望将该元素的地址存入指指中,则必须使用取址运算符//pdata = &data[1];//1 指针算术运算//我们可以用指针执行算术操作,在算术方面,我们仅限于加减操作//pdata = &data[2];//这种情况下,表达式pdata+1将是数组data中的第四个元素data[3].因此我们通过下面的这条语句,就可以使指针pdata指向元素data[3]//pdata++;//注意,指针算术运算产生的地址范围可以从数组第一个元素的地址到最后一个元素之后的第一个地址,如果超出该范围,则指针的行为是不确定的//对于作为指针算术运算结果的指针来说,我们当然可以解除对它的引用(否则该指针就没什么用途)//假设pdata仍然指向data[2]//* (pdata+1) = *(pdata+2);//data[3] == data[4]//当我们使某个指针包含的地址递增之后,又希望解除对该指针的引用时,圆括号是必不可少的,因为间接运算符的优先级高于算述运算符+或-的优先级,如果写成*pdata + 1 而非*(pdata+1),//则使pdata指向的地址中存储的数值加1,即等价于执行data[2]+1; 因为该表达式不是一个左值,所以用于前面的赋值语句时将使编译器生成一条出错消息/**const int MAX = 100;long primes[MAX] = {2,3,5};long trial = 5;int count = 3;int found = 0;do{trial += 2; //7found =0;   //0for(int i=0; i<count; i++){found = (trial % *(primes+i)) == 0;if(found){cout<<"trial:"<<trial<<endl;cout<<"*(primes+i):"<<*(primes+i)<<endl;break;}}if(found == 0)*(primes + count++) = trial;}while(count < MAX);for(int i=0; i<MAX; i++){if(i % 5 == 0)cout<<endl;cout<<setw(10)<<*(primes + i);}*///计算字符的个数/*const int MAX = 80;char buffer[MAX];char* pbuffer = buffer;cout<<"请输入你要的字符串,最大值为"<<MAX<<endl;cin.getline(buffer,MAX,'\n');//因为指针pbuffer是在while循环中递增的,发现'\0'字符之后递增将停止,当发现'\0'字符时,pbuffer将包含字符串中该字符的地址,//因此,输入的字符串中字符的个数就是指针pubffer中存储的地址与buffer指示的数组开始地址的差值//这句话很重要,pbuffer将包含字符串中该字符地址,因此,输入的字符串中字符的个数就是指针pbuffer中存储的地址与buffer指示的数组开始的地址的差值while(*pbuffer){pbuffer++;}cout<<"the stirng :"<<buffer<<endl;cout<<" has "<<(pbuffer - buffer -1)<<" characters. ";cout<<endl;//注意,我们不能用与使用指针相同的方式使用数组名,表达式buffer++绝对是非法的,因为我们不能修改数组名表示的地址,尽管我们可以在表达式中像使用指针一样使用数组名,但是数组名不是指针,因为它表示的地址是固定的*/// 2 使用指针处理多维数组//但相对处理多信数组时,事情就变得稍微复杂一些了//double beans[3][4];//我们可以声明一个指针pbeans//double* pbeans;//pbeans = &beans[0][0];   //我们也可以用下面的语句,将指针设置为数组中第一行的地址//pbeans = beans[0];//但由于beans是二维数组,因此不能用下面的语句设置指针中的地址//pbeans = beans;//问题在于类型不同,前面定义的指针类型是double*, 但是数组beans的类型是double[3][4],//存储该数组地址的指针必须是double*[4]类型,C++将数组的大小与类型联系在一起,//上面的语句仅当将指针声明为要求的大小时才合法,这种声明形式比前面所介绍的都复杂一些//double (*pbeans)[4];//此处的圆括弧是必需的,否则声明的将是一个指针数组,前面那条语句现在是合法的,但是该指针只能用来存储规定大小的数组的地址/*double beans[3][4]={10};double* pbeans = &beans[0][0];cout<<"pbeans:"<<*pbeans<<endl;//将第一行做为存储地址double* ppbeans = beans[0];*(ppbeans+1)=22; //这样是个改第一行的第二个值//ppbeans++; 这样加不行,这样加是指元素向前提一个 //*(ppbeans+1)=55;//*(*ppbeans+1)=66;//这里还是不知道如何移动到下一次,或者指定下一列的信息cout<<"beans[0][1]:"<<beans[0][1]<<endl;cout<<"beans[0][2]:"<<beans[0][2]<<endl;cout<<"beans[1][1]:"<<beans[1][1]<<endl;*///3: 多维数组的指针形式//使用带两个索引值的数组名//使用指针形式的数组名//beans[i][j];//*(*(beans+i)+j);//beans是数组变量值,而不是指针值//我们来看一下工作过程,第一行使用正常的数组索引值,引用数组中第i行偏移量为j的元素//我们可以从内向外确定每样二行的意义,beans引用数组第一行的地址,因此beans+i引用提数的第i行,//表达式*(beans+i)是第i行的第一个元素的地址,因此*(beans+i)+j是i行中偏大移量为j的那个元素的地址,因此,整个表达式引用的该元素的值/*double beans[3][4]={10};double* pbeans = &beans[0][0];cout<<"pbeans:"<<*pbeans<<endl;//我这里个beans[1][1]的元素值*(*(beans+1)+1) = 55; //大爷的,这里注意是用beans而不是指针变量pbeans去找的cout<<"beans[1][1]:"<<beans[1][1]<<endl;//*(*(beans+i)+j);//我们不建议这样做,那么可以混合使用数组和指针两种形式,*(beans[2]+1) = 66;cout<<"beasn[2][1]:"<<beans[2][1]<<endl;(*(beans+1))[2] = 77;cout<<"beans[1][2]:"<<beans[1][2]<<endl;*///4.3动态内存分配//4.3.1 堆的别名--自由存储器//4.3.2 new和delete运算符//double* pvalue = NULL;//pvalue = new double;//*pvalue = 9999.0;//pvalue = new double(999.0);//delete pvalue;//这样将确保这块内存以后可被另一个变量使用,如果我们不使用delete,随后又在pvalue指针中存入一个不同的地址值,那么将无法再释放这块内存,或使用其包含的变量,因为我们失去了访问该地址的途径,这种情况被称为内存泄漏,特别是出现在用户程序中的时候//4.3.3 为数组动态分配内存//pstr = new char[20]; 声明动态数组//delete []pstr; 删除数组 使用方括号是为了指出要删除的是一个数组,//从自由存储器中删除数组时,我们应该总是包括方括号,否则结果将不可预料,别请注意,我们不需要指定任何大小,只需要写出[]即可//当我们使用delete运算符弃某些内存之后,还应该总暗针访俯拾皆是指针重新设置为0//pstr = 0;/*long* pprime =0;
long trial = 5;
int count = 3;
int found = 0;
int max = 0;cout<<"请输入一个最大值:";
cin>>max;if(max < 4){max = 4;
}
pprime = new long[max]; //声明一个long的数组*pprime = 2; //第一个值为2
*(pprime+1)=3; //第二个值为3
*(pprime+2)=5; //第三个值为5
do
{trial +=2;found = 0;for(int i=0; i<count; i++){found = (trial % *(pprime+i)) == 0;if(found)break;}if(found==0){*(pprime+ count++) = trial;}
}while(count < max);for(int i=0; i<max; i++)
{if(i % 5 ==0){cout<<endl;}cout<<setw(10)<<*(pprime+i);
}
delete []pprime;
pprime = 0;
//注意:我们不能给动态分配的数组元素指定初值,如果需要设置数组元素的初值,则必须显示使用赋值语句
*///4.3.4 多维数组的动态分配件//与一维数组相比,在自由存储器中为多维数组分配内存需要以略微复杂的形式使用new运算符//pbeans = new double[3][4];//pBigArray = new double[5][10][10];//前面曾经看到,可以使用变量来指定new分配的一维数组的大小,对二维或多维数组来说同样如此,//但仅限于用变量指定最左边那一维,所有其他维都必须是常量或常量表达式,//pBigArray = new double[max][10][10];//?????????????????????????//不会吧我得试试才知道了/*const int max = 20;const int line = 30;const int line2 = 10;double(*pBigArray)[10][10] = new double[max][10][10]; //看看成不成功delete [] pBigArray;*///上面说的是正确的,书上说的是正确的

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转载]ns2在linux安装过程

本安装教程&#xff0c;实在ubuntu下实现&#xff0c;安装的软件的版本&#xff0c;可能不同&#xff0c; 过程中也可能存在微小差异&#xff0c;供参考。 本人亲测&#xff0c;gcc版本4.5&#xff0c;ns2版本2.35&#xff0c;成功。 教程来源&#xff1a;http://blog.sina.com…

Http的轻微配置

目标&#xff1a; 建立DNS服务器&#xff0c;同时为linux.com, php.net, apache.org三个域提供解析&#xff1b;要求&#xff0c;每个域内的www主机均指向本机唯一的IP&#xff1b; 建立httpd服务器&#xff0c;分别为www.linux.com, www.php.net, www.apache.org 各提供一个虚…

Ural 1627 Join(生成树计数)

http://acm.timus.ru/problem.aspx?space1&num1627 生成树计数的题&#xff0c;直接用Matrix-Tree定理就可以解决问题了。 代码如下&#xff1a; View Code 1 #include <cstdio>2 #include <cstring>3 #include <algorithm>4 5 using namespace std;6 …

repair filesystem 一般是什么引起的和该怎样解决

repair filesystem 一般是什么引起的和该怎样解决 linux下repair filesystem模式修复方法实践 第一种情况&#xff1a;非正常关机引起的磁盘分区问题不能正常进入系统 如果确定是由于上次非正常关机或者异常断电引起的&#xff0c;可以使用fsck /dev/hdaX后reboot进入&#xff…

Navicat for MySQL工具创建mysql数据库定时器

步骤1&#xff1a; 步骤二&#xff1a; 效果图:

centos安装virtualbox

1 检查系统内核版本[rootcentos ~]# uname -aLinux centos2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:35 EDT 2010 i686 i686 i386 GNU/Linux2 安装软件环境yum install gcc yum install kernel-devel yum install kernel-headers 注&#xff1a;这步执行后的版kernel-devel和kern…

带有emplace开头的STL为何优于其它插入函数

#include #include #include “my_string.h” int main() { std::vector<my_string>vec; //会执行构造函数&#xff0c;再执行move构造函数,如果没有move会自己生成默认的move构造函数 vec.push_back(“1111”); //c会执行构造&#xff0c;执行完毕 std::string str …

openssl rsa密钥

#include <boost/asio/ssl.hpp> #include #if defined(WINDOWS) #if (OPENSSL_VERSION_NUMBER > 0x10101000L) #pragma comment(lib,“libcrypto.lib”) #pragma comment(lib,“libssl.lib”) #else #pragma comment(lib,“libeay32.lib”) #pragma comment(lib,“ss…

Juniper基础系列之一---vlan的建立

VLAN是交换机最重要的一个功能。EX交换机关于VLAN配置的菜单有三层&#xff0c;首先是vlans菜单层次&#xff0c;在vlans&#xff08;通过edit vlans可以进入vlans菜单里面&#xff09;里面可以创建vlan&#xff0c;而创建vlan的时候可以指定名字和vlan id。 在EX端口下面&…

魔兽争霸3地图(WarIII Maps):三国猛兽传

魔兽争霸3地图&#xff08;WarIII Maps&#xff09;&#xff1a;三国猛兽传三国猛兽传三国时期&#xff0c;连年战乱&#xff0c;天降异象&#xff0c;所有战力无双的英雄&#xff0c;外表全都变成了凶悍的猛兽…………其貌虽毁&#xff0c;其心不改攻城略地&#xff0c;百战成…

Linux下Redis的安装、配置操作说明

Redis 是一个高性能的key-value数据库。 redis的出现&#xff0c;很大程度补偿了memcached这类keyvalue存储的不足&#xff0c;在部分场合可以对关系数据库起到很好的补充作用。它提供了Python&#xff0c;Ruby&#xff0c;Erlang&#xff0c;PHP客户端&#xff0c;使用很方便。…

提取ip和端口

#include int main() { std::string str “192.168.9:8086”; std::string buffer1; buffer1.resize(128); int port 0; sscanf(str.c_str(), “%[^:]:%d”, &buffer1[0],&port); //std::string str “https://192.168.9:8086/test”; //std::string buffer1; //b…

Oracle SQL语句执行步骤

Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1、当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法、表名、字段名等相关信息&#xff08;如下图&#xff09;&#xff0c;这过程会花比较长的时间&#xff0c;因为它要分…

字节流及字节对齐

#include #pragma pack(push,4) struct MyStruct { unsigned char a;// unsigned int b; //到这里是&#xff0c;加起来等于unsigned int 字节的倍数 unsigned char Cbuffer[10];//char没有字节对齐 unsigned int d; }; #pragma pack() void EnCodePack(unsigned char*cSend…

Android平台各类恶意软件及病毒概览

原文请见:http://mobile.51cto.com/ahot-364267.htmAndroid平台中各类恶意软件及病毒概览<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />随着移动互联网的发展&#xff0c;作为当今最大的移动操作系统之一&#xff0c;Android已…

string封装

class String { public: String(const char*str NULL) { if (str NULL) { data_ new char[1]; data_[0] 0; //memset(data_, 0, sizeof(data_)); //数组越界&#xff0c;delete的时候&#xff0c;会影响内存回收变化&#xff0c;因此会导致程序崩溃 } else { data_ new ch…

vim高级技巧(split)_小花_新浪博客

vim高级技巧&#xff08;split&#xff09;_小花_新浪博客:res(ize) N 把当前窗口高度增加N个像素 :res(ize) -N 把当前窗口高度减少N个像素 :vertical res(ize) N 把当前窗口宽度增加N个像素 :vertical res(ize) -N 把当前窗口宽度减少N个像素等于是按下后,松开键盘,再按…

单链表反转和插入

#include struct node { int value -1; node* next_ptr nullptr; }; //创建结点 void create(int i, node** header_ptr) { node* current header_ptr; //第一个结点 if (current nullptr) { node ptr new node; ptr->value i; ptr->next_ptr nullptr; header…

liunx命令联系

1&#xff0c;liunx桌面和命令行之间的切换 init 3 init4 init5 2&#xff0c;liunx下用户的切换是su 用户 转载于:https://blog.51cto.com/lvjian118/1057319

测试boot库下I/O模型类型

#include #include #include <boost/asio.hpp> int main() { std::string output; #if defined(BOOST_ASIO_HAS_IOCP) output “iocp” ; #elif defined(BOOST_ASIO_HAS_EPOLL) output “epoll” ; #elif defined(BOOST_ASIO_HAS_KQUEUE) output “kqueue” ; #elif…