
C语言
文章平均质量分 57
L_YY
这个作者很懒,什么都没留下…
展开
-
char类型默认是signed还是unsigned
一直以来在Windows下使用VC编写C/C++程序,用到char类型时默认就认为是signed,没有显式添加过signed,只有在需要无符号类型时才显式加上unsigned。 最近在Android下编写一个C函数,这个函数有一个char类型的形参,本意是可以传递8位有符号数。测试发现每次传递负数进去返回值都不对,调试后发现自己想当然了 下次开发环境变了,要记得看看编译器默认ch转载 2018-01-18 17:00:57 · 6052 阅读 · 0 评论 -
C语言:枚举类型的使用详解
1. 枚举的定义枚举类型定义的一般形式为: enum 枚举名{ 枚举值表 };在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。例如: 该枚举名为weekday,枚举值共有7个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。2. 枚举变量的说明如同结构和联合一样,枚举变量也可用不同的方式说明,即先定转载 2016-12-21 22:10:33 · 1698 阅读 · 0 评论 -
易犯的错误:C指针指向内存空间的常量区
根据下面语句写出结果:char* s = “AAA”;printf(“%s”, s);s[0] = 'B';printf(“%s”, s);看到上面的短程序,或许我们会觉得显而易见,这里指针s指向了AAA,存放的是AAA的地址,所以第一个打印的结果为AAA,s[0]代表的是指向字符串AAA的首地址,所以会觉得第二个打印的结果就是BAA,即将第一个字符更改为了B。然而在将上面的程序原创 2016-12-15 21:53:34 · 408 阅读 · 0 评论 -
多线程的聊天室实现-服务器端
服务器端的主要功能: 实现多用户群体聊天功能(此程序最多设定为10人,可进行更改),每个人所发送的消息其他用户均可以收到。用户可以随意的加入或退出(推出以字符串“bye”实现),服务器也可以进行关闭。 服务器端的程序结构: 总共有三个函数:主函数(main),实现服务器端的初始化,接受连接;消息处理函数(rcv_snd),接受某一用户的消息,将其进行简单处理之后发送给其他所有的用户;退转载 2016-11-27 21:05:10 · 916 阅读 · 0 评论 -
编程中getchar()的灵活使用
getchar()在C程序中的功能是接收一个字符,当我们在连续输入字符的时候getchar()会给你意想不到的效果。下面是net小伙做的一些测试:首先看下面的这个程序:#include #include int main(void) { int a,b,c; printf("please input num a:\n"); scanf("%d",&a原创 2016-11-26 21:22:40 · 3081 阅读 · 0 评论 -
条件编译解析
这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为: #ifdef 标识符 程序段1 #else 程序段2转载 2016-11-25 20:54:18 · 290 阅读 · 0 评论 -
系统调用和库函数的区别
系统调用:是操作系统为用户态运行的进程和硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口,即就是设置在应用程序和硬件设备之间的一个接口层。可以说是操作系统留给用户程序的一个接口。一般地,操作系统为了考虑实现的难度和管理的方便,它只提供一少部分的系统调用,这些系统调用一般都是由C和汇编混合编写实现的,其接口用C来定义,而具体的实现则是汇编,这样的好处就是执行效率高,而且,极大的方便了上层调原创 2016-12-07 21:42:45 · 285 阅读 · 0 评论 -
联合体判断机器为大端字节序还是小端字节序
联合体union的存放顺序是所有成员都从低地址开始存放,而且所有成员共享存储空间#include union temp { short int a; char b; }temp;int main(){ temp.a = 0x1234; if( temp.b == 0x12 )//低字节存的是数据的高字节数据 { printf(原创 2016-12-13 21:04:55 · 987 阅读 · 0 评论 -
用联合体判断机器是大端字节序还是小端字节序
联合体union的存放顺序是所有成员都从低地址开始存放,而且所有成员共享存储空间#include union temp { short int a; char b; }temp;int main(){ temp.a = 0x1234; if( temp.b == 0x12 )//低字节存的是数据的高字节数据 { printf(原创 2016-12-13 20:58:50 · 711 阅读 · 0 评论 -
编程实现strstr子串函数
#include #include #include #define MAX_SIZE 512char* my_strstr(char *str,char *dest){ int len1 = strlen(dest); int len2 = strlen(str); char *temp = NULL; char *p = str; cha原创 2016-12-06 21:20:07 · 303 阅读 · 0 评论 -
BOOL,int,float,指针变量 与“零值”比较的if语句
以下摘自《林锐-高质量c++c编程指南》 /* ---------------------------------------------------------------------------- */ if语句是C++/C语言中最简单、最常用的语句,然而很多程序员用隐含错误的方式写if语句。本节以“与零值比较”为例,展开讨论。 4.3.1 布尔变量与零值比较转载 2016-12-05 21:03:46 · 1031 阅读 · 0 评论 -
unsigned和signed间的转换
1、#include int main(int argc, char *argv[]){ unsigned short a = -1; short b = a; printf("%d %d",a,b); return 0;}结果:65535 -1在计算机中,负数是以补码来存储的。htmlC语言中常量整数 -1的补码表示为0xFFF原创 2016-12-12 22:20:19 · 3019 阅读 · 0 评论 -
编程实现对输入的字符串进行逆序
方法一:用两个指针,一个指针指向字符串结尾,一个指针指向字符串首部,len代表字符串的长度,用折半的方式将头部指针和尾部指针的内容进行交换,每交换一次字符后头部指针自加,尾部指针自减。#include #include #define MAX_SIZE 512void reverse(char *str, int len){ int i; char temp;原创 2016-12-03 19:14:54 · 1818 阅读 · 0 评论 -
堆和栈的区别
简单的可以理解为: heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据原创 2016-12-23 21:30:51 · 243 阅读 · 0 评论 -
青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?下面我们有数学归纳法分析一下这个问题: 用Fib(n)表示青蛙跳上n阶台阶的跳法数,青蛙一次性跳上n阶台阶的跳法数1(n阶跳),设定Fib(0) = 1; 当n = 1 时, 只有一种跳法,即1阶跳:Fib(1) = 1; 当n原创 2016-12-18 19:47:04 · 362 阅读 · 0 评论 -
宏定义的使用及注意事项
我在写代码的时候喜欢使用宏,不仅使代码看起来整洁,而且用好了还能极大的减轻编码的工作量,但是如果使用不当的话,出了问题查找起来就就非常的难了,下面的总结大部分是从网上看到的,也有一些是我自己在工作中总结出来的。宏使用中的常见的基础问题1. 防止一个头文件被重复包含#ifndef BODYDEF_H #define BODYDEF_H //头文件内容#endif2转载 2018-01-21 10:24:19 · 3359 阅读 · 0 评论 -
删除数组中重复出现的字符并只留一个,构成新的数组
方法一:先对数组中的元素进行排序(这里为递增排序),再对重复的元素进行判断删除。代码如下:#includevoid delete(int *a){ int i; int j = 1; int len = sizeof(a)/sizeof(a[0]); for(i = 1; i < len; i++) { if(a[j - 1]原创 2017-03-07 19:58:58 · 2443 阅读 · 1 评论 -
sizeof和strlen的区别
(1)Sizeof是运算符,strlen是函数(2)Sizeof可以用类型做参数,strlen只能用char*做参数,且必须以“\0”结尾(3)数组做sizeof的参数不退化,做strlen参数退化为指针(4)大部分编译程序在编译的时候就把sizeof计算,strlen的结果要在运行的时候才能计算出来。(5)sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧,strlen原创 2017-01-16 12:24:06 · 311 阅读 · 0 评论 -
判断一个数是否为回文字符串
//判断一个数是否为回文字符串 #include int fun(char *str) { int len=strlen(str); int i; for(i=0;i<len;i++) { if(str[i]==(str[len-1])) len--; else原创 2016-12-20 21:51:31 · 326 阅读 · 0 评论 -
将字符串顺序翻转,如: I am转成:am I
#include #include void fanw( char *left,char *right ) //把每个单词单词翻转 { char* pleft = left; char* pright = right; char temp; while( pleft < pright ) { temp原创 2016-12-31 12:02:22 · 454 阅读 · 1 评论 -
new和malloc的区别
1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int num_bytes);说明:分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。1.2转载 2016-12-28 21:18:55 · 208 阅读 · 0 评论 -
递归判断递增数组
用递归算法判断数组是否为一个递增数组bool fun( int a[], int n ){if( n == 1 || n == 0 )return true;if( n ==2 )return a[n-1]>= a[n-2];return fun( a,n-1)&& ( a[n-1] >= a[n-2] );}原创 2017-01-04 22:04:14 · 482 阅读 · 0 评论 -
删除一字符串的出现的字符子串
例如:输入“awsakqabcwsabcee",重复字串为”abc",结果输出为:“awsakqwsee"#include #include #define MAX_SIZE 1024 char *filter(char *output,const char *input) { if((output == NULL) || (input == NUL原创 2016-12-27 19:42:21 · 516 阅读 · 0 评论 -
判断一个数是否是2的整数次方
对于判断一个数是否为2的N次方问题,通常想到的最为直接的办法就是对这个数不断对2取余,为0就将该数变为该数除以2,直到最后该数为1为止。void judge(int n){ while(!(n % 2)) { n = n / 2; if(n == 1) { printf("yes!\n);原创 2016-12-19 22:24:54 · 1293 阅读 · 0 评论 -
编程:实现对字符串进行循环右移,例如:输入abcdefgh,循环右移34位,输出ghabcdef
例如:输入abcdefgh,循环右移34位,输出ghabcdef#include #include #define MAX_SIZE 1024char *move(char *input,int n){ if(input == NULL) { return NULL; } int i; int len = strlen(in原创 2016-12-26 19:54:01 · 1641 阅读 · 0 评论 -
C语言位操作
位操作符1.位与&1、注意:位与符号是一个&,两个&&是逻辑与。2、真值表:1&0=0 1&1=1 0&0=0 0&1=03、从真值表可以看出:位与操作的特点是,只有1和1位于结果为1,其余全是0.4、位与和逻辑与的区别:位与时两个操作数是按照二进制位彼次对应位相与的,逻辑与是两个操作数作为整体来相与的。(举例:0xAA&0xF0=0xA0,0xAA && 0xF0原创 2016-12-24 22:16:23 · 619 阅读 · 0 评论 -
递归和尾递归
C语言中编译预处理的三种形式的命令:宏定义,文件包含,条件编译命令。1、宏定义主要是:#define,#undef如下:#define PI 3.1415926 /*不带参数的宏定义*/#define Max(a,b) a>b?a:b /*带参数的宏定义*/说明:宏定义在C语言与C++语言中是相通的。原创 2016-12-17 22:47:12 · 257 阅读 · 0 评论 -
移位操作符详解
位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。 移位时,移出的位数全部丢弃,移出的空位补入的数与左移还是右移花接木有关。如果是左移,则规定补入的数全部是0;如果是右移,还与被移位的数据是否带符号有关。若是不带符号数,则补入的数全部为0;若是带符号数,则补入的数全部原创 2016-11-20 14:27:21 · 2243 阅读 · 1 评论 -
编程实现蛇形输出
实现如下的蛇形输出:1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9 具体代码实现:#include #include int main(){int n;int x,y,round;//a[x][y],x是二维数组的第一个下标,y是二维数组的第二个下原创 2016-12-11 20:27:47 · 602 阅读 · 0 评论 -
编写一个程序,实现删除链表中倒数第k个节点(用单链表实现)
#include #include int count = 0;//计算链表长度 typedef struct node{ int num; struct node* next;}Node,*NODE; void init_head(NODE *head)//初始化头指针{ *head = NULL; return;} void se原创 2016-12-01 11:23:13 · 921 阅读 · 0 评论 -
sizeof:被人们误认为函数的关键字
sizeof其实是32个关键字中的一个,为了确定它是否为关键字,下面的例子可以给出证明。#include int main(){ int i = 0; int a; int b; int c; a = sizeof(int); b = sizeof(i); c = sizeof i; return 0;}在gcc原创 2016-09-23 17:07:38 · 1248 阅读 · 0 评论 -
编程实现strlen函数
一、函数说明:strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。头文件:#include 功能:计算给定字符串的长度格式:格式:strlen (字符数组名)返回值:返回s的长度,不包括结束符NULL。原创 2016-10-08 20:09:30 · 1604 阅读 · 0 评论 -
数据对齐
一、什么是数据对齐在当今计算机中,内存空间的划分都是按字节进行的。理论上,任何的数据类型的变量的访问可以从任意的地址开始,然而实际上在访问特定类型的变量时经常在特定的地址空间进行。各类型的数据在内存空间上按一定的规则进行排列而不是一个紧接一个排列,这就是所谓的数据对齐。二、访问数据地址访问数据的地址应满足一定的条件:能被该数据的长度所整除。例如:2字节的数据的地址应满足被2原创 2016-09-22 16:52:08 · 1042 阅读 · 0 评论 -
编程实现strcmp函数
strcmp原型:extern int strcmp(const char *s1,const char *s2);头文件:string.h功能:用于比较两个字符串s1、s2。① 若str1 = str2, 返回0;② 若str1 ③若str1 > str2, 返回正数。注意:strcmp(const char *s1,const char * s2)这里面只能比较字符原创 2016-09-18 16:30:03 · 1095 阅读 · 0 评论 -
C编程题:求阶乘的尾数零的个数
例:求100!的末尾的0的个数针对这类题目,我们往往会和之前求高次方数的尾数有同样的思路。先去求出100!的值,然后去判断0的个数,但这也犯了和之前一样的错误,原因是计算机能表示的整数的范围有限,根据平台的不同,整型数的取值范围也不同,取值范围不满足过大的数值计算。解决方法:一个整数每含有一个因子5则在求阶乘时必定会产生一个0,因此解决上面问题的方法是通过求阶乘的各个整数中的因子5的个数最原创 2016-09-17 12:04:54 · 2140 阅读 · 0 评论 -
C编程题:求高次方数的尾数
例:编写程序求出13的13次方的最后三位数。首先分析题意,我们可以定义两个变量用于存储次方底数和指数,再用一个for循环对底数进行指数次的自乘,最后截取最后三位数即可。然而这种方式却行不通,因为计算机的整数的表示范围有限(GCC编译器中int型为4个字节,范围为-65536~65535),故不能用13去进行13次自乘。解决方法:乘法规律中,乘积的最后几位的值仅仅跟乘数和被乘数的最后几位数字原创 2016-09-16 12:56:23 · 1978 阅读 · 1 评论 -
C语言的数据类型
一、C的数据类型1.什么是数据类型2.各数据类型的字节长度和指针变量的字节长度3.变量及变量的特点4.右左法则及举例5.sizeof()和strlen()一.C的数据类型1.什么是数据类型数据类型就是数据集合的划分,不同的数据类型对CPU具有不一样的意义,所以一定要注意相应变量数据类型的定义和转换。 数据类型又划分为两大类:基本数...原创 2016-07-11 10:24:44 · 889 阅读 · 0 评论 -
进程的虚拟地址空间分配概述
一、为什么进行内存空间的分配在任何程序设计环境及语言中,内存管理都十分重要。在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的。因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题。二、内存空间的分类和内存空间示意图栈区—由编译器自动分配释放,存放函数形参,局部变量和自动变量堆区—用于分配由mallloc、ralloc、calloc分配的空间数据区—该区又分为原创 2016-07-12 12:39:15 · 2775 阅读 · 0 评论 -
scanf()函数实现输入带有空格的字符串
我们用scanf()函数输入一个带空格的字符串时,经常会在第一个空格时就停止输入。下面有两种方法可以完整输入字符串1)利用strcat()函数来实现带空格字符串的输入,可以用字符串追加函数strcat()来连接每个单词。 Strcat()一般格式:char*strcat(char*dest,const char*src); 函数将字符串src连接到dest的尾端,并返回字符串de转载 2016-07-14 20:08:09 · 7515 阅读 · 0 评论 -
数组的遍历方法
一、什么是数组遍历数组的遍历就是就是对数组所有元素进行访问,根据需要对所需要的元素进行操作,例如在字符串数组中对字符串进行输出显示。二、数组的几种遍历方式及举例1、当我们定义某一类型的数组时,对应的数组名代表所对应数组的首元素的地址,对数组遍历时可以用数组名进行遍历,例如:(1)输入三个整数时 ①scanf("%d",a+i); ②scan原创 2016-07-19 16:35:59 · 3570 阅读 · 0 评论