C语言拾遗
鱼虾一整碗
网络安全服务器研发工程师
展开
-
C语言 字符串裁剪实现
#include<stdio.h>#include<string.h>int main(){char a[100]="hello my name is";char b[100]= {0};int i=0;for(i=0;i<strlen(a);i++){ if(a[i] == ' ') { printf("dddddddddddd...原创 2019-03-20 17:50:04 · 2853 阅读 · 0 评论 -
C语言中int与long int的区别
区别是它们的有效范围不一样。在turbo C中,系统为整型(int)数据分配两个字节,表示范围在-32768到32767之间。如果不在这个范围内就要使用长整型(long int)来表示了。在Visual C++中,系统为整型(int)数据分配四个字节,表示的范围在-2147483648到2147483647之间,因此在Visual C++中没有必要使用长整型,但便于规范和好记还是建议在需要原创 2016-12-12 11:49:13 · 8192 阅读 · 0 评论 -
僵尸进程的解决方法
当子进程执行失败时,可能不会发送个父进程结束的指令,因此会产生一个僵尸进程。解决方法如下:# include <stdio.h> # include <stdlib.h> # include <sys/types.h> # include <sys/wait.h> # include <unistd.h> int m...原创 2017-09-19 20:44:40 · 587 阅读 · 0 评论 -
C语言浅谈unsigned和siged
C语言中把数据分为两大类,即unsigned无符号和signed有符号对应的有符号数会比无符号数的最大值约小一半默认的数据类型都是有符号的,例如int=signed int long long = signed long long,但是对char类型还要看具体情况范围列表如下:signed char:[-2^7, 2^7)即[-128, 128);unsigned原创 2017-03-20 18:57:42 · 829 阅读 · 0 评论 -
C语言中字符串的几种定义方式
第1种:char a[5]="hello";第2种:char a[]="hello";第3种:char* a="hello";第4种:char a[10];gets(a);第5种:char* a[5]={"hello","nihao","good","ok","bye"};完!!原创 2017-03-20 17:55:01 · 65501 阅读 · 7 评论 -
Linuxc链接动态库
在linux下,C程序中引用动态库的方法:程序中引用:例子:#include //必须添加的头文件char *p = dlopen("./lib/test.so",RTLD_LAZY); //打开 p = dlerror(void);p = dlsym(void *handl原创 2016-12-21 12:21:24 · 319 阅读 · 0 评论 -
获取系统年份
int main(){struct tm *tmptr;time_t yearnow;time(&yearnow);int year1=0;tmptr=localtime(&yearnow);year1=tmptr->tm_year+1900;sprintf("%d",year1);}主要要加上1900完!原创 2017-09-22 11:49:16 · 351 阅读 · 0 评论 -
C 语言使用access函数 判断是否有该文件及权限
函数原型:int access(const char *path,int mode);参数说明:path:为路径和文件名mode:0 是否存在1 是否可执行2 是否可写4 是否可读返回值:可返回0 不可返回-1完!!原创 2017-09-22 16:02:04 · 572 阅读 · 0 评论 -
linux下使用valgrind对程序进行检查
今天在做snmpd的时候,程序连续运行40分钟左右出现错误,错误的原因是popen函数出错。怀疑是内存泄漏,所以使用valgrind对程序进行检查。发现是在某个popen时,内存没有被释放,因此次数多了,程序就出错了。简单说下valgrind的用法。先去官网下载源码包,安装valgrind。三部曲:./configure && make && make install转载 2017-09-23 18:59:17 · 819 阅读 · 1 评论 -
linux多文件编译—makefile
说到linux下多文件编译。大多是c语言,因为linux内核以及许多的自由软件都是c语言编写的。当然还有c++语言,区别就是c语言使用gcc,而c++语言使用g++。那么本文以c语言为例讲解。c++那么就能融汇贯通了将gcc改为g++就好了。1,单个文件的编译,比如有test.c 直接输入命令#gcc test.c -o test执行,直接输入#./t原创 2016-11-30 10:21:59 · 2399 阅读 · 0 评论 -
使用popen时,若最多执行100次而不pclose,将会出错
使用popen时,应记住使用完后一定要pclose();今天犯了一个错误,意思是for(i=0;i{popen(command,"r");}pclose();这样的话会被告知pclose失败,原因就是循环了1000次,让popen执行1000次(实际上执行到100次的时候就不再执行了)所以应该改为:for(i=0;i{popen(co原创 2017-09-22 11:58:45 · 2703 阅读 · 0 评论 -
C语言打印%
printf("您需要支付15%%的额外费用");在printf中,%%是用于输出%的完!!原创 2017-10-10 15:14:25 · 582 阅读 · 0 评论 -
linux 计算CPU使用率(C代码)
int getcpuutilization(char *cpuutilization){ int sum1[2]={0}; int sum2[2]={0}; int i=0; for(i=0;i if(i==1) { sleep(3); } FILE原创 2017-10-18 14:48:41 · 1579 阅读 · 0 评论 -
linux 僵尸进程defunct ps auxf
当我们在程序中使用popen或者fopen时,容易出现僵尸进程。原因可能是没有fclose或者pclose,或者其他原因。当我们ps auxf查看时,就能看到如下root 29587 0.0 0.0 117280 3580 ? S 18:02 0:00 /bin/snmpd -c /conf/snmpd.confroot 29622原创 2017-09-19 18:03:51 · 2121 阅读 · 0 评论 -
C语言中 scanf gets getchar 的区别
scanf:原型:scanf("格式化字符串",地址表);格式化字符说明%d 十进制 整数%o 八进制 %x 十六进制%f 浮点型%c 字符%s 字符串地址表可以是指针或者是一个地址特点:遇到回车 空格 tab键 会结束输入,结束后自动加'\0'gets: 原型:gets(指针或者地址)特点:获取一个字符串,能够接收空格和tab建,但遇到原创 2017-03-20 18:21:44 · 1748 阅读 · 0 评论 -
gcc详解
在网上查GCC命令方面的资料,发现两篇文章写得比较合我意,冲突不大,特放在一起学习,希望对我及大家有益。第一篇主要讲GCC原理,第二篇主要详解GCC命令的参数。第一篇文章:Linux GCC常用命令1简介2简单编译2.1预处理2.2编译为汇编代码(Compilation)2.3汇编(Assembly)2.4连接(Linking)3转载 2017-02-16 14:30:47 · 515 阅读 · 0 评论 -
C字符串截切函数strtok
#include<stdio.h>#include<string.h>int main(void){ char buf[]="aa bb cc dd"; char *temp1 = strtok(NULL," "); char *temp2 = strtok(NULL," "); char *temp3 = strtok(NULL,"...原创 2019-03-05 22:07:14 · 342 阅读 · 0 评论 -
C语言URL encode decode(url编码解码)
static unsigned char char_to_hex( unsigned char x ) { return (unsigned char)(x > 9 ? x + 55: x + 48); } static int is_alpha_number_char( unsigned char c ) { if ( (c >= 'a' && c &...转载 2019-03-05 22:02:00 · 1873 阅读 · 0 评论 -
C语言 判断一个字符串是否全为数字
#include<stdio.h>#include<string.h>int main(){ char a[]="1000023233d"; if(strspn(a, "0123456789")==strlen(a)) { printf("quan wei shu zi\n"); }else{ prin...转载 2019-03-01 18:32:21 · 14017 阅读 · 2 评论 -
C程序中打印文件名、函数名、行号
printf(“%s:%s:%s”,__FILE__,__FUNCTION__,__LINE__); 完!!原创 2019-02-23 17:45:01 · 1535 阅读 · 0 评论 -
C语言 对字符串中的字符串进行替换(函数)
将str中的oldstr替换成newstr,替换成的字符串存放于outstrint strrpc_weixindz15376_auth(char *str,char *outstr,char *oldstr,char *newstr){ char bstr[strlen(str)]; memset(bstr,0,sizeof(bstr)); int i=0; for(i = 0;i ...原创 2019-02-27 17:07:04 · 17702 阅读 · 0 评论 -
popen与system
popen与system都可在C语言代码中实现shell命令的执行。popen是不堵塞的,也就是说不会等待子进程的结束并杀死子进程,即不会管理进程。这样就需要我们认为的去杀死或忽略子进程等操作。还有就是popen会将执行的结果返回到buf中。system是堵塞的,会自动对进程进行管理,无需我们再去对进程进行管理。另外,system不会返回执行的结果,只是会返回执行是否成功。若想要获取s...原创 2018-10-29 11:10:47 · 3510 阅读 · 0 评论 -
linux环境下python调用C库
举例 输出“hello world”原创 2018-04-21 17:41:54 · 291 阅读 · 0 评论 -
Linux系统产生随机数 /dev/random和/dev/urandom
/dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流。很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流。这两个设备的差异在于:/dev/random的randompool依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,尝试读取的进程就会进入等待...原创 2018-04-16 15:06:19 · 5559 阅读 · 1 评论 -
gcc如何调试多线程程序
在gcc编译时加上-lpthread参数,用以连接到库文件。且加上-g参数,用以支持gdb调试。例如gcc test.c -o -g test -lpthread会得到可执行文件test而后使用gdb对可执行文件test进行调试gdb testb 行号 :设置断点clear 行号:清楚断点info 行号:查看断点run:进入到下一个断点(执行函数体)stpe:进原创 2018-03-31 18:56:14 · 1675 阅读 · 0 评论 -
进程间通信的共享内存机制
共享内存是系统为多个进程间通信所预留的一个内存块。进程访问这个内存块就如同访问进程所属内存一样,速度非常快。某个进程修改了这个内存块,其它进程会有所察觉。ftok函数创建IDshmget函数t获取内存块shmat函数映射内存块shmdt函数解除内存块shmctl控制释放此为简单介绍。后续会继续深入补充。完!原创 2018-03-31 18:50:05 · 289 阅读 · 1 评论 -
树的遍历
树的遍历也就是访问每一个节点。三种遍历方式,前序遍历,中序遍历,后序遍历。比如有一个树为 A B C前序遍历:先前序遍历左子树,再遍历根节点,最后遍历右子树。即BAC中序遍历:先访问根节点,再中序遍历右子树,最后中序遍历左子树。即ABC后序遍历:先后续遍历右子树,再后续遍历左子树,最后访问根节点。即CBA此为简单原创 2018-03-31 18:44:51 · 136 阅读 · 0 评论 -
大端序小端序
近日遇到大端小端的问题。特此来做个总结比如有一个数字,1234,那么12就是低位字符,34就是高位字符。大端:高位字符先存储,也就是高位低地址,低位高地址小端:低位字节先存储,也就是低位高地址,高位低地址 写一个C程序判断大端小端int main(int argc, char **argv) { int a = 0x12345678;原创 2018-03-31 18:37:13 · 166 阅读 · 0 评论 -
C 不可以直接对指针进行赋值!!!
C语言里 不可以对指针进行赋值!!!切记!!!完!原创 2017-09-27 17:50:34 · 6408 阅读 · 3 评论 -
C语言逐行读取文件
fp=fopen("./test.txt","r");while(fgets(buff,1000,fp)!=NULL){if(strlen(buff)==0){break;}printf("%s",buff);}完!!原创 2017-08-30 13:43:26 · 673 阅读 · 0 评论 -
将已经赋过值的数组置为空
char a[100]=“12122112”;memset(a,'\0',a);完!!原创 2017-08-29 10:26:28 · 3520 阅读 · 0 评论 -
C语言中使用goto语句
关于C语言是否该使用goto语句这里不再辩论。只讲讲goto语句的用法。不建议使用goto语句,但是遇到goto语句我们要知道是什么 意思。goto语句又叫无条件转移语句。先看一个例子:void main(){ int a=2,b=3; if(a goto aa; printf("hello"); aa:printf("s"); return 0;原创 2017-01-17 14:20:45 · 70374 阅读 · 5 评论 -
C语言QueryPerformanceFrequency和QueryPerformanceCounter的用法
类型:Win32API原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency); BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);作用:返回硬件支持的高精度计数器的频率。返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。注原创 2017-01-17 10:49:53 · 1613 阅读 · 0 评论 -
C语言中的LARGE_INTEGER
LARGE_INTEGER是一个union:用于表示一个有符号整数值。结构定义如下typedef union _LARGE_INTEGER{ struct{ DWORD LowPart, LONG HighPart }; LONGLONG QuadPart}LARGE_INTEGE原创 2017-01-17 10:13:25 · 2416 阅读 · 0 评论 -
C语言中#if 0 #if 1 #endif
这是一个预编译指令。作用是用来当注释。在C语言中,// 和 */都无法用来嵌套注释,例如/*啊啊啊/*嘿嘿嘿*/哈哈哈*/这样是不可以的此时我们就可以使用#if 0...#endif例如:/*啊啊啊#if 0嘿嘿嘿#endif哈哈哈*/这样就可以了!!当我们需要释放这一段注释原创 2017-01-17 09:50:24 · 400 阅读 · 0 评论 -
C语言位操作 & | ^ ~ << >>
位操作是指转化为二进制来操作例如十进制9转为二进制为00001001 十进制5转为二进制为00000101& 位与 两个都是1时为1,否则为0例子9&500001001&00000101=00000001| 位或 两个都是0时为0,否则为1例子9|500001001|00000101=00001101^ 位异原创 2017-01-16 16:40:26 · 526 阅读 · 0 评论 -
C语言 线程临界资源--critical section
简介:不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。每个线程中访问临界资源的那段程序称为临界区(Critical Section)(临界资源是一次仅允许一个线程使用的共享资源)。每次只准许一个线程进入临界区,进入后不允许其他线程进入。不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。多个线程中涉及到同一个临界资源的临界区称为相关临界区。线原创 2017-01-16 13:41:14 · 1447 阅读 · 0 评论 -
C语言的条件编译 #if #elif #endif #ifndef #define
有些程序在调试,兼容性,平台移植等情况下通过简单的设置一些参数就生成一个不同的软件。在不同的情况下可能只用到一部分代码,就没必要把所有的代码都写进去,就用到条件编译 。条件编译的方法:条件编译是通过预编译指令来实现的,主要方法有:第一种:即可设置不同的条件,在编译时编译不同的代码。C语言本身的表达式如逻辑运算,算数运算等都可以在这里使用。#if 条件1 代码段1#原创 2017-01-16 10:58:09 · 826 阅读 · 0 评论 -
linuxC系统编程——socket编程
例子:server端:#include#include//包含套接字函数库#include#include//包含AF——INET相关结构#include//包含AF——INET相关操作的函数#includeint main(){int server_sockfd,client_sockfd;//用于保存服务器和客户套接字标识符int server_len,cli原创 2017-01-05 11:13:34 · 285 阅读 · 0 评论 -
linuxC系统编程——线程管理
例子:#include#include#include#include#includevoid *thread_function(void *arg);char message[]="THREAD_TEST";int main(){int res;pthread_t a_thread;void *thread_result;res=pthread_creat原创 2017-01-05 10:32:33 · 295 阅读 · 0 评论