
C语言
pinkfIoyd
We don't need no education, we don't need no thought control.
展开
-
浮点数与零比较
int FloatCompareZero(float f){ if (f > 0.00000001) { return 1; } if (f < -0.00000001) { return -1; } return 0;}原创 2016-10-09 17:45:17 · 1339 阅读 · 0 评论 -
字符过滤
#include void filterchar(const char* src, char* dst){ const char* p; int ch; int flag[0xff] = {0}; int i; if (src == NULL || dst == NULL) return ; p = src; while (ch = *p++) {原创 2014-03-19 10:46:57 · 737 阅读 · 0 评论 -
获取整型数字某一位的值
int GetNumber(int opt_num,int pos){ int opt = opt_num < 0?-opt_num:opt_num; int res = 0; if(pos < 0) return -1; while(opt&&(pos-- >= 0)) { res = opt%10; opt /= 10; } return res原创 2014-01-23 10:50:08 · 2432 阅读 · 0 评论 -
判断是否是自守数
bool IsAutoMorphicNum(unsigned int num){ unsigned long long int pow = (unsigned long long int )num*num; while(num) { if(num%10 != pow%10) return false; num /= 10, pow/= 10; } ret原创 2014-01-14 10:06:58 · 4547 阅读 · 0 评论 -
C和C++中的结构体对比
在C语言中,结构体里的内容只能是const类型、普通变量或者结构体,而且不能被赋处置,即使是const类型的量。结构体中的所有成员对外都是可见的。像这样都是可以满足的typedef struct tagTest{ struct t { char ch; }; const int i; float f; enum tagDate { year,原创 2013-12-25 11:43:00 · 1040 阅读 · 0 评论 -
求1到n的正整数中某个字符出现的次数
我自己写了一个,但是效率很低,大整数的时候比较慢,代码如下:#include #include int CountOf1s(int n, char ch ){ int i = 1; int num = 0; int count = 0; int temp = 0; if(ch '9' || n < 1) return -1; num = ch -原创 2013-12-28 19:05:17 · 1735 阅读 · 1 评论 -
获取32位整型变量中某一位的bit值
#include typedef unsigned int UINT_32;typedef unsigned char UINT_8;UINT_8 GetBit(UINT_32 number,UINT_32 index){ if(index 31) return 0xff; //如果传入参数有问题,则返回0xff,表示异常 return (number>>i原创 2013-12-13 10:03:26 · 8225 阅读 · 0 评论 -
C陷阱与缺陷中的一个问题——signal函数声明的剖析
在《C陷阱与缺陷》这本书的第2.1节“理解函数声明”中,作者通过对函数声明的一步步分析、引导、深入,最后得到一个signal函数:但是,当我第一次看到的时候也觉得没法理解,看过好多遍之后还是没法理解。这几天看《C++Primer》,突然明白了,所以就赶紧记录下来。我记得以前我在优快云论坛上提过一个问题:请问signal函数如何调用?其实,如果理解了signal函数原创 2013-12-13 00:25:16 · 1199 阅读 · 0 评论 -
memcpy和memmove的区别
前几天面试,华为的一个技术人员问我一个问题:memcpy和memmove有什么区别?当时,我没回答上来。我只知道它们的入参和返回值是一样的,区别还不是很清楚,说不上来,我说可能效率不太一样吧。其实,这两个函数的效率几乎是一样的,区别只是在于内存重叠时,memcpy不能保证拷贝的正确,而memmove却能保证拷贝的正确性。换句话说,memcpy是memmove的子集,memmove更原创 2013-12-02 21:48:43 · 1343 阅读 · 0 评论 -
递归打印实数
#include void printOut(int n);int main(void){ int num; printf("请输入一个数字:\n"); scanf("%d",&num); printOut(num);}void printOut(int n) { /*该整数的中间数都以正数打出*/ if(abs(n) >= 10) { prin原创 2013-09-02 18:01:38 · 828 阅读 · 0 评论 -
引论中的问题【page1】
方法一:排序,返回第几个最大值,编码如下:#include //插入排序void insertion_sort(int array[], int first, int last);int main(void){ int arr[10] = {8,4,5,1,7,9,2,3,1,0}; int key = 0; int i = 0; printf("求第几个最大值?输入:\n")原创 2013-09-02 16:31:43 · 772 阅读 · 0 评论 -
貌似是微软编译器的一个Bug
有如下代码:#include int my_func(void){ /* float f = 0.0; */ return(0.0 ? 1 : 0);}int main(void){ printf("%s\n", ( my_func() ? "ONE" : "NIL") ); return 0;}在vc6.0和vs2010中运行,原创 2013-09-06 11:46:11 · 859 阅读 · 0 评论 -
判断一行输入是否是数字(包含小数点)
bool judgeInput( char* pnumber, size_t length){ unsigned int i = 0; unsigned char isdot = false; //СÊýµã±ê¼Ç //ÅжϷǷ¨ÊäÈë for (i = 0;i < length; i++) { if (*(pnumber+i) '9') {//²»ÊÇÊý×Ö原创 2013-08-30 11:16:07 · 1162 阅读 · 0 评论 -
C语言实现不定结构体
先看一段代码:#include #include #include typedef struct { int num; char name[10];}A;typedef struct{ int a; float b; void* c;}TEST;int main(void){ TEST t = {0}; t.c = (A*)malloc(sizeof(A原创 2013-07-12 14:10:20 · 1801 阅读 · 0 评论 -
输入年月日,求该年年初到此时的天数
#include unsigned char leapyear(int year){ if((year % 400 == 0) || (year % 4 == 0) && (year % 100 != 0)) return 1; return 0;}unsigned char checkvalid(int year, int month, int day)原创 2014-04-15 15:23:34 · 1185 阅读 · 0 评论 -
字符过滤【二】有顺序的过滤重复字符
#include typedef struct tagFilterChar{ int ch; int n;}FilterChar;void insert_sort(FilterChar* arr,int n) { int i,j; FilterChar temp = {0}; for(i = 1;i < n; i++) { tem原创 2014-03-20 16:59:31 · 803 阅读 · 0 评论 -
通过子网掩码判断两个IP是否在同一网段
#include #include #include unsigned char checkipv4seg(int seg){ if (seg 255) return 0; return 1;}unsigned char checkvalid(const char* ipv4){ int seg1,seg2,seg3,seg4; int原创 2014-04-17 18:23:02 · 2704 阅读 · 0 评论 -
折半查找递归和非递归实现
//递归int BinarySearch(int arr[],int n,int left, int right){ if (left <= right) { int middle = left + (right - left)/2; //防溢出 if (n == arr[middle]) { return middle; } else i原创 2016-08-19 18:16:32 · 855 阅读 · 0 评论 -
单链表的创建、插入、删除、销毁以及查找中间结点
#include #include #include //链表结构typedef struct _tagLinkList { int num; //数值 struct _tagLinkList *next; //链表下一个结点}LinkList,*PLINK;//初始化链表bool init_list(PLINK* head){ PLINK pLink = NUL原创 2016-07-12 21:54:49 · 1580 阅读 · 0 评论 -
交换两个字符串内容
#include static void swap_string(char **p1, char **p2){ char *tmp = NULL; tmp = *p1; *p1 = *p2; *p2 = tmp;}static void swap_strings(char *src[][2],unsigned int row){ unsigned int i = 0;原创 2015-06-16 13:05:15 · 3739 阅读 · 0 评论 -
判断是否含有子串
#include #include unsigned char is_sub_array(int arr[],int arr_len,int subarr[],int subarr_len);unsigned char is_sub_array1(int arr[],int arr_len,int subarr[],int subarr_len);int main(){原创 2014-12-04 16:33:04 · 907 阅读 · 0 评论 -
获取bcd码的长度
unsigned int get_bcd_length(const unsigned char* bcd){ unsigned int length = 0; while (((*bcd&0xf0) != 0xf0) && ((*bcd&0x0f) != 0x0f)) { length += 2; ++bcd; } if (*bcd == 0xff)原创 2014-10-24 13:38:31 · 1422 阅读 · 0 评论 -
双链表基本操作
#include #include #include #define DNODE_SIZE sizeof(DNode)typedef struct _tagDNode{ int value; struct _tagDNode *prov; struct _tagDNode *next;}DNode;DNode* create_double_lin原创 2014-06-17 16:29:00 · 741 阅读 · 0 评论 -
自己写的单链表操作
#include #include #include #define NODE_SIZE sizeof(Node)typedef struct _tagNode{ int value; struct _tagNode *next;}Node;Node* createlink(Node *cur){ Node* pn = NULL; pn原创 2014-06-16 17:19:27 · 737 阅读 · 0 评论 -
根据结构体某个成员的地址求出结构体所有成员的值
思路:根据结构体部分成员的值,求出该结构体的首地址,从而求出所有成员的值。下面是一个结构体的内存模型低地址 ——> 高地址|_________|______|______|_____________|首地址 成员1 成员2 成员3 …… 末地址 根据内存模型,思考:如果可以求出某个成员的地址,再求出该成员离首地址原创 2014-06-04 18:02:45 · 1745 阅读 · 0 评论 -
获取一个整型数组前三个最大的值
没有用堆排序,遍历一次就够了原创 2014-04-09 19:46:23 · 3308 阅读 · 0 评论 -
通过void指针实现跨类型变量交换函数
#include #include #include void fun(void **src,void **dst){ void *tmp; tmp = *src; *src = *dst; *dst = tmp;}void swap(void *src,void *dst,int size){ void *tmp = malloc(size);原创 2014-03-27 09:18:11 · 1492 阅读 · 0 评论 -
获取一个整型的每八位
#include typedef union tagTestEndian{ char ch; int n;}TestEndian;int main(){ int ip = 0x12345678; TestEndian t; t.n = 1; if (t.ch) {//大端 printf("%x %x %x %x\n",((uns原创 2014-04-04 18:22:52 · 1219 阅读 · 0 评论 -
获取一个子字符串第一次出现的位置
int substr(const char *src,const char *substr){ const char *p1,*p2; if (src == NULL || substr == NULL) { return -1; } p1 = src; while (*p1) { p2 = substr; if (*p1 != *p2原创 2014-04-04 17:10:58 · 2196 阅读 · 0 评论 -
异或巧解筷子问题
经常会遇到这样的题目:原创 2014-04-19 09:57:23 · 1530 阅读 · 0 评论 -
从键盘输入任意个数字,以0为结尾,输出其中最大值
很简约的一段代码#include #include int main() { int a = INT_MIN; int Max; for (Max = a; a; scanf("%d",&a)) { if(a > Max) Max = a; } printf("Max number is:%d\n",Max); return原创 2014-04-01 17:27:06 · 5259 阅读 · 0 评论 -
C语言实现定时器
在实际开发过程中,很多事情需要用到定时器。C语言也可以实现定时器的功能,例如下面代码:#include #include #include #ifndef CLOCKS_PER_SEC#define CLOCKS_PER_SEC 1000#endifvoid main( void ){ clock_t start; long count = 1; start = clo原创 2013-07-10 15:09:28 · 11700 阅读 · 2 评论 -
一个c语言题目
题意::把手放在键盘上时,稍不注意就会往右错一位。这样的话,Q会变成W,J会变成K等。输入一个错位后敲出的字符串,输出打字员本来想打出的句子。这是昨天下午在网上看到的一道题。其实,这道题很简单,找一个字母的对应数组就可以了。用‘0’来补位,因为aqz是不可能输入的。引用Linus的那句名言:Talk is cheap. Show me the code。呵呵#include in原创 2013-07-10 09:52:03 · 1263 阅读 · 0 评论 -
memmove的用法
原型:void *memmove( void* dest, const void* src, size_tcount );头文件:功能:由src所指内存区域复制count个字节到dest所指内存区域。说明:src和dest所指内存区域可以重叠,但复制后dest内容会被更改。函数返回指向dest的指针。相关函数:memset,memcpy。#include #include原创 2013-01-12 20:32:13 · 4616 阅读 · 0 评论 -
bcdncmp函数的实现
#include typedef unsigned char uint8;uint8 MMICL_BCDncmp(const uint8* src, const uint8* dst,const uint8 n,int isbig){ uint8 srcHigh = 0,srcLow = 0,dstHigh = 0,dstLow = 0,iTemp = 0; for(iTemp = 0原创 2013-01-28 15:37:47 · 625 阅读 · 0 评论 -
两串BCD码的对比
#include typedef unsigned char uint8;uint8 bcdcmp(const uint8 *src, const uint8 *dst, int isbig){ uint8 srcHigh = 0,srcLow = 0,dstHigh = 0,dstLow = 0; while (*src != 0xff && *dst != 0xff && *dst原创 2013-01-28 11:29:06 · 919 阅读 · 0 评论 -
二级指针的用法
#include void fun(char** p);int main(void){ char* localnum[] = {"2","3","4","5","6","7","8","95","13","14","15","18"}; int i = 0; int temp = 0; fun(localnum); return 0;}void fun(char** p)原创 2013-01-10 21:42:44 · 641 阅读 · 0 评论 -
关于预编译的两种用法
在写代码时,我们经常会进行预编译处理,对于不同的情况执行不同的代码。例一:#ifdef TEST if (A(x)) 代码段1; else { 代码段2; }#else 代码段2;#endif可以改为#ifdef TEST if (A(x)) 代码段1; else#endif { 代码段2; }例二:#ifdef TEST if原创 2013-01-09 08:41:34 · 936 阅读 · 0 评论 -
关于sprintf函数——两个格式输出问题
在函数处理中,经常会遇到将int 类型的时间转换成char*类型并输出。例如:2013.1.5,要输出“2013.01.05”。其中,年月日都是int型变量。这类问题,可用sprintf函数进行处理sprintf((char*)monthtime,"%d/%02d/%02d",(uint16)tyear,(uint8)tmonth,(uint8)tday);在函数处理中,经常会遇到将int类型原创 2013-01-05 17:32:02 · 2554 阅读 · 0 评论 -
关于函数栈溢出问题
如果你觉得定义变量肯定不会引错误,那么我只能说你是一个编程新手。在程序中,每一个函数的执行都会放在一个栈中,而栈又是有大小的,当一个函数的数据超过这个栈容量就会发生溢出,因而就会发生定义变量还会出错的情况,很隐秘吧?但如果你真的需要很大容量的数组怎么办?有两种解决方案。第一种是动态分配,第二种是全局变量。动态分配当然是最好的,随时用,随时释放。全局变量用起来简单,但释放内存不那么积极,所以,对原创 2013-01-05 11:14:12 · 1308 阅读 · 0 评论