Question: PAT 1030 完美数列测试点5答案错误

引用 3 楼 coo135 的回复:left=search(a,i,N-1,(long long)(a[i]*p));  a[i]*p，两个int相乘，溢出了~再转成long long 没啥意义了。可以改成比如：(long long)a[i]*p。  search函数弄得有点复杂了~~~  #include <stdio.h> #include <stdlib.h> int cmp(const void* a, const void* b) { 	return *(int*)a > * (int*)b; }  int main() { 	int* arr, N, P, ans = 0; 	long int T; 	scanf("%d%d", &N, &P); 	arr = (int*)malloc(sizeof(int) * N); 	for (int i = 0; i < N; i++) 		scanf("%d", &arr[i]);  	qsort(arr, N, sizeof(int), cmp);  	for (int i = 0; i < N; i++) { 		T = (long int)arr[i] * P; 		for (int j = i + ans; j < N; j++) 			if (arr[j] <= T) { 				ans++; 			} 			else 				break; 	} 	printf("%d\n", ans); 	free(arr); 	return 0; }  谢谢高手的回答，回去试了一下解决了

引用 1 楼 自信男孩 的回复:这个没那么复杂吧，直接遍历套公式就好了吧 找到最大值，然后遍历M<= p * m;得到最大数是8个。 不用二分法的话复杂度是O(n^2)，会超时


Question: 文件传输中断，残损了，如何让别人看不到残损文件的内容

web是采取temp目录的办法。 如果文件小可以考虑内存模式

引用 楼主 gewenbingg 的回复:向服务器上传一个.txt文件，网络断了，服务器只接收到文件的一半。在这中情况下不想让服务器打开能看到这个残损的文件内容（让他打不开），请问有什么办法？？ 看文件大小了，没接收完先存在内存中，接收完成，再写文件。接收失败，销毁对象。


Question: 求救求救被困了2h愣是没看出有什么区别

引用 1 楼 自信男孩的回复:区别在if (j == i)是在第二个for循环里还是循环外。 从逻辑上看，应该放在循环外，因为放在循环里无意义，因为循环里不会出现j == i wok 秒懂 原来是这样子的  谢谢啊

错误提示不是有吗，i重复定义了，第20行和第41行


Question: 关于循环的的问题

建议从实际出发，如果对浮点数不确定能不能判断，那么可以改成自己熟悉的方式，比如整型数。

引用 8 楼 LandY和C 的回复:[quote=引用 7 楼 WNs_ACE 的回复:] [quote=引用 6 楼 LandY和C 的回复:] [quote=引用 4 楼 WNs_ACE 的回复:] 我觉得这类问题就应该看汇编，你看一下汇编就懂了，while的那个判断，在汇编中就是test，然后根据test修改的寄存器来决定是否跳转，而0.000001的话，在底层应该是先通过movsd指令移动到浮点数的寄存器中，然后再通过ucomisd指令比较0（这个0是浮点数来的），最后通过test来决定是否跳转。当然具体的可能还需要看编译器来决定对应的汇编指令和汇编逻辑（因为还一些编译没有浮点数的寄存器什么的）  说的很详细  ,  那意思就是 这个代码在不同的机器上会有不同的结果喽.  也就是间接的告诉我不能这么用.  证实 非0即为真 不包括小数[/quote] 基本上来说，在PC和一般的高端平台，我觉得基本上你上面这样写没有问题，while (0.000001)为真，while (0.00000)为假，但是如果是低端嵌入式平台，可能就不可以了。[/quote]  换个方式问这个问题(核心没变) 如何将浮点数转字符串. 假设 x = 0.00123 ; 我的具体代码  while ((x *= 10) - (int)x) {      printf("%d\n" , (int)x % 10); }  有什么更好的方法吗 ?[/quote] char str[20]; double f=14.309948; sprintf(str,"%f",f); 查一下sprintf函数，有现成的函数，不需要自己这样子转

引用 7 楼 WNs_ACE 的回复:[quote=引用 6 楼 LandY和C 的回复:] [quote=引用 4 楼 WNs_ACE 的回复:] 我觉得这类问题就应该看汇编，你看一下汇编就懂了，while的那个判断，在汇编中就是test，然后根据test修改的寄存器来决定是否跳转，而0.000001的话，在底层应该是先通过movsd指令移动到浮点数的寄存器中，然后再通过ucomisd指令比较0（这个0是浮点数来的），最后通过test来决定是否跳转。当然具体的可能还需要看编译器来决定对应的汇编指令和汇编逻辑（因为还一些编译没有浮点数的寄存器什么的）  说的很详细  ,  那意思就是 这个代码在不同的机器上会有不同的结果喽.  也就是间接的告诉我不能这么用.  证实 非0即为真 不包括小数[/quote] 基本上来说，在PC和一般的高端平台，我觉得基本上你上面这样写没有问题，while (0.000001)为真，while (0.00000)为假，但是如果是低端嵌入式平台，可能就不可以了。[/quote]  换个方式问这个问题(核心没变) 如何将浮点数转字符串. 假设 x = 0.00123 ; 我的具体代码  while ((x *= 10) - (int)x) {      printf("%d\n" , (int)x % 10); }  有什么更好的方法吗 ?

引用 6 楼 LandY和C 的回复:[quote=引用 4 楼 WNs_ACE 的回复:] 我觉得这类问题就应该看汇编，你看一下汇编就懂了，while的那个判断，在汇编中就是test，然后根据test修改的寄存器来决定是否跳转，而0.000001的话，在底层应该是先通过movsd指令移动到浮点数的寄存器中，然后再通过ucomisd指令比较0（这个0是浮点数来的），最后通过test来决定是否跳转。当然具体的可能还需要看编译器来决定对应的汇编指令和汇编逻辑（因为还一些编译没有浮点数的寄存器什么的）  说的很详细  ,  那意思就是 这个代码在不同的机器上会有不同的结果喽.  也就是间接的告诉我不能这么用.  证实 非0即为真 不包括小数[/quote] 基本上来说，在PC和一般的高端平台，我觉得基本上你上面这样写没有问题，while (0.000001)为真，while (0.00000)为假，但是如果是低端嵌入式平台，可能就不可以了。

引用 4 楼 WNs_ACE 的回复:我觉得这类问题就应该看汇编，你看一下汇编就懂了，while的那个判断，在汇编中就是test，然后根据test修改的寄存器来决定是否跳转，而0.000001的话，在底层应该是先通过movsd指令移动到浮点数的寄存器中，然后再通过ucomisd指令比较0（这个0是浮点数来的），最后通过test来决定是否跳转。当然具体的可能还需要看编译器来决定对应的汇编指令和汇编逻辑（因为还一些编译没有浮点数的寄存器什么的）  说的很详细  ,  那意思就是 这个代码在不同的机器上会有不同的结果喽.  也就是间接的告诉我不能这么用.  证实 非0即为真 不包括小数

引用 1 楼 user-4 的回复:我觉得是可以的.  .随便写个程序运行试试就知道了  那我问你  while (2.00000000123 - 2.00000000123) {表达式} ; 会执行吗 ?    这样移植性好嘛 ?

不管用的语言的语法怎样规定，编程时有几个原则应该遵守的：1、避免大数吃小数；2、避免除极小数；3、避免判断两个浮点数是否相等（楼主的问题其实也属于这种情况——在判断一个极小数与0.0是否相等）......

可以这样用。测试来看是包括小数的

我觉得是可以的.  .随便写个程序运行试试就知道了


Question: 当捕获一个消息值后，如果查找该值对应的消息？

引用 4 楼 gouyanfen 的回复:https://www.cnblogs.com/moonlight-zjb/p/3442280.html 这个6了！

引用 6 楼 Intel0011 的回复:貌似CSDN有字符个数限制，不能粘贴太长，被截断了 你可以使用findinfiles软件搜索整个文件夹或整个分区 我感觉这个软件应该用不着吧，找文件里的内容，应该是说的查找文本内容是吧？我用findstr写了个脚本，功能应该是差不多的吧，没去搜（刚搜了，也没找到），毕竟只是一个消息数值。你这个表有后文吗？

搜索整个Include文件夹，可以看看网上是否有人总结过，我这里有个表，不知是哪找来的，不保证正确  WM_ Window Message 窗口消息，一般用在SendMessage，PostMessage这样的消息函数中  SM_ Static Message 静态标签消息  SS_ Static Style 静态标签风格  BM_ Button Message 按钮消息  BS_ Button Style 按钮风格  BN_ Button Notify 按钮通知  EM_ Edit Message 编辑框消息  ES_ Edit Style 编辑框风格  CB_ ComboBox 组合框消息  CBN_ ComboBox Notify 组合框通知  LBM_ ListBox Message 列表框消息  LBS_ ListBox Style 列表框风格  LBN_ ListBox Notify 列表框通知  LVM_ ListView Message 超级列表框(列表视图)消息  LVS_ ListView Style 超级列表框(列表视图)风格  LVN_ ListView Notify 超级列表框(列表视图)通知  TVM_ TreeView Message 树型框(树型视图)消息  TVS_ TreeView Style 树型框(树型视图)风格  TVN_ TreeView Notify 树型框(树型视图)通知  VK_ Virtual Keyboard 虚拟键、键代码   //0x0005/*_IMC_GETOPE  //0x0005/*_IMC_GETOPENSTATUS*/,"",   //0x0003/*_IMC_GETSENTENCEMODE*/,"",   0x000F/*_IMC_GETSTATUSWINDOWPOS*/,"发送给IME窗口,获取状态窗口的位置",   0x0022/*_IMC_OPENSTATUSWINDOW*/,"发送给IME窗口,显示状态窗口",   0x0008/*_IMC_SETCANDIDATEPOS*/,"发送给IME窗口,设置候选窗口的位置",   0x000A/*_IMC_SETCOMPOSITIONFONT*/,"发送给IME窗口,设置用来显示按键组合窗口中的文本的逻辑字体",   0x000C/*_IMC_SETCOMPOSITIONWINDOW*/,"发送给IME窗口,设置按键组合窗口的样式",    //0x0002/*_IMC_SETCONVERSIONMODE*/,"",   //0x0006/*_IMC_SETOPENSTATUS*/,"",   //0x0004/*_IMC_SETSENTENCEMODE*/,"",   0x0010/*_IMC_SETSTATUSWINDOWPOS*/,"发送给IME窗口,设置状态窗口的位置",   0x0003/*_IMN_CHANGECANDIDATE*/,"IME通知应用程序:候选窗口中的内容将改变",   0x0004/*_IMN_CLOSECANDIDATE*/,"IME通知应用程序:候选窗口将关闭",   0x0001/*_IMN_CLOSESTATUSWINDOW*/,"IME通知应用程序:状态窗口将关闭",   0x000D/*_IMN_GUIDELINE*/,"IME通知应用程序:将显示一条出错或其他信息",   0x0005/*_IMN_OPENCANDIDATE*/,"IME通知应用程序:将打开候选窗口",   0x0002/*_IMN_OPENSTATUSWINDOW*/,"IME通知应用程序:将创建状态窗口",   0x0009/*_IMN_SETCANDIDATEPOS*/,"IME通知应用程序:已结束候选处理同时将移动候选窗口",   0x000A/*_IMN_SETCOMPOSITIONFONT*/,"IME通知应用程序:输入内容的字体已被更改",   0x000B/*_IMN_SETCOMPOSITIONWINDOW*/,"IME通知应用程序:按键组合窗口的样式或位置已被更改",   0x0006/*_IMN_SETCONVERSIONMODE*/,"IME通知应用程序:输入内容的转换模式已被更改",   0x0008/*_IMN_SETOPENSTATUS*/,"IME通知应用程序:输入内容的状态已被更改",   0x0007/*_IMN_SETSENTENCEMODE*/,"IME通知应用程序:输入内容的语句模式已被更改",   0x000C/*_IMN_SETSTATUSWINDOWPOS*/,"IME通知应用程序:输入内容中的状态窗口的位置已被更改",   //IMR_CANDIDATEFORM,"",    //IMR_COMPOSITIONFORM,"",    //Pager Control,Pager控件消息,分页控件消息   (0x1400 + 3)/*_PGM_FORWARDMOUSE*/,"启用或禁用Pager分页控件的鼠标消息转发,若启用则Pager控件转发WM_MOUSEMOVE消息给包含的窗口,宏:Pager_ForwardMouse",   (0x1400 + 5)/*_PGM_GETBKCOLOR*/,"获取Pager分页控件的当前背景色,宏:Pager_GetBkColor",   (0x1400 + 7)/*_PGM_GETBORDER*/,"获取Pager分页控件的当前边界尺寸,宏:Pager_GetBorder",   (0x1400 + 11)/*_PGM_GETBUTTONSIZE*/,"获取Pager分页控件的当前按钮大小,宏:Pager_GetButtonSize",   (0x1400 + 12)/*_PGM_GETBUTTONSTATE*/,"获取Pager分页控件中指定按钮的状态,宏:Pager_GetButtonState",   (0x2000 + 4)/*_PGM_GETDROPTARGET*/,"获取Pager分页控件的IDropTarget接口指针,宏:Pager_GetDropTarget",   (0x1400 + 9)/*_PGM_GETPOS*/,"获取Pager分页控件的滚动条的当前位置,宏:Pager_GetPos",   (0x1400 + 2)/*_PGM_RECALCSIZE*/,"强制重新计算Pager分页控件包含的窗口的大小,宏:Pager_RecalcSize",   (0x1400 + 4)/*_PGM_SETBKCOLOR*/,"设置Pager分页控件的当前背景色,宏:Pager_SetBkColor",   (0x1400 + 6)/*_PGM_SETBORDER*/,"设置Pager分页控件的当前边界尺寸,宏:Pager_SetBorder",   (0x1400 + 10)/*_PGM_SETBUTTONSIZE*/,"设置Pager分页控件的当前按钮大小,宏:Pager_SetButtonSize",   (0x1400 + 1)/*_PGM_SETCHILD*/,"设置Pager分页控件中包含的窗口,宏:Pager_SetChild",   (0x1400 + 8)/*_PGM_SETPOS*/,"获取Pager分页控件的滚动条的当前位置,宏:Pager_SetPos",    //Pager Control,Pager控件通知消息   (-900-2)/*_PGN_CALCSIZE*/,"Pager控件发送的通知消息,用以获得所包含窗口的滚动尺寸,相关结构:NMPGCALCSIZE",   (-900-1)/*_PGN_SCROLL*/,"在所包含窗口被滚动之前,Pager控件发送的通知消息,相关结构:NMPGSCROLL",    //MIDI消息   0x3C2/*_MIM_CLOSE*/,"当MIDI输入设备被关闭时,把该消息发送给MIDI输入回调函数",   0x3C3/*_MIM_DATA*/,"当MIDI输入设备接收一条MIDI消息后,把该消息发送给MIDI输入回调函数",   0x3C5/*_MIM_ERROR*/,"当收到一条无效的MIDI消息时,把该消息发送给MIDI输入回调函数",   0x3C4/*_MIM_LONGDATA*/,"当输入缓冲区中填写了MIDI系统专用数据且将把该缓冲区交还给应用程序时,发送该消息给MIDI回调函数",   0x3C6/*_MIM_LONGERROR*/,"当收到一条无效的MIDI系统专用消息时,把该消息发送给一个MIDI输入回调函数",   0x3CC/*_MIM_MOREDATA*/,"当MIDI输入设备收到一条MIDI消息,但应用程序处理MIM_DATA消息不够快跟不上输入设备时,发送该消息给MIDI输入回调函数",   0x3C1/*_MIM_OPEN*/,"当MIDI输入设备被打开时,把该消息发送给MIDI输入回调函数",   0x3C2/*_MM_MIM_CLOSE*/,"当关闭某MIDI输入设备时,发送该消息给一个窗口。一旦发送了该消息,设备句柄将不再有效",   0x3C3/*_MM_MIM_DATA*/,"当MIDI输入设备收到一条完整的MIDI消息时,发送该消息给一个窗口",   0x3C5/*_MM_MIM_ERROR*/,"当收到一条无效的MIDI消息时,把该消息发给一个窗口",   0x3C4/*_MM_MIM_LONGDATA*/,"当输入缓冲区中填写了MIDI系统专用数据且将把该缓冲区交还给应用程序时,发送该消息给一个窗口",   0x3C6/*_MM_MIM_LONGERROR*/," 当收到一条无效的(或不完整的)MIDI系统专用消息时,发送该消息给一个窗口",   0x3CC/*_MM_MIM_MOREDATA*/,"当MIDI输入设备收到一条MIDI消息,但应用程序处理MIM_DATA消息不够快跟不上输入设备时,发送该消息给一个回调窗口",   0x3C1/*_MM_MIM_OPEN*/,"当MIDI输入设备被打开时,发送该消息给一个窗口",   0x3C8/*_MM_MOM_CLOSE*/,"当MIDI输出设备被关闭时,发送该消息给一个窗口;一旦发送了这一消息,设备句柄将不再有效",   0x3C9/*_MM_MOM_DONE*/,"当指定的系统专用缓冲区中的内容被播放完,并且将把该缓冲区交还给应用程序时,发送该消息给一个MIDI回调函数",   0x3C7/*_MM_MOM_OPEN*/,"当MIDI输出设备被打开时,发送该消息给一个窗口",   0x3CA/*_MM_MOM_POSITIONCB*/,"当在MIDI输出流中一个MEVT_F_CALLBACK(标志)事件到达时,发送该消息给一个窗口",   0x3C8/*_MOM_CLOSE*/,"当MIDI输出设备被关闭时,把该消息发送给MIDI输出回调函数",   0x3C9/*_MOM_DONE*/,"当指定的专用系统或流缓冲区已经播放,并且正在返回到应用程序时,发送该信息到MIDI输出回调函数",   0x3C7/*_MOM_OPEN*/,"当MIDI输出设备被打开时,把该消息发送给MIDI输出回调函数",   0x3CA/*_MOM_POSITIONCB*/,"当在MIDI输出流中一个MEVT_F_CALLBACK(标志)事件到达时,发送该消息给一个窗口",     //驱动程序消息   0x0004/*_DRV_CLOSE*/,"驱动程序因CloseDriver调用而关闭时,系统向它发出本消息,驱动程序常使用DRV_CLOSE通知来释放特定实例的数据结构",   0x0007/*_DRV_CONFIGURE*/,"驱动程序完成初始化安装及每当用户要重新配置驱动程序时,驱动安装程序会发送该消息",   0x0005/*_DRV_DISABLE*/,"驱动程序被释放或由Windows进入DOS时,向驱动程序发DRV_DISABLE消息",   0x0002/*_DRV_ENABLE*/,"当驱动程序首次加载后,系统向它发DRV_ENABLE消息,利用该消息设置硬件并挂接中断",   0x000B/*_DRV_EXITSESSION*/,"系统退出前,向所有打开的驱动程序发出该消息",   0x0006/*_DRV_FREE*/,"驱动程序被丢弃前,系统发送给它的最后一个消息就是DRV_FREE",   0x0009/*_DRV_INSTALL*/,"驱动程序安装过程中,它将收到该消息",   0x0001/*_DRV_LOAD*/,"驱动程序首次加载后,系统发送给它的就是DRV_LOAD消息,此时可初始化实例数据",   0x0003/*_DRV_OPEN*/,"驱动程序被OpenDriver调用打开时,系统向它发该消息",   0x000F/*_DRV_POWER*/,"在符合APM标准的系统中,当系统将进入或退出挂起模式时,驱动程序将收到DRV_PORWER消息",   0x0008/*_DRV_QUERYCONFIGURE*/,"驱动程序的安装程序利用该消息来确定驱动程序是否能由用户配置。若该消息返回TURE,安装程序会使能\"configure\"或\"Setup\"按钮",   0x000A/*_DRV_REMOVE*/,"驱动程序将从安装的驱动程序列表中删除时,将会收到该消息",   0x4000/*_DRV_USER*/,"用户自定义的驱动程序消息的消息值范围从DRV_RESERVED开始到DRV_USER",  DRV_EXITAPPLICATION,"应用程序退出时,系统向驱动程序发出该消息",       0x0800/*_DRV_RESERVED*/,"用户自定义的驱动程序消息的消息值范围从DRV_RESERVED开始到DRV_USER",    //Power Management,电源管理消息,PBT_:Power BaTtery   0x0009/*_PBT_APMBATTERYLOW*/,"该消息发送到应用程序,通知BIOS的电池电量不足,窗口通过WM_POWERBROADCAST收到此消息",   0x000B/*_PBT_APMOEMEVENT*/,"高级电源管理的基本输入/输出系统 (BIOS)发出高级电源管理的OEM事件信号时(APM:高级电源管理),发送本消息,窗口通过WM_POWERBROADCAST收到此消息,注:这不是个统一事件,各OEM厂商会根据自己的判断尝试捕捉各自事件",   0x000A/*_PBT_APMPOWERSTATUSCHANGE*/,"计算机电源状态改变时,发送本消息,如:检测到电池电源切换A/C或低于一个阈值后的剩余电池电量的下降,窗口通过WM_POWERBROADCAST收到此消息",   0x0000/*_PBT_APMQUERYSUSPEND*/,"发送该消息以请求允许挂起计算机,授予权限的应用程序应在返回前挂起,窗口通过WM_POWERBROADCAST收到此消息",   0x0002/*_PBT_APMQUERYSUSPENDFAILED*/,"待机请求被拒绝时,发送该消息,窗口通过WM_POWERBROADCAST收到此消息",   0x0012/*_PBT_APMRESUMEAUTOMATIC*/,"计算机自动唤醒以处理某事件时,发送该消息,窗口通过WM_POWERBROADCAST收到此消息",   0x0006/*_PBT_APMRESUMECRITICAL*/,"由于BIOS电池问题使计算机被挂起后恢复操作时,发送该消息,驱动程序通过WM_POWERBROADCAST收到此消息",   0x0007/*_PBT_APMRESUMESUSPEND*/,"系统待机后恢复运行时,发送该消息,窗口通过WM_POWERBROADCAST收到此消",   0x0004/*_PBT_APMSUSPEND*/,"系统进入待机后,会立即发送该消息,窗口通过WM_POWERBROADCAST收到此消息",    //setup functions,驱动安装函数消息   0x0000000d/*_SPFILENOTIFY_COPYERROR*/,"驱动安装过程中,文件拷贝发生错误时,该通知发送给回调例程",   0x00000007/*_SPFILENOTIFY_DELETEERROR*/,"驱动安装过程中,文件删除操作发生错误时,该通知发送给回调例程",   0x0000000c/*_SPFILENOTIFY_ENDCOPY*/,"驱动安装过程中,队列完成复制操作时,该通知传递给回调函数(即使用户取消或有错误发生,该通知也被发送)",   0x00000006/*_SPFILENOTIFY_ENDDELETE*/,"驱动安装过程中,当队列完成删除操作时,该通知被返回给回调例程(即使用户取消或有错误发生,该通知也被发送)",   0x00000002/*_SPFILENOTIFY_ENDQUEUE*/,"驱动安装过程中,队列中的所有作业已完成后,该通知发送给回调例程",   0x00000009/*_SPFILENOTIFY_ENDRENAME*/,"驱动安装过程中,队列完成重命名操作后,该通知发送到回调例程(即使用户取消或有错误发生,该通知也被发送)",   0x00000004/*_SPFILENOTIFY_ENDSUBQUEUE*/,"驱动安装过程中,队列完成子队列中的删除、重命名或拷贝作业后,该通知发送给回调例程",   0x00000013/*_SPFILENOTIFY_FILEEXTRACTED*/,"驱动安装过程中,该通知发送给SetupIterateCabinet函数的回调例程,用以表明已从cab压缩文件中提取出一个文件,或提取失败并且对cab压缩文件的处理已被取消",   0x00000011/*_SPFILENOTIFY_FILEINCABINET*/,"驱动安装过程中,每当cab压缩文件中找到一个文件时,该通知送到SetupIterateCabinet函数的回调例程,回调例程须返回一个值以指示是否提取该文件",   0x00000014/*_SPFILENOTIFY_FILEOPDELAYED*/,"驱动安装过程中,如果文件操作被延时(由于文件在使用中),该通知由SetupInstallFileEx函数或SetupCommitFileQueue函数发送给回调例程,该文件操作将在下次系统重启时被继续处理",   0x00010000/*_SPFILENOTIFY_LANGMISMATCH*/,"驱动安装过程中,若要复制文件的语言不匹配现有目标文件的语言,该通知发送给回调例程,它可被单独或联合发送到回调例程(通过\"或\"操 作:SPFILENOTIFY_TARGETEXISTS 与/或 SPFILENOTIFY_TARGETNEWER)",   0x0000000e/*_SPFILENOTIFY_NEEDMEDIA*/,"驱动安装过程中,当需要新的媒介或新的cab压缩文件时,该通知发送给回调例程",   0x00000012/*_SPFILENOTIFY_NEEDNEWCABINET*/,"驱动安装过程中,该通知由SetupIterateCabinet函数发送,用以表明当前文件需有另一个cab压缩文件柜才能继续。您的回调例程可调用SetupPromptForDisk函数,或创建自己的对话框,提示用户去插入下一张磁盘",   0x0000000f/*_SPFILENOTIFY_QUEUESCAN*/,"驱动安装过程中,该通知由SetupScanFileQueue函数发送给回调例程,用以检索文件队列的拷贝子队列中的各个节点(只发生在以SPQ_SCAN_USE_CALLBACK标志调用SetupScanFileQueue函数时)",   0x0000000a/*_SPFILENOTIFY_RENAMEERROR*/,"驱动安装过程中,若文件重命名操作过程中发生错误时,该通知发送给回调例程",   0x0000000b/*_SPFILENOTIFY_STARTCOPY*/,"驱动安装过程中,当队列开始文件拷贝操作时,该通知发送给回调函数",   0x00000005/*_SPFILENOTIFY_STARTDELETE*/,"驱动安装过程中,当队列开始文件删除操作时,该通知发送给回调函数",   0x00000001/*_SPFILENOTIFY_STARTQUEUE*/,"驱动安装过程中,当队列允许进程启动时,该通知发送给回调例程",   0x00000008/*_SPFILENOTIFY_STARTRENAME*/,"驱动安装过程中,当队列开始文件重命名操作时,该通知发送给回调函数",   0x00000003/*_SPFILENOTIFY_STARTSUBQUEUE*/,"驱动安装过程中,当列队开始处理在删除、重命名或拷贝子队列中的作业时,该通知发送给回调函数",   0x00020000/*_SPFILENOTIFY_TARGETEXISTS*/,"驱动安装过程中,如果要拷贝的文件已用SP_COPY_NOOVERWRITE标志进行列队,且该文件在目标目录中已经存在时,该通知发送给回调例程。它可被单独或联合发送到回调例程(通过或操作:SPFILENOTIFY_LANGMISMATCH 与/或 SPFILENOTIFY_TARGETNEWER通知)",   0x00040000/*_SPFILENOTIFY_TARGETNEWER*/,"驱动安装过程中,驱动安装过程中,如果要拷贝的文件已用P_COPY_NEWER或SP_COPY_FORCE_NEWER标志进行列队,且较新版本在文件中已经存在时,该通知发送给回调例程。它可被单独或联合发送到回调例程(通过或操作:SPFILENOTIFY_LANGMISMATCH 与/或 SPFILENOTIFY_TARGETEXISTS通知)",   0x0000/*_WM_NULL*/,"空消息,可检测程序是否有响应等",   0x0001/*_WM_CREATE*/,"新建一个窗口",   0x0002/*_WM_DESTROY*/,"销毁一个窗口",   //IDSTR(0x0004),"",   0x0003/*_WM_MOVE*/,"移动一个窗口",   0x0005/*_WM_SIZE*/,"改变一个窗口的大小",   0x0006/*_WM_ACTIVATE*/,"一个窗口被激活或失去激活状态",   0x0007/*_WM_SETFOCUS*/,"将焦点转向一个窗口",   0x0008/*_WM_KILLFOCUS*/,"使一个窗口失去焦点",   //IDSTR(0x0009),"",   0x000A/*_WM_ENABLE*/,"使一个窗口处于可用状态",   0x000B/*_WM_SETREDRAW*/,"设置窗口是否能重绘",   0x000C/*_WM_SETTEXT*/,"设置一个窗口的文本",   0x000D/*_WM_GETTEXT*/,"复制窗口的文本到缓冲区",   0x000E/*_WM_GETTEXTLENGTH*/,"得到窗口的文本长度(不含结束符)",   0x000F/*_WM_PAINT*/,"窗口重绘",   0x0010/*_WM_CLOSE*/,"用户关闭窗口时会发送本消息,紧接着会发送WM_DESTROY消息",   0x0011/*_WM_QUERYENDSESSION*/,"关机或注销时系统会按优先级给各进程发送WM_QUERYENDSESSION,告诉应用程序要关机或注销了",   0x0012/*_WM_

引用 1 楼 user-3 的回复:就找到一个，代码搜索关键字 #define WM_DWMNCRENDERINGCHANGED        0x031F 谢谢哈，不过你是怎么搜的？在谷歌搜的吗？我百度“WM_   0x31f也没找到”

引用 楼主 六道佩恩 的回复:以查看winuser.h，没找到，想在微软网站搜又不知道怎么搜，消息值是0x31f、0xc0fc、0xc052 消息值是什么意义，要看应用程序怎么解释，windows只是预定义，分发消息处理函数，而且消息值可以自定义，不是消息值都可以查到对应的说明的，你用spy看消息，如果没有出来对应的解释就说明应该是自定义消息


Question: c语言读取txt换行数据存入结构体中

仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

#include <stdio.h> #include <string.h> #include<stdlib.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数值 #define MAXNL 1024   //最大长度 typedef  struct  DATA { 	int      ID;   //学号 	int     shuxue;//数学 	int      yuwen;//语文 }; DATA data[MAXNL]; FILE *f; int st, n, i; char ln[MAXCPL]; int main()  { 	f = fopen("data.txt", "r"); 	if (NULL == f) 	{ 		printf("Can not open file data.txt!\n"); 		return 1; 	} 	st = 0; 	n = 0; 	while (1)  	{ 		if (NULL == fgets(ln, MAXCPL, f))  		break; 		printf("%s\n",ln); 		if (st == 0) 		{ 			if (0 == strcmp(ln, "DATA\n")) 			st = 1; 		} 		else if (st == 1) 		{  			if (1 == sscanf(ln, "int ID=%d", &data[n].ID)) 			{ 				n++; 				if (n >= MAXCITY )  				break; 			} 		} 	} 	fclose(f); 	 	for (i = 0; i<n; i++) 	{ 		printf("data[%d].ID=%d\n", i,data[i].ID); 	} 	system("pause"); 	return 0; }  我用的这个代码，只能读取data[0]=1,data[1]=2

抱歉，fscanf不下，

引用 5 楼 qq_34263292的回复:用fscanf(FILE*,char*,…) 和scanf差不多，不过是从文件中读取

用fscanf(FILE*,char*,…)

引用 2 楼 qq_34263292的回复:scanf("DATA { int ID=%d; int shuxue=%d; int yuwen=%d; },"data[i.]ID,data[i].shuxue,data[i].yuwen) 是sscanf吗？？

typedef后应该有两个参数:struct DATA和DATA，


Question: c 语言结构体【学生管理系统】的3个问题，求解答

在add函数里，for循环从sdtNum开始（;sdtNum<MAX_SDT;sdtNum++） 你的addup 函数有点混乱，应该可以简化一下

引用 3 楼 user-1的回复:函数外面定义一个int sdtNum; 每增加一个学生，sdtNum++; 在print(里)，for循环条件由i<101变成i<sdtNum. 谢谢，那怎么实现信息的再增加呀？而不是增加后，就覆盖上次的信息

引用 1 楼 user-1的回复:加个学生数量变量就可以消除无用的排列了 怎么加？请大神明示，我不太会

加个学生数量变量就可以消除无用的排列了


Question: 数据交集

这题只要一排序，你就不要想“运行速度最优”~~~

引用 8 楼 六道佩恩 的回复:[quote=引用 7 楼 德意志战车 的回复:] [quote=引用 6 楼 六道佩恩 的回复:] [quote=引用 5 楼 德意志战车 的回复:]  [quote=引用 4 楼 六道佩恩 的回复:] 你这样：把两个数组拷贝一份，然后合并，然后排序，然后遍历，如果一个数出现两次，那就是交集的 这是什么算法，是最优的吗?时间复杂度是多少？[/quote] 临时为你想的算法，是不是最优我不知道。 数组合并后以及遍历相同的数，这部分都是O(n)，终点在排序，就看你怎么排，数据范围小，推荐计数排序，最终时间复杂度为O(n)，空间复杂度在拷贝数组时用得多，O(n)，如果数的范围稍大，推荐基数排序，时间复杂度也是O(n)，消耗内存是数组的十倍，空间复杂度O(n)；如果希望消耗内存小，那就用希尔排序，时间复杂度O(n^1.3)，空间仅消耗一个数组，空间复杂度O(n)。[/quote] 文件里有几百万个数据，数组能放进去吗？[/quote] 打算你有500万个数据，每个数据占一个int，那么占不过2000万字节，不过区区20MB，直接申请数组的话可能不行，用malloc的话，只要你是家用计算机，申请个1GB都是可以的，何况区区20MB。如果你是微机，内存不够，当然，前提得闪存够大，总不可能你本来的数据都存不下吧，这种情况的微机下，你就分段处理，写进闪存，当然，速度就很慢了。如果20MB你都不够，那么前面大佬提议的512MB你就更不够了。[/quote] 明白了，我原先不知道用malloc申请

引用 7 楼 德意志战车 的回复:[quote=引用 6 楼 六道佩恩 的回复:] [quote=引用 5 楼 德意志战车 的回复:]  [quote=引用 4 楼 六道佩恩 的回复:] 你这样：把两个数组拷贝一份，然后合并，然后排序，然后遍历，如果一个数出现两次，那就是交集的 这是什么算法，是最优的吗?时间复杂度是多少？[/quote] 临时为你想的算法，是不是最优我不知道。 数组合并后以及遍历相同的数，这部分都是O(n)，终点在排序，就看你怎么排，数据范围小，推荐计数排序，最终时间复杂度为O(n)，空间复杂度在拷贝数组时用得多，O(n)，如果数的范围稍大，推荐基数排序，时间复杂度也是O(n)，消耗内存是数组的十倍，空间复杂度O(n)；如果希望消耗内存小，那就用希尔排序，时间复杂度O(n^1.3)，空间仅消耗一个数组，空间复杂度O(n)。[/quote] 文件里有几百万个数据，数组能放进去吗？[/quote] 打算你有500万个数据，每个数据占一个int，那么占不过2000万字节，不过区区20MB，直接申请数组的话可能不行，用malloc的话，只要你是家用计算机，申请个1GB都是可以的，何况区区20MB。如果你是微机，内存不够，当然，前提得闪存够大，总不可能你本来的数据都存不下吧，这种情况的微机下，你就分段处理，写进闪存，当然，速度就很慢了。如果20MB你都不够，那么前面大佬提议的512MB你就更不够了。

引用 6 楼 六道佩恩 的回复:[quote=引用 5 楼 德意志战车 的回复:]  [quote=引用 4 楼 六道佩恩 的回复:] 你这样：把两个数组拷贝一份，然后合并，然后排序，然后遍历，如果一个数出现两次，那就是交集的 这是什么算法，是最优的吗?时间复杂度是多少？[/quote] 临时为你想的算法，是不是最优我不知道。 数组合并后以及遍历相同的数，这部分都是O(n)，终点在排序，就看你怎么排，数据范围小，推荐计数排序，最终时间复杂度为O(n)，空间复杂度在拷贝数组时用得多，O(n)，如果数的范围稍大，推荐基数排序，时间复杂度也是O(n)，消耗内存是数组的十倍，空间复杂度O(n)；如果希望消耗内存小，那就用希尔排序，时间复杂度O(n^1.3)，空间仅消耗一个数组，空间复杂度O(n)。[/quote] 文件里有几百万个数据，数组能放进去吗？

引用 5 楼 德意志战车 的回复:[quote=引用 4 楼 六道佩恩 的回复:] 你这样：把两个数组拷贝一份，然后合并，然后排序，然后遍历，如果一个数出现两次，那就是交集的 这是什么算法，是最优的吗?时间复杂度是多少？[/quote] 临时为你想的算法，是不是最优我不知道。 数组合并后以及遍历相同的数，这部分都是O(n)，终点在排序，就看你怎么排，数据范围小，推荐计数排序，最终时间复杂度为O(n)，空间复杂度在拷贝数组时用得多，O(n)，如果数的范围稍大，推荐基数排序，时间复杂度也是O(n)，消耗内存是数组的十倍，空间复杂度O(n)；如果希望消耗内存小，那就用希尔排序，时间复杂度O(n^1.3)，空间仅消耗一个数组，空间复杂度O(n)。

引用 4 楼 六道佩恩 的回复:你这样：把两个数组拷贝一份，然后合并，然后排序，然后遍历，如果一个数出现两次，那就是交集的 这是什么算法，是最优的吗?时间复杂度是多少？

建立一个512MB的数组，共4G bits代表数字0~4294967295，初始置0 顺序读文件1，把每一个数字对应的数组位置1 顺序读文件2，如果数字对应的数组位是1，把该数字写入输出文件

引用 1 楼 早打大打打核战争 的回复:位图法直接索引整个int32范围，需要消耗512MB内存 我可以理解成这个程序想要写出来需要位图法吗？

位图法直接索引整个int32范围，需要消耗512MB内存


Question: 初学者，请教字段是什么意思？字段宽度是什么意思？

表的基础知识  表是包含数据库中所有数据的数据库对象。表定义是一个列集合。数据在表中的组织方式与在电子表格中相似，都是按行和列的格式组织的。每一行代表一条唯一的记录，每一列代表记录中的一个字段。例如，在包含公司雇员数据的表中，每一行代表一名雇员，各列分别代表该雇员的信息，如雇员编号、姓名、地址、职位以及家庭电话号码等。

struct struct [tag] { member-list } [declarators];  [struct] tag declarators;  The struct keyword defines a structure type and/or a variable of a structure type. See Anonymous Structures and Unsized Array in a Structure for more information.  A structure type is a user-defined composite type. It is composed of "fields" or "members" that can have different types.  In C++, a structure is the same as a class except that its members are public by default.  Using a Structure  In C, you must explicitly use the struct keyword to declare a structure. In C++, this is unnecessary once the type has been defined.  You have the option of declaring variables when the structure type is defined by placing one or more comma-separated variable names between the closing brace and the semicolon.  For related information, see class, union, and enum.  Example 1  struct PERSON              // Declare PERSON struct type {    int   age;              // Declare member types    long  ss;    float weight;    char  name[25]; } family_member;           // Define object of type PERSON     struct PERSON sister;   // C style structure declaration    PERSON brother;         // C++ style structure declaration     sister.age  = 13;       // assign values to members    brother.age =  7; Structure variables can be initialized. The initialization for each variable must be enclosed in braces.  Example 2  struct POINT            // Declare POINT structure {    int x;               // Define members x and y    int y; } spot = { 20, 40 };    // Variable spot has                         //     values x = 20, y = 40 struct POINT there;     // Variable there has POINT type struct CELL             // Declare CELL bit field {    unsigned character  : 8;  // 00000000 ????????    unsigned foreground : 3;  // 00000??? 00000000    unsigned intensity  : 1;  // 0000?000 00000000    unsigned background : 3;  // 0???0000 00000000    unsigned blink      : 1;  // ?0000000 00000000 } screen[25][80];       // Array of bit fields


Question: C语言大佬求教 哪里错了

引用 2 楼 user-4的回复:有些比较旧的编译器要求把变量声明都放在函数最前面 谢谢 可以了。。。。。。。。。

引用 4 楼 Cokie℡的回复:你试试把change的声明放到开头去，单独写一个int change； 可以了 谢谢。。。。。。。。

引用 3 楼 csucxy的回复:将change的声明提前。 老的C要求局部变量的声明在块的开头，如果你用的是高版本的VS应该没有这个问题， 好了😁谢谢你。。。。。。。。

“错误.c”改名为“错误.cpp”再试试。

你试试把change的声明放到开头去，单独写一个int change；

有些比较旧的编译器要求把变量声明都放在函数最前面

救命头疼 哪位大佬帮帮忙


Question: 萌新求助——关于c语言的疑问

谢谢(*°∀°)=3果然是这个问题，你们棒棒棒棒哒

scanf()和puts()函数都是在头文件<stdio.h>里面的，加上#include<stdio.h>就行了，下面报错基本都是这个原因

加一下<stdio.h>头文件试一下

引入c语言标准io头文件 stdio.h


Question: 求大佬帮忙看下

英语也是一门计算机语言的说。  关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

谢谢各位已经解决，是名字错了

你的结构体在哪。。

估计是data

关键的代码没贴出来，你的结构体定义里有没有date呢？还是定义的是data但是函数里引用的是date

data和date不是一回事！

typedef struct student{int date, struct student * next} link;


Question: C语言BC31问题：Linker Error: Undefined symbol _main in module c0.ASM

bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028


Question: c 语言结构体系统，【学生管理系统】信息增加重叠，如何改正

你需要了解一下堆栈，你就知道为什么每次只能存一组数据了。 还有你的思路我认为不太好，如果存一个结构体数据的话，就算用一个单链表也是很简单很方便的，你这种思路我不是很理解。。

引用 2 楼 weixin_42911598的回复:你需求都没写清楚，你增加信息是增加什么信息，直接遍历你的链表做判断，不管是显示信息还是重叠什么的判断直接操作链表指针不就行了。。 我事想来写一个，没有只有指针，链表结构体【数组】的程序，增加信息的话。现在我输入第一个信息，可以查询到第一组信息，但输入第二个信息的话，查询只能查询到第二组信息，没有第一组信息了。这就让我头疼的地方了。大神可以帮我解答一下吗？，

每次的输入先放到一个临时变量里，每次输入之后都去已经输入过得信息查找，如果查找到则不想student[]里存放并给予提示。 另外，信息重叠是指那个信息重叠不行，查找功能里就去比较那个信息。


Question: MODBUS协议

引用 3 楼 轻箬笠的回复:http://blog.gkong.com/freshair_64760.ashx是不是这种啊 可以可以，非常的流批，感谢

引用 1 楼 636f6c696e的回复:https://download.csdn.net/download/charliecha1982/9623230 大佬，有没有免费的，这一个再让我开个会员，要不我给你转现金，


Question: 输入3个科目4个人的得分，写出得分、和、平均分，再求出各科目的平均分

#include<stdio. h> void print (int [][3]) ; int main(void){     int mem[4][3];     for (int i=0;i<4;i++){         printf("*** Member%d ***\n",i+1) ;         for (int j=0;j<3;j++) {               printf("Input point of subject%d :", j+1) ;               scanf("%d", mem[i+]j);               if (mem[i][j]<0 || mem [i][j]>100) {                        printf("\nInput point 0-100. \n") ;                        j--;                  }          }     }    print(mem;      return 0; } void print( int m[][3]) {          ..... .  . }e;

你要我们看啥。。

那改什么？你的代码为啥补贴出来呢？

这是要求最后实行的结果，但不会写代码


Question: 为什么运行程序后只有输入，没有输出

#include <stdio.h>  int main(void) {    int i, n, a[50], t;    scanf("%d", &n);     for (i = 0; i < n; i++)    {       scanf("%d", &a[i]);    }     for (i = 0; i < n / 2; i++)    {       t = a[i];       a[i] = a[n-i-1];       a[n-i-1] = t;    }     for (i = 0; i < n; i++)       printf("%d ", a[i]);     return 0; }

后面有明确赋值的情况下不需要初始化，核心问题有两个： 1. 最后一个for循环误加分号：for(i=0;i<=n;i++); 2.一般n个元素最后一个的索引是n-1而不是n，建议你所有for循环中的i<=n改成i<n，不然你的程序结果是和预期不符的 引用 1 楼  的回复:1.数组a[50]没有初始化； 2.这个程序是想要交换数组内元素的位置？ a[3] = {1, 2, 3} ==》 a[3] = {3, 2, 1}

后面有明确赋值的情况下不需要初始化，核心问题有两个： 1. 最后一个for循环误加分号：for(i=0;i<=n;i++); 2.一般n个元素最后一个的索引是n-1而不是n，建议你所有for循环中的i<=n改成i<n 引用 1 楼  的回复:1.数组a[50]没有初始化； 2.这个程序是想要交换数组内元素的位置？ a[3] = {1, 2, 3} ==》 a[3] = {3, 2, 1}

#include<stdio.h> int main() {     int i,n,a[50],t;     scanf("%d",&n);     if (n >= 50)    //防止数组越界         return 0;     printf("\n");     for(i=0;i<=n;i++)         scanf("%d",&a[i]);     for(i=0;i<=n/2;i++)     {         t=a[i];         a[i]=a[n-i-1];         a[n-i-1]=t;     }     for(i=0;i<=n;i++)    //去掉;,否则这里只会循环执行不到printf语句         printf("%d",a[i]);      return 0; } 供参考～


Question: 通过bpf收发数据，用write函数发送数据，发现此函数有时候会耗时较大

開綫程做咯，這樣主綫程就可以繼續計時

不太清楚你这是要干嘛，通信的方式不是有很多吗，写文件是在写闪存或磁盘了，速度比较慢，你完全可以定义一个数组来交互数据啊，或者用管道

只是在4000多次周期中会出现3到4次耗时达到6ms，其他都是小于1ms的


Question: 有关C语言二维指针的求助

引用 8 楼 636f6c696e 的回复：推荐的做法是二维指针再申请指针，后进行字符串拷贝： for (i = 0; i < 3; i++) {     //Line[0].s[i] = a[i];     Line[0].s[i] = malloc(strlen(a[i]) + 1);     strcpy(Line[0].s[i], a[i]); }谢谢，我也是刚接触二维指针，想尝试着用用

补充下，不建议函数返回一个局部变量地址给外部使用，函数返回后可能会释放栈内存，你在外面使用可能会出问题 引用 6 楼 ClaudeWax 的回复:[quote=引用 5 楼 636f6c696e 的回复：]参考： #include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct { char **s; } Me;  Me Line[1];  void init() { char *a[] = { "123","2345","34567"}; Line[0].s = malloc(sizeof(char *) *3); int i; for (i = 0; i < 3; i++)     Line[0].s[i] = a[i]; }  int main() { init(); int i; for (i = 0;i < 3;i++) { printf("%s\n", Line[0].s[i]); } system("pause"); } [quote=引用 4 楼 ClaudeWax 的回复:] [quote=引用 3 楼 雾夕miku 的回复：]#include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct  {     char ** s; }me;  me miku[1];  void init() {     char *p="123";     miku[0].s=p; }  int main() {     init();     printf("%s",miku[0].s);     system("pause"); } 这样不要for，好像也可以吧。萌新一枚\(//∇//)\我这里123是随便写的，其实应该是几十个长度不一的字符串，功能是希望根据s[i]输出不同位置的字符串。不过还是谢谢你提供了一种新的思路[/quote][/quote]一针见血，起初我尝试给s分配空间但并没有成功，应该是我只分配了一个空间的缘故。感谢[/quote]

引用 5 楼 636f6c696e 的回复：参考： #include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct { char **s; } Me;  Me Line[1];  void init() { char *a[] = { "123","2345","34567"}; Line[0].s = malloc(sizeof(char *) *3); int i; for (i = 0; i < 3; i++)     Line[0].s[i] = a[i]; }  int main() { init(); int i; for (i = 0;i < 3;i++) { printf("%s\n", Line[0].s[i]); } system("pause"); } [quote=引用 4 楼 ClaudeWax 的回复:] [quote=引用 3 楼 雾夕miku 的回复：]#include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct  {     char ** s; }me;  me miku[1];  void init() {     char *p="123";     miku[0].s=p; }  int main() {     init();     printf("%s",miku[0].s);     system("pause"); } 这样不要for，好像也可以吧。萌新一枚\(//∇//)\我这里123是随便写的，其实应该是几十个长度不一的字符串，功能是希望根据s[i]输出不同位置的字符串。不过还是谢谢你提供了一种新的思路[/quote][/quote]一针见血，起初我尝试给s分配空间但并没有成功，应该是我只分配了一个空间的缘故。感谢

参考： #include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct { char **s; } Me;  Me Line[1];  void init() { char *a[] = { "123","2345","34567"}; Line[0].s = malloc(sizeof(char *) *3); int i; for (i = 0; i < 3; i++)     Line[0].s[i] = a[i]; }  int main() { init(); int i; for (i = 0;i < 3;i++) { printf("%s\n", Line[0].s[i]); } system("pause"); } 引用 4 楼 ClaudeWax 的回复:[quote=引用 3 楼 雾夕miku 的回复：]#include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct  {     char ** s; }me;  me miku[1];  void init() {     char *p="123";     miku[0].s=p; }  int main() {     init();     printf("%s",miku[0].s);     system("pause"); } 这样不要for，好像也可以吧。萌新一枚\(//∇//)\我这里123是随便写的，其实应该是几十个长度不一的字符串，功能是希望根据s[i]输出不同位置的字符串。不过还是谢谢你提供了一种新的思路[/quote]

引用 3 楼 雾夕miku 的回复：#include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct  {     char ** s; }me;  me miku[1];  void init() {     char *p="123";     miku[0].s=p; }  int main() {     init();     printf("%s",miku[0].s);     system("pause"); } 这样不要for，好像也可以吧。萌新一枚\(//∇//)\我这里123是随便写的，其实应该是几十个长度不一的字符串，功能是希望根据s[i]输出不同位置的字符串。不过还是谢谢你🙏🏻提供了一种新的思路

引用 1 楼 六道佩恩 的回复：Line[0].s[0]是一个char型整数我想通过那个for，使用s将三个字符串都输出，有什么高见吗？使用s[i]的话总会报错


Question: 求大神帮帮忙啊――只有思路也可以啊

这道题水很深滴： ●行尾到底是\r\n,\r,\n? ●一行最多多少个字符？ ●遇到汉字怎么办？ ●遇到阿拉伯文怎么办？ ●遇到纯二进制文件怎么办？ ●文件中字符编码到底是啥？ ●……  参考：https://blog.csdn.net/Peak1949/article/details/7179298

就是要做一个简单的排版 要求每行18个字符 首行缩进两个字符 然后在统计行数

就是要做一个简单的段落排版

引用 4 楼  的回复:请问每行18个字符，遇到回车换行，首行缩进怎么实现 没懂你意思，这个程序的逻辑主要是，复制一个文字到新文件，如果它是\n，就说明该换行了，此时写入一个行号到新文件。如果有没明白的，把你要处理的数据贴出来。

引用 2 楼 六道佩恩的回复: #include "stdio.h" int main( int argc, char* argv[] ) { 	if( argc != 3 ) 		return 0; 	 	FILE *p= fopen(argv[1], "r"); 	FILE *q= fopen(argv[2], "w"); 	int c=0,i=1; 	fprintf(q,"%d\t",i++); 	while( (c=fgetc(p)) != EOF ) 	{	 		fputc(c, q); 		if( c=='\n' ) 			fprintf(q,"%d\t",i++); 	} 	 	fclose(p); 	fclose(q); 	return 0; }  使用方式是：程序名  原文件名  新文件名 请问每行18个字符，遇到回车换行，首行缩进怎么实现

请问每行18个字符，遇到回车换行，首行缩进怎么实现

利用getLine() 读取data.txt到二维数组中，然后给数组中的每一行数据加上行号，重新写入到这个文件里面


Question: C语言链表

谢谢赵老师，这个过程我明白，就是因为现在存放在数据域的是指针，那么它的操作是不是和存放数据的结构体有些差异。

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

Node * head   这是用来遍历链表定义的临时量，就是一个链表指针，next存指向下一个元素的地址

一层循环做什么排序？  p->data =head->data;      head->data =tmp->data;      tmp->data=head; 这几句看不懂，data是保存数据的，怎么连到head上去呢，next做什么用呢？

是不是这个冒泡差点东西


Question: c语言小白，用xcode写了几行代码，总是运行不出结果。

贴出你的代码，按照楼上说的改绝对不会有问题 引用 3 楼 qq_45401357 的回复:[quote=引用 1 楼 自信男孩的回复:]两处问题： 1.输入改成： scanf("%f%f", &a, &b); 2. max函数里z定义成float类型； 然后在试一下  另外，为了更好的比较浮点数，建议参考如下链接内容： https://blog.csdn.net/kingdom54/article/details/86566925 谢谢，还是不行，变成一堆❓❓[/quote]

他们说的没错，就是scanf的问题，是你自己没改对，你之所以敲回车没反应，是因为你敲的回车都被scanf里的"\n"全部匹配掉了，所以你要注意三点： 1. scanf后面的双引号里，最后不要加空格或\t、\n，即写为"%f\n%f"或"%f%f"或"%f %f" 2. scanf后面的双引号里，空格、\t、\n等效，你的"%f\n%f"等价于"%f %f" 3. scanf后面的双引号怎么写，你就要怎么输入，在"%f %f"的情况下，你应该输入“数 空格 数” 如果还有问题，粘贴代码

试了，还是不行 谢谢…

引用 1 楼 自信男孩的回复:两处问题： 1.输入改成： scanf("%f%f", &a, &b); 2. max函数里z定义成float类型； 然后在试一下  另外，为了更好的比较浮点数，建议参考如下链接内容： https://blog.csdn.net/kingdom54/article/details/86566925 谢谢，还是不行，变成一堆❓❓

改成scanf("%f %f", &a, &b);试试


Question: 请教一个关于free()函数的问题

引用 9 楼 六道佩恩 的回复:[quote=引用 8 楼 牧牛童子 的回复:] [quote=引用 3 楼 六道佩恩 的回复:] 不管怎样，只要你free的时候给的是申请的内存的首地址即可，你的程序运行结果是，那么就可行  也就是说，free是首地址，至于是什么变量名，无所谓，是么？（两个指针指向同一个地址，free其中一个，就可以？）[/quote] 是的，你用malloc申请地址时，系统为了知道这块内存是你用的，会标记这块内容是吧，标记使用的程序、首地址、长度等等（猜的），是吧，那么free的参数就是一个首地址，告诉系统你要释放这块地址，系统根据这个首地址就知道是哪块内存、多长，解除后，又可以给其他程序用了。 何止是变量名，变量名有什么区别？你只要给它这个首地址值就行，唯一要注意的就是参数的类型，因为free函数内部是用一个void*类型的形参来接收的这个参数，你要传指针型，或者强制转为指针型，比如你已经知道首地址是0x010100，那么你甚至可以写free( (void*)0x010100 )[/quote]  非常感谢！

引用 3 楼 六道佩恩 的回复:不管怎样，只要你free的时候给的是申请的内存的首地址即可，你的程序运行结果是，那么就可行  也就是说，free是首地址，至于是什么变量名，无所谓，是么？（两个指针指向同一个地址，free其中一个，就可以？）

引用 8 楼 牧牛童子 的回复:[quote=引用 3 楼 六道佩恩 的回复:] 不管怎样，只要你free的时候给的是申请的内存的首地址即可，你的程序运行结果是，那么就可行  也就是说，free是首地址，至于是什么变量名，无所谓，是么？（两个指针指向同一个地址，free其中一个，就可以？）[/quote] 是的，你用malloc申请地址时，系统为了知道这块内存是你用的，会标记这块内容是吧，标记使用的程序、首地址、长度等等（猜的），是吧，那么free的参数就是一个首地址，告诉系统你要释放这块地址，系统根据这个首地址就知道是哪块内存、多长，解除后，又可以给其他程序用了。 何止是变量名，变量名有什么区别？你只要给它这个首地址值就行，唯一要注意的就是参数的类型，因为free函数内部是用一个void*类型的形参来接收的这个参数，你要传指针型，或者强制转为指针型，比如你已经知道首地址是0x010100，那么你甚至可以写free( (void*)0x010100 )

谢谢各位热心帮助解惑！！！

引用 5 楼 nice_cxf 的回复:这样写没问题，但是一般来说，在那里申请就应该在那里释放，最好是在main函数先malloc，然后把指针传给函数，然后main函数free，这样查问题比较容易，如果你这个函数封装在库里面，别人调用了，但是没free就内存泄漏了，这种问题很难检查的  我从github下载了个3DES的源码，就是在函数里面malloc()，要我在外面调用时free();。夸函数体的玩法，心里没底。

可以这么写，没问题

可以这么写，只要申请的地址不变，即free的参数（指针）是申请的地址值，free都是没问题的

通常情况下，可以这么写。 特殊情况，比如dll调用，这种写法会有问题


Question: 求大神给看看为什么我的代码运行不了？？敲回车以后只换行不运行

你的问题是死循环，while每次循环下需要将p的值还原成1 #include<stdio.h> int main() { int n;int m;int sum=0;int count=0;int t=2;int a; scanf("%d %d",&n,&m); int i=2;int p=1; while(count<m) { p = 1; for(t=2;t<i;t++) { a=i%t; if(a==0) { p=0; break; } } if(p==1) { count++; if(count>=n) { sum=sum+i; } }  i++; } printf("%d\n",sum);  return 0; } 引用 5 楼 Na2So4_ 的回复:[quote=引用 2 楼 weixin_40290083的回复:]i被初始化为2，t在for循环中初始化为2，循环条件t<2，所以for循环没有运行。 另外也不知道你的程序要实现什么功能，如果代码有逻辑很难读懂，建议你文字描述功能 可是for循环没有运行 while循环也要运行的啊，[/quote]

引用 2 楼 weixin_40290083的回复:i被初始化为2，t在for循环中初始化为2，循环条件t<2，所以for循环没有运行。 另外也不知道你的程序要实现什么功能，如果代码有逻辑很难读懂，建议你文字描述功能 可是for循环没有运行 while循环也要运行的啊，

引用 2 楼 weixin_40290083的回复:i被初始化为2，t在for循环中初始化为2，循环条件t<2，所以for循环没有运行。 另外也不知道你的程序要实现什么功能，如果代码有逻辑很难读懂，建议你文字描述功能 我们认为2是第一个素数，3是第二个素数，5是第三个素数，依次类推。 现在，给定两个整数n和m，0<n<=m<=200，你的程序要计算第n个素数到第m个素数之间所有的素数的和，包括第n个素数和第m个素数。  这个是题目

可以运行啊。 你输入1 2，然后回车就有输出了。 如果console一闪而过，可以在最后面加几个getchar();


Question: 输入一个数字，精确小数点后一位，输出若干个5，若干个1.若干个0.5，若干个0.1

引用 12 楼 nice_cxf 的回复：重新排了下版，还有一个错误，应该是>=10  #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { 	char buf[32]; 	int value1,value2;  	scanf("%s", buf); 	sscanf(buf,"%d.%d",&value1,&value2); 	while (value2>=10) 	   value2/=10; 	printf("你输入的数字是%d.%d\n", value1,value2); 	printf("\n"); 	printf("一共有%d个5", (int)value1 / 5); 	printf("\n"); 	printf("一共有%d个1", (int)value1 % 5); 	printf("\n"); 	printf("一共有%d个0.5", (int)value2 / 5); 	printf("\n"); 	printf("一共有%d个0.1", (int)value2 % 5); 	printf("\n"); }  就是您这个能帮我做到四舍五入吗，然后精确一位就可以了，我刚才改了一下有输出了

是不是缺少输出呀

您好，程序是没问题，调试的时候，输入一个数完，就跳出主界面了，这是什么问题？？

不要用浮点，会有精度误差，按字符串读进来   #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>  int main(void) { char buf[32]; int value1,value2;  scanf("%s", buf); sscanf(buf,"%d.%d",&value1,&value2); while (value2>10)    value2/=10; printf("你输入的数字是%d.%d\n", value1,value2); printf("\n"); printf("一共有%d个5", (int)value1 / 5); printf("\n"); printf("一共有%d个1", (int)value1 % 5); printf("\n"); printf("一共有%d个0.5", (int)value2 / 5); printf("\n"); printf("一共有%d个0.1", (int)value2 % 5); printf("\n"); return 0; }

不好意思哦，语文高考没及格！

语文表述太差了吧，你的题目哪里有表达这意思？ 引用 6 楼 Valiant_Z 的回复:[quote=引用 5 楼 轻箬笠 的回复：]还要四舍五入啊。 #include <Windows.h> #include <stdio.h>  int aa(float a) { 	int c = (int)a; 	float d = a - (float)c; 	printf("一共有%d个0.5\n", (int)(d * 10 + 0.5) / 5); 	printf("一共有%d个0.1\n", (int)(d * 10 + 0.5)); 	system("pause"); 	return 0; }  int main() { 	float a;  	scanf("%f", &a); 	printf("你输入的数字是%.1f\n", a); 	printf("\n"); 	printf("一共有%d个5", (int)(a + 0.5) / 5); 	printf("\n"); 	printf("一共有%d个1", (int)(a + 0.5)); 	printf("\n"); 	return aa(a);  }真的不好意思，我以为你理解我的意思，那个他分出来这四个数之和要是你精确的数，你好像只是满足了我要多少个5，多少个1，多少个0.5，多少个0.1，真的麻烦你了 [/quote]

引用 7 楼 轻箬笠 的回复：你是想拆分这个输入的数字，然后可以拼凑回原来的数？是的

你是想拆分这个输入的数字，然后可以拼凑回原来的数？

引用 5 楼 轻箬笠 的回复：还要四舍五入啊。 #include <Windows.h> #include <stdio.h>  int aa(float a) { 	int c = (int)a; 	float d = a - (float)c; 	printf("一共有%d个0.5\n", (int)(d * 10 + 0.5) / 5); 	printf("一共有%d个0.1\n", (int)(d * 10 + 0.5)); 	system("pause"); 	return 0; }  int main() { 	float a;  	scanf("%f", &a); 	printf("你输入的数字是%.1f\n", a); 	printf("\n"); 	printf("一共有%d个5", (int)(a + 0.5) / 5); 	printf("\n"); 	printf("一共有%d个1", (int)(a + 0.5)); 	printf("\n"); 	return aa(a);  }真的不好意思，我以为你理解我的意思，那个他分出来这四个数之和要是你精确的数，你好像只是满足了我要多少个5，多少个1，多少个0.5，多少个0.1，真的麻烦你了

引用 3 楼 轻箬笠 的回复：#include <Windows.h> #include <stdio.h>  int aa(float a) { 	int c = (int)a; 	float d = a - (float)c; 	printf("一共有%d个0.5\n", (int)(d * 10) / 5); 	printf("一共有%d个0.1\n", (int)(d * 10)); 	system("pause"); 	return 0; }  int main() { 	float a;  	scanf("%f", &a); 	printf("你输入的数字是%.1f\n", a); 	printf("\n"); 	printf("一共有%d个5", (int)a / 5); 	printf("\n"); 	printf("一共有%d个1", (int)a); 	printf("\n"); 	return aa(a);  }这里面没有四舍五入吗，可能我要输入的是有多位小数的，不好意思，我没说清楚

引用 1 楼 轻箬笠 的回复：你的测试输入是啥？就是输入一个20以内的数就可以了

你的测试输入是啥？


Question: 算法

求解 大佬


Question: PTA上的买火车票问题，总是通不过

因为刚刚开始用，大的效果还不是很清楚。就目前而言在上面练习会让自己更注意细节和算法的优化吧（因为会运行限制时间和内存）

类似pta这样的网站，刷题之后，效果如何啊？

已经解决了，居然就因为大小写！！！


Question: 求大神帮助 一个C语言金额钱枚数分类问题源代码

引用 5 楼 C_Python_life 的回复：#include <stdio.h>  int main(void){  int money;  int m10000,m5000,m1000,m500,m100,m50,m10,m5,m1;   do {  printf("金額を入力してください(0円を指定すると終了します)：");   scanf ("%d", &money);  if(money) {  m10000 = money / 10000;   money = money % 10000;     m5000 = money / 5000;   money = money % 5000;     m1000 = money / 1000;   money = money % 1000;     m500 = money / 500;   money = money % 500;    m100 = money / 100;   money = money % 100;    m50 = money / 50;   money = money % 50;    m10 = money / 10;   money = money % 10;    m5 = money / 5;   money = money % 5;    m1 = money / 1;   money = money % 1;    if (m10000>=1) printf ("10000円は%d枚必要です。\n", m10000);    if (m5000>=1) printf ("5000円は%d枚必要です。\n", m5000);    if (m1000>=1) printf ("1000円は%d枚必要です。\n", m1000);    if (m500>=1) printf ("500円は%d枚必要です。\n", m500);    if (m100>=1) printf ("100円は%d枚必要です。\n", m100);    if (m50>=1) printf ("50円は%d枚必要です。\n", m50);    if (m10>=1) printf ("10円は%d枚必要です。\n", m10);    if (m5>=1) printf ("5円は%d枚必要です。\n", m5);    if (m1>=1) printf ("1円は%d枚必要です。\n", m1);   } else     break; }while(1);   return 0; }感谢大佬 我运行试试感谢！

引用 4 楼 赵4老师 的回复：#include <stdio.h> int main(void) {     int money;     int m10000,m5000,m1000,m500,m100,m50,m10,m5,m1;     do {         printf("金額を入力してください(0円を指定すると終了します)：");         fflush(stdout);         rewind(stdin);         scanf ("%d", &money);         if (0==money) break;         m10000 = money / 10000;         money  = money % 10000;         m5000  = money / 5000 ;         money  = money % 5000 ;         m1000  = money / 1000 ;         money  = money % 1000 ;         m500   = money / 500  ;         money  = money % 500  ;         m100   = money / 100  ;         money  = money % 100  ;         m50    = money / 50   ;         money  = money % 50   ;         m10    = money / 10   ;         money  = money % 10   ;         m5     = money / 5    ;         money  = money % 5    ;         m1     = money / 1    ;         money  = money % 1    ;         if (m10000>=1) printf ("10000円は%d枚必要です。\n", m10000);         if (m5000 >=1) printf ("5000円は %d枚必要です。\n", m5000 );         if (m1000 >=1) printf ("1000円は %d枚必要です。\n", m1000 );         if (m500  >=1) printf ("500円は  %d枚必要です。\n", m500  );         if (m100  >=1) printf ("100円は  %d枚必要です。\n", m100  );         if (m50   >=1) printf ("50円は   %d枚必要です。\n", m50   );         if (m10   >=1) printf ("10円は   %d枚必要です。\n", m10   );         if (m5    >=1) printf ("5円は    %d枚必要です。\n", m5    );         if (m1    >=1) printf ("1円は    %d枚必要です。\n", m1    );     } while(1);     return 0; } 感谢大佬

我的天！         scanf("%d", &money);         if (!money)             break;

引用 1 楼 user-3 的回复：你本来就写成了死循环。结束循环无非就是修改循环控制条件，或者在循环体中进行条件判断，然后跳出循环（如break语句）具体在哪儿修改啊


Question: 求教大佬，c语言switch语句的一个疑问

怪不得，你default写错了，写成了dafault。

输入缓冲区的问题，表面上你输入的是A，其实你输入是A和\n，第二次循环时，还有这个\n没接收，于是scanf就把它接收掉了，然后继续执行下面的代码，因此就有了那个输出。不过奇怪的是，按理说应该会执行一次default才对

只是跳出了switch,但还在while循环里面。

明白了，非常感谢大佬😊

调试运行，追踪一下程序

第一次输入A回车后，其实是输入了两个字符'A'、'\n'，第一次循环时gread获得了'A'，第二次循环它获得'\n'。  另外，default错成了dafault

#include<stdio.h> int main() {     char gread;     while(1)     {         scanf("%c",&gread);         getchar();         printf("Your score:");         switch(gread)         {             case'A':printf("85~100\n");break;             case'B':printf("70~84\n");break;             case'C':printf("60~69\n");break;             case'D':printf("<60\n");break;             //dafault:printf("enter data error!\n");             default:printf("enter data error!\n");         }     }     return 0; }  供参考~  default写成dafault，单词拼写错误； 第二个问题，也是你问的问题，输入'A'之后，'\n'还在输入缓存里，被第二次scanf接收，走了default分支。 解决办法是加getchar();如上的代码～

楼主的问题在于没有加getchar()吸收回车字符 当然default分支没有加break也是问题，但不是楼主遇到问题的原因 引用 2 楼 weixin_44822001 的回复:[quote=引用 1 楼 莲生fly的回复:]break只跳出了switch语句，没有跳出while语句，应该在switch语句后面，再加一个break 没明白，哪儿加break[/quote]

{case'A':printf("85~100\n"); continue; case'B':printf("70~84\n");continue; case'C':printf("60~69\n");continue; case'D':printf("<60\n");continue; dafault: break!} break;}  这样改会不会更符合你的要求？\n");

case'A':printf("85~100\n"); continue; case'B':printf("70~84\n");continue; case'C':printf("60~69\n");continue; case'D':printf("<60\n");continue; dafault: break!b break;}  这样改会不会更符合你的要求？\n");

while里面，执行完switch之后

引用 1 楼 莲生fly的回复:break只跳出了switch语句，没有跳出while语句，应该在switch语句后面，再加一个break 没明白，哪儿加break


Question: C语言运算符优先级

C语言非零为一

3 + 8 * 4 && 5 || 6 - 4 * 6 --> 3 + 32 && 5 || 6 - 24 --> 35 && 5 || -18 --> true && true || true --> true || true --> true ==> 1

C语言中，数学运算符的优先级高于逻辑运算符，所以先算加减乘除，最后剩下两个数先&&然后和最后一个数||的逻辑运算，因为||运算的两边只要有一个1，结果就是1，所以结果为1啰。


Question: 如何给单选框或多选框分组？

win32界面可以按下面的方式分组 为对话框添加Radio1，Radio2，Radio3和Radio4。很简单，先为这些Radio Button排个顺序(这 个必须要做，比如你的一组控件有Radio1,Radio2,Radio3,就把它们的TAB顺序分别设为1,2,3,并将Radio1的Group属性 设为True，这样，当选中Radio1的时候和它关联的变量就是０，当选中Radio２的时候和它关联的变量就是１，依此类推)，就是排 列他们的TAB ORDER。在对话框资源面板上Ctrl+D，然后按你自己的理想顺序用鼠标逐个点击就可以了。不妨假设Radio1、Radio2、Radio3、 Radio4分别是1、2、3、4。Radio1和Radio3都选上Group属性，那么，1、2是一组，3、4是另外一组，因为分组的原则是在选上 Group属性的这一个开始直到碰到下一个选上Group属性的。你不妨再Ctrl+D，令Radio1、Radio2、Radio3、Radio4分别 是1、3、2、4，那么Radio1和Radio3是一组，如果m_nRadio1=1,此时是Radio3被选上而不是Radio2被选上。分好了组就 分别使用它们吧。

引用 2 楼 Intel0011 的回复://* #define UNICODE #define _UNICODE //*/ #include <Windows.h> #include <tchar.h> #include <stdio.h>  #pragma comment(lib, "gdi32") #pragma comment(lib, "user32")  #pragma comment(linker, "/subsystem:windows")  LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);  int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int iCmdShow) {    static TCHAR szAppName[] = TEXT("HelloWin");    HWND         hwnd;    MSG          msg;    WNDCLASS     wndclass;     RtlZeroMemory(&wndclass, sizeof(wndclass));    wndclass.style         = CS_HREDRAW | CS_VREDRAW;    wndclass.lpfnWndProc   = WndProc;    wndclass.hInstance     = hInstance;    wndclass.hIcon         = LoadIcon(NULL, TEXT("#32512"));    wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    wndclass.lpszMenuName  = NULL;    wndclass.lpszClassName = szAppName;     if (!RegisterClass(&wndclass))    {       MessageBox(NULL, TEXT("This program requires Windows NT series!"), szAppName, MB_ICONERROR);       return -1;    }     hwnd = CreateWindowEx(WS_EX_APPWINDOW,         // A tool window does not appear in the task bar or in the window that appears when the user presses ALT+TAB.                          szAppName,                  // window class name                          TEXT("The Hello Program"),  // window caption                          WS_OVERLAPPEDWINDOW,        // window style                          500,//CW_USEDEFAULT,              // initial x position                          200,//CW_USEDEFAULT,              // initial y position                          320,//CW_USEDEFAULT,              // initial x size                          320,//CW_USEDEFAULT,              // initial y size                          NULL,                       // parent window handle                          NULL,                       // window menu handle                          hInstance,                  // program instance handle                          NULL);                      // creation parameters     ShowWindow(hwnd, SW_SHOW);    UpdateWindow(hwnd);     {       BOOL bRet;       while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)       {          if (bRet == -1)          {             MessageBox(NULL, TEXT("GetMessage Error."), TEXT("Message"), MB_ICONERROR);             return -1;          }          else          {             TranslateMessage(&msg);             DispatchMessage(&msg);          }       }    }     //All window classes that an application registers are unregistered when it terminates.    //No window classes registered by a DLL are unregistered when the dll is unloaded.    //hInstance如果设为NULL,会从系统、全局和局部三个作用域查找    UnregisterClass(szAppName, hInstance);    return msg.wParam; }  LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {    HWND h_kuang1, h_n1, h_n2, h_n3, h_kuang2, h_n12, h_n22, h_n32;     switch (message)    {       case WM_CREATE:          //*          //画一个框          h_kuang1 = CreateWindowEx(0,                                   TEXT("button"),                                   TEXT("Group1"),                                   WS_CHILD | WS_VISIBLE | BS_GROUPBOX,                                   10,                                   10,                                   100,                                   150,                                   hwnd,     //父窗口句柄                                   (HMENU)10086,                                   (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),                                   NULL);          //*/          //添个单选按钮          h_n1 = CreateWindowEx(0,                                TEXT("button"),                                TEXT("n1"),                                WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, //在每一组中设置第一个radio的属性为WS_GROUP                                20,                                40,                                50,                                30,                                hwnd,     //父窗口句柄                                (HMENU)100,                                (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),                                NULL);                    //下面是二个单选按钮          h_n2 = CreateWindowEx(0,                                TEXT("button"),                                TEXT("n2"),                                WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,                                20,                                70,                                50,                                30,                                hwnd,     //父窗口句柄                                (HMENU)101,                                (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),                                NULL);          h_n3 = CreateWindowEx(0,                                TEXT("button"),                                TEXT("n3"),                                WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,                                20,                                100,                                50,                                30,                                hwnd,     //父窗口句柄                                (HMENU)102,                                (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),                                NULL);          h_kuang2 = CreateWindowEx(0,                                   TEXT("button"),                                   TEXT("Group2"),                                   WS_CHILD | WS_VISIBLE | BS_GROUPBOX,                                   110,                                   10,                                   100,                                   150,                                   hwnd,     //父窗口句柄                                   (HMENU)110086,                                   (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),                                   NULL);          //*/          //添个单选按钮          h_n12 = CreateWindowEx(0,                                TEXT("button"),                                TEXT("n1"),                                WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, //在每一组中设置第一个radio的属性为WS_GROUP                                120,                                40,                                50,                                30,                                hwnd,     //父窗口句柄                                (HMENU)1100,                                (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),                                NULL);                    //下面是二个单选按钮          h_n22 = CreateWindowEx(0,                                TEXT("button"),                                TEXT("n2"),                                WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,                                120,                                70,                                50,                                30,                                hwnd,     //父窗口句柄                                (HMENU)1101,                                (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),                                NULL);          h_n32 = CreateWindowEx(0,                                TEXT("button"),                                TEXT("n3"),                                WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,                                120,                                100,                                50,                                30,                                hwnd,     //父窗口句柄                                (HMENU)1102,                                (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),                                NULL);          return 0;       case WM_DESTROY:          PostQuitMessage(0);          return 0;    }    return DefWindowProc(hwnd, message, wParam, lParam); }  我知道了，说白了就是跟BS_GROUBOX没有关系，只跟WS_GROU有关系是吧？


Question: 如何看待一个不会写makefile的图像处理算法工程师？？

引用 5 楼 图像大师 的回复:[quote=引用 2 楼 走好每一步 的回复：][quote=引用 楼主 图像大师 的回复:] 公司新招了一个图像处理算法工程师，40岁左右，在北京某大型企业工作十余年。最近，我发现这个工程师，居然不会写makefile文件，make一下出错了，就傻眼了。同时，对于重复包含头文件、函数未定义等error也不知如何处理。老板花了大价钱请来的，不知如何评价。  算法是数学，编程不好不奇怪。[/quote]我们是一家规模不大的民企，搞算法的除了研究算法，还得负责把算法移植到板卡，供软件调用。看样子，大企业可能不是我们这玩法[/quote]  规模不大那就没办法了，大公司要的精和专。 小公司要啥都会的

引用 2 楼 走好每一步 的回复：[quote=引用 楼主 图像大师 的回复:] 公司新招了一个图像处理算法工程师，40岁左右，在北京某大型企业工作十余年。最近，我发现这个工程师，居然不会写makefile文件，make一下出错了，就傻眼了。同时，对于重复包含头文件、函数未定义等error也不知如何处理。老板花了大价钱请来的，不知如何评价。  算法是数学，编程不好不奇怪。[/quote]我们是一家规模不大的民企，搞算法的除了研究算法，还得负责把算法移植到板卡，供软件调用。看样子，大企业可能不是我们这玩法

不会写makefile有啥奇怪的呀。不是也有很多人不会写正则表达式吗。临到用时，百度下不就好了。

这很正常啊。比如一个研发汽车发动机的人，你要他会给汽车外壳喷漆？这不扯蛋嘛

引用 楼主 图像大师 的回复:公司新招了一个图像处理算法工程师，40岁左右，在北京某大型企业工作十余年。最近，我发现这个工程师，居然不会写makefile文件，make一下出错了，就傻眼了。同时，对于重复包含头文件、函数未定义等error也不知如何处理。老板花了大价钱请来的，不知如何评价。  算法是数学，编程不好不奇怪。

引用 楼主 图像大师 的回复:公司新招了一个图像处理算法工程师，40岁左右，在北京某大型企业工作十余年。最近，我发现这个工程师，居然不会写makefile文件，make一下出错了，就傻眼了。同时，对于重复包含头文件、函数未定义等error也不知如何处理。老板花了大价钱请来的，不知如何评价。 人家做算法的不一定要写Makefile，不会也正常，我也Makefile也得百度

搜“跟我一起写Makefile”


Question: 在linux环境下用sqlite3实现学生成绩管理系统（C语言）

希望有大佬能帮忙解决下

上面的是大概框架.下面的是sprintf.C #include<stdio.h> #include<unistd.h> int main(int argc, char const *argv[]) { 	char name[]="张三"; 	char sex[]="男"; 	int class = 1; 	char kemu[] = "形势与政策"; 	int result = 100; 	char a[300]; 	sprintf(a,"insert into student values(\"%s\",\"%s\",%d,\"%s\",%d);",name,sex,class,kemu,result); 	printf("%s\n",a ); 	return 0; }

#include "head.h" #include "sqlite3.h" int i=0; int callback(void * para, int n, char **value, char **name ) { 	int j; 	if (i==0) 	{ 		printf("当前有多少列记录%d\n",n ); 		for(j = 0; j < n; ++j) 		{ 			printf("%s\t",name[j]); 		}  		printf("\n"); 	} 	i=1; 	for(j = 0; j < n; ++j) 	{ 		printf("%s\t",value[j]); 	}  	printf("\n");  	return 0; } int callback1(void * para, int n, char **value, char **name ) {  	printf("\n");  	return 0; } int main(int argc, char const *argv[]) { 	sqlite3 *sq; 	sqlite3_open("xnsydx.db", &sq); /* code */ 	char sql[100]="create table student(name text,number int,sex text,home text,class int);"; 	sqlite3_exec(sq,sql,NULL,NULL,NULL); 	char sel[100]="select * from student;";  	sqlite3_exec(sq,sel,callback1,NULL,NULL); 	i=0; 	insert into student values("%s","%s",%d,"%s",%d);   	******1.xxxx******增加某位学生的成绩记录（姓名，班级，学号，科目名称，成绩） 	******2.xxxx******删除某位学生的记录（计网，形势与政策） 	******3.xxxx******修改某位学生的某一科的成绩 	******4.xxxx******查询，***1，查询学生的全部成绩*** 							***2，按照学生的科目进行查询*** 							***3，按照班级查看学生的成绩***（计算出平均分） 	sprintf 	snprintf 	strcpy       	sqlite3_close(sq);    	return 0; }


Question: 大佬们求助

scanf格式输入不符导致的错误，按照格式"%d，%d" 你输入的两个数字之间必须有一个中文的逗号


Question: C语言递归问题

递归就是自己调用自己，那么问题出现了，如果一直调用咋个办，难道无穷无尽。所以一定要有结束递归调用的条件，这点很重要，自己调用自己前一定要有终止的条件，否则会堆栈耗尽崩溃。

刚刚看到到的一道算法题，满足下楼主的要求。 C++不用任何算术运算符实现整数加法 int add_no_arithm(int a, int b) {     if (b == 0) return a;     int sum = a ^ b; // add without carrying     int carry = (a & b) << 1; // carry, but don’t add     return add_no_arithm(sum, carry); // recurse } 所谓递归就是自己调用自己，然后满足一定条件后，按调用层次，一层一层的返回。就比如上面的递归函数，当b==0的时候，返回上一层的add_no_arithm的值，上一层又返回它的上一层add_no_arithm的值，直到最外层add_no_arithm

你自己写一个正常的求阶乘的程序，再写一个用递归求阶乘的函数，你比较一下，然后递归的你可以逆推一下，从=1基本条件开始推。

自己网上找个简单的递归程序调试下就懂了

“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出


Question: 走台阶递归问题

引用 10 楼 早打大打打核战争 的回复:这样能够计算的n更大一些，不过就题目中的限制1 <= N <= 30，用int也是可以的 好的，十分感谢！

引用 3 楼 user-4 的回复: #include<stdio.h> int countway(int n); int main() { 	int N; 	int a; 	while (scanf("%d", &N)) { 		a = countway(N); 		printf("%d\n", a); 	} } int countway(int n){ 	if (n < 0) 		return 0; 	else if (n == 0) 		return 1; 	return countway(n - 1) + countway(n - 2) + countway(n - 3); } 非常糟糕的做法

引用 8 楼 早打大打打核战争 的回复: #include <stdio.h>  int main() {   unsigned int f[31] = {0, 1, 2, 4};    for (int i = 4; i < 31; i++) f[i] = f[i - 1] + f[i - 2] + f[i - 3];   for (int n; scanf("%d", &n) != EOF;) printf("%u\n", f[n]);    return 0; }  可以解释下为什么用unsigned定义吗。。

记忆性递归试试，还不行的话，建议检查下输出格式是否符合要求  引用 2 楼 qq_40103142 的回复:刚开始用递归，后面发现递归会超时就换成了长迭代，但是不知道为什么是wrong answer

用记忆性递归还是不行，提交显示wrong answer，但是题目上只让输出一共有多少中方法，我按照之前一般的输出格式输出的呀，不知道错在哪

#include<stdio.h> int main() { 	int N; 	int dp[40] = {0}; 	dp[0] = 1; 	for (int i = 0; i <= 30; i++) { 		dp[i + 1] += dp[i]; 		dp[i + 2] += dp[i]; 		dp[i + 3] += dp[i]; 	} 	while (scanf("%d", &N)) 	 		printf("%d\n",dp[N]); }

记忆性递归（也有人叫备忘录算法），通过存储函数结果，避免重复运算，一定程度上效率接近DP算法  #include<stdio.h> #include<string.h> int countway(int n); int save[50]; int main(){ 	memset(save, -1, sizeof(save)); 	save[0] = 1; 	int N; 	int a; 	while (scanf("%d", &N)) { 		a = countway(N); 		printf("%d\n", a); 	} } int countway(int n){ 	if (n < 0) 		return 0; 	if (save[n] != -1) 		return save[n]; 	return save[n] = countway(n - 1) + countway(n - 2) + countway(n - 3); }

这哪里是用递归算法了？


Question: 新手请多关照：有关指针指向常量的一个看法和问题。

推论我知道了。那假说对吗？

引用 10 楼 weixin_45358177 的回复:搜了，谢谢你！那你觉得我的观点对吗，下午想的一个假说？刚上完高中，也就只能通过运行结果推测还不了解的计算机原理了。 推论错 *p 赋值完全合法 标准也没有忘记相关情况

引用 9 楼 lin5161678的回复:[quote=引用 7 楼 weixin_45358177 的回复:] 谢谢，那么我的观点对吗？还有就是其实只知道C有几个标准，初学者喜欢把名词挂在嘴边，可能是我的小小的虚荣心作祟。说正事：所以未定义行为是说const这句话就没用了吗？ 百度搜索 未定义行为 就可以了[/quote] 搜了，谢谢你！那你觉得我的观点对吗，下午想的一个假说？刚上完高中，也就只能通过运行结果推测还不了解的计算机原理了。

引用 7 楼 weixin_45358177 的回复:谢谢，那么我的观点对吗？还有就是其实只知道C有几个标准，初学者喜欢把名词挂在嘴边，可能是我的小小的虚荣心作祟。说正事：所以未定义行为是说const这句话就没用了吗？ 百度搜索 未定义行为 就可以了

引用 1 楼 轻箬笠的回复:楼主放照片也就算了，竟然还是侧向的。这是考验我们的脖子啊。 我以为你们手机上也有呢😂😂😂

引用 5 楼 lin5161678的回复:标准并没有忘记这种代码  标准把这种代码归类为未定义行为 结果没意义  不应该这样写   顺便说一句 结果未必是 9 9 谢谢，那么我的观点对吗？还有就是其实只知道C有几个标准，初学者喜欢把名词挂在嘴边，可能是我的小小的虚荣心作祟。说正事：所以未定义行为是说const这句话就没用了吗？

引用 1 楼 轻箬笠的回复:楼主放照片也就算了，竟然还是侧向的。这是考验我们的脖子啊。 哈哈，不好意思，拍的时候也不知道，下次竖着拍。

引用 3 楼 yunate 的回复:int * p = &a; 这一句编译过不了，除非强转转换一下C++会 C不会

int * p = &a; 这一句编译过不了，除非强转转换一下

int * p = &a; 这一句编译过不了，除非强转转换一下

楼主放照片也就算了，竟然还是侧向的。这是考验我们的脖子啊。


Question: Vsc编译器

不是插件的可以解决的，你创建程序的时候要在向导中选择相应的程序类型 Win32 Application --> WinMain Win32 Console Application --> main  main对应#pragma comment(linker, "/subsystem:console")   WinMain对应#pragma comment(linker, "/subsystem:windows")

还真的可以，谢谢大佬，那是否有什么插件可以解决这个程序类型不匹配呢，嘻嘻嘻嘻

程序类型不匹配 加上以下代码即可  #pragma comment(linker, "/subsystem:console")


Question: 求大佬帮忙看下这个程序怎么写

求大佬们帮帮忙，谢谢。

引用参考这方面的开源项目   请问有具体的开源项目的名字吗

参考这方面的开源项目


Question: PTA平台段错误，好像指针乱飞了，求高人指点，题目是多项式乘法和加法

引用 1 楼 自信男孩 的回复：https://blog.csdn.net/wwxy1995/article/details/82561510  供参考～  加法没问题，主要是乘法，问题是出在乘法上。你好，可以具体说说嘛？问题出在哪里？段错误应该是指针的问题吧？

引用 4 楼 weixin_45416408 的回复：还有，抛开答案对错不说，为什么在自己机器上编译运行都没问题呢？

引用 3 楼 coo135 的回复：在你的 Mult函数中 while (t) { 	if (t->Next->exp == exp)  在这种条件下，怎么可能保证t一定是有后续的呢？！当t->next=NULL时，一定会出现段错误的。  同时，你的多项式乘法函数的算法是完全错误的。谢谢谢谢，我比较菜。这段确实有问题，得改进？ 请问一下，当t->next＝null时，最后就是t=null，不就跳出while循环了吗？怎么会段错误呢？😂对不起，我对段错误不太懂，不忙的时候可以说说嘛？


Question: 急！要求修改C语言代码，使用户登陆路由器时，只能用ip或域名其中之一登陆！

引用 1 楼 user-1的回复:这问题真是无力吐槽，问得太业余了 工作中的问题，不是业余，有什么好的办法嘛

这问题真是无力吐槽，问得太业余了


Question: 求大佬帮忙解决一下问题，实在搞不懂

因为i的for循环没有加大括号，实际循环体只有if那条语句： for (i = 0; i < 4; i++) if (*(*(p + j) + i) < 60) flag = 1;

引用 2 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h>  void fail(float(*p)[4], int n);  int main() {     float score[3][4] = { { 55,57,70,60 }, { 60,87,90,81 }, { 90,99,100,98 } };     fail(score, 3);     system("pause");     return 0; }  void fail(float(*p)[4], int n) {     int i, j, k, flag;     for (j = 0; j < n; j++)     {         flag = 0;         for (i = 0; i < 4; i++) {             if (*(*(p + j) + i) < 60)                 flag = 1;             if (flag == 1)             {                 printf("No.%d fails,his scores are:\n", j + 1);                 for (k = 0; k < 4; k++)                     printf("%5.1f", *(*(p + j) + i));                 printf("\n");             }             flag = 0;         }     } } 供参考～ 第三个循环就不能用i了。另外，还得在第二个循环加一个大括号～ 对的，非常非常非常非常感谢。(低于十个字不让评论)

引用 3 楼 user-2的回复:别被楼主带偏了，这个程序本身是对的，后面两个for循环是并列的，所以都用i是没有问题的： #include <stdio.h> #include <stdlib.h> int main() {     void fail(float(*p)[4], int n);     float score[3][4] = { { 55,57,70,60 }, { 60,87,90,81 }, { 90,99,100,98 } };     fail(score, 3);     system("pause");     return 0; } void fail(float(*p)[4], int n) {     int i, j, flag;     for (j = 0; j < n; j++)     {         flag = 0;         for (i = 0; i < 4; i++)             if (*(*(p + j) + i) < 60)                 flag = 1;         if (flag == 1)         {             printf("No.%d fails,his scores are:\n", j + 1);             for (i = 0; i < 4; i++)                 printf("%5.1f", *(*(p + j) + i));             printf("\n");         }     } } 供参考～ 第三个循环就不能用i了。另外，还得在第二个循环加一个大括号～[/quote] 对对，非常感谢，我把i变成x，结果打印了四次成绩单，考生1崩溃哈哈


Question: 如何实现窗口单边拉长？

引用 3 楼 Intel0011 的回复:另外，这样也可以  case WM_NCHITTEST: //去除左右边框箭头显示，所以无法横向拉动窗口     {       LRESULT b = DefWindowProc(hwnd, message, wParam, lParam);       if (b == HTLEFT || b == HTRIGHT)          return 0;       else          return b;    } 引用 1 楼 Intel0011 的回复: hwnd = CreateWindowEx(WS_EX_APPWINDOW,                          szAppName,                  // window class name                          TEXT("The Hello Program"),  // window caption                          WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, // 去除最大化                          500,//CW_USEDEFAULT,              // initial x position                          200,//CW_USEDEFAULT,              // initial y position                          320,//CW_USEDEFAULT,              // initial x size                          320,//CW_USEDEFAULT,              // initial y size                          NULL,                       // parent window handle                          NULL,                       // window menu handle                          hInstance,                  // program instance handle                          NULL);                      // creation parameters //消息处理函数中加入以下代码 case WM_GETMINMAXINFO:          ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = 320;          ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = 320;          return 0;  厉害了，试了下，这的确是最完美的方案

引用 7 楼 轻箬笠 的回复:[quote=引用 6 楼 六道佩恩 的回复:] 这个5是边界的范围吗？ 是的[/quote] 我自己就是用的这种方法，减小之后就放大到指定大小，但这个时候鼠标仍没有松，继续缩小，窗口就继续回弹，然后就会出现一闪一闪的抽风现象

引用 6 楼 六道佩恩 的回复:这个5是边界的范围吗？ 是的

引用 5 楼 轻箬笠 的回复:是不是类似上面这样就满足楼主的要求了，如果不想拉伸的，只要返回HTCLIENT就可以了。 比如左侧不想拉伸 if(point.x <= rect.left + 5)  {   return HTCLIENT;  } 这个5是边界的范围吗？

LRESULT CtestDlg::OnNcHitTest(CPoint point) {  // TODO: 在此添加消息处理程序代码和/或调用默认值  CRect rect;  GetWindowRect(&rect);  if(point.x <= rect.left + 5 && point.y <= rect.top + 5)  {   return HTTOPLEFT;  }  else if(point.x >= rect.right - 5 && point.y <= rect.top + 5)  {   return HTTOPRIGHT;  }  else if(point.x <= rect.left + 5 && point.y >= rect.bottom - 5)  {   return HTBOTTOMLEFT;  }  else if(point.x >= rect.right - 5 && point.y >= rect.bottom - 5)  {   return HTBOTTOMRIGHT;  }  else if(point.x <= rect.left + 5)  {   return HTLEFT;  }  else if(point.x >= rect.right - 5)  {   return HTRIGHT;  }  else if(point.y <= rect.top + 5)  {   return HTTOP;  }  else if(point.y >= rect.bottom - 5)  {   return HTBOTTOM;  }  return CDialog::OnNcHitTest(point); } 是不是类似上面这样就满足楼主的要求了，如果不想拉伸的，只要返回HTCLIENT就可以了。 比如左侧不想拉伸 if(point.x <= rect.left + 5)  {   return HTCLIENT;  }

引用 2 楼 user-3 的回复:捕捉鼠标点击消息～当他单击到你设备两侧时你销毁这个消息 左侧是不是得有个范围？

捕捉鼠标点击消息～当他单击到你设备两侧时你销毁这个消息


Question: 我问一下csdn的一些C语言编译器是不是有很多支持的地方？

书上不是这么弄的呀，

#include <stdio.h>  int main(void) {     unsigned int un = 3000000000;/* int 是32位数，short是16位数。*/     short end = 200;     long big = 65537;     long long verybig = 12345678908642;      printf("-1 = %u\n", -1);     printf("un = %#x\n", un);     printf("un = %u and ont %d\n", un, un);     printf("end = %hd and %d\n", end, end);     printf("big = %ld and %d\n", big, big);      return 0; }  你的代码没有运行，而是本身就有编译错误。首先编译通过了才会运行，否则运行终止；  un是无符号数，如果用%d输出，那么最高位就是符号位，如上的代码，可以把un按照16进制输出，然后看一下最高位是不是1， 如果是1，那么%d输出的就是负值。 下面的分析和这个一样的。


Question: c的链表糊涂了

哈哈，你把创建链表以及简单使用的代码看明白你就懂了。

哈哈，你把创建链表以及简单使用的代码看明白你就懂了。

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

引用 3 楼 weixin_45378677的回复:[quote=引用 1 楼 user-5的回复:]List  movies; 等价于 Node* movies 链表是一连串的结点（new那才是创建结点），说白了这里只是创建一个指针，用来存放链表头结点的地址 可是在后面例题中，同样的代码List movies;被当做创建了一个链表，真的烦，快被搞炸了[/quote] 链表本身是通过next指针链接的节点链。 所以创建链表首先要创建头节点，或者说你创建一个节点的时候可以把它看做是链表的表头。 只有在把对链表的操作封装到类或者结构体的时候，创建节点和创建链表才有不同。 事实上简单链表类的数据成员也就只有一个节点指针，在创建链表的时候要对它初始化。

引用 1 楼 user-5的回复:List  movies; 等价于 Node* movies 链表是一连串的结点（new那才是创建结点），说白了这里只是创建一个指针，用来存放链表头结点的地址 可是在后面例题中，同样的代码List movies;被当做创建了一个链表，真的烦，快被搞炸了

百度下typedef的作用，不是创建


Question: 怎么让手机控制蓝牙模块使继电器开合

就是在一个单片机的p3.3输入高电平，另外一个单片机dp3.3也输出高电平，单片机要用那一种stc12c2052,或者stc89c52rc，或者stm8s103f3p6系统板，还是Nano V3.0系统板。还有我用的是hc-05蓝牙模块。


Question: c语言如何跳转

引用 7 楼 csucxy 的回复:从理论上讲，任何算法都可以不使用goto语句而实现。原则上goto能不用则不用，因为它严重破坏程序的结构性。只有某些特殊情况下，使用goto可以获取极大好处，而又不至于严重破坏程序的结构性、可读性时保守地使用。 我以前也这么认为的，goto破坏了程序的结构性，造成可读性变差。自从我用纯c语言写完一个程序，我发现这完全是扯淡，纯c的程序，稍微复杂点，不用goto，代码更加没法看。

从理论上讲，任何算法都可以不使用goto语句而实现。原则上goto能不用则不用，因为它严重破坏程序的结构性。只有某些特殊情况下，使用goto可以获取极大好处，而又不至于严重破坏程序的结构性、可读性时保守地使用。 至目前为止，本人写程序时还从未使用过goto。至于楼主的问题，必然是具体的问题具体分析。针对楼主贴出的程序，二楼的方案当然是恰当的，只是二楼的while循环形成了死循环，也应该避免，猜测楼主的意思，可改成如下的样子： #include <stdio.h> #include <stdlib.h> #include <time.h>  int main() {     int a, b, c;     while (1)     {         srand((unsigned)time(NULL));         a = (rand() % 5);         b = 2;         c = a + b;          if (c == 3)         {             printf("OK\n");             break;         }         else             printf("不OK\n");     }      return 0; }

最简单的跳转就是goto，而且你稍微动脑子想想就知道goto和label本身就是跳转的最小集了 引用 3 楼 qq_41207969 的回复:[quote=引用 2 楼 自信男孩 的回复:] goto语句都可以用循环或其他语句来替换的，楼上已经帮你解决了，使用while循环 用循环确实可以，但在复杂的程序里面循环用多了不是会显得很复杂嘛，这段代码我就是用来举个例子问一问，就是想问一下有没有跳转语句（一行代码搞定的那种），而且不用像goto一样需要label的[/quote]

跳转需要提供跳转后的地址，goto lable。这里lable就是要去的地址。如果楼主只想跳转，只能写个函数了

你的例子完全不应该用goto，破坏程序可读性 引用 11 楼 qq_41207969 的回复:谢谢各位，我也是之前一直听说goto语句不好用，尽量不要用，刚才试了一下，，，哎呀真香

引用 3 楼 qq_41207969的回复:[quote=引用 2 楼 自信男孩 的回复:] goto语句都可以用循环或其他语句来替换的，楼上已经帮你解决了，使用while循环 用循环确实可以，但在复杂的程序里面循环用多了不是会显得很复杂嘛，这段代码我就是用来举个例子问一问，就是想问一下有没有跳转语句（一行代码搞定的那种），而且不用像goto一样需要label的[/quote] 没有label的跳转机制是怎么知道要跳到哪里去的

引用 2 楼 自信男孩 的回复:goto语句都可以用循环或其他语句来替换的，楼上已经帮你解决了，使用while循环 用循环确实可以，但在复杂的程序里面循环用多了不是会显得很复杂嘛，这段代码我就是用来举个例子问一问，就是想问一下有没有跳转语句（一行代码搞定的那种），而且不用像goto一样需要label的

弱弱的问一句，使用循环来实现不可以吗？ #include<stdio.h> #include <stdlib.h> #include <time.h> int main() {     int a,b,c;     srand(time(NULL));     while(1){         a=(rand()%5);         b=2;         c=a+b;           if(c==3)             printf("%s\0","OK");         else             printf("%s\0","不OK");     }     return 0; }


Question: 大佬们教教我

int n[] = { 1,2,3,4,5};	 	int length = sizeof(n) / sizeof(int); 	int loop = length * 2; 	int i = 0, j = 1; 	while (i < loop) { 		printf("%d ", (i < length ? n[i] : n[length - j++])); 		i++; 	}  int n[] = { 1,2,3,4,5,6,7,8,9};好处是不用改n[]下面的程序.

void main() {     int n[] = {1,2,3,4,5};     int i=0;     while (i<10) {         printf("%d ", (i<5 ? n[i]: n[4-i%5]));         i++;     } } 用while

for example void main() {     int n[] = {1,2,3,4,5};     for (int i=0; i<10; i++) {         printf("%d ", (i<5 ? n[i]: n[4-i%5]));     } }


Question: 为什么我刚创建的编辑框（Edit）无法输入内容？

show us the code

引用 5 楼 赵4老师 的回复:MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl  MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\GLOBCHAT\CLIENT\GLOBCL.C       112: //      113: //  FUNCTION: MsgCreate(HWND, UINT, WPARAM, LPARAM)      114: //      115: //  PURPOSE: Creates Inbox and Outbox Edit controls      116: //      117: //  PARAMETERS:      118: //      119: //    hwnd      - Window handle      120: //    uMessage  - Message number (Unused)      121: //    wparam    - Extra data     (Unused)      122: //    lparam    - Extra data     (Unused)      123: //      124: //  RETURN VALUE:      125: //      126: //    Always returns 0 - Message handled      127: //      128: //  COMMENTS:      129: //      130: //      131:       132: LRESULT MsgCreate(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)      133: {      134:     // Create Edit control for typing to be sent to server      135:     hOutWnd = CreateWindow("EDIT",      136:                            NULL,      137:                            WS_BORDER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT |      138:                            ES_MULTILINE | ES_AUTOVSCROLL,      139:                            0,0,0,0,      140:                            hwnd,      141:                            (HMENU) ID_OUTBOX,      142:                            (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),      143:                            0);      144:     // Create Edit control for typing to be received from server      145:     hInWnd = CreateWindow("EDIT",      146:                           NULL,      147:                           WS_BORDER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT |      148:                           ES_MULTILINE | ES_AUTOVSCROLL,      149:                           0,0,0,0,      150:                           hwnd,      151:                           (HMENU) ID_INBOX,      152:                           (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),      153:                           0);      154:       155:     return (TRUE);      156: }  https://bbs.csdn.net/topics/390374955 赵老师，现在您一般用的是GetWindowLong还是GetWindowLongPtr？

引用 4 楼 Intel0011 的回复:只需将 while (GetMessage(&msg, NULL, 0, 0))    {       DispatchMessage(&msg);    } 改为 while (GetMessage(&msg, NULL, 0, 0))    {       TranslateMessage(&msg); //转换字符消息       DispatchMessage(&msg);    } 即可 我前面的说法有点问题，应该是不处理WM_KEYDOWN等消息是吧？我想Edit类应该还是有很多种类消息要处理的

引用 4 楼 Intel0011 的回复:只需将 while (GetMessage(&msg, NULL, 0, 0))    {       DispatchMessage(&msg);    } 改为 while (GetMessage(&msg, NULL, 0, 0))    {       TranslateMessage(&msg); //转换字符消息       DispatchMessage(&msg);    } 即可 我去，，这也太牛了，强啊，能问下是什么原理吗？DispatchMessage应该也会发送消息到编辑框呀，难道是编辑框只接收WM_CHAR消息，因此对于KEY_DOWN不处理，看起来就是没反应，是吧？

EDIT Designates a rectangular child window into which the user can type text from the keyboard. The user selects the control and gives it the keyboard focus by clicking it or moving to it by pressing the tab key. The user can type text when the edit control displays a flashing caret; use the mouse to move the cursor, select characters to be replaced, or position the cursor for inserting characters; or use the backspace key to delete characters. For more information, see Edit Controls.    For a table of the edit control styles you can specify in the dwStyle parameter, see Edit Control Styles.

引用 1 楼 Intel0011 的回复:show us the code #include "stdio.h" #include "windows.h" #include "windowsx.h" void SetWNDCLASS( WNDCLASS* a, WNDPROC proc, LPCTSTR ClassName ) { 	a->style 			=0;			 	a->lpfnWndProc	=proc;							 	a->cbClsExtra		=0;		 	a->cbWndExtra	=0;	 	a->hInstance		=NULL;		 	a->hIcon			=NULL;			 	a->hCursor		=NULL;		 	a->hbrBackground	=(HBRUSH)GetStockObject(WHITE_BRUSH); 	a->lpszMenuName	=NULL;	 	a->lpszClassName	=ClassName;	 } LRESULT MyProc( HWND h, UINT msg, WPARAM wParam, LPARAM lParam) { 	HWND h2; 	switch( msg ) 	{ 		case WM_CREATE:			 			h2=CreateWindow("EDIT", "编辑框", WS_TABSTOP|WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | ES_WANTRETURN | ES_NOHIDESEL , 30,20,100,30,h, 1,NULL,NULL ); 			CreateWindow("butTon", "按钮", WS_CHILD|WS_TABSTOP|WS_VISIBLE , 150,20,80,30,h, 2,NULL,NULL ); 			SendMessage(h2,EM_LIMITTEXT,100,0); 			Edit_Enable( h2, TRUE); 			return 0;  		case WM_DESTROY: 			PostQuitMessage(0); 			return 0; 	} 	return DefWindowProc( h, msg, wParam, lParam);  }  int main( void ) { 	WNDCLASS MyClass; 	SetWNDCLASS ( &MyClass,   MyProc, "MyClass" ); 	RegisterClass( &MyClass );				 	 	MSG msg; 	HWND h = CreateWindow( "MyClass", "ABC", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 280, 120, NULL, NULL, NULL, NULL);  	UpdateWindow(h);							  	while( GetMessage(&msg, NULL , 0, 0) ) 	{ 		DispatchMessage ( &msg ); 	} 	return 0; }


Question: 为什么这个程序在dev c++里可以正常运行在vs2019里就不可以

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

新建一个空项目  ,新建一个cpp. 粘贴代码 . 然后 项目 -> 属性 -> C/C++ -> 预处理器 -> 预处理器定中添加 _CRT_SECURE_NO_WARNINGS 这个预定义


Question: 求助一个C语言编程题目

for (int i = 0, n[] = {'A', 'C', 'G', 'T'}; i < 1 << 20; i++, puts(""))     for (int j = 9; j >= 0; j--) printf("%c", n[i >> j * 2 & 3]);

非常感谢，因为初学对这里的位运算还不是很理解，但是在电脑上实现了还是很开心，仿佛打开了新世界的大门😄😄


Question: malloc函数Debug Assertion Failed!

两个错误，c数组这样声明长度只有1，c数组赋值没有加\0  char c[10]=""; a=(char *)malloc(100); c[0]='1'; c[1]='2'; c[2]='s'; c[3]='\0'; strcpy(a,c); 引用 3 楼 qq_41207969 的回复:感谢，那么如果需要对a逐位赋值的话应该怎么办？我想着先对一个数组进行赋值，完了再用strcpy拷贝： 	char c[]=""; 	a=(char *)malloc(100); 	c[0]='1'; 	c[1]='2'; 	c[2]='s'; 	strcpy(a,c); 但运行的时候还是12s后面有个问号有个框。。

谢谢两位大佬，问题解决了，笔芯么么哒

引用 3 楼 qq_41207969 的回复:感谢，那么如果需要对a逐位赋值的话应该怎么办？我想着先对一个数组进行赋值，完了再用strcpy拷贝： 	char c[]=""; 	a=(char *)malloc(100); 	c[0]='1'; 	c[1]='2'; 	c[2]='s'; 	strcpy(a,c); 但运行的时候还是12s后面有个问号有个框。。 那是因为没有加'\0'

引用 1 楼 自信男孩 的回复:a=(char *)malloc(100); a="12s"; 如上这两句，第二句已经导致内存泄露了。指针a指向了堆上的100个字节大小的内存空间，但是第二句相当于把指向堆上的空间 改成了字符串常量"12s"了，相当于改变了指针变量里的地址值。后面free(a);已经有问题了，因为现在a指向的是"12s"，不是堆上 开始申请的空间了，所以会有问题。改为： a=(char *)malloc(100); strcpy(a, "12s"); 即可。 内存泄漏的问题，这位已经说明白了。  针对第二个例子说下。 int output(char *a) { a=(char *)malloc(100); a[0]='1'; a[1]='2'; a[2]='s'; a[3]='\0'; //	a="12s"; printf("%s",a); free(a); return 0; } int main() { char *b; output(b); return 0; } 字符串需要带字符串截止符'\0';


Question: 求梯形对角线的交点坐标？

求AD和BC的直线解析式。 然后用直线解析式均线是求交点坐标。

https://www.zybang.com/question/698d4b459e366ee73d3033c862b2ffd9.html 参考上面这个，写出直线方程。然后二元一次方程。

哪位大神，可以帮助一下

梯形简单很多啊，中学数学题都不会解了么 以C为原点，A是xa,h  B是xb,h D是xd, 0 解一下两个二元一次方程不就好了


Question: 对于一个C小白，算法方面有什么书可以借鉴

C小白，《数据结构与算法》一绿皮书足已。建议先把简单的数据结构利用C搞顺溜（数组、链表、二叉树），再去搞搞算法。

刘汝佳的《算法竞赛入门经典》紫皮书。

微积分 概率论 离散数学  数学学得越精通越好  数据结构 算法导论 opencv OpenGL

《算法精解（C语言描述）》

数据结构推介清华邓俊辉的，虽然没看过，不过口碑貌似不错。 中科大的数据结构也不错，不过细节上有些错误，印刷也有些错误，不知道新版有没校正。 《数据结构与算法经典问题解析》、《趣学算法》、《无处不在的算法》都不错 当然少不了《算法》、《算法导论》。 《具体数学》《离散数学及其应用》《组合数学》《图论》《矩阵分析》《TAOCP》多看看、认认真真做些题 线性代数推介李尚志的《线性代数》，比较偏几何技巧，要做图形算法的可以认真学学


Question: strchr函数的问题

建议先了解一下这个函数的原理。从网上查一下吧

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

strchr函数功能为在一个串中查找给定字符的第一个匹配之处。函数原型为：char *strchr(const char *str, int c)，即在参数 str 所指向的字符串中搜索第一次出现字符 c（一个无符号字符）的位置。strchr函数包含在C 标准库 <string.h>中。  也就是说strchr说查找给定字符的，查找成功反正所在位置的指针，失败返回null。对于if来说，null表示false，非null表示true


Question: 求的值总是0，求大佬看看

15 行   zhi = (double)n / (double)m

值，总是零的原因在于。。你的n和m都是 int型。。。因为都是整形，n小于m时，怎么除都是0。。。  然后，你将0，赋给了 double型的zhi。。。  你吧 m和n，声明为 double型就好啦。

别贴图贴代码

getchar函数只能接受单个字符，输入数字也按字符处理。输入多于一个字符时，只接收第一个字符。

把zhi = n/m;改成zhi = n*1.0/m;再试试； 因为n/m是按照整型除法来计算的，后面n*1.0/m是按照双精度浮点数来算除法的。


Question: 使用CreateFile打开设备，WDK编译没有问题，但使用vs 2015编译无法打开设备

和用什么编译没关系，只和跑在平台有关

引用 1 楼 user-1的回复:和用什么编译没关系，只和跑在平台有关 同样的代码，在同一台机器上打开同一个设备，vs编译的就是找不到设备


Question: 对书本上的一个说法存疑。

引用 2 楼 Italink的回复:char *b =“House”真正的字符串不是b，等号右边的才是真正的字符串，这里赋值只是把常字符串"House"的首地址给了b，也就是b其实是指向的一个常字符串"House"，所以修改b是非法的，后来的标准都不允许出现类似这样的形式：char* = const char* 发现不同了。用字符数组定义字符串是有名字的，而用字符指针时，字符串是没有名字的，是字面变量。是不一样的。谢谢啦，才明白你说的。

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

引用 2 楼 Italink的回复:char *b =“House”真正的字符串不是b，等号右边的才是真正的字符串，这里赋值只是把常字符串"House"的首地址给了b，也就是b其实是指向的一个常字符串"House"，所以修改b是非法的，后来的标准都不允许出现类似这样的形式：char* = const char* 没有看明白您的说法中的因果关系，我说一下我的的想法。 首先，“所以”之前的话我是知道的。定义b是字符指针变量，一开始b是字符串的首地址，之后b[2]就是*（b+2）就是'u'。 其次，当时刚学指针时，做交换两个数的值，在被调函数中完成：两个指针形参接受a，b的地址，在被调函数中用指针变量交换，最后主函数里的a，b也交换。基于这个现象，我以为用指针操作是对系统中的内存操作，如果x=&a，*x就是a，所以操作被调函数可以和主函数结果统一。这里的字符串，我开始认为和之前是相同的，b+2就是'u'的地址，对*（b+2）或b[2]操作就是对那个元素操作，我觉得和用已知可以的字符数组操作是一样的，和用指针对数值数组操作也是一样的。这是我目前的看法。 还是说书上这个说法就是这么规定的呢？

引用 1 楼 user-3的回复:看清楚，to是第二个参数是b，不是a WoW，刚发现诶！

看清楚，to是第二个参数是b，不是a


Question: memcpy函数怎么把一个序列的k位拷贝到另一个序列的第n~n+k位

memcpy的第一个参数设成你希望起始的地址就好了

data[7]是字符，memcpy第一个参数传地址，所以应该改成&data[7]

memcpy(&data[7],Buffer,10); 或者 memcpy(data+7,Buffer,10);

代码没贴全，后面fclose和free这些步骤都是有的（因为我的代码有问题，贴全也没必要）

data[7]修改成data+7就可以了，另外用malloc要判断返回值，程序结束前需要free掉malloc的内存 这些是良好的习惯


Question: 用API写的一个文件搜索程序，出现了很神奇的情况，跪求大神来看下

说白了是你调试能力太差了，所有加list的地方都用fout打印，很难么？ 你容器初始化之后fout打印可能有内容么？这样不就知道哪个流程多出来内容了？ 我上面就是告诉你一会cout 一会fout，然后只贴fout的内容，鬼知道你想表达什么 引用 3 楼 geralt14 的回复:[quote=引用 2 楼 636f6c696e的回复:]没看懂你的逻辑，一会cout一会fout，能不能统一下打印，再仔细描述下你的问题 里面说了fout是用来测试的吧，cout是用来输出结果啊，把list的内部fout出来看下。。下面不是有fout出来的结果截图吗，显示的list内部变化很奇怪啊[/quote]

哪里奇怪了 引用 3 楼 geralt14 的回复:[quote=引用 2 楼 636f6c696e的回复:]没看懂你的逻辑，一会cout一会fout，能不能统一下打印，再仔细描述下你的问题 里面说了fout是用来测试的吧，cout是用来输出结果啊，把list的内部fout出来看下。。下面不是有fout出来的结果截图吗，显示的list内部变化很奇怪啊[/quote]

引用 2 楼 636f6c696e的回复:没看懂你的逻辑，一会cout一会fout，能不能统一下打印，再仔细描述下你的问题 里面说了fout是用来测试的吧，cout是用来输出结果啊，把list的内部fout出来看下。。下面不是有fout出来的结果截图吗，显示的list内部变化很奇怪啊

在文件大小相同的前提下：  读刚读过的文件比头次读没读过的文件快  读转速快的硬盘上的文件比读转速慢的硬盘上的文件快  读没有磁盘碎片的文件比读有磁盘碎片的文件快  读文件不处理比边读边处理快  单线程从头到尾一次读文件比多线程分别读文件各部分快（非固态硬盘上）  读固态硬盘上的文件比读普通硬盘上的文件快 遍历文件类似。


Question: 请教大神：自己实现的简单printf()函数，多个参数处理，不能输出

貌似不行呢，大神

char* str = args; 错了  args 是一个指向栈的指针 你需要将这个指针解引用 才能得到指向你的字符串的指针 char* str = *(char**)args; 就没问题了

你可以找一下关于不定参的文章看一下  #include<stdio.h> #include <stdlib.h> #include<stdarg.h>   void my_printf(const char * format, ...) { 	va_list begin; 	va_start(begin, format); 	if (!format) { 		printf("no data,quit\n"); 		return; 	} 	const char *p = format; 	while (*p != '\0') { 		if (*p == '%') { 			p++; 			if (*p == 's') { 				const char *temp = va_arg(begin, const char *); 				while (*temp)putc(*temp++, stdout); 			} 			else if (*p == 'd') { 				//待实现 			} 		} 		else { 			putc(*p, stdout); 		} 		p++; 	}  }  int main() { 	printf("---test begin---\n"); 	my_printf("Hello,my name is %s,i am %d years old\n", "asdfasdfasf", 50); 	printf("---test end---\n"); 	return 0; }

不定参不能这么写的吧


Question: void *是在定义什么

引用 6 楼 自信男孩 的回复:[quote=引用 5 楼 hesoyam119 的回复:] [quote=引用 1 楼 user-4 的回复:] 定义一个可以指向任意类型的指针，使用的时候需要用强制转换 这是一个空指针是吗？我不知道我的函数里接下来要用到什么类型的指针，但一定会用到指针，所以我定义一个放在那里，用的时候转换即可？  麻烦了大神[/quote] 是不是空指针，要看实参，这儿定义的是一个形参。[/quote] 谢谢大神

引用 5 楼 hesoyam119 的回复:[quote=引用 1 楼 user-4 的回复:] 定义一个可以指向任意类型的指针，使用的时候需要用强制转换 这是一个空指针是吗？我不知道我的函数里接下来要用到什么类型的指针，但一定会用到指针，所以我定义一个放在那里，用的时候转换即可？  麻烦了大神[/quote] 是不是空指针，要看实参，这儿定义的是一个形参。

引用 1 楼 user-4 的回复:定义一个可以指向任意类型的指针，使用的时候需要用强制转换 这是一个空指针是吗？我不知道我的函数里接下来要用到什么类型的指针，但一定会用到指针，所以我定义一个放在那里，用的时候转换即可？  麻烦了大神

引用 3 楼 轻箬笠 的回复:void *定义一个通用的指针。 比如 void func(void *p, int type) { if (type == 1) { struct A *pa = (struct A *)p; ... } else if (type == 2) { struct B *pb = (struct B *)p; ... } }  因为任何指针都可以强制转换为void * 秒懂 谢谢大神

无类型指针

定义一个可以指向任意类型的指针，使用的时候需要用强制转换


Question: 四个排序（冒泡排序，选择排序，插入排序，快速排序）

各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/

这个分数就是奖励给回答你问题的人的。如果你觉得他回答得好，就可以多给几分；回答得不好，就不给分。 你给别人的分数会从你自己的分数里扣除。

第一次发帖，想问下大家这个分数是啥意思


Question: 请问这个该怎么解决，用dev就没事，用vc2010就报错

vs2010太老了 不支持新的c标准，要么换新版vs，要么在最前面定义c

代码呢

我忽略这个调试错误的弹窗，就输入一个数字，我输入5，最后结果是-4

会出一个调试错误的框，说"b"未在被初始化的情况下使用

引用 1 楼 lin5161678的回复:c先声明 别用vs写c 我这是vc啊，学校里面需要用这个，然后考试也要用vc，你说的先声明我也试过了，又有不一样的报错，

c先声明 别用vs写c

cpp不是bpp打错了

c语言所有变量的定义必须在函数开头部分，这也是与c++的一个区别，你把文件改成bpp估计就不会报错


Question: 推箱子，但是输出地图后人物不移动实在看不出问题来希望大佬们能给点帮助

加调试输出呗

引用 1 楼 赵4老师的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 已经找到错误了，这些解答


Question: 野指针

楼主是读书笔记，有意识去改善自己代码，赞一个

引用 2 楼 636f6c696e 的回复:这代码很多是无意义代码，实际项目中根本不会这么写 毕竟还不是写在项目里的，没必要要求那么高吧。  有意识的去避免野指针/内存泄露还是挺好的，应该支持楼主

这代码很多是无意义代码，实际项目中根本不会这么写

原来还可以在论坛写学习笔记，但分数怎么处理呢？


Question: 随便做题的时候遇到很诡异的现象，求解惑

非常感谢，果然不细心，就会有奇奇怪怪的问题出现=-=

随便写的代码，自然会随便出现问题。

和后面count++其实没有直接联系 但是代码是有问题的 前面的循环里i为9的时候  i+1实际上已经越界了,因为没有a[10]这个元素,所以最后的判断将是未知的结果 所以判断循环里i<9才行,然后还得加上数据结尾时的数列,因为后面没有数据了,前面的循环判断不到

具体作用就是输入一段数据，然后找出连续递增或递减数列的个数，并列出来。 代码虽然是随便写的，但很好奇为什么会有这种现象


Question: 有人能看下我这个搜索文件的程序为什么会出错吗，求高人指点，解决了继续加分

引用 1 楼 赵4老师的回复:system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。 如果嫌system黑窗口一闪，将system("...")替换为WinExec("cmd /c ...",SW_HIDE); 好的，我试试，谢谢老师

引用 1 楼 赵4老师 的回复:system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。 如果嫌system黑窗口一闪，将system("...")替换为WinExec("cmd /c ...",SW_HIDE);  老师，我又新开了一贴，能去那个帖子里看下吗，还是这个有新的问题。（不过还是拿API写的，感觉不像老师说的API出错情况啊）


Question: 是什么的问题啊   大佬们 (我是一名高中生）

希望楼主不要犯类似 “早知道吃完第七个包子就饱了，我为什么还要吃前六个包子呢？！” 这种低级错误。

无法打开pdb不是什么错误。楼主应该聚焦在自己的代码的问题上面

我只知道找不到pdb文件的这一堆是没问题的。我们用VS编译程序，后面链接dll动态链接库的时候都会跟这一句。


Question: 我是个新学的菜鸟，求帮助

图片代码，输出的第一行是please score顶行的第二行是liu，前有空格，但是这个空格不是printf（“       liu  ”）中的吗？

%6.1f 表示保留一位小数, 整体占6位,不足左侧补空格 比如 printf("%6.1f\n",3.141592f); 输出为    3.1 前面为3个空格

%6.1f 表示保留一位小数, 整体占9位,不足左侧补空格 比如 printf("%6.1f\n",3.141592f); 输出为    3.1 前面为3个空格

输出float类型, 6表示设置域为6,即加上标点也只能输出6个字符的浮点数. 1表示输出到小数点后1位.


Question: C语言程序设计

引用 1 楼 轻箬笠的回复:定义个数组 char data[13] = {0}; scanf获取输入数据 定义个int数组 int ean[12] = {0}; for (int i = 0; i < 12; i++)    ean[i] = data[i] - '0'; 后面应该就方便了吧 还没看到数组那呢，不会数组，这一章是表达式。数组


Question: 新手小白求教

这个问题大了去了，没有入口函数，还有中文的分号，代码一点也不规范，while循环没有把需要执行的语句用大括标明，都不会向你想的那样执行，这代码简直一塌糊涂，回去先写好hello world吧

Hello World都没通关。还是看书吧

大括号不配对，函数名未找到 程序写的很随意

好好看看书先

找本书或者教程基础学起吧，函数都不知道就直接写能写对么


Question: 萌新求教

这个提示是在说你strupr未定义、print未定义，print这个是你少些了f，有两处，strupr这个应该是这个编译环境里没有这个函数，你先把这个函数注释掉再运行看看

strupr，strlwr、print函数没有定义，引用的string.h有这个方法吗。我所查到的string.h中是没有这两个方法定义的。也没有查到print函数的定义

这样编译是不会错误的，如果错误的，看看是不是自己的编译器配置错了呢？


Question: c语言编写

1、字符串的长度最多只能存放 定义的定符数组的长度-1个字符，否则后面的字符就不知道是什么值了，也不知道什么时修改能遇到字符串结束符。 2、你用的是C还是C++,以中字符串的比较不能使用== 3、记得gets函数会在字符串尾部加上回车符，记不清了，你测下长度，和你输入的长度比较下就知道了。

char admin1[10],password1[6]; 数组长度不够，没考虑字符串截止符。 改成char admin1[11],password1[7];  引用 1 楼 user-3 的回复:字符串比较应使用strcmp： if(0 == strcmp(admin1 ,"0411180101")  && 0 == strcmp(password1, "171917"")


Question: 急求 c语言加分题 快来

这分我不要加，我加了就是害了你，太基础了。

int func(int m, int n) {     return (m^2)! + (n!)^2; }


Question: printf函数用了两个预定义宏，warning显示 too many arguments for format [-Wformat-extra-args]

printf("%s(%d): %s() open file %s failed! ", __FILE__,__LINE__,__func__,file);

参考这个 #define Y_DBG(fmt,args...)  printf("=====> %s(%d): %s() "#fmt"\n",__FILE__,__LINE__,__func__,##args)  printf("open file %s failed! ",file,__func__,__LINE__); 改成 printf("%s(%d): %s() open file %s failed! ", __FILE__,__func__,__LINE__,file);

printf("open file %s，%s, %d failed! ",file,__func__,__LINE__); 前后不对应，所以会有警告～


Question: 请哪位大神帮忙做一下这个，拜托拜托了

这么复杂，给500块兴许有人做


Question: 请问各位大神,为什么STM32F103自动重传模式下2个CAN设备同时发送时数据优先级低的发不出去

但是把自动重传模式关掉就发的出去了

是那个低优级的就没发出去过

说明发送通道一次只能发送一个呀，所以每次都发了高优先级的


Question: 求代码 谢谢！！

#include<iostream> using namespace std;  int main() {          for(int i = 1; i <= 9; i++)     {         for( int j = 1; j <= i; j++)         {           int a;           cout << j << "*" << i << "=" << i * j << " ";           }            cout << endl;      }     return 0; }

引用 1 楼 main(进击的菜鸟)的回复:去百度都比贴吧问的快 😂好的哈哈哈哈哈哈哈

去百度都比贴吧问的快


Question: 该版本与你运行的Windows版本不兼容

怎么看是多少位的程序？ 同样的程序有时候就会发生这种问题，不明白

引用 2 楼 smwhotjay的回复: 16位程序，你编译器不对吧。 同样的情况，无任何更改，有段时间完美运行，不是那个问题

引用 2 楼 smwhotjay 的回复: 16位程序，你编译器不对吧。 +1  另外补充一点，64位的windows中只能运行32位和64位的程序，不能运行16位的程序（不论是windows程序还是dos程序）

16位程序，你编译器不对吧。

Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt


Question: 大佬们，为啥会出现3221225477错误

因为原来的代码中S是一个指针，指针他默认指向的空间是随机的，你还没有给它指向一个变量，访问时当然会越界（据我所知，3221225477是指std::out_of_range）

谢谢大佬们，了解了

因为定义成指针，那么S是一个野指针，所以S->base就可能会导致段错误， 因为S指向的区域可能是不可写的，那么S->base = xxx;其实就是对其写的操作。

theStack *S;表示你声明了一个指向theStack的指针变量，程序运行时它全指针变量分配了内存空间，但是指针的值是无效的。即它没有指向任何的变量，也就是对于这个指针没以有赋值。 theStack S;表示声明了一个theStack的变量，

theStack *S是一个空指针，当然会报错 你要么搞成栈内存：theStack S; 要么动态申请：theStack *S =(theStack *) malloc(sizeof(theStack));


Question: 想问大佬这个是怎么回事

引用 4 楼 斟秋 的回复:[quote=引用 2 楼 main(进击的菜鸟)的回复:]1、将函数写在主函数前面，否则会有警告：隐式声明函数。若函数写在主函数后面，主函数前面要声明函数。 2、return (z) 应该是return z;(个人认为) but唐浩强那本书上就是这样一模一样[/quote]  书也会有错的，别完全相信

把错误描述复制一下，然后在网上搜一下。可能跟你的编译环境有关系  引用 4 楼 斟秋 的回复:[quote=引用 2 楼 main(进击的菜鸟)的回复:]1、将函数写在主函数前面，否则会有警告：隐式声明函数。若函数写在主函数后面，主函数前面要声明函数。 2、return (z) 应该是return z;(个人认为) but唐浩强那本书上就是这样一模一样[/quote] 谭老师的数也说多个带有main函数的文件一起编译了没？

引用 1 楼 自信男孩的回复:把错误描述复制一下，然后在网上搜一下。可能跟你的编译环境有关系 好的我试试看下......

引用 3 楼 @风轻云淡_的回复:你的这个项目里是不是有多个main函数？ 没有吧好像...我和书上的例题一模一样

引用 2 楼 main(进击的菜鸟)的回复:1、将函数写在主函数前面，否则会有警告：隐式声明函数。若函数写在主函数后面，主函数前面要声明函数。 2、return (z) 应该是return z;(个人认为) but唐浩强那本书上就是这样一模一样

你的这个项目里是不是有多个main函数？

把错误描述复制一下，然后在网上搜一下。可能跟你的编译环境有关系


Question: while里面有getchar的问题

引用 3 楼 嗯 额的回复:[quote=引用 1 楼 轻箬笠的回复:]你输入1后打回车也算一个字符。 int main() { 	char a = getchar(); 	char b = getchar();      return 0; } 比如上面这个测试代码，如果1，然后回车。a='1'， b='\n';  针对目前这个情况，你加个getchar没事，建议改成 a = getchar(); fflush(stdin); 我试了用fflush，如果有两个字符用getchar赋值，中间加一个fflush不能分两次输入，[/quote] 后面那个getchar直接忽略了

引用 1 楼 轻箬笠的回复:你输入1后打回车也算一个字符。 int main() { 	char a = getchar(); 	char b = getchar();      return 0; } 比如上面这个测试代码，如果1，然后回车。a='1'， b='\n';  针对目前这个情况，你加个getchar没事，建议改成 a = getchar(); fflush(stdin); 我试了用fflush，如果有两个字符用getchar赋值，中间加一个fflush不能分两次输入，

回车也是一个字符，所以你实际输入了1和回车2个字符


Question: Linux下如何使用openssl库进行DES/CBC/PKCS5Padding加密后用base64编码

int kk_encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,              unsigned char *iv, unsigned char *ciphertext) 196 { 197     EVP_CIPHER_CTX *ctx; 198  199     int len; 200  201     int ciphertext_len; 202     ctx = EVP_CIPHER_CTX_new(); 203     EVP_EncryptInit_ex(ctx, EVP_des_ecb(), NULL, key, iv); 204  205     EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len); 206     ciphertext_len = len; 207     EVP_EncryptFinal_ex(ctx, ciphertext + len, &len); 208     ciphertext_len += len; 209     EVP_CIPHER_CTX_free(ctx); 210  211     return ciphertext_len; 212 } 213  214 //解密 215 int kk_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, 216                 unsigned char *iv, unsigned char *plaintext) 217 { 218         EVP_CIPHER_CTX *ctx; 219  220         int len; 221         int plaintext_len; 222  223         ctx = EVP_CIPHER_CTX_new(); 224  225         EVP_DecryptInit_ex(ctx, EVP_des_ecb(), NULL, key, iv); 226         EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len); 227         plaintext_len = len; 228  229         EVP_DecryptFinal_ex(ctx, plaintext + len, &len); 230         plaintext_len += len; 231  232         EVP_CIPHER_CTX_free(ctx); 233  234         return plaintext_len; 235 }  char * base64Encode(const char *buffer, int length, bool newLine) {     BIO *bmem = NULL;     BIO *b64 = NULL;     BUF_MEM *bptr;     b64 = BIO_new(BIO_f_base64());     if (!newLine) {         BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);     }     bmem = BIO_new(BIO_s_mem());     b64 = BIO_push(b64, bmem);     BIO_write(b64, buffer, length);     BIO_flush(b64);     BIO_get_mem_ptr(b64, &bptr);     BIO_set_close(b64, BIO_NOCLOSE);     char *buff = (char *)malloc(bptr->length + 1);     memcpy(buff, bptr->data, bptr->length);     buff[bptr->length] = 0;     BIO_free_all(b64);     return buff; } char * base64Decode(char *input, int length, bool newLine) {         BIO *b64 = NULL;         BIO *bmem = NULL;         char *buffer = (char *)malloc(length);         memset(buffer, 0, length);         b64 = BIO_new(BIO_f_base64());         if (!newLine) {                 BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);         }         bmem = BIO_new_mem_buf(input, length);         bmem = BIO_push(b64, bmem);         BIO_read(bmem, buffer, length);         BIO_free_all(bmem);         return buffer; } 这是我这边C的解密代码

这是他边提供的C#解码编码  #region DESEncrypt DES加密  /// <summary>  /// 进行DES加密。  /// </summary>  /// <param name="pToEncrypt">要加密的字符串。</param>  /// <param name="sKey">密钥，且必须为8位。</param>  /// <returns>以Base64格式返回的加密字符串。</returns>  public static string DESEncrypt(string pToEncrypt, string sKey)  {  using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())  {  byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);  des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);  des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);  System.IO.MemoryStream ms = new System.IO.MemoryStream();  using (CryptoStream cs = new CryptoStream(ms,  des.CreateEncryptor(), CryptoStreamMode.Write))  {  cs.Write(inputByteArray, 0, inputByteArray.Length);  cs.FlushFinalBlock();  cs.Close();  }  string str = Convert.ToBase64String(ms.ToArray());  ms.Close();  return str;  }  }  #endregion  #region DESDecrypt DES解密  /// <summary>  /// 进行DES解密。  /// </summary>  /// <param name="pToDecrypt">要解密的以Base64</param>  /// <param name="sKey">密钥，且必须为8位。</param> /// <returns>已解密的字符串。</returns>  public static string DESDecrypt(string pToDecrypt, string sKey)  {  byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);  using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())  {  des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);  des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);  System.IO.MemoryStream ms = new System.IO.MemoryStream();  using (CryptoStream cs = new CryptoStream(ms,  des.CreateDecryptor(), CryptoStreamMode.Write))  {  cs.Write(inputByteArray, 0, inputByteArray.Length);  cs.FlushFinalBlock();  cs.Close();  }  string str = Encoding.UTF8.GetString(ms.ToArray());  ms.Close();  return str;  }  }  #endregion

参考下吧： https://blog.csdn.net/p0x1307/article/details/40115567

百度一下很多吧 比如https://blog.csdn.net/hanghang121/article/details/51435008  但是有一个注意点就是key的生成 很多时候,提供的并不是key,而是一个password 要从password生成key,方法有很多,这个加密方和解密方需要协商 比如先对password进行一次MD5,取结果前12(24)字节作为key

引用 5 楼 早打大打打核战争 的回复:字符串编码不一样 使用了openssl 的命令是发现用16进制处理后的密码进行加密。

字符串编码不一样


Question: c

你说的是接入政府的税务系统？


Question: 新手请多关照：strcpy函数

程序问题很多，导致报错原因是Str2空间少1，没有\0，这样strcpy就不知道拷贝了多长的数据导致越界 str1表示也不对，应该改成这样： char str1[11]="1111111111"; char str2[6]="China";

str1, str2越界了，定义的时候已经越界了。"China"是5个字符，定义5个字符数组，那么'\0'往哪放？

引用 5 楼 轻箬笠 的回复:[quote=引用 4 楼 weixin_40290083 的回复:] char str1[10]="1111111111"; 这位朋友对于字符串截止符好像也不懂啊[/quote]  没有注意数他的字符串长度，他本身对str1的定义也是有问题的，我想说的是不应该把它放到{}中间。

引用 4 楼 weixin_40290083 的回复:char str1[10]="1111111111"; 这位朋友对于字符串截止符好像也不懂啊

char str1[10]="1111111111";

这个应该编译都不过吧，字符串长度都不对

兄弟，与其你过来问那么多问题，还不如好好找本书看下字符串学下基础 你问的这些问题都是对字符串不懂导致的 字符串必须有截止符，所以char数组的长度是字符长度+1

改成char str1[] = "1111111111", str2[] = "China"; 问题原因是数组长度不够，没有保存字符串截止符

字符数组越界了，学习下怎么判断字符串的结束

兄弟，如果你想玩好C，字符比指针更重要！不是指字符函数，就是指单个字符的组成和处理，很简单，别忽视。我是玩嵌入式的，绝大部分操作都以字符（char）作为最底层操作


Question: 学习C语言

看你将来想做前端还是后端，前端用的基本就是html+css+js 后端常用的有php   java   c#

引用 3 楼 轻箬笠的回复:html+css+js和C++关联程度很小 知道，但是感觉只学C有点单一了

html+css+js和C++关联程度很小

引用 1 楼 user-3的回复:C#C#C# 为什么要学C#呢？

C#C#C#


Question: 求助这是怎么回事 mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean g

C/C++的人真是无所不能啊，不仅得会C#，还得会php


Question: 请教一下fprintf函数和fwrite的区别？帮忙解答一下下面的问题。

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……   推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

FILE*  pTrain = fopen(strFinalTrain, "wb");    这才是控制 二进制 输出的关键吧  反正我现在使用的是 fwrite fwrite(pRightDat + nFtrLen*i, 2 * nFtrLen, 1, pTrain);  你写个测试用例 自己看下   (实践了 才能真正知道 好多人 说的也不一定对 )

引用 18 楼 自信男孩的回复:你以什么形式打开rb还是r+，还是其他？、 就是一道选择题。emm题目我给了

你以什么形式打开rb还是r+，还是其他？、

引用 14 楼 lin5161678的回复:[quote=引用 13 楼 qq_45152498 的回复:] [quote=引用 12 楼 lin5161678的回复:][quote=引用 11 楼 qq_45152498 的回复:] 所以，fprintf就是ASCII形式存放。fwrite是用二进制存放的呀。那应该选用fwrite吧emmm 你用 %c 把 int 4个字节的内容都写入文件  效果和 fwrite 是一样的 早就说了 都可以[/quote] 你看看楼上，他说那道题应该选printf函数。[/quote]瞎说嘛[/quote] 我觉得他说的在理啊哈哈哈

引用 13 楼 qq_45152498 的回复:[quote=引用 12 楼 lin5161678的回复:][quote=引用 11 楼 qq_45152498 的回复:] 所以，fprintf就是ASCII形式存放。fwrite是用二进制存放的呀。那应该选用fwrite吧emmm 你用 %c 把 int 4个字节的内容都写入文件  效果和 fwrite 是一样的 早就说了 都可以[/quote] 你看看楼上，他说那道题应该选printf函数。[/quote]瞎说嘛

引用 12 楼 lin5161678的回复:[quote=引用 11 楼 qq_45152498 的回复:] 所以，fprintf就是ASCII形式存放。fwrite是用二进制存放的呀。那应该选用fwrite吧emmm 你用 %c 把 int 4个字节的内容都写入文件  效果和 fwrite 是一样的 早就说了 都可以[/quote] 你看看楼上，他说那道题应该选printf函数。

引用 11 楼 qq_45152498 的回复:所以，fprintf就是ASCII形式存放。fwrite是用二进制存放的呀。那应该选用fwrite吧emmm 你用 %c 把 int 4个字节的内容都写入文件  效果和 fwrite 是一样的 早就说了 都可以

引用 10 楼 弓人水的回复:整数是四个字节（也就是32位），转换为字节码char *（fwrite写入）的话，就是四个字节大小0x01 0x00 0x00 0x00(32位int，小端存储)； fprintf会把整数转换字符串，然后每个字符对应一个ASCII（也就是1一个字节），比如：1就是1个字节（0x31）; 1000，就是四个字节（0x31 0x30 0x30 0x30） 所以，fprintf就是ASCII形式存放。fwrite是用二进制存放的呀。那应该选用fwrite吧emmm

引用 8 楼 弓人水的回复:int n=1; fwrite(&n, sizeof(int), 1, f); // f中被写4个字节0x01 0x00 0x00 0x00(32位int，小端存储) fprintf(f, "%d", n);              // f中被写1个字节0x31(即1的ASCII码) 所以fprintf写入的才是整数的二进制格式，如果用fwrite至少要先转码。 追问一下，fwrite是将数据不经转换直接以二进制的形式写入文件，而fprintf是将数据转换为字符后再写入文件。是什么意思？

引用 6 楼 qq_45152498 的回复:嗯呐，谢谢啦！可是那个fprintf不是转换成字符存放吗？fwrite才是直接用二进制呀用%c 就行了

引用 5 楼 lin5161678的回复:[quote=引用 4 楼 qq_45152498 的回复:] [quote=引用 3 楼 lin5161678的回复:]都可以  单项选择题给了四个选项，选的是fprintf。为什么呢？感觉fwrite才是以二进制存放的吧。[/quote] 不管是 fprintf 还是 fwrite 都没问题 只要FILE* 是二进制模式   单选题至少2个选项可以选? 那就是题目错了  习惯就好了 [/quote] 嗯呐，谢谢啦！可是那个fprintf不是转换成字符存放吗？fwrite才是直接用二进制呀

引用 4 楼 qq_45152498 的回复:[quote=引用 3 楼 lin5161678的回复:]都可以  单项选择题给了四个选项，选的是fprintf。为什么呢？感觉fwrite才是以二进制存放的吧。[/quote] 不管是 fprintf 还是 fwrite 都没问题 只要FILE* 是二进制模式   单选题至少2个选项可以选? 那就是题目错了  习惯就好了

引用 3 楼 lin5161678的回复:都可以  单项选择题给了四个选项，选的是fprintf。为什么呢？感觉fwrite才是以二进制存放的吧。

都可以

引用 1 楼 user-6的回复:二进制是fwrite吧 对呀，所以这个用fprintf还是fwrite.答案给的是fprintf.我就不知道了

二进制是fwrite吧


Question: 注册第一天，大一小生暑假acm训练中。有哪位大神能抽空做一下吗

引用 3 楼 甜茶callmeby 的回复:acm.hdu.edu.cn 是这个吗  是的

引用 4 楼 Italink的回复:形如2 2 3 这样的也算吧  #include<iostream> using namespace std; const int MAX = 3001; bool isPrim(int x) { 	if (x <= 1) 		return false; 	int len = sqrt(x); 	for (int i = 2; i <= len; i++) 		if (x % i == 0) 			return false; 	return true; } int main() { 	int n, primList[MAX], len = 0, sum, maxSum = 0, count = 0; 	cin >> n; 	for (int i = 0; i <= n; i++) {	//构建素数表 		if (isPrim(i)) 			primList[len++] = i; 	} 	primList[len] = MAX;		//设置边界哨兵 	for (int i = 0; primList[i] <= n; i++) { 		for (int j = i; primList[j] <= n; j++) { 			for (int k = j; primList[k] <= n; k++) { 				sum = primList[i] + primList[j] + primList[k]; 				if (isPrim(sum)) { 					//cout<< primList[i] <<"+"<< primList[j] <<"+"<< primList[k]<<"="<<sum<<endl; 					count++; 					if (sum > maxSum) 						maxSum = sum; 				} 			} 		} 	} 	cout << count << " " << maxSum << endl; 	return 0; }  谢谢谢谢，一定好好看

acm.hdu.edu.cn 是这个吗

能把ACM的链接给我一个吗？ 我也想玩玩。  代码如下，希望正确。 #include<stdio.h> #include<stdbool.h> #include<stdlib.h> #include<time.h>  #define N 50  long long QuickPow(long long a,long long n,long long MOD){     long long ret=1,tmp=a%MOD;     while(n){         if(n&1) ret=ret*tmp%MOD;         tmp=tmp*tmp%MOD;         n>>=1;     }     return ret; }  bool Miller_Rabin(long long x, long long a) // a^(x-1) = 1 (mod x) {     long long tmx = x - 1;     long long s2 = tmx & -tmx;     long long res = QuickPow(a, tmx/s2, x);     if(res == 1 || res == tmx)         return 1;     while(s2>1)     {         res=(res*res)%x;         if(res == 1)             return 0;         if(res == tmx)             return 1;         s2>>=1;     }     return 0; }  bool IsPrime(long long x, int k) {     if(x == 2 || x == 3) return 1;     if(x < 2 || x%2 == 0 || x%3 == 0) return 0;     while(k--)         if(!Miller_Rabin(x, rand()%(x-2)+2))             return 0;     return 1; }  int main(){     long long m,n;     long long i;     long long sum=0;     long long tmp=0;     long long primeList[3000];          int primeCount = 0;          int count=0;     int k;     srand(time(NULL));     scanf("%lld", &n);     m = 3;     for(i=m;i<=n;i++)     {         if(IsPrime(i, N))         {             primeList[count++] = i;         }     }     for(i = 0; i < count - 2; i ++)     {         for(long j = i + 1; j < count - 1; j ++)          {             for(long z = j + 1; z < count; z ++)             {                 tmp = primeList[i] + primeList[j] + primeList[z];                 if(IsPrime(tmp, N))                 {                     primeCount ++;                     if(sum < tmp)                     {                         sum = tmp;                     }                 }             }         }     }     printf("%d %lld",primeCount,sum);     return 0; }

#include <stdio.h> #include <math.h>  #define MAX_NUM 3000  int main() {     int i, j, k, s, f, u, w, max;     int n, p[3 * MAX_NUM], q[MAX_NUM];     int m;      printf("input:");     scanf("%d", &n);      if(n > MAX_NUM)         return 0;      // step 1 : 素数标记p[i]=1     for(i = 3; i <= 3 * n; i = i + 2)     {         f = 1;         u = (int)sqrt(i);         for(j = 3; j <= u; j = j + 2) {             if(i % j == 0) {                 f = 0;                 break;             }         }         if(f == 1)             p[i] = 1;     }      // step 2 : 共w个不大于n的奇素数数q[w]     w = 0;     for(i = 3; i <= n; i = i + 2) {         if(p[i]==1) {             w++;             q[w] = i;         }     }      // step 3 : 三重循环枚举所有三个素数组     m = 0;      // 全素组个数     max = 0;    // 最大全素组     s = 0;      // 3个素数之和     for(i = 1; i <= w - 2; i++)  {         for(j = i + 1; j <= w - 1; j++) {             for(k = j + 1; k <= w; k++) {                 s= q[i] + q[j] + q[k];                 if(p[s] == 1) {                     m++;                     if(s > max)                         max =s;                 }             }         }     }      printf("ouput: %d %d\n", m, max);      return 0; }


Question: linux下openssl 命令加密过程是怎么样的？怎么用openssl库来用C代码实现？

建议查看官方api，下载开源代码，自己编译，然后看着api实现功能，可以参考官方实例和网上资料

int decrypt_data(const char *_key, const char *_vt,char *_raw_ptr,size_t _raw_size     , char **_dst_buf, size_t *_dst_size ) {   DES_key_schedule schedule;   uchar key1[8];   des_cblock *iv3;   int pading ;   size_t i, vt_size ;   char *mid_buf;   memset( key1,0,8);   memcpy( key1, _key, 8 );   DES_set_key_unchecked( (const_DES_cblock*)&key1, &schedule);   vt_size = strlen( _vt );   iv3 = (des_cblock *)malloc(vt_size * sizeof(uchar));   memcpy(iv3,_vt,vt_size);   *_dst_buf = (char*)malloc(_raw_size);   DES_cbc_encrypt( (const uchar*)_raw_ptr, *_dst_buf, _raw_size, &schedule, iv3, DES_DECRYPT);   free(iv3);   return 1; } 其中key iv,得先转成8字节的数组,而非命令行的16进制字符串 然后_raw_ptr也要从base64转过来

openssl既有命令也有API，具体加密算法都是有专业文档定义每一步过程的

计算机密码学


Question: 怎么样才能循序渐进地学好编程，从入门到精通呢？

引用 3 楼 浅笑丷梨花落゛的回复:自定义的max()函数，要放在main()前面 哦哦，明白了，但是我这个也可以，不过好像是要麻烦一些，谢谢大佬哦！

引用 2 楼 main(进击的菜鸟)的回复:先把编程100例吃透，把最基础的掌握了 编程100例是什么呀大佬

引用 1 楼 user-6的回复:return 0;就是返回这个函数，主函数返回就到了操作系统了，所以要加暂时，可以用getchar();system("pause");各种都可以，但是必须在return 之前 循序渐进就是掌握了必须的语法之后，再进一步就是实战了，找个自己感兴趣的东西，从头设计，攻城拔寨，如果觉得自己设计有点吃力，可以找别人好点的代码来读，再进一步改进。做东西期间就会遇到各种问题，不过得过且过，兴趣是最大的老师。 谢谢大佬！我就是现在比较迷茫

先把编程100例吃透，把最基础的掌握了  引用 2 楼 main(进击的菜鸟) 的回复:先把编程100例吃透，把最基础的掌握了 去百度菜鸟教程100例

Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

给你个简单直接快速的方法，交费跟项目，前提有基础

好哒，谢谢大佬~有头绪了

引用 12 楼 伽利略打小怪兽的回复:关于闪退， system("pause")； 加在main函数 return之前。 好的，我去试试看

引用 11 楼 伽利略打小怪兽的回复:有两个地方需要指出。 一、定义变量时，请顺便初始化。 int a, b, c,k; 改为 int a = 0, b = 0, c = 0, k = 0;  二、scanf_s对应的输入格式 scanf_s("%d, %d, %d", &a, &b, &c); 若你这样写，则你在输入时应该是这样“1,2,3" + 回车。  再来说说怎样学好编程。 看书+练习。 1、看书时请划出知识点，或在笔记本上划出知识点拓扑图。 2、每看一章，都要思考这一章讲了些什么。 3、一本书至少看三遍，也可以每一章至少看三遍。第一遍快读，看到你认为重要的就勾出来(也不用过多思考)，      第二遍认真阅读，重点思考之前勾画的部分，顺便做好笔记。第三遍是你再通读整本书后，返过来回味，增强记忆的。 4、关于练习，可以多看看各公司笔试题。网上很多。  好了，能说的都在这儿了。编程之路苦逼而漫长，劝君回头是岸。 哇，写的很详细，很专业。真的学到了，谢谢大佬！

引用 5 楼 ELOO丶WLQ 的回复:[quote=引用 2 楼 main(进击的菜鸟)的回复:]先把编程100例吃透，把最基础的掌握了 编程100例是什么呀大佬[/quote] 去百度菜鸟教程100例

自定义的max()函数，要放在main()前面

先把编程100例吃透，把最基础的掌握了


Question: C语言如何把字符串追加到一个已有字符串的文件中

引用 4 楼 自信男孩的回复:如果仅仅是把字符串追加到文件中（已经有字符串的文件），那么没必要使用strcat，直接以"a+"的方式打开文件，然后向文件里写字符串就好了。 你程序的问题应该是有两个main函数，可能是编译时另一个文件里也有main，一起编译了。建议查一下自己的编译环境 谢谢大佬，我懂了٩( 'ω' )و

引用 4 楼 自信男孩的回复:如果仅仅是把字符串追加到文件中（已经有字符串的文件），那么没必要使用strcat，直接以"a+"的方式打开文件，然后向文件里写字符串就好了。 你程序的问题应该是有两个main函数，可能是编译时另一个文件里也有main，一起编译了。建议查一下自己的编译环境 那怎么向文件里写字符串？

引用 1 楼 user-2的回复:strcat(str,"\n"); strcat(str,s); 修改一下，用sprintf(str,"\n%s",s); str原来没有初始化，用strcat结果不可预料 还有其他错误吧，还是运行不了有error，求大神发个完整的程序🙏

还有其他错误吧，还是运行不了有error，求大神发个完整的程序😭


Question: 求大佬帮忙用c语言编一个程序

引用 2 楼 曾經的過去的回复:最短路径算法吗  。。。 对的。。。。。。。。。

最短路径算法吗  。。。

有大佬吗


Question: 猜数字游戏

这个用到随机数 如有需要联系我


Question: strlen和sizeof的区别

引用 4 楼 Martin Morning 的回复:[quote=引用 3 楼 636f6c696e的回复:]同意，代码本身就是错的 字符串必须末尾有\0 并不是所有char数组都是字符串 只有字符串才能用strlen获取长度  你的第一个例子，strlen就是内存越界，结果是未定义值 可是我在第一个例子中无论定义多少个字符，l 的结果总是字符个数加1。如果说代码错误，那么到底存在哪呢，能不能具体解释一下[/quote] 因为你的第一个字符数组用strlen的最后大小取决于，这块内存到什么地方有0，你是结果总是字符数加一，是因为首先字符是固定的，那后面内存中什么时候有0呢，你的字符数组分配在栈中，一般来讲，后面的变量分配会占用。具体什么原因，你把字符数组的内存地址打印出来，直接看栈的内容。

引用 3 楼 636f6c696e的回复:同意，代码本身就是错的 字符串必须末尾有\0 并不是所有char数组都是字符串 只有字符串才能用strlen获取长度  你的第一个例子，strlen就是内存越界，结果是未定义值 可是我在第一个例子中无论定义多少个字符，l 的结果总是字符个数加1。如果说代码错误，那么到底存在哪呢，能不能具体解释一下

引用 1 楼 lin5161678的回复:代码错 分析结果毫无意义  至于strlen 和 sizeof 请直接百度 第一种赋值方法错了吗，为什么不能这么用

代码错 分析结果毫无意义  至于strlen 和 sizeof 请直接百度

不同环境不同编译器实现不一致，我这边的环境不同字符数结果是不一样的 所以叫做未定义行为 引用 4 楼 Martin Morning 的回复:[quote=引用 3 楼 636f6c696e的回复:]同意，代码本身就是错的 字符串必须末尾有\0 并不是所有char数组都是字符串 只有字符串才能用strlen获取长度  你的第一个例子，strlen就是内存越界，结果是未定义值 可是我在第一个例子中无论定义多少个字符，l 的结果总是字符个数加1。如果说代码错误，那么到底存在哪呢，能不能具体解释一下[/quote]

char b[] ="abcde"; 等价于 char b[] = { 'a', 'b', 'c', 'd', 'e', '\0' }; // 字符串是有结束符的 char a[] = { 'a', 'b', 'c', 'd', 'e'}; 等价于 char a[5] = { 'a', 'b', 'c', 'd', 'e'}; --> 注意此时后面没有结束符，strlen(a)的结果取决于a后面的'\0'的位置，但这已经是越界了，结果是错误的