C语言怎么读取3个字节的整型数据

 编写一程序P319.C实现以下功能
  有一存储很多商品数据的二进制文件sp36.dat,每件商品的属性先后包括:品名(17字节的字符串)、规格(12字节的字符串)、数量(3字节的整数)、单价(float实数)。从键盘输入某种商品的品名,要求在文件中查找有无相应品名商品(可能有多条记录或没有),若有则在屏幕上显示出相应的商品的品名、规格、数量、单价(显示时,品名、规格、数量、单价之间使用逗号(,)作分隔),若无则显示没有相应品名的商品。
  单击此处下载程序运行时测试用的商品数据文件sp36.dat并保存到程序P319.C所在的文件夹且文件名保持不变。编程可用素材:printf("Please input shang pin pin ming:")...、printf("\ncha zhao qing kuang:\n")...、printf("mei you shang pin :...。
  ▲ 提示:使用fread,sizeof(结构体)的方法肯定不对,应单项属性逐个fread!
  程序的运行效果应类似地如图1和图2所示,图1中的Please input shang pin pin ming:xuebi中的xuebi和图2中的Please input shang pin pin ming:kele中的kele是从键盘输入的内容。

这里怎么读取3个字节的整型数据啊?

2个回答

问题在于sp36.dat文件的规格不清楚,还不到提解决方案的时候。
硬要提解决方案的话,首先必须揣测一下sp36.dat文件的规格。

问:sp36.dat文件中,怎么存储“数量”这个“整数”的?

也就是说,要揣测一下,写文件时用的什么方法。

(1)如果是转化为字符串后写入文件的,即用的“格式化输出”办法:

{
    int shuliang = 17;
    fprintf(fp, "%03d", shuliang);
}

则分配一个至少4个字节的字符数组,依次读取三个字符,后面写个0构成标准的csz,然后atoi()即可:

{
    char szShuliang[4];
    fread(szShuliang, 1, 4, fp);
    szShuliang[3] = 0;
    int shuliang = atof(szShuliang);
}

(2)如果写文件时用的以下方式:

{
    int shuliang = 17;
    fwrite(&shuliang, 1, 3, fp);
}

则可以按以下方式读取:

{
    int shuliang;
    fread(&shuliang, 1, 3, fp);
}

一般不出以上两种方式,试一下吧。


当然,也可能设计者比较牛逼一点,在第一种方案的基础上,换用整数的十六进制表达;或者在第二种方案的基础上,规定用“大端”或“小端”编码以让数据文件的格式独立于硬件平台。这就需要揣测者多一番判断和处置了。总之,具体情况具体分析吧:-)

scanf("%3d",&shuju)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c语言中字节对齐求解??
在其中一篇文章中看到这样一段话: 比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据,如果变量在0x00000003地址上的话则要访问三次内存,第一次为char,第二次为short,第三次为char,然后组合得到整型数据。而如果变量在自然对齐位置上,则只要一次就可以取出数据。 问题:请问如果整型变量地址为:0x00000002,为什么访问内存第一次是从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short? 而如果整型变量在0x00000003地址上的话,则要访问三次内存,第一次为char,第二次为short,第三次为char??
求内存数据转整形的c算法
对内存32字节的数据,也就是256位,以5位分割,计算其整形数值,如11111计算为31, 直到计算到250既可以,一共计算出50个整形保存到数组中,32字节是随机的,在内存中 都是0或1.限C语言实现。
c语言中float到double形,是准确转换的吗?
因为了解到数据以%f输出数据的时候,会先把数据转换到double型再输出, 而之前了解到整形的低字节到高字节会有位扩展。 所以想问下,float到double的时候,是否也会像整形一样有位扩展,补0或补1的问题?
关于不读取 全部数据进内存的二分折半查找法的应用
编程语言用java 现在有一个字典数据文件,格式如下: <string1><0x00><int(4byte)><int(4byte)><string2><0x00><int(4byte)><int(4byte)>......... 就是一个单词+0x00 + int整形(4字节)+ int整形(4字节) 举例: a 0x00 0x00 0x00 0x00 0x0a 0x00 0x00 0x00 0x2d aba 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x35...... 字典按字母顺序已经排序。 如果把这些词全部读入内存,然后用二分折半查找其实很简单,现在问题是由于在手持设备上读取,不能全部读入内存再查找。如果不用二分法非常慢。 但是如果用了二分法,实时定位困扰我很久,一直无法解决。因为加入文件长20000,第一次定位在10000的位置,这个位置如果出现在string里面,那么继续往下读到0x00,就可以判断单词结束,继续往下读两个int即可。但是如果出现在int数据间,那就无法用0x00来作为分隔符了,因为int本身的四个byte就可能含0x00。z 这样我没法知道哪个位置开始是string。 如果用c,有个函数可以直接读byte,自动读取当前位置后面的string,但是java就没办法了。 数据文件结构不能更改,请教大家有没有什么巧妙的办法可以不读入内存直接二分法查询? 谢谢! [b]问题补充:[/b] 我自己也也用了索引法,我是这么建索引的: <string1><0x00><int(4byte)> 这里的int就是字典文件里string的offset,我是按头字母和每隔100个string采用一个作为索引,就是这样,索引文件还是有500kb,500kb对小型设备还是比较多。 我觉得肯定有更好的索引创建方法,比如先按第一个字母作索引,再按头两个字母做索引,不过还没想到怎么创建这个索引文件比较高效和尺寸小.
有一个关于用C语言编写流量控制的问题,请大神帮忙~
#include<stdio.h> #include<string.h> int main() { char str[31],temp[31]; //定义IP地址为32位的字符类型 int a,b,c,d; //定义IP地址的四个字节为a,b,c,d,并且均为整型的 printf("请输入IP地址"); while(gets(str) != NULL); { if(scanf(str,"%d.%d.%d.%d",&a,&b,&c,&d)==4 && a>=0 && a<=255 && b>=0 && b<=255 && c>=0 && c<=255 && d>=0 && d<=255) //IP地址每个字节的范围限制 { printf(temp,"%d.%d.%d.%d",a,b,c,d); if(strcmp(temp,str)==0) { printf("IP地址合法\n"); } else { printf("IP地址不合法\n"); } } else { printf("IP地址不合法\n"); } } return 0; } 在上面的基础上,我想加入一个流量控制的功能,请问怎么编写,请告知,谢谢!
C语言新手问题scanf函数将字符串指针用%c的格式输出结果是什么?
``` #include<stdio.h> int main(){ char *string="I love China"; printf("%c\n",string); return 0; } ``` 我用vs2005执行结果是“?” 上网查了,有一篇文章“作者:Lemon_jay 来源:CSDN 原文:https://blog.csdn.net/lemon_jay/article/details/82917000 ”,这篇文章意思是这是将字符串指针的值的十进制形式输出,但%c要求输出字符,将地址值转换为对应的字符输出,网上又有讲大于127的整型用%c输出要截取低位。 我的理解是:string类型是char *,占内存是四个字节,值是16进制数,我调试string是0x004157b8,十进制是4282296,那么是直接把0x004157b8去截取低位b8,还是把string先转十进制数4282296,变成整型常量,再用int存储,而整型存储又是以补码存放(当然这个正数补码就是原码),再截低位b 8? b8十进制是184,书上ASCII码值中有从0到127,这个184怎么办,为什么输出是“?”,网上好像讲标准ASCII 码也叫基础ASCII码,使用7 位二进制数,第1位二进制为0,而这里184二进制是10111000,第一位是1。 还有,我把上面的数十进制4282296以及把它加1加2(即4282297,4282298)这样输出, ``` #include<stdio.h> int main(){ char *string="I love China"; printf("%c\n",4282296); return 0; } ``` 结果都是“?” 这样是不是把这两个整型常量先用int存储,分别是0x004157b9和0x004157ba,再截取低位,即b9和ba,十进制为185,186,还是不在127范围内,二进制为10111001,10111010,第一位还是1,这是不是说截了低位也就是只有8位二进制数后第一位是1,输出都是“?”? 网上又有讲将300,400输出,也就是如下: ``` #include<stdio.h> int main(){ char *string="I love China"; printf("%c\n",4282296); return 0; } ``` 300结果是“,”,400结果是“?”,300二进制是100101100,400二进制是110010000,这个又是不是这样:300,400都是整型常量,都被内存以0000000100101100和0000000110010000存储,再截取低位,300为00101100,400为10010000,而00101100十进制为44,%c输出就是“,”,10010000第一位是1,输出就是就是“?”? 希望各位大神能详细指教,万分感谢·
问下大神定时器T0中断导致串口通信无法正常进行的问题。
这是我的代码,将之烧入51单片机时,串口通信本来是让led显示,但是可能由于红外遥控的中断函数干扰了串口通信,导致红外遥控工作正常,串口通信无法进行,led无法显示。 #include<reg51.h> #include<intrins.h> #include"lcd.h" #include"temp.h" #define uint unsigned int #define uchar unsigned char sbit moto=P1^0; uchar CNCHAR[6] = "摄氏度"; void LcdDisplay(int); void UsartConfiguration(); /******************************************************************************* * 函数名 : main * 函数功能 : 主函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void UsartConfiguration() { SCON=0X50; //设置为工作方式1 TMOD=0X20; //设置计数器工作方式2 PCON=0X80; //波特率加倍 TH1=0XF3; //计数器初始值设置,注意波特率是4800的 TL1=0XF3; //ES=1; //打开接收中断 //EA=1; //打开总中断 TR1=1; //打开计数器 } uchar time0; bit IRok;//33数据位处理完成标志位 bit handle_ok; uchar IRcode[4];//4个字节 uchar IRdata[33];//33位数据 void InitUART() //定时器初始化 { TMOD=0x02;//定时器重装初值 TH0=0; TL0=0; EA=1; EX0=1; TCON=0X01; ET0=1; TR0=1;//启动定时器 } void t0() interrupt 1 { time0++;//一次中断为277.76us } void int0() interrupt 0 { static uchar i; static bit flag; if(flag) { ES=0; if((time0<54)&&(time0>32)) i=0; IRdata[i]=time0; time0=0; i++; if(i==33) { i=0; IRok=1; } } else { time0=0; flag=1; } } void handle_data() { uchar i;//处理四个字节 uchar j;//处理八位 uchar k;//处理三十三个数据 k=1; for(i=0;i<4;i++) { for(j=0;j<8;j++) { if(IRdata[k]>5) IRcode[i]|=0x80; k++; if(j<7) IRcode[i]>>=1; } } handle_ok=1; } void work() { uchar j; j=0x01; switch (IRcode[2]) { case 0x0c:moto=0;break;//1 数字一按键停止(修改这里更改控制按键) case 0x18:moto=1;break;//2数字二按键启动 default:break; } } but() { while(1) { if(IRok) { handle_data(); IRok=0; } if(handle_ok)//如果处理完成处理遥控器相关程序 { work(); handle_ok=0; } } } void main() { InitUART(); UsartConfiguration(); LcdInit(); //初始化LCD1602 LcdWriteCom(0x88); //写地址 80表示初始地址 LcdWriteData('C'); while(1) { but(); LcdDisplay(Ds18b20ReadTemp()); } } /******************************************************************************* * 函数名 : LcdDisplay() * 函数功能 : LCD显示读取到的温度 * 输入 : v * 输出 : 无 *******************************************************************************/ void LcdDisplay(int temp) //lcd显示 { unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定义数组 float tp; if(temp< 0) //当温度值为负数 { LcdWriteCom(0x80); //写地址 80表示初始地址 SBUF='-';//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 LcdWriteData('-'); //显示负 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算由?.5,还是在小数点后面。 } else { LcdWriteCom(0x80); //写地址 80表示初始地址 LcdWriteData('+'); //显示正 SBUF='+';//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 } if(temp>=2900) { moto=1; //开启电机 } else { moto=0; //关闭电机 } datas[0] = temp / 10000; datas[1] = temp % 10000 / 1000; datas[2] = temp % 1000 / 100; datas[3] = temp % 100 / 10; datas[4] = temp % 10; LcdWriteCom(0x82); //写地址 80表示初始地址 LcdWriteData('0'+datas[0]); //百位 SBUF = '0'+datas[0];//将接收到的数据放入到发送寄存器 while (!TI) ; //等待发送数据完成 TI = 0; LcdWriteCom(0x83); //写地址 80表示初始地址 LcdWriteData('0'+datas[1]); //十位 SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x84); //写地址 80表示初始地址 LcdWriteData('0'+datas[2]); //个位 SBUF = '0'+datas[2];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x85); //写地址 80表示初始地址 LcdWriteData('.'); //显示 ‘.’ SBUF = '.';//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x86); //写地址 80表示初始地址 LcdWriteData('0'+datas[3]); //显示小数点 SBUF = '0'+datas[3];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x87); //写地址 80表示初始地址 LcdWriteData('0'+datas[4]); //显示小数点 SBUF = '0'+datas[4];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; for(i=0; i<6; i++) { SBUF = CNCHAR[i];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; } }
正在学51单片机,对串口通信SBUF数据传输方式不是很清楚。。
为了实现在串口调试助手上输入一个值(0~65535),接收处理后能够在动态数码管上显示。因为不清楚SBUF内的数据存储方式,所以无从下手,特来求解。网上已有的解释是SBUF每次只读一个字节,那么输入12345,它的读取方式是怎样的,希望大家能够给一些指导。 PS:重点是串口中断函数部分接收到的数据转变为整型数据类型的实现方法. 附上代码: ``` #include <reg51.h> typedef unsigned char u8; typedef unsigned int u16; u8 n=0; u8 disp[5]; u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值,共阴 sbit LSA=P2^2; //定义“三”管脚 sbit LSB=P2^3; sbit LSC=P2^4; void delay(u16 i) //延时函数,i=1时,大约延时10us { while(i--); } void DigDisplay() //动态扫描,逐个显示 { u8 i; for(i=0;i<5;i++) { switch(i) //位选,选择点亮的数码管 { case(0): LSA=0;LSB=0;LSC=0; break;//显示第0位 case(1): LSA=1;LSB=0;LSC=0; break;//显示第1位 case(2): LSA=0;LSB=1;LSC=0; break;//显示第2位 case(3): LSA=1;LSB=1;LSC=0; break;//显示第3位 case(4): LSA=0;LSB=0;LSC=1; break;//显示第4位 } P0=disp[i];//发送段码 delay(100);//单次扫描间隔 P0=0x00;//消隐 } } void UsartInit() { SCON=0x50; //设置为工作方式1 TMOD=0x20; //设置计数器工作方式2 PCON=0x80; //波特率加倍 TH1=0xF4; //计数器初始值设置,波特率为4800 TL1=0xF4; ES=1; //打开接收中断 EA=1; //打开总中断 TR1=1; //打开计数器 } void datapros() { disp[0]=smgduan[n/10000]; //万位 disp[1]=smgduan[n%10000/1000]; //千位 disp[2]=smgduan[n%10000%1000/100]; //百位 disp[3]=smgduan[n%10000%1000%100/10]; //十位 disp[4]=smgduan[n%10000%1000%100%10]; //个位 } void main() { UsartInit(); //串口初始化 while(1) { datapros(); //数据处理函数 DigDisplay(); } } void Usart() interrupt 4 //接收停止位的中间时,由内部硬件使RI置1,进入中断 { n=SBUF; //存储接收到的数据 RI=0; //清除接收中断标志位 } ```
Linux下网络编程read,write问题(C语言),求大神指点阿!!!
zuijzuj。最近学习socket编程的时候调试代码出现了一些问题,求大神们指导阿!!!我要实现的功能是客户端输入两个操作数和一个运算符,在服务端进行运算再把结果返回到客户端。现在的bug是客户端输入第一个操作数的时候没问题,输入运算符的时候客户端可以通过write函数写入但是服务端读出的结果不是输入的运算符,客户端输入第二个操作数的时候write函数无法写入,这是缓冲区满了吗?缓冲区大小不是由内核自己决定的吗?还是write和read函数调用不当?请大神们指正!这个问题困扰了我好多天了! 以下是客户端和服务端的代码,末尾是运行结果的截图。 客户端: #include <stdlib.h> #include <sys/types.h> #include <stdio.h> #include <sys/socket.h> #include <linux/in.h> #include <string.h> #include <errno.h> int main() { int cfd; /* 文件描述符 */ int recbytes; int sin_size; char result[1024]={0}; /* 接受缓冲区 */ struct sockaddr_in s_add,c_add; /* 存储服务端和本端的ip、端口等信息结构体 */ unsigned short portnum=2015; /* 服务端使用的通信端口,可以更改,需和服务端相同 */ int opnum1,opnum2; char op[2]; char opnum1s[3],opnum2s[3],temp[3]; char mutex[3] = "111"; printf("Hello,welcome to client !\r\n"); /* 建立socket 使用因特网,TCP流传输 */ cfd = socket(AF_INET, SOCK_STREAM, 0); if(-1 == cfd) { printf("socket fail ! \r\n"); return -1; } printf("socket ok !\r\n"); /* 构造服务器端的ip和端口信息,具体结构体可以查资料 */ bzero(&s_add,sizeof(struct sockaddr_in)); s_add.sin_family=AF_INET; s_add.sin_addr.s_addr= inet_addr("192.168.1.104"); /* ip转换为4字节整形,使用时需要根据服务端ip进行更改 */ s_add.sin_port=htons(portnum); printf("s_addr = %#x ,port : %#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port); /* 这里打印出的是小端 和我们平时看到的是相反的。 */ /* 客户端连接服务器,参数依次为socket文件描述符,地址信息,地址结构大小 */ if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr))) { printf("connect fail !\r\n"); return -1; } printf("connect ok !\r\n"); /*连接成功*/ //write op and opnumbers to server //write opnumber1 printf("Please enter the first number:"); scanf("%d", &opnum1); itoa(opnum1, opnum1s, 10);//itoa if (-1 == write (cfd, opnum1s,strlen(opnum1s))) { printf("write first number fail!\n"); return 0; } //write op printf("Please enter the op('+','-','*','/'): "); scanf("%s", &op); if (-1 == write (cfd, op ,strlen(op))) { printf("write op fail!\n"); return 0; } //write opnumber2 printf("Please enter the second number:"); scanf("%d", &opnum2); itoa(opnum2, opnum2s, 10); if (-1 == write (cfd, opnum2, strlen(opnum2s))) { printf("write second number fail!\n"); return 0; } else { printf("All has been writed!\n"); } //从服务端接收字符*/ if(-1 == (recbytes = read(cfd,result,5))) { printf("read data fail !\r\n"); return -1; } else printf("read ok\r\nREC:\r\n"); result[recbytes]='\0'; printf("The result is %s\r\n",result); getchar(); /* 此句为使程序暂停在此处,可以使用netstat查看当前的连接 */ close(cfd); /* 关闭连接,本次通信完成 */ return 0; } void itoa(int i,char*string) { int power,j; j=i; for(power=1;j>=10;j/=10) power*=10; for(;power>0;power/=10) { *string++='0'+i/power; i%=power; } *string='\0'; } ``` 服务端: #include <stdlib.h> #include <sys/types.h> #include <stdio.h> #include <sys/socket.h> #include <linux/in.h> #include <string.h> int main() { int sfp,nfp; /* 定义两个描述符 */ struct sockaddr_in s_add,c_add; int sin_size; unsigned short portnum=2015; /* 服务端使用端口 */ int res, opnum1, opnum2, opnumi; int i = 1; int opnum[3]; char op[2],ress; char opnums[3],opnumis[3],opnum1s[3],opnum2s[3],temp[3]; printf("Hello,welcome to my server !\r\n"); sfp = socket(AF_INET, SOCK_STREAM, 0); if(-1 == sfp) { printf("socket fail ! \r\n"); return -1; } printf("socket ok !\r\n"); /* 填充服务器端口地址信息,以便下面使用此地址和端口监听 */ bzero(&s_add,sizeof(struct sockaddr_in)); s_add.sin_family=AF_INET; s_add.sin_addr.s_addr=htonl(INADDR_ANY); /* 这里地址使用全0,即所有 */ s_add.sin_port=htons(portnum); /* 使用bind进行绑定端口 */ if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr))) { printf("bind fail !\r\n"); return -1; } printf("bind ok !\r\n"); /* 开始监听相应的端口 */ if(-1 == listen(sfp,5)) { printf("listen fail !\r\n"); return -1; } printf("listen ok!\r\n"); while(1) { sin_size = sizeof(struct sockaddr_in); /* accept服务端使用函数,调用时即进入阻塞状态,等待用户进行连接,在没有客户端进行连接时,程序停止在此处, 不会看到后面的打印,当有客户端进行连接时,程序马上执行一次,然后再次循环到此处继续等待。 此处accept的第二个参数用于获取客户端的端口和地址信息。 */ nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size); if(-1 == nfp) { printf("accept fail !\r\n"); return -1; } printf("accept ok!\r\nServer start get connect from %#x : %#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port)); //read from client while (i <= 4) { if (4 == i) { switch (op[1]) { case '+': res = opnum[1] + opnum[3];break; case '-': res = opnum[1] - opnum[3];break; case '*':res = opnum[1] * opnum[3];break; case '/': res = opnum[1] / opnum[3];break; default : printf("op error!\n"); } itoa(res, ress, 10); if(-1 == write(nfp,ress,strlen(ress))) { printf("write fail!\r\n"); return -1; } printf("write ok!\r\n"); } else { switch(i) { case 2: if ( -1 == read(nfp, op, 1)) { printf("read op fail!\n"); } printf("read op is:%d\n", op);break; case 1: case 3: if ( -1 == read(nfp, temp, 3)) { printf("read %d number fail!\n", i); } printf("read opnum%d is:%s\n", i ,temp); opnum[i] = atoi(temp);break; default : printf("error!\n"); } } i ++; } close(nfp); } close(sfp); return 0; } void itoa(int i,char*string) { int power,j; j=i; for(power=1;j>=10;j/=10) power*=10; for(;power>0;power/=10) { *string++='0'+i/power; i%=power; } *string='\0'; } ``` 客户端运行的情况: Hello,welcome to client ! socket ok ! s_addr = 0x6801a8c0 ,port : 0xdf07 connect ok ! Please enter the first number:123 Please enter the op('+','-','*','/'): + Please enter the second number:444 write second number fail! ![图片说明](https://img-ask.csdn.net/upload/201506/16/1434438899_561887.png) 服务端运行的情况: Hello,welcome to my server ! socket ok ! bind ok ! listen ok! accept ok! Server start get connect from 0xc0a80168 : 0xc42d read opnum1 is:123 read op is:-1074087721 read opnum3 is:123 op error! 段错误 (核心已转储) ![图片说明](https://img-ask.csdn.net/upload/201506/16/1434438921_326746.png)
动态规划入门到熟悉,看不懂来打我啊
持续更新。。。。。。 2.1斐波那契系列问题 2.2矩阵系列问题 2.3跳跃系列问题 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些变形选讲 2.1斐波那契系列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n&gt;=2,n∈N*)根据定义,前十项为1, 1, 2, 3...
程序员,职场上请远离这种人!
对有些职场人来讲,甩锅就是一种生存手段。01.从大学打篮球说起上大学的时候喜欢打篮球,然后我又特别喜欢抢篮板,经常是跳起来的时候没事,落下来的时候偶尔会踩到别人的脚上,于...
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
一个读研让我损失了一百万的真实故事
关注我!只要10分钟,包你学会数据分析 毕业后,应该就业还是考研? 我刚出国留学那会儿,就惊讶的发现,外国local95%都不会选择读研 他们说,硕士学费很贵,时间宝贵,老板不认,所以很费 当几乎所有人都是本科学历时,硕士学历反而像个异类 在老板眼里,三年硕士远远不如3年的工作经验实用 他们甚至专门为拒绝高学历者发明了一个词,叫overoccupie...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
shell脚本:备份数据库、代码上线
备份MySQL数据库 场景: 一台MySQL服务器,跑着5个数据库,在没有做主从的情况下,需要对这5个库进行备份 需求: 1)每天备份一次,需要备份所有的库 2)把备份数据存放到/data/backup/下 3)备份文件名称格式示例:dbname-2019-11-23.sql 4)需要对1天以前的所有sql文件压缩,格式为gzip 5)本地数据保留1周 6)需要把备份的数据同步到远程备份中心,假如...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手、代码自动提示、代码重构、代码版本管理(Git、SVN、Maven)、单元测试、代码分析等方面有着亮眼的发挥。IDEA 产于捷克,开发人员以严谨著称的东欧程序员为主。IDEA 分为社区版和付费版两个版本。 我呢,一直是 Eclipse 的忠实粉丝,差不多十年的老用户了。很早就接触到了 IDEA...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
为什么要推荐大家学习字节码?
配套视频: 为什么推荐大家学习Java字节码 https://www.bilibili.com/video/av77600176/ 一、背景 本文主要探讨:为什么要学习 JVM 字节码? 可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。 但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。 这里有个悖论,有时候你觉得有些技术没用恰恰是...
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。 三次握手 当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答: 首先很多人会先讲下握...
压测学习总结(1)——高并发性能指标:QPS、TPS、RT、吞吐量详解
一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。 二、TPS,每秒事务 TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一...
新程序员七宗罪
当我发表这篇文章《为什么每个工程师都应该开始考虑开发中的分析和编程技能呢?》时,我从未想到它会对读者产生如此积极的影响。那些想要开始探索编程和数据科学领域的人向我寻求建议;还有一些人问我下一篇文章的发布日期;还有许多人询问如何顺利过渡到这个职业。我非常鼓励大家继续分享我在这个旅程的经验,学习,成功和失败,以帮助尽可能多的人过渡到一个充满无数好处和机会的职业生涯。亲爱的读者,谢谢你。 -罗伯特。 ...
2019年Spring Boot面试都问了什么?快看看这22道面试题!
Spring Boot 面试题 1、什么是 Spring Boot? 2、Spring Boot 有哪些优点? 3、什么是 JavaConfig? 4、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? 5、Spring Boot 中的监视器是什么? 6、如何在 Spring Boot 中禁用 Actuator 端点安全性? 7、如何在自定义端口上运行 Sprin...
【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
字节跳动这家公司,应该是所有秋招的公司中,对算法最重视的一个了,每次面试基本都会让你手撕算法,今天这篇文章就记录下当时被问到的几个算法题,并且每个算法题我都详细着给出了最优解,下面再现当时的面试场景。看完一定让你有所收获 一、小牛试刀:有效括号 大部分情况下,面试官都会问一个不怎么难的问题,不过你千万别太开心,因为这道题往往可以拓展出更多有难度的问题,或者一道题看起来很简单,但是给出最优解,确实很...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
杭漂程序员2019的心路历程,还不起助学贷款,交不起房租,披荆斩棘终雨过天晴
一个杭漂2019的心酸历程,一路披荆斩棘终于还是雨过天晴。
我采访了同事,让他掏出了每天都会浏览的干货网站
前言只有光头才能变强。文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y在周六的晚上,我日常去到公司写文章。想写...
Java知识体系最强总结(2020版)
更新于2019-12-15 10:38:00 本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。 文章目录...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
春节不出门!这三款超好评编程游戏,好玩到停不下来
By 超神经场景描述:春节马上就要来临,在这个假期里,怎么能让自己放松,又不至于生疏了自己的老本行?不妨来玩一下编程向的小游戏吧,超神经在此整理了三款好玩有趣又有深度的游戏,快看看是不是...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
相关热词 c# id读写器 c#俄罗斯方块源码 c# linq原理 c# 装箱有什么用 c#集合 复制 c# 一个字符串分组 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图
立即提问