char

Leetcode-数组&链表

可紊 提交于 2020-03-02 09:37:52
常见双指针技巧用法,只总结思路,具体边界判定想不清楚的时候稍微画个图就行了 1. 快慢指针判断链表是否含有环、环入口(快慢指针再次相遇即有环;再从头节点和快慢指针的相遇位置同速度向后,相遇点即为环入口)。 2. 快慢指针找链表中点、倒数第k个元素(快指针到达 Null 时慢指针所处位置即为中点;快指针先走k步,然后和慢指针一起同速度向后,快指针到达 Null 时慢指针的位置就是倒数第k个节点)。 3. 左右指针二分查找、在有序数组中找两数之和、反转数组 4. 滑动窗口,典型题包括 #76、#438、#3 76. 最小覆盖子串 https://leetcode-cn.com/problems/minimum-window-substring/ 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 解: 可以用滑动窗口技巧,left 和 right 指针都初始化为0,然后 right 向右滑动直到 s[left, ..., right] 中包括了T串中所有的字符,就得到一个可能的解,再令 left

C++面试题一大波

梦想与她 提交于 2020-03-02 08:44:39
//打印1到最大的n位数。 //题目:输入数字n。按顺序打印出从1到最大的n位十进制数。比方: //输入3。则打印出1、2、3一直到最大的3位数999. //[陷阱]:这个题目非常easy想到的办法就是先求出最大的数。然后循环输出就能够了。 #include <iostream> #include <string.h> using namespace std; void Grial(char *str, char *s) { if (*s == '\0') { cout << str << endl; return; } else { for (int i = 0; i <= 9; i++) { Grial(str,s+1); *s = '1' + i; } } } void Grial(int x) { char *s = new char[x]; memset(s,'0',sizeof(s)); *(s + x) = '\0'; char *str = s; Grial(str, s); } int main() { Grial(2); return 0; } #include <iostream> using namespace std; void Grial(char *str,int n) { int count = 1; char *p = str+n; while

C语言错误: HEAP CORRUPTION DETECTED

时光怂恿深爱的人放手 提交于 2020-03-02 08:14:00
程序源代码: //写文件两种方式(文本文件和二进制文件) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //文本写文件 int writeWord(const char *path,const char *pword){ int ERRO_MSG = 0; if (path == NULL) { ERRO_MSG = 1; printf("path==NULL erro msg:%d\n", ERRO_MSG); return ERRO_MSG; } if (pword == NULL) { ERRO_MSG = 2; printf("pword==NULL erro msg:%d\n", ERRO_MSG); return ERRO_MSG; } //定义文件指针 FILE *fpw=NULL; //打开文件 fpw = fopen(path, "w");//w 打开只写文件,若文件存在,则文件长度清零,即文件内容会消失,若文件不存在则建立该文件 //判断文件是否打开成功 if (fpw==NULL) { ERRO_MSG = 1; printf("文件打开失败 fpw==NULL erro msg:%d\n", ERRO_MSG); return

模拟shell程序

我的梦境 提交于 2020-03-02 07:43:09
要求: 能识别 > , < 的输入输出重定向。 能识别出管道操作。 支持多重管道: 比如 cat | cat | cat | cat 。 支持管道和重定向的混合。 解决管道输入输出重定向和管道输出重定向和文件重定向共存的问题。 分析: 简单指令 此类指令无重定向, 无管道, 则其执行方式应该是主进程创建一个子进程, 将指令字符串组装成字符串数组后再添加调用 exec 函数即可。 带有重定向的指令 方案一 : > 和 < 直接当做命令行参数传递给 exec 函数。 经过测试, exec 并不能解析重定向符号 。 方案二 : 手动打开文件然后后 dup2 了。 带有管道的指令 将指令从管道符号拆分成多条指令, 每条指令分给一个子线程, 并让一个管道分隔的两个子进程一个获得一个管道的读端, 一个获得进程写端, 且将写端的进程的标准输出重定向到写端的文件描述符。如下图所示: 实现 /** * 完成一个模拟shell的程序。 */ # include <stdio.h> # include <stdlib.h> # include <string.h> # include <sys/types.h> # include <sys/stat.h> # include <fcntl.h> # include <unistd.h> char commands [ 1024 ] ; /*

Linux模块

二次信任 提交于 2020-03-02 04:50:53
一、为什么要使用模块 由于linux使用的是整体结构,不是模块化的结构,整体结构实现的操作系统可扩展性差。linux为了扩展系统,使用了模块的技术,模块能够从系统中动态装入和卸载,这样使得linux也具有很好的可扩展性。 二、linux中哪些代码作为模块实现,哪些直接编译进内核? 当然我们是尽量把代码编译成模块,这样就可以根据需要进行链接,内核的代码量也会少很多。几乎所有的高层组件—文件系统、设备驱动程序、可执行格式、网络层等等—都可以作为模块进行编译。 然而有些代码确必须直接编译进内核。这些代码通常是对数据结构或者函数进行修改。如内核中已经定义好了的数据结构,如果要改变这个数据结构,那么只有从新编译内核了。 三、管理模块 内核主要完成管理模块的两个任务。第一个任务是确保内核的其它部分可以访问该模块的全局符号,模块还必须知道全局符号在内核及其它模块中的地址。因此,在链接模块时,一定要解决模块间的引用关系。第二个任务是记录模块的使用情况,以便再其它模块或者内核的其它部分正在使用这个模块时,不能卸载这个模块。 四、模块使用的数据结构 每个模块都用一个module描述符描述,并且链接到一个以modules变量为链表头的双向循环链表中。 module描述符: struct module { enum module_state state; //模块内部状态 struct list_head

C语言文件操作详解

限于喜欢 提交于 2020-03-02 04:13:23
C语言文件操作详解 C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:       文件的打开操作 fopen 打开一个文件       文件的关闭操作 fclose 关闭一个文件       文件的读写操作 fgetc 从文件中读取一个字符               fputc 写一个字符到文件中去               fgets 从文件中读取一个字符串               fputs 写一个字符串到文件中去               fprintf 往文件中写格式化数据               fscanf 格式化读取文件中数据               fread 以二进制形式读取文件中的数据               fwrite 以二进制形式写数据到文件中去               getw 以二进制形式读取一个整数               putw 以二进制形式存贮一个整数     文件状态检查函数 feof 文件结束               ferror 文件读/写出错               clearerr 清除文件错误标志               ftell 了解文件指针的当前位置       文件定位函数 rewind 反绕              

内存安全实验

送分小仙女□ 提交于 2020-03-02 01:30:33
实验环境: Linux ubuntu 4.15.0-47-generic #50~16.04.1-Ubuntu SMP Fri Mar 15 16:03:40 UTC 2019 i686 i686 i686 GNU/Linux 栈的保护机制 地址随机化 地址随机化 :通过随机化整个segment,比如栈,堆,或者代码区的地址对内存进行保护。 关闭该机制可使用以下命令: sudo sysctl -w kernel.randomize_va_space=0 #关闭内存地址随机化 栈不可执行和DEP保护 NX(DEP) :NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。 栈保护基址 :栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行

char[ ]数组与String类型的互换

醉酒当歌 提交于 2020-03-02 00:29:44
文章目录 1.String ---> char[ ] 2.char[ ] ---> String 1.String —> char[ ] 1)方法1:String类中的toCharArray()方法 String a = "abcdef" ; char [ ] arr = a . toCharArray ( ) ; 2)方法2:通过String类中的charAt()方法与空的char数组 String a = "abcdef" ; char [ ] arr = new char [ a . length ( ) ] ; // 创建和a的长度一样的字符数组 for ( int b = 0 ; b < a . length ( ) ; a ++ ) { arr [ b ] = a . charAt ( b ) ; } 2.char[ ] —> String 1)方法1:使用String类的构造方法 char [ ] arr ; // 非空的字符数组 String result = new String ( arr ) ; 2)方法2:char[ ] --> StringBuffer --> String char [ ] arr ; // 非空的字符数组 StingBuffer sb = new StringBuffer ( ) ; sb . append ( arr ) ;

字符串的应用

只谈情不闲聊 提交于 2020-03-02 00:11:31
一、字符串特性介绍 字符串是一个char的集合,而char是Unicode的代码,所以char可以转化为int。 字符串在参数传递时,为引用传递,可以使用空字符串("")。 字符串(string):实际是在内存的托管堆上用一个变量名对应的存储空间内存储数据实际存储位置的地址 string string_name=new string(char[])将一个字符串数组作为参数赋值给字符串变量 二、 字符串类型转换 可以用索引器来得到字符串中指定的字符,如: string myString="hello"; char myChars; myChars=myString[0]; 要想得到一个char数组可以用如下方法: char[] myChars = myString.ToCharArray(); 异同:char[]与string的不同之处在于char[]可以读写,而string只能读。 转为int int.parse(myString); 转为string 用基类提供能的Tostring,如: 123.Tostring(); 其他转化 Convert.To***( myString);如: Convert.ToInt32("123"); Convert.ToBoolean("123"); Convert.ToBoolean("false"); Convert是一个形式转换的类

C语言 :文件操作 -2

徘徊边缘 提交于 2020-03-01 23:22:51
C语言获取文件大小: #define _CRT_SECURE_NO_WARNINGS //去掉安全检查 #include<stdlib.h> #include<stdio.h> #include<string.h> char path1[100] = "C:\\Users\\whx\\Desktop\\test.txt"; //文本文件 char path2[100]= "C:\\Users\\whx\\Desktop\\SpaceSniffer.exe"; //二进制文件 char* ch1 = ".txt"; char* ch2 = ".exe"; int get_file_size(char* path); int get_file_type(char* path); void main() { int num1= get_file_size(path1); int num2 = get_file_size(path2); printf(".txt= %d ; .exe= %d \n",num1, num2); system("pause"); } //获取文件大小 int get_file_size(char* path) { int count = -1; FILE* fp=NULL; if (path == NULL) { return count; } int