char函数

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的执行

小知识杂记(知识点)

杀马特。学长 韩版系。学妹 提交于 2020-03-01 21:56:49
lower_bound() 函数lower_bound()在first和last中的 前闭后开 区间进行二分查找,返回大于或等于val的 第一个元素 位置。 调用lower_bound之前必须确定序列为有序序列,否则调用出错。 lower_bound(val): 返回容器中第一个值【大于或等于】val的元素的iterator位置。 upper_bound(val): 返回容器中第一个值【大于】val的元素的iterator位置。 对于有序数组a【n】,lower_bound(a,a+n,x)值为第一个 【大于或等于】x的元素在数组中的下标; hash 对于字符串sh【N】其hash值可以为 for(int i=0;i<n;i++)hash=hash*base+sh[i] //base是一个小质数 hash的初始值为0; 对于查找字符串sh2中包含几个字符串sh可以进行如下操作 for(int i=0;i<strlen(sh2);i++)hs[i+1]=hs[i]*base+sh2[i]; for(int i=0;i+strlen(sh)-1< strlen(sh2);i++ )if(hash==genth(i,i+strlen(sh)))ans++; //genth(int l,int r){return hs[r+1]-po[r-l+1]*hs[l];}//po[i

C++ 第3章 函数

非 Y 不嫁゛ 提交于 2020-03-01 21:01:07
3.1 函数的定义与使用 3.1.1 函数的定义 函数是面向对象程序设计中,对功能的抽象 类型标识符 函数名(形式参数表) { 语句序列 } 3.1.2 函数的调用 调用前先声明函数原型: 类型标识符 被调用函数名 (含类型说明的形参表); 调用形式 函数名(实参列表) 嵌套调用:函数可以嵌套调用,但不允许嵌套定义。 递归调用:函数直接或间接调用自身 例: #include <iostream> using namespace std; //计算x的n次方 double power (double x, int n); void main(void) { cout << "5 to the power 2 is "<< power(5,2) << endl; } double power (double x, int n) { double val = 1.0; while (n--) val = val*x; return(val); } 运行结果:5 to the power 2 is 25 由于函数power 的定义位于调用之后,所以需要先对函数原型加以声明。 例: 输入一个8位二进制数,将其转换为十进制数输出。1101 2 = 1(2 3 ) + 1(2 2 ) + 0(2 1 ) + 1(2 0 ) = 13 10 所以,如果输入1101,则应输出13 #include

扩展堆数组的大小

我与影子孤独终老i 提交于 2020-03-01 20:54:59
函数: void* realloc(void *ptr, size_t size); 功能: 函数将 ptr 对象的储存空间改变为给定的大小 size 。 参数 size 可以是任意大小,大于或小于原尺寸都可以。 返回值是指向新空间的指针,如果错误发生返回NULL。 扩展内存 1 int main() 2 { 3 const size_t pSize = 15; 4 5 char *p = new char[pSize]{0}; 6 strcpy_s(p, pSize, "I LOVE YOU"); 7 8 cout << "p:" << hex << (int)p << endl; 9 10 p = (char *)realloc(p, pSize * 2); 12 13 if (!p) 14 cerr << "Call realloc function error!" << endl; 15 16 17 cout << "p1:" << hex << (int)p << endl; 18 _snprintf_s(p, pSize * 2, pSize * 2, "Hello,%s C++!", p); 19 cout << p<< endl; 20 21 delete[]p; 22 23 getchar(); 24 return 0; 25 } 如果没有 p = (char *

指针 * 跟类型还是变量名

佐手、 提交于 2020-03-01 17:52:39
星号跟谁? 算是指针系列的一个番外篇, 星号到底跟谁? #include <stdio.h> int main() { char * greet = "Hello World"; printf("%s", greet); return 0; } 单看 greet 是 char* 类型, 表示 N 个 char , 我就是全部; 但看 *greet 是 char 类型, 但有 N 个, 我是第一个. 不同表达, 不同含义. 下面一个简单的函数可以区别. #include <stdio.h> int main() { printf("%c", *greet); printf("%s", greet); return 0; } 略概看了些开源框架, 规范的写法还是跟名字 char *greets . 来源: https://www.cnblogs.com/swyw/p/12390936.html

strlen&&sizeof

懵懂的女人 提交于 2020-03-01 17:40:59
sizeof 和 strlen 有以下区别:  sizeof 是一个操作符,strlen 是库函数。  sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为‘\ 0‘的字符串作参数。  编译器在编译时就计算出了 sizeof 的结果。而 strlen 函数必须在运行时才能计算出来。并且 sizeof 计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。  数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了。 int _tmain(int argc, _TCHAR* argv[]) { //strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0', // 如果你只定义没有给它赋初值,这个结果是不定的 // 它会从aa首地址一直找下去,直到遇到'\0'停止 //而sizeof()返回的是变量声明后所占的内存数,不是实际长度, //此外sizeof不是函数,仅仅是一个操作符,strlen是函数。 char aa[10]; std::cout << strlen(aa) << endl; //结果是不定的 char bb[10]={'\0'}; std::cout << strlen(bb) << endl; //结果为0 char cc[10] = "hui"; std:

C总结-part_2-数组&字符串

风流意气都作罢 提交于 2020-03-01 16:54:26
5_数组 & 字符串 数组 数组属于构造数据类型。 数组元素,可以是基本数据类型,也可以是构造类型; 空格 \t 换行 \n ——————————————————————————————————————————————— 数组的大小 int score[10]; sizeof(score); // 40,一个int为4B,10个占用40B sizeof(int); // 4 int length = sizeof(score)/sizeof(int); // 可以通过这种方式计算出数组长度 // 注意:即使数组越界,sizeof依然会返回一个正确的数组元素占用的大小值 // 例如,score[10000],下标越界,但是sizeof依然可以返回4 int len = sizeof(score)/sizeof(score[10000]); ——————————————————————————————————————————————— 数组初始化 int a[10] = {1,2,3,4,5,6,7,8,9,0}; int b[10] = {1,2,3}; // 前3个赋值,后7个全部为默认0; int a[10] = {0}; // 10个元素全部赋值为0 int a[] = {1,2,3,4,5};; // 未指定数组长度,只指定成员 int a[10] = {1}; //

C++ printf string.c_str() char[]

烈酒焚心 提交于 2020-03-01 14:00:59
以下代码错误,不能直接printf string。 int main ( ) { std :: string str1 = "test abc" ; printf ( "%s" , str1 ) ; } 正确代码应为: int main ( ) { std :: string str1 = "test abc" ; printf ( "%s" , str1 . c_str ( ) ) ; } printf输出字符串是针对char*或char[]的。即printf只能输出C语言中的内置数据,string不是c语言内置数据。 以上代码中str1是string类型的对象,并非单单只有字符串,其内还有许多用于操作的函数,于是&str1并非字符串“test abc”的首地址,而是str1这个对象的首地址。 但string类型的数据可以用cout直接输出: int main ( ) { std :: string str1 = "This is string." ; cout << str1 << endl ; } 对于char[]或char*定义的字符串可以直接printf。 如下代码正确: int main ( ) { char str1 [ ] = "123456" ; const char * str2 = "test" ; printf ( "%s\n" , str1 ) ;

g++功能还是很强大的

风流意气都作罢 提交于 2020-03-01 13:51:16
#include <iostream> using namespace std; int fuc(char *a) { cout << a << endl; } int main() { fuc("hello"); } inux 环境下当 GCC 版本比较高时,编译代码可能出现的问题 问题是这样产生的,先看这个函数原型: 1 void someFunc( char *someStr); 再看这个函数调用: 1 someFunc( "I'm a string!" ); 把这两个东西组合起来,用最新的g++编译一下就会得到标题中的警告。 为什么呢?原来 char *背后的含义是:给我个字符串,我要 修改 它。 而理论上,我们 传给函数的字面常量是没法被修改的 。 所以说,比较和理的办法是 把参数类型修改为 const char *。 这个类型说背后的含义是: 给我个字符串,我只要读取它。 来源: oschina 链接: https://my.oschina.net/u/128542/blog/500214