C语言标准库函数原型设计

最近试着自己实现一些C库中的函数,于是参考了标准库(我用的是mingw)头文件中的函数声明,发现自己对标准库中函数原型设计存在一些不解的地方。
例如,在string.h中,有如下声明:
1. char* strchr(const char*, int);
该函数是在一个字符串中查找字符首次出现的位置,那么第二个参数为什么是int类型而不是char类型?
2. void* memset(void*, int, size_t);
memset是逐字节操作的,理论上第二个参数设为char类型就足够了,那么函数第二个参数为什么要设置为int类型?

库作者的基本考虑是什么?

1个回答

这都是 有历史原因的 你自己实现 就没必要 一定和标准库一样 怎么合理 怎么来

hijack00
hijack00 标准库中有些函数原型设计是设计者别有用心的,例如getchar返回int而不是char,是为了考虑EOF的情况;再如strcpy等函数返回一个指针是为了实现链式调用,等等。我比较感兴趣的是对于上面那两个函数,库作者的设计初衷是什么,所以发出来和大家一起讨论讨论
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
这是一个关于C语言函数库函数的问题
各位大佬,我觉得C语言的函数库函数,它们的名字都是英语拼起来的。 比如 <stdio.h>是stand in and out 我想问下memset,memcpy,strcpy,strcpm,这几个函数的英语原型是什么呢?
函数原型与函数首行与函数声明三者的区别与联系
为什么谭浩强的书上前面说,函数首行称为函数原型,而后面说函数声明是函数原型?函数原型到底指的是什么?另外,函数原型中包含函数的存储类别吗?
【问题描述】 本题要求实现一个拆分实数的整数与小数部分的简单函数。在main里完成数据读取和结果输出。 函数原型为 void splitfloat( float x, int *intpart, float *fracpart );
【问题描述】 本题要求实现一个拆分实数的整数与小数部分的简单函数。在main里完成数据读取和结果输出。 函数原型为 void splitfloat( float x, int *intpart, float *fracpart );
**删除C程序中的注释(请你编写一个函数,将C语言源程序中的注释全部删去。)
请你编写一个函数,将C语言源程序中的注释全部删去。 函数原型 // 删除注释 void Pack(FILE *src, FILE *dst); 说明:参数 src 和 dst 均为文件指针,其中:src 指示原始程序文件,dst 指示整理后得到的文件。 C语言规定:注释以 /* 开始,以 */ 结束。注释可以跨行,不允许嵌套。字符串中的 /* 和 */ 不是注释。 此外C语言还规定:注释相当于一个空白字符。因此,注释被删除后应补入一个空格。 裁判程序 #include <stdio.h> #include <ctype.h> #include <string.h> // 删除注释 void Pack(FILE *src, FILE *dst); int main() { char sname[1024], dname[1024]; FILE *sfile, *dfile; gets(sname); gets(dname); sfile = fopen(sname, "rb"); if (!sfile) { printf("%s 无法打开!\n", sfile); } dfile = fopen(dname, "wb"); if (!dfile) { printf("%s 无法打开!\n", dfile); } if (sfile && dfile) { printf("正在整理..."); Pack(sfile, dfile); puts("整理完成!"); } if (sfile) { fclose(sfile); } if (dfile) { fclose(dfile); } return 0; } /* 你提交的代码将被嵌在这里 */
【问题描述】编写函数f,功能是用递归的方法求n!,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出n!并在主函数中输出。
#include <stdio.h> long long int f(int n) { int i; long long int m=1; for(i=1;i<=n;i++) m=m*i; return m; } int main(int argc, char *argv[]) { int a; scanf("%d",&a); printf("%d!=%lld",a,f(a)); return 0; } ![图片说明](https://img-ask.csdn.net/upload/201912/21/1576916227_297321.png) 求大佬帮助寻找错误
编写函数,判断该数组中哪些是素数,并统计素数的个数,在主函数中输出素数的个数和这些素数,函数原型不能变,怎么我一直输出不来,求大神指教!?
#include<stdio.h> int len ; int IsPrime(int *data, int *primes,int len) { int y=1; for (int j = 0; j < 5; j++)/*判断素数*/ { for (int i = 2; i < data[j]; i++) { y *= data[j] % i; } if (y != 0) { primes = &data[j]; len++; primes++; } } /*for (int i = 0; i < len; i++) printf("%3d\n", *--primes);*/ return len; } void main() { int data[5], *primes, primes_[5] = {1,2,3,4,5}, len = 0; primes = primes_; for (int i = 0; i < 5; i++) { scanf("%3d", &data[i]); } printf("共有%d个素数", len = IsPrime(data, primes, 0)); printf("这些素数分别为:\n"); for(int i=0;i<len;i++) printf("%3d\n", primes_[len]); }
c语言strncpy函数的使用
在visual stdio2013中不能使用strncpy函数,说是应该用strcpy_s ``` strncpy_s(&q_StrGameBack[q_arrSanke[i][0]][q_arrSanke[i][1]],&m, 2); ``` 可是我调用的时候总是提示调用参数太少 查了下函数原型是 ``` strncpy_s(_Out_writes_z_(_SizeInBytes) char * _Dst, _In_ rsize_t _SizeInBytes, _In_reads_or_z_(_MaxCount) const char * _Src, _In_ rsize_t _MaxCount); ``` 我应该是缺少了_In_ rsize_t _SizeInBytes这个参数,可是这个参数该怎么填啊 求哪位大神给我解答下,谢谢了
C语言函数间用指针调用数值的问题
函数原型是这样的 void f(int * u); main里有这么一句 f(&x); 相当于是把变量x的地址传递给f(),没错吧,那问题来了,被赋值的是 * u还是u? 答案自然是u 我是这样想的, * u 作为一个int整体是f()的形式参数,那就将地址以int储存,那u岂不是这个地址的地址?到底哪里理解错误了?
C语言数学函数拟合(最小二乘法)
参数说明: double Step_A, // A参数步长 double Step_B, // B参数步长 double Step_C, // C参数步长 double Range_A_Down, // A参数取值下限 double Range_B_Down, // B参数取值下限 double Range_C_Down, // C参数取值下限 double Range_A_Up, // A参数取值上限 double Range_B_Up, // B参数取值上限 double Range_C_Up, // C参数取值上限 double Sigma_Down // Sigma容忍值下限 最小二乘法函数: int Sigma_Converge_Func( double Step_A, double Step_B, double Step_C, double Range_A_Down, double Range_B_Down, double Range_C_Down, double Range_A_Up, double Range_B_Up, double Range_C_Up, double Sigma_Down) { for(A=Range_A_Down;A < Range_A_Up;A += Step_A) // 第一层循环,扫描A参数 { for(B=Range_B_Down;B < Range_B_Up;B += Step_B) // 第二层循环,扫描B参数 { for(C=Range_C_Down;C < Range_C_Up;C += Step_C) // 第三层循环,扫描C参数 { Sigma = 0; for(int i=0;i<PtsNum;i++) { y0[i] = A*x[i]*x[i]+B*x[i]+C; y1[i] = (y[i]-y0[i])*(y[i]-y0[i]); Sigma += y1[i]; } if(Sigma < Sigma_Buff) { Sigma_Buff = Sigma; if(Sigma <= Sigma_Down) { return 1; } } else { } } } } return 0; } 下面是三级优化: // 第一轮优化,大步长,大范围,进行快速扫描,缩小范围 Sigma_Converge_Func( Step_A0, Step_B0, Step_C0, Range_A_Down0, Range_B_Down0, Range_C_Down0, Range_A_Up0, Range_B_Up0, Range_C_Up0, Sigma_Down0 ); // 第二轮优化,范围适当缩小,-100~+100,步长缩小为1,快速扫描,进一步缩小范围 Range_A_Down0 = A - 100; Range_A_Up0 = A + 100; Range_B_Down0 = B - 100; Range_B_Up0 = B + 100; Range_C_Down0 = C - 100; Range_C_Up0 = C + 100; Step_A0 = 1; Step_B0 = 1; Step_C0 = 1; Sigma_Down0 = 1000; Sigma_Converge_Func( Step_A0, Step_B0, Step_C0, Range_A_Down0, Range_B_Down0, Range_C_Down0, Range_A_Up0, Range_B_Up0, Range_C_Up0, Sigma_Down0 ); // 第三轮优化,范围十分小,步长为0.1,逐步扫描,直至Sigma趋近于0,暂定为小于1e-9即可 Range_A_Down0 = A - 1; Range_A_Up0 = A + 1; Range_B_Down0 = B - 10; Range_B_Up0 = B + 10; Range_C_Down0 = C - 10; Range_C_Up0 = C + 10; Step_A0 = 0.1; Step_B0 = 0.1; Step_C0 = 0.1; Sigma_Down0 = 1e-9; if (true == Sigma_Converge_Func( Step_A0, //若Sigma_Converge_Func()的返回值为1,即Sigma<Sigma_Down0,此时的参数最适合 Step_B0, Step_C0, Range_A_Down0, Range_B_Down0, Range_C_Down0, Range_A_Up0, Range_B_Up0, Range_C_Up0, Sigma_Down0 )) 思路和问题:(题目:通过10个已知坐标和函数模型(带3个参数)拟合出原函数) 对于函数原型y=A*x^2+B*x+C来说,假设A,B,C三个参数是从-1000到1000,本来我打算设置0.1的步长,从-1000扫描到1000,可是这样的话三层循环都是从-1000到1000以0.1的步长扫描参数,太慢了,然后我就想设定一个Sigma的容忍值,第一次扫描到Sigma<(一个值)就退出二乘法函数,然后重新在得到的大概的A,B,C参数值附近再进行下一步扫描,然后继续缩小Sigma的值,再重复一次,直至Sigma逼近0,这也就是说A,B,C参数就是我想要的值。 但是这个方法有问题,当我换一个函数模型时,程序就不行了,好比说,A,B,C正确值分别是A=5,B=20,C=-35,可是我在第一次扫描时得到Sigma<(一个值)时的A=-20,B=40,C=-30,那么程序会自动在这个附近进行下一次扫描,比如说在A=-30~-10之间进行扫描,B,C以此类推,但是这远远偏离了正确值,需要重新手动调整扫描范围才能让结果趋向于正确值。 请问该怎么办,我想不出好的解决办法。谢谢大家!
c语言调用动态库中的函数,不能获取返回值,但C#可以,不知c代码该如何改进?vs2017环境下。
c语言: typedef char * (__stdcall *MYPROC)(char * s, char * rs);//函数原型,s:传入数据,rs:返回数据。 HINSTANCE hinstLib; MYPROC send; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; WCHAR msg[] = L"{\"head\":{\"jylsh\":\"330199103576000000000000001811\",\"xxlxm\":\"C009\",\"fhsj\":\"\",\"xxfhm\":\"\",\"fhxx\":\"\",\"yytcq\":\"330799\",\"zdjbh\":\"Test11111\",\"yljgdm\":\"8095\",\"czydm\":\"\",\"bbh\":\"1.0\"},\"data\":{\"ksjgs\":{\"klb\":\"12\",\"knsj\":\"A30533169330799D1560000050009A4378127B360\"}}}"; wprintf(L"%s", msg); WCHAR P[] = L""; char oututfmsg[1024] = { 0 }; WCHAR outmsg[2048] = { 0 }; char utfmsg[10240] = { 0 }; unicode_to_utf8((short *)msg, utfmsg); hinstLib = LoadLibrary(TEXT("SendRcvB.dll")); if (hinstLib != NULL) { printf("begin GetProcAddres\n"); send = (MYPROC)GetProcAddress(hinstLib, "SendRcv"); if (NULL != send) { char * rcode = send(utfmsg, oututfmsg);//调试发现oututfmsg调用前后未发生变化 fRunTimeLinkSuccess = TRUE; } wprintf(L"%s", oututfmsg); fFreeResult = FreeLibrary(hinstLib); } c#代码如下: [DllImport("SendRcvB.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.StdCall)] private extern static IntPtr SendRcv(IntPtr sSend, out IntPtr sRcv); public Main() { InitializeComponent(); } private void btn_fs_Click(object sender, EventArgs e) { try { string sRcv, sRs; string sIn = rTextIn.Text; byte[] tmpIn = gbkToUft8(sIn); IntPtr pIn = mallocIntptr(tmpIn.Length); Marshal.Copy(tmpIn, 0, pIn, tmpIn.Length); //IntPtr pIn = mallocIntptr(sIn); IntPtr pOut = IntPtr.Zero; IntPtr pRs = IntPtr.Zero; pRs = SendRcv(pIn, out pOut);//pOut指针在变化,能指向返回数据 sRcv = Marshal.PtrToStringUni(pOut); sRs = Marshal.PtrToStringAnsi(pRs); sRcv = utf8ToGbk(sRcv); rTextOut.Text = sRcv; Marshal.FreeHGlobal(pIn); } catch (Exception oe) { MessageBox.Show(oe.Message); }
自定义函数,要用到指针,怎么编写呢?
编写一个求3个学生的各科平均成绩和总成绩的程序,每个学生有4科成绩,学生成绩存放在a数组中,函数原型: void Ave_Sum(float array[][4], int n, int *ave, int *sum),n为学生数。 其中a数组的矩阵表示为 float a[3][4] = { { 65,67,70,60 }, { 80,87,90,81 }, {90, 99,100,98} };
刚接触MFC,弄半天了,大神一看就懂,这个函数,怎么声明一个函数指针接收啊,在线等
``` 原型: Task<bool>^ OpenAsync( Action<Task<bool>^>^ onFinish = nullptr ) 代码: //声明函数指针 typedef task<bool>(*OpenAPI)(); //创建dll句柄 HINSTANCE hDll; //装载dll hDll = LoadLibrary(_T("xxx.dll")); if (NULL == hDll) { AfxMessageBox(_T("DLL加载失败!")); } //检索指定DLL中的输出库函数地址 OpenAPI OpenAsync1 = (OpenAPI)GetProcAddress(hDll, "OpenAsync"); if (NULL == OpenAsync1) { AfxMessageBox(_T("DLL内部函数调用失败!")); } ``` 在声明函数指针的时候不知道怎么声明,LoadLibrary可以得到,GetProcAddress一直为0
c语言课程设计:统计工资
2.1 设计题目 本课程设计要求设计一个公司职员的数据结构,并使用结构指针数组存储职员信息,统计公司员工工资总额和平均工资。 2.2 设计要求 设计要求实现如下功能: (1)使用结构指针数组设计一个公司职员的数据结构,使用下述的结构定义: typedef struct employee{ int age; char *name; double salary; }*PEMP; (2)在主函数里构造一个指针数组company,用来存放职工信息。 (3)设计一个update函数,用来给company赋值。 函数update(company, id, age, name, salary)的四个参数为: company: 结构指针数组 id: company的下标 age: 年龄,整数类型 salary: 薪水,实数 (4)设计一个readin函数,直接采用调用update函数的方式进行赋值。例如:update(company, 2, 30, “LI MING”, 3000.0); (5)编写total函数对工资求和。 这个函数应该能对全体职工和某一年龄段的职工的工资求和。 (6)编写mean函数求平均工资。 这个函数应该能对全体职工和大于某一年龄段的职工的工资求和并计算相应的平均值。 2.3 算法分析 为了简单起见,假设在主函数main中定义结构数组指针如下: PEMP company[num]; 下面说明几个函数的设计问题: (1)readin函数 数组company属于main函数,它是不可见的,所以必须作为readin函数的参数。因为参数传递是传地址的方式,所以不需要返回值。以数据为例,这个函数的定义和使用方法如下: void reading(company) PEMP company[]; { update(company, 2, 23, “张文”,3000.0); update(company, 1, 33, “王微”,2400.0); update(company, 2, 23, “李小”,3055.0); } (2)total函数 它也必须以数组company作为参数,而且要返回工资总额。可将它的原型设计为: double total (PEMP *); total函数应该允许输入年龄范围,如果年龄不合理,应该允许重新输入。对输入数据进行判别,确保无误再进行计算。 for( ; ; ) { printf(“输入年龄范围”); scanf(“%d%d”,&age1, &age2) if(age1>age2) { i=age1; age1=age2; age2=i; } if((age1>=0)&&(age2<=100)&&(age2>=0)&&(age2<=100)&&(age2>age1)) break; } (3)mean函数 mean函数也必须以数组company作为参数,而且要返回平均工资。将它的函数原型设计为: double mean (PEMP *); mean函数应该允许输入年龄范围。对输入字符进行判别,确保无误再进行计算,注意允许大小写。 printf(“求某一年龄段以上的职工的平均工资\n”); printf(“默认是全体职工的平均工资,要改变计算方式请输入Y/y\n”); getchar(); ch=getchar(); if(ch==’Y’||ch=’y’) { printf(“age:”); scanf(“%d”,&age); } (4)申请内存 在update函数中,需要申请内存空间。 PEMP emp If((emp=(PEMP) malloc (sizeof(struct employee)))==NULL)return; 注意emp是指针,所以要使用sizeof(struct employee)。
求 linux 标准 C 语言判断2个字符串的一个函数
函数的原型为: int diff_str(const char * a, const char * b); 主要是用来处理当A和B 中存在有符号点 “.” 或星号 “*”时的判断关系。 星号出现的(位置不定),且 (不限制长度) 匹配 [a-z0-9] 中包含的字符。 注意: 星号不能匹配 "." 例如: a=“hello*world”; b=“hello.world”; 这个时候 a != b; a=“hello*world”; b=“hellower9world”; 这个时候 a == b; a="*"; b="adfafdafd"; 这个时候 a == b; 最好再加个判断如果 输入 的a 非 [a-z0-9\.] 直接返回。 要求性能高效。 思路我有,关键是求一个效率高的算法。求代码: int n=0, d=0; for (p1 = a, p2= a + strlen(a) - 1; p2 > p1; ++p1, --p2){ if (*p1 == '*'){ if (!strncmp(a, b, n)){ d=1; } break; } else if (*p2 =='*'){ if (!strncmp(a, b,strlen(a)-n-1)){ d=1; } break; } n++; } 定位"*" 号位置我只知道这样两边查找。 求更高效的。
利用指针方法实现两数互换,函数原型为:void swap(int *p1,int *p2);在线等,急
输入3个数x,y,z,按大小顺序排序后输出。 要求:利用指针方法实现两数互换,函数原型为:void swap(int *p1,int *p2); 输入提示:printf("please input 3 number x,y,z"); 输出格式:printf("the sorted numbers are:%d,%d,%d\n", ); ``` #include <stdio.h> #include <stdlib.h> void swap(int *p1,int *p2) { int temp; temp = *p1; *p1 = *p2; *p2 = temp; } int main() { int x,y,z; int i,j; int m[3]; printf("please input 3 number x,y,z"); for(i = 0; i < 3 ;i++) { scanf("%d",&m[i]); } for(i = 0; i < 2; i++) { for(j = 0; j < 3; j++) { if(m[i] < m[j]) { swap(m[i],m[j]); } } } printf("the sorted numbers are:%d,%d,%d\n", m[0],m[1],m[2]); return 0; } ``` 我的代码哪里有错?
c语言 输入n个整数(n<50) 存入一维数组,统计其中的 正数,负数和零的个数,输出统计结果。
编写程序, 输入n个整数(n<50) 存入一维数组,统计其中的 正数,负数和零的个数,输出统计结果。 要求: 用自定义函数count完成按要求统计, 在主函数里完成输入n个数和输出统计结果。 自定义函数原型: void count(int a[], int n, int *pz, int *pf, int *pl); 主函数: int main() { int a[50], n, positive, negative , zero ; scanf(“%d”, &n); //读入n个数 //调用函数,统计其中的 正数,负数和零的个数 //输出统计结果 return 0; }
C语言数据结构顺序存储的线性表常用函数的参数传递中*P和P使用情况和一些顺序存储的线性表问题
刚学了C语言的数据结构,有一些问题不懂,或者说有一些认识不知道对不对,想知道真正的情况是怎么样的。 先看这几条语句: void union(List *La,List Lb) (1) { int La_len,Lb_len,i; ElemType e; La_len = ListLength(*La); (2) Lb_len = ListLength(Lb); (3) for(i=1;i<=Lb_len;i++) { GetElem(Lb,i,&e); if(!LocateElem(*La,e)) (4) ListInsert(La,++La_len,e); } } 再看函数原型,是我看的书上的:(L是线性表) 1. InitList(*L); 2. ClearList(*L); 3. ListInsert(*L,i,e); 4. ListDelete(*L,i,*e); 5. ListLength(L); 6. ListEmpty(L); 7. LocateElem(L,e); 8. GetElem(L,i,*e); 问题是: 1. 第一部分语句, union函数的两个参数List *La,List Lb,一个是*La,一个是Lb, 不知道为什么一个是用线性表的指针的地址 *L,一个是用 L 。 2. La_len = ListLength(*La); (2) Lb_len = ListLength(Lb); (3) !LocateElem(*La,e) (4) 和第7条原型LocateElem(L,e); (2)(3)两条语句,用的是同样的函数,一个却是指针地址,一个确实指针指向的值,对应第5条函数原型ListLength(L);是不是这个函数里面的参数既可以是*La也可以是Lb?区别是什么? (4)的语句第一个参数是*La,而原型第一个参数是L,不知道为什么一个有加*,一个没有加,有错吗,没错的话区别是什么? 3. 几个函数原型里面,前4条函数的参数是L,后4条函数参数是(*L),还有e也有这种情况,是为什么??搞不懂什么时候用加*,什么时候不用加,区别是什么 4. 顺序线性表的定义跟一个结构体差不多,里面有一个数组存储数据元素,搞不清楚结构体和线性表和数组的区别和联系 (老师教C的时候,没怎么听,后来学JAVA了C也忘记差不多了,学C的数据结构感觉熟悉又陌生,有很多不懂的地方,谢谢大家帮忙解答了)
C语言使用fread()函数的时候为什么不是从文档开头读取?
原函数: ![图片说明](https://img-ask.csdn.net/upload/201708/30/1504072304_729154.png) 文件内容: ![图片说明](https://img-ask.csdn.net/upload/201708/30/1504072421_460777.png) 运行结果: ![图片说明](https://img-ask.csdn.net/upload/201708/30/1504072551_117469.png) 函数原型: unsigned fread(void *buffer,unsigned size,unsigned count,FILE *fp); 根据我的理解是从fp指向的文件首部开始读起,再传入buffer所指向的待存入的数据块首址。 另外我试了一下,当文件中只包含一组数据的时候,还会出现乱码情况,如图: ![图片说明](https://img-ask.csdn.net/upload/201708/30/1504072991_198145.png) 新人一个,求各位大神解答
c语言中函数形参为空指针,调用时可以不用带实参吗?
最近在看代码,有地方不太懂 void map_hash_init(void) { map_hash_head = hash_create ((uint32_t (*)(void *))(con_key), (int (*)(void *, void *))(Con_comp)); } 这是一个hash表的初始化 hash_creat的原型: hash_create (uint32_t (*hash_key) (), int32_t (*hash_cmp) ()) { return hash_create_size (HASHTABSIZE, hash_key, hash_cmp); } con_key函数: uint32_t con_key(void *data) { uint32_t key; T_ConnectionId *pData = (T_ConnectionId *)data; key = ((pData->srcNeId + pData->tunnelId) * HASHNUM + (pData->desNeId + pData->lspId)) % HASHTABSIZE; return key; } 为什么在hash初始化的时候,直接(uint32_t (*)(void *))(con_key)就可以?con_key不是要带实参的吗?
130 个相见恨晚的超实用网站,一次性分享出来
相见恨晚的超实用网站 持续更新中。。。
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
(经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
今年正式步入了大四,离毕业也只剩半年多的时间,回想一下大学四年,感觉自己走了不少弯路,今天就来分享一下自己大学的学习经历,也希望其他人能不要走我走错的路。 (一)初进校园 刚进入大学的时候自己完全就相信了高中老师的话:“进入大学你们就轻松了”。因此在大一的时候自己学习的激情早就被抛地一干二净,每天不是在寝室里玩游戏就是出门游玩,不过好在自己大学时买的第一台笔记本性能并不是很好,也没让我彻底沉...
使用 Angular 打造微前端架构的 ToB 企业级应用
这篇文章其实已经准备了11个月了,因为虽然我们年初就开始使用 Angular 的微前端架构,但是产品一直没有正式发布,无法通过生产环境实践验证可行性,11月16日我们的产品正式灰度发布,所以是时候分享一下我们在使用 Angular 微前端这条路上的心得(踩过的坑)了额,希望和 Angular 社区一起成长一起进步,如果你对微前端有一定的了解并且已经在项目中尝试了可以忽略前面的章节。 什么是微前...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
拿下微软、Google、Adobe,印度为何盛产科技圈 CEO?
作者 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 世界500强中,30%的掌舵人,都是印度人。 是的,你没看错。这是近日《哈佛商业评论》的研究结果。 其中又以微软CEO萨提亚·纳德拉(Satya Nadella)、和谷歌CEO桑达尔·皮查伊(Sundar Pichai,以下简称劈柴)最为出名。 微软CEO萨提亚·纳德拉(Satya Nadella) 其他著名印度...
程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
一文带你入门Linux
文章目录1.1 Linux的概述:1.1.1 什么是Linux:1.1.1.1 学习Linux之前先了解Unix1.1.1.2 Linux的概述:1.1.1.3 Linux的历史:1.1.1.4 Linux系统的应用:1.1.1.5 Linux的版本1.1.1.6 Linux的主流版本1.2 Linux的安装:1.2.1 虚拟机安装:1.2.1.1 什么是虚拟机1.2.1.2 安装VmWare1....
普通三本毕业,我怎么一路艰辛进入阿里的
英雄不问出处? 自古以来就有这样一句话,真的英雄不问出处吗?这句话太挫了。普通三本院校的我,大四的时候居然都不知道什么是校招,所以出处太重要了。这也是没有机会参加阿里校招的原因,毕竟校招门槛比社招还是要低的,最重要的是校招进入阿里能让你的起点比别人更高。 有幸可以社招进入阿里,了解了校招的思路,赶紧介绍给学弟们,现在我们三本院校的小学弟今年居然有 3 个人通过了阿里的校招。下面我也把这份宝贵的经...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
强烈推荐10本程序员在家读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
关于2020年个人项目【臻美_疫情实时大数据报告】(项目开源)
本项目开源,供大家学习交流,数据来自官方通报。 项目网址: 点这可以查看项目 项目图例: 1、国内疫情(省) 2、国内疫情(市) 3、国外疫情 4、热点消息、辟谣消息 5、防疫知识 源码奉上: 本项目后台使用node.js app.js var originRequest = require('request'); var iconv = require('iconv-lite'...
[数据结构与算法] 排序算法
终于学习到了算法部分, 在学习算法时, 我们还是应该回顾一下数据结构与算法之间的关系 数据结构是研究数据的组织方式, 是算法的基础 算法是解决编程问题的方法论, 是程序的灵魂 程序= 数据结构+算法 排序算法 排序也称排序算法(Sort algorithm). 是指 将一组数据按照指定顺序进行排列的过程 主要分为内部排序和外部排序 内部排序: 指将需要处理的数据加载到内存中进行排序 外部排序...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
智力题(程序员面试经典)
NO.1  有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平,怎么找出比较重的那瓶药丸?天平只能用一次。 解法 有时候,严格的限制条件有可能反倒是解题的线索。在这个问题中,限制条件是天平只能用一次。 因为天平只能用一次,我们也得以知道一个有趣的事实:一次必须同时称很多药丸,其实更准确地说,是必须从19瓶拿出药丸进行称重。否则,如果跳过两瓶或更多瓶药...
自学python网络爬虫,从小白快速成长,分别实现静态网页爬取,下载meiztu中图片;动态网页爬取,下载burberry官网所有当季新品图片。
文章目录 1.前言 2.知识储备 3.爬取静态网站 4.爬取动态网站 1.前言 近日疫情严重,手机已经玩吐了,闲着无聊逛衣服品牌官网发现,结果一时兴起,想学一学python,写一个爬虫下载官网所有最新上架的衣服图片和价格;说干就干,但身为一个只学过一些c和c++的python 0基础大二小白,csdn上的各种教程里涉及的各种发法、工具和库让我眼花缭乱;因此走了很多弯路,终于花三天时间完成了爬虫的设...
面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他
初识 MyBatis MyBatis 是第一个支持自定义 SQL、存储过程和高级映射的类持久框架。MyBatis 消除了大部分 JDBC 的样板代码、手动设置参数以及检索结果。MyBatis 能够支持简单的 XML 和注解配置规则。使 Map 接口和 POJO 类映射到数据库字段和记录。 MyBatis 的特点 那么 MyBatis 具有什么特点呢?或许我们可以从如下几个方面来描述 MyBati...
对Tomcat的简单概要小结
首先我们必须得知道Tomcat就是一个服务,一个本地服务,我们可以控制启动和停止,我们程序员通过这个服务主要是用来存放我们的java程序,当我们把Java程序放进Tomcat服务中,一旦Tomcat服务启动起来,其他电脑就可以进行网络连通,也就是说其他电脑也可以共同访问这个Java程序。 Tomcat的主要目录的概念 有上面的概念之后,我们再来知道一下tomcat根目录下都有哪些文件,以及这些文...
相关热词 c# 为空 判断 委托 c#记事本颜色 c# 系统默认声音 js中调用c#方法参数 c#引入dll文件报错 c#根据名称实例化 c#从邮件服务器获取邮件 c# 保存文件夹 c#代码打包引用 c# 压缩效率
立即提问