char函数

C语言学习笔记04――程序在内存中的分布以及内存越界问题

匿名 (未验证) 提交于 2019-12-03 00:22:01
C语言程序在内存中的分布: #include <stdio.h> char bss[1024*1024]; int main() { return 0;} 现在来看看程序的可执行文件大小 定义 char bss[1024*1024]={0};也是这个结果 可以看到 bss的大小并没有1MB 说明未初始化的全局变量不占程序文件的存储空间 #include<stdio.h> char data[1024*1024]={1}; int main() {return 0;} 运行结果: char* p = "12345" 如何使用堆内存: void *malloc(size_t size); void free(void *ptr); 举个例子: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main() { printf("%d\n",getpid()); //得到进程id char* p = malloc(sizeof(char)*10); char str1[7] = "123avbd"; char* str2 = "101"; printf("&p:%p\np:%p\n",&p,p); printf("str1:%p\nstr2:%p\n",str1

RSA算法详解及C语言实现

匿名 (未验证) 提交于 2019-12-03 00:22:01
1、 什么是RSA RSA公钥加密算法是1977年由罗纳德・李维斯特(Ron Rivest)、阿迪・萨莫尔(Adi Shamir)和伦纳德・阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。 RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。 今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。 RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。 RSA算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法。在了解RSA算法之前,先熟悉下几个术语 根据密钥的使用方法,可以将密码分为对称密码和公钥密码 对称密码:加密和解密使用同一种密钥的方式 公钥密码:加密和解密使用不同的密码的方式,因此公钥密码通常也称为非对称密码。 2. RSA加密 RSA的加密过程可以使用一个通式来表达 密文= 明 文 E 明 文 E mod N

C++ 练习-多线程

匿名 (未验证) 提交于 2019-12-03 00:22:01
#if 0 //CreateThread代码示例 #include<iostream> #include<windows.h> using namespace std ; DWORD WINAPI ThreadFun(LPVOID lpThreadParameter) { char * str = ( char *)lpThreadParameter; while ( true ) { cout << "线程处理函数中接收到的参数是:" << str << endl; cout << "子线程ID: " << GetCurrentThreadId() << endl; Sleep( 1000 ); } return 0 ; } int main() { DWORD threadId = 0 ; HANDLE hThread = CreateThread( NULL, //设为NULL表示默认安全性 0 , //如果设为0,那么默认将使用与调用该函数的线程相同的栈空间大小 ThreadFun, //线程处理函数,函数名就是函数指针 "hello thread!" , //向线程函数传入的参数 0 , //0表示创建后马上运行 &threadId); if (hThread == NULL){ cout << "线程创建失败,ERROR CODE : " << GetLastError

C++ 重写String类

匿名 (未验证) 提交于 2019-12-03 00:21:02
codeblocks gcc version 4.9.2 (tdm-1) 构造方法 描述 String(char *s,int len) 构造方法初始化数据 成员方法 描述 char *getStr() 获取当前的String(打印) int getLength() 获取当前String的长度 char *Strcpy(char *s) 字符串的复制 char *Strcat(char *s) 字符串的连接 int Compare(char *b) 字符串的比较 char *substring(int sub_start,int sub_end) 指定起始终止位置求子串 void exchange(char *s) 字符串的交换 int BF_Find_String(char *s) 在当前字符串String中查找子串 int indexOf(char index) 查找某字符在当前String中第一次出现的位置 void toUpperCase() 字符串小写转大写 void toLowerCase() 字符串大写转小写 char *trim() 消除字符串中的空格 char *SplitStr() 消除{,!”“#$%&’()*+,-./}的字符 void set(int index,char letter) 在指定字符串的指定位置添加某字符 #include<

关于链式表达式

匿名 (未验证) 提交于 2019-12-03 00:14:01
就是为了后来函数调用者方便而设计的.不用你这么麻烦用上述方法去使用了,而直接可以使用拷贝后的dest字符串了.这种方便的实现方法,看起来就是链子链在一起的,所以称为 链式表达式 已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串。 (1)不调用C++/C的字符串库函数,请编写函数 strcpy char *strcpy(char *strDest, const char *strSrc); { assert((strDest!=NULL) && (strSrc !=NULL)); // 2分 char *address = strDest; // 2分 while( (*strDest++ = * strSrc++) != ‘\0’ ) // 2分 NULL ; return address ; // 2分 } (2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值? 答:为了实现链式表达式。 // 2分 例如 int length = strlen( strcpy( strDest, “hello world”) ); --------------------------------------------

C++primer学习笔记(三)

匿名 (未验证) 提交于 2019-12-03 00:11:01
没啥好说的,就是+- /& =、==等。 简单归纳:当一个对象被用作右值的时候,用的是对象的值(内存);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。假设p的类型是一个int*,则decltype如果作用于一个表达式时如decltype(*p)得到的是一个引用类型,而decltype(&p)的结果是一个int ** 其中逻辑与运算符(&&)和逻辑或(||)运算符是短路求值运算符: 对于逻辑与运算符来说,当且仅当左侧运算对象为真时才对右侧运算对象求值。 对于逻辑或运算符来说,当且仅当左侧运算对象为假时才对右侧运算对象求值。 赋值运算符满足右结合律,即 1 2 int a,b,c; a = b = c =3;//可以连续赋值 赋值运算优先级较低,所以在条件语句中,赋值部分通常加上括号,如: cpp int i; while((i=get_value())!=42){ //anything } 分前置版本和后置版本。前置版本先加1,然后将改变后的对象作为求值结果,后置版本也会将运算对象加1,但是求值结果是运算对象改变之前那个值的副本。 如果想测试一个算术对象或者指针对象的真值,最直接的方法就是将其作为if条件 1 2 3 4 if(val);//如果val是任意的非0值,条件为真 if(!val);//如果val是0,条件为真 有时我们试图将上面的真值测试写成如下形式:

编译原理――LR(1)分析程序(C#)

匿名 (未验证) 提交于 2019-12-03 00:05:01
LR(1)分析程序实验目的与要求 实验内容 本次实验最主要的部分构建语法分析表,理解分析表的使用,明确分析步骤。 本次实验主要用到的数据结构有List, Stack,二维数组等。 根据用户输入,给出分析过程。 实验步骤 Main函数:在while循环中,根据状态栈栈顶元素,输入字符串的首字符,查询Action表,根据其值判断分析是否结束。未结束,则分为成功,移进,规约三种状态进行分析。 主要函数介绍: 根据S后的数字,获取产生式右部:static string GetRight(int n) 打印分析步骤:Display(string inputString,string action,string Go) 用于将状态栈,符号栈的内容逆序转化成字符串:GetStringFromStack(Stack stack) 根据终结符查找其在Vt表的位置:GetIndexByTerminalOnVt (char target) 根据非终结符查找其在Vn表的位置:GetIndexByNonTerminalOnVt (char target) 实验中遇到的问题: using System; using System.Collections.Generic; using System.Linq; using System.Text; using static System.Console;

字符串、字符和字节

匿名 (未验证) 提交于 2019-12-03 00:05:01
C语言中没有显示的字符串数据类型,字符串以字符串常量或者字符数组的形式出现,字符串常量适用于那些程序不会对它们进行修改的字符串。所有其它字符串都必须存储于字符数组或动态分配的内存中。 字符串 是一串零个或多个字符,并且以一个位模式为全0的NULL字节结尾。 字符串所包含的的字符内部不能出现NULL字节。 NULL字节是字符串的终结符,但它并不是字符串的一部分,所以字符串的长度并不包含NULL字节。 字符串函数的声明都在 string.h 头文件中。 字符串的长度就是它所包含的字符个数,通常使用函数 strlen 来计算字符串的长度。 sizet_t strlen ( char const * string ); size_t 定义在 stddef.h 中,它是一个无符号整数类型。 在表达式中使用无符号数可能导致不必要的结果,如下: if ( strlen ( x ) >= strlen ( y ))... if ( strlen ( x ) - strlen ( y ) >= 0 )... 第二条语句的结果永远为真,因为strlen(x)、strlen(y)的返回值都是无符号数,所以>=左边是无符号数,无符号数不可能小于零。 最常用的字符串函数都是不受限制的,就是说它们只是通过寻找字符串参数结尾的NULL来判断它的长度。在使用这些函数时,必须要 保证结果字符串不会溢出内存。

BUUCTF--SimpleRev

匿名 (未验证) 提交于 2019-12-03 00:03:02
测试文件: https://buuoj.cn/files/7458c5c0ce999ac491df13cf7a7ed9f1/SimpleRev?token=eyJ0ZWFtX2lkIjpudWxsLCJ1c2VyX2lkIjoxOTAzLCJmaWxlX2lkIjoyNDN9.XXnIgg.L-8ifBkOTka-7o-QXZDkKNm77x4 1.准备 获取信息 64位文件 1.IDA打开 将main函数反编译为C代码 1 int __cdecl __noreturn main ( int argc , const char ** argv , const char ** envp ) 2 { 3 int v3 ; // eax 4 char v4 ; // [rsp+Fh] [rbp-1h] 5 6 while ( 1 ) 7 { 8 while ( 1 ) 9 { 10 printf ( "Welcome to CTF game!\nPlease input d/D to start or input q/Q to quit this program: " , argv , envp ); 11 v4 = getchar (); 12 if ( v4 != 'd' && v4 != 'D' ) 13 break ; 14 Decry (); 15 } 16 if ( v4 =

易错、经典问题:return不可返回指向栈内存的指针

匿名 (未验证) 提交于 2019-12-02 23:59:01
C/C++程序占用的内存分为两大类: 静态存储区 与 动态存储区 。其示意图如下所示: 数据保存在静态存储区与动态存储区的区别就是:静态存储区在 编译-链接 阶段已经确定了,程序运行过程中不会变化,只有当程序退出的时候,静态存储区的内存才会被系统回收。动态存储区是在程序运行过程中动态分配的。 在其它地方我们还可以看到内存分配还有其他分类,那些都是细分的分类,比如文字常量区、全局数据区等,都归为静态存储区这一个大类。 关于内存的分类这里只是大致说明一下,关于内存更详细的内容可查看往期笔记: 【C语言笔记】内存笔记 先看一个return返回指向栈内存指针的例子: #include <stdio.h> char * GetStr ( void ) { char p [] = "Hello" ; /* 保存在栈中 */ return p ; } int main ( void ) { char * str = NULL ; str = GetStr (); printf ( "%s\n" , str ); return 0 ; } 程序编译、运行的结果如下: 可以看到,编译出现警告: warning: function returns address of local variable 运行结果并不是我们期望的输出字符串 Hello 。 那是因为 GetStr 函数返回指向栈内存的指针