char函数

C/C++ typedef用法详解

和自甴很熟 提交于 2020-01-11 02:58:03
一、四个用途 1.用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。 比如: char* pa, pb; //这多数不符合我们的意图,它只声明了一个指向字符变量 //和一个字符变量; 以下则可行: typedef char* PCHAR; //一般用大写 PCHAR pa, pb; //可行,同时声明了啷个指向字符变量的指针 虽然: char *pa, *pb; 也可行,但相对于来说,没用用typedef的形式直观,尤其是需要大量指针的地方,typedef的方式更加省事。 2.用途二: 在旧的C的代码中,帮助struct。 以前的代码中,声明struct新对象是,必须带上struct,即形式为:struct 结构名 对象名,如: 1 struct tagPOINT1 2 { 3 int x; 4 int y; 5 }; 6 struct tagPOINT1 p1; 而在C++中,则可以直接写:结构名 对象名,即: tagPOINT1 p1; 估计某人觉得经常多写一个struct太麻烦了,于是就发明了: 1 typedef struct tagPOINT 2 { 3 int x; 4 int y; 5 }POINT; 6 POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候 或许,在C++中

数据降维(PCA、KPCA、PPCA)及C++实现

流过昼夜 提交于 2020-01-10 22:13:31
1、何为数据降维 1.1维数灾难:往往满足采样条件所需的样本数目巨大、样本稀疏、距离计算困难。 1.2降维:利用数学变换将原始高维属性空间转变为低维“子空间”,即在高维采样数据中提取能够表达原始数据的特征。 1.3 降维优点:数据集更易懂、使用和显示;降低算法计算开销;去除噪声。 2、一些降维算法 Principal Component Analysis (PCA) Linear Discriminant Analysis(LDA) Locally linear embedding(LLE) Laplacian Eigenmaps 本文主要针对以下三种算法: 2.1 PCA:PCA算法是一种线性投影技术,利用降维后使数据的方差最大原则保留尽可能多的信息; 2.2 KPCA:PCA仅考虑了数据的二阶统计信息,而没有利用高阶统计信息,忽略了数据的非线性相关性,而KPCA,通过非线性变换将数据映射到了高维,在高维空间中进行特征提取,获得了更好的特征提取性能; 2.3 PPCA:PCA没有将数据的概率分布考虑,PPCA对PCA做了概率上的解释,延伸了PCA算法。 总之:PPCA和KPCA都是针对PCA算法的缺陷,做出了不同方向上的改进。 3 PCA、KPCA、PPCA算法步骤 3.1 PCA: 数据在低维线性空间上的正交投影,这个线性空间被称为主子空间,使得投影数据的方差被最大化。

strcpy, strdup, strcat, strncpy, strndup

本小妞迷上赌 提交于 2020-01-10 12:32:26
http://hi.baidu.com/liuhuman/item/c862c932b272d020b3c0c532 char* strcpy (char* dst, const char* src); //如果dst的长度 小于或者等于 strlen(src)时, src多余的字符串仍然被复制,将覆盖原先存储于数组后面的内存空间的值。 char* strdup(const char* src); //这个函数包含了malloc和strcpy, 不用担心在strcpy中dst的长度问题 char* strcat(char* dst, cosnt char* src); // 需要保证dst的大小足至少是strlen(dst) + strlen(src) + 1,否则数组溢出。 char* strncpy(char* dst, const char* src, size_t len); // 它总是正好向dst写入len个字符。 如果strlen(src) 小于 len , dst数组就用额外的'\0'填充到len个长度。 如果strlen(src) 大于或者等于 len, 那么只有len个字符被复制到dst中。注意: 它的结果将不会以'\0'结束 char* strndup(const char* src, size_t len); //复制len个字符串,它比strcpy好在:

c语言中的string

百般思念 提交于 2020-01-10 12:28:24
1. strlen(char const* s);   函数传入的是c风格字符串(即以‘\0’结尾的字符数组),返回的长度为size_t(即unsigned int),其长度不包括'\0'。 2. strcpy(char* dest, char const* source);   dest:目标指针;   source:是源指针,传入的必须是c风格字符串或者字符数组。   返回值: dest指针   注意:1. 该函数会将包括'\0'在内的source全部拷贝到dest。如果char* source="abcd"; dest为char[],则dest应该定义为char[5];       2. src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。       3. C语言中不支持用赋值符号“=”直接将一个字符数组赋值给另一个字符数组。因为C语言不支持运算符重载。故而必须用strcpy操作。 3. strncpy(char* dest, char const* source, size_t n);   n代表可以指定字符个数进行赋值。   功能:将字符串source中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。要求:如果n > dest串长度

使用C语言获取linux系统相关信息

五迷三道 提交于 2020-01-10 10:47:07
最近在写shell的时候,涉及到了获取环境变量参数和本地计算机相关信息,包括计算机设备名,用户名的信息,在这里简单总结一下。 获取环境变量各项参数,可以直接使用getenv函数。man中关于getenv函数的声明如下: #include <stdlib.h> char *getenv(const char *name); 函数中,参数name 为环境变量的名称, 如果该变量存在则会返回指向该内容的指针. 环境变量的格式为name=value。执行成功则返回指向该内容的指针, 找不到符合的环境变量名称则返回NULL。 这里我使用环境变量获取用户名称和当前目录为例,首先我们知道在环境变量中,用户名保存在“LOGNAME”中,而当前目录保存在"PWD"中,所以函数调用应该为 getenv(“LOGNAME”) getenv(“PWD”); 所以,简单的测试程序就出来了,程序源码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int main(int argc,char **argv) 6 { 7 char *name; 8 char *path; 9 10 name = getenv("LOGNAME"); 11 path = getenv("PWD"); 12 13 printf(

字符串分割函数strtok(线程不安全),线程安全函数strtok_r

不想你离开。 提交于 2020-01-10 10:03:11
strtok_r函数---字符串分割函数 函数原型: char *strtok_r(char *str, const char *delim, char **saveptr); 参数: str:被分割的字符串,若str为NULL,则被分割的字符串为*saveptr delim:依据此字符串分割str saveptr:分割后剩余部分的字符串 返回值: 遇到第一个delim时,分割出的字符串,若没有遇到delim,则范围NULL 例程: int main(int argc,char* argv[]) { char str[1024] = "this is a test!"; char *token; char *saveptr; token = strtok_r(str, " ", &saveptr); printf("token:%s\n",token); printf("saveptr:%s\n\n\n",saveptr); token = strtok_r(saveptr, " ", &saveptr); printf("token:%s\n",token); printf("saveptr:%s\n",saveptr); return 0; } 结果: 3.strtok和strtok_r的源代码 这两个函数的实现,由众多的版本。我strtok_r来自于GNU C Library

C++中的显示类型转换

拥有回忆 提交于 2020-01-10 08:49:01
C++中显示转换也成为强制类型转换(cast),有四种:static_cast、dynamic_cast、const_cast、reinterpret_cast。命名的强制类型转换符号一般形式如下: cast_name<type>(expression); 以下分别介绍 一、static_cast 任何具有明确定义的类型转换,只要不包含底层const都可以使用static_cast。好吧这句话我不是很懂,换句话:编译器隐式执行的任何类型转换都可以由static_cast显示完成。也就是说,两类型之间可以发生隐式的转换,就可以用static_cast显示转换,有点意思。但要知道的是C++基本类型的指针之间不含有隐式转换(void*除外、const的有些也是可以的),需要 显示转换 。什么意思?如下: double d=3.14; int i=d; //编译器的隐式转换,等价于下面这条语句 int i=static_cast<int>(d); /*指针之间的转换*/ char str[]="good"; char *ptr=str; int *p=static_cast<int *>(ptr); //编译错误,两者之间的转换要显式,如下 int *p=(int *)(ptr); 仅当类型之间可隐式转换时(除类层次见的下行转换以外),static_cast的转换才是合法的,否则将出错。

Windows SDK编程 API入门系列(转)

与世无争的帅哥 提交于 2020-01-10 08:00:28
本文转载自: https://www.cnblogs.com/yjkai/archive/2011/11/11/2245568.html 作者:yjkai 转载请注明该声明。 之一 -那‘烦人’的Windows数据类型 原创文章,转载请注明作者及出处。 首发 http://blog.csdn.net/beyondcode http://www.cnblogs.com/beyond-code/ http://hi.baidu.com/beyondcode Baidu文章地址: http://hi.baidu.com/beyondcode/blog/item/09370f24526d6b6835a80f54.html CSDN文章地址: http://blog.csdn.net/beyondcode/archive/2009/03/23/4015769.aspx Hello Everybody This is beyondcode 大家好 再次自我介绍一下 我是beyondcode, 这次心血来潮, 计划着做一系列关于Windows API 编程的教程,用于帮助一些在Windows API编程上有疑惑的,纳闷的,迷惑的新手朋友们。 先解释一些术语或名词吧 SDK是Software Development Kit的简写,也就是软件开发包的意思,其中就包含了我们写程序要用到的一些头文件,库

深入理解按位异或运算符

让人想犯罪 __ 提交于 2020-01-10 04:01:05
深入理解按位异或运算符 参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。 即:    0^0 = 0, 1^0 = 1, 0^1 = 1, 1^1 = 0 按位异或的3个特点: (1) 0^0=0,0^1=1 0异或任何数=任何数 (2) 1^0=1,1^1=0 1异或任何数-任何数取反 (3) 任何数异或自己=把自己置0 按位异或的几个常见用途: (1) 使某些特定的位翻转 例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。       10100001^00000110 = 10100111 (2) 实现两个值的交换,而不必使用临时变量。 例如交换两个整数a=10100001,b=00000110的值,可通过下列语句实现:     a = a^b;   //a=10100111     b = b^a;   //b=10100001     a = a^b;   //a=00000110 (3) 在汇编语言中经常用于将变量置零: xor a,a (4) 快速判断两个值是否相等 举例1: 判断两个整数a,b是否相等,则可通过下列语句实现: return ((a ^ b) == 0) 举例2: Linux中最初的ipv6_addr_equal()函数的实现如下: static inline int ipv6_addr

进程间通信(一)

坚强是说给别人听的谎言 提交于 2020-01-10 03:40:06
进程间通信 一、进程间通信简介 1.进程间是相互独立的,每个进程都有自己的进程虚拟地址空间,二进程通讯需要介子,使得两个进程都能访问的公共资源; 2.进程间通讯的目的: 数据传输:一个进程需要将他的数据发送给另一个进程 资源共享:多个进程间共享同样的资源 通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件(如子进程退出时要通知父进程回收其资源等) 进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程所有陷入和异常,并能及时的知道他的改变状态 二、进程间通讯的发展及分类: 1.管道 匿名管道pipe 命名管道 2.System V进程间通讯 System V消息共享队列 System V共享内存 System V信号量 3.POSIX进程间通讯 消息队列 共享内存 信号量 互斥量 条件变量 读写锁 三、管道 1.什么是管道: 管道是内核中的一块内存 ,构成一个队列, 使用一对文件描述符来进行访问管理这个内存 ,读文件描述符相当于从这个内存中取数据,写文件描述符相当于往这块内存中写数据 2.匿名管道 匿名管道的创建 int pipe(int pipefd[2]); 功能:是创建一个无名管道; 参数:是两个输出型参数,fd表示文件描述符数组,其中fd[0]端表示读端,fd[1]端表示写端。 返回值:创建成功返回0;失败返回错误码。