Question: 请教一个指针的问题 @赵四老板@各路老板。

计算机组成原理→Shell命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… 对学习编程者的忠告：多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！眼过千遍不如手过一遍！书看千行不如手敲一行！手敲千行不如单步一行！单步源代码千行不如单步Debug版对应汇编一行！单步Debug版对应汇编千行不如单步Release版对应汇编一行！不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！） 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 栈中的变量通常包括函数参数和函数里声明的临时变量。栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。而栈中的类变量退出其作用域时，会自动执行其析构函数，……所谓在栈中“申请”N字节的空间，其实只是将栈指针寄存器（16位sp，32位esp，64位rsp）的值多减N而已。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。（Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。”但我又不得不承认： 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物； 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。而我本人属前者。 不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质，而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。 这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！ 提醒：“学习用汇编语言写程序”和“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。（Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）想要从本质上理解C指针，必须学习C和汇编的对应关系。”不是一回事！ 不要迷信书、考题、老师、回帖；要迷信CPU、编译器、调试器、运行结果。并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

多谢!

写一行，调试一行，行行出BUG

其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

例2的a一样能得到num的地址，没问题。只不过离开这个函数也就是a的作用域以后a本身就不在了。

见过大佬N次。例2，用在实际情况里，我的程序没有正常运行。而且，指针 一般不都是要  malloc 的吗？

所以说您把实际存在问题的部分当作无关紧要的内容，从而简化掉了。 指针变量首先是个变量，变量肯定是对应着一小块存储空间的，这个不需要另外申请。 一般要malloc的是目标空间，也就是把自己的首地址送去给指针变量保存的那个空间。而您这里的目标已经有了，就是num，所以不存在什么空间问题。 问题就是局部变量a离开作用域以后失去了定义。

待验证！谢谢大佬！


Question: #C语言遇到这个报错该怎么解决啊[Error] 'rand' cannot be used as a function

#include <stdlib.h>//int rand;

删掉那行int rand;


Question: 我这个为什么编译不通过呀（第二个图片的就编译通过）

函数名前置类限定嘛


Question: C 语言 关于清空缓存 while (getchar() != '\n') continue;

另外这样写（无论前者后者）严谨地说不算是清空，因为它只清到行末。

功能上没有区别。效率上前者不可能高于后者，现代编译器中大概率编译成一样的。至于为什么，恐怕您得问编者了。


Question: 蓝桥杯c++练习系统提交总是显示运行错误

int *a = new int [n];


Question: 循环队列，求助大佬：为什么显示的运行结果不对

调式噻，一步步运行看哪里不对噻；加数据函数里，应该先放数据，在调 rear 吧；其它，显示数据，你显示的是下标，数据应该是 q->data[q->rear] 吧，而且显示过程把数据清空了，对还是不对。


Question: 这个输出结果怎么不对啊？有大佬帮忙看一下吗 感谢！！！

不是哥们，你不会debug一下吗


Question: arduino编程，红灯不亮是怎么回事，求助大佬，程序如下

所以，红灯凭什么要亮呢？


Question: 请教大佬一下，为什么这个程序不能得出想要的结果？（我编写的这个函数好像失效了）

帮你改了两个地方。  #include <stdio.h> #define SIZE_ONE 7 #define SIZE_TWO 3 void copy_fun(double array_ar[],double source_ar[]); int main(void) {     int index;     double source[SIZE_TWO];     double array[SIZE_ONE] = { 1.2, 2.3, 4.2, 7.9, 6.3, 9.3, 9.3 };     copy_fun(array,source);//删去void      printf("source's value as following:\n");     for (index = 0; index < SIZE_TWO; index++)         printf("%.1f ", source[index]);     return 0; }   void copy_fun(double array_ar[],double source_ar[]) {     int i, index;      for (index = 0, i = 2; index < SIZE_ONE- 4; index++, i++)//SIZE改为SIZE_ONE          source_ar[index] = array_ar[i]; }

#include <stdio.h>  #define SRC_ARR_LENGTH 7 #define DST_ARR_LENGTH 3  void copy_fun(double src_ar[], double dst_ar[]) {     int j = 0;     for (int i = 0; i < SRC_ARR_LENGTH; i++)     {         if ((i>=2) && (i<=4))         {             dst_ar[j++] = src_ar[i];         }     } }  int main() {     double dstArray[DST_ARR_LENGTH] = {0, 0};     double srcArray[SRC_ARR_LENGTH] = { 1.2, 2.3, 4.2, 7.9, 6.3, 9.3, 9.3 };      copy_fun(srcArray, dstArray);      printf("source's value as following:\n");     for (int i = 0; i < DST_ARR_LENGTH; i++)     {         printf("%.1f ", dstArray[i]);     }     printf("\n");      return 0; }

函数调用语句不能带前面的void，带着那玩意就被编译器理解为函数原型声明了。另外，啥地方定义了SIZE了？你的函数里SIZE-4没法解释啊。

十分感谢，我已经对代码进行了修改，可以输出想要的结果了。

失效，什么阶段什么表现；编译时，照着提示的错误信息和错误所在行，去修改；若运行结果不对，调试，在复制语句上断点，看每次复制时的状况，有错误，看错哪里，改。


Question: 大神们，帮帮忙，新人学习，找找出什么问题了，谢谢了。

scanf("%d,&gread"); 注意引号位置scanf("%d",&gread);

#include <stdio.h> int main() {     int grade;     scanf("%d", &grade);      if(grade >= 90)     {         printf("成绩为优秀\n");     }     else if((grade >= 70) && (grade <90))     {         printf("成绩为良好\n");     }     else if((grade >= 30) && (grade < 70))     {         printf("成绩为合格\n");     }     else     {         printf("成绩为差\n");     }      return 0;  }

#include <stdio.h> int main() {     int gread;     scanf("%d",&gread);          if (90<=gread            ) printf("成绩为优秀\n");     else if (70<=gread && gread<90) printf("成绩为合格\n");     else if (30<=gread && gread<70) printf("成绩为良好\n");     else if ( 0<=gread && gread<30) printf("成绩为差\n");     return 0; }

码的漂亮，应该效仿！

子曾经说过，思而不学则die所以咱得学，而不是想当然地随便写。

scanf() 语句的后双引号放哪里去了

兄弟，我改完了以后，还是不行。 运行是不能正常运行，就无论输入什么数值，它都是只有一个输出（成绩为优秀和成绩为差）一起输出的


Question: 小白求助，用逗号和空格输出结果为什么不一样

scanf() 语句里不是要求用逗号么，还问为什么？


Question: 到底错在哪里？求解答。谢谢谢谢

if 和 else if 行末不应该有语句结束标记字符分号 ;

; 号


Question:
问下各位大神，我这个代码怎么t输入18.6-18.9，结果都是错的，输入18.6  s1应该等于1，怎么等于0
18.5结果是对的

随意敲数据类型的后果。

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

不调试么，走一边大概就能知道问题在哪里吧；好像数据类型有不对

Coe() 里的 s ，最前面的声明是 int 但看函数里的使用，又是 float

这个问题可能与浮点数精度有关，因为浮点数在计算机中的表示方式可能存在精度损失。在程序中，你将浮点数输入到s变量中，但在Coe函数中，你将其与18.5进行比较。由于在计算机内部存储和表示浮点数时的精度限制，可能会导致s变量与18.5进行比较时的结果不是你期望的。因此，建议你可以将s变量与一个非常接近的整数进行比较，而不是浮点数18.5。例如，你可以定义一个整数常量，如下所示： #define BASE_S 185  然后，将s与BASE_S进行比较，如下所示： if (s <= BASE_S) {     s1 = 0; } else if (s - BASE_S <= 5) {     s1 = 1; } else if (s - BASE_S > 5) {     s1 = (s - BASE_S) / 5 + 1; }  这样，你就可以将浮点数s转换为整数进行比较，避免了由于精度误差导致的计算结果错误的问题。

谢谢🙏，懂

t输入16     s输入18.6      ch选择211  结果应该是525，输出的却是450.


Question: 0x0FA7EF8C (ucrtbased.dll)处(位于 c语言.exe 中)引发的异常: 0xC0000005: 写入位置 0x01300000 时发生访问冲突。


Question: 新手入门求大佬教一下

还请麻烦您细讲一下什么是定义标识符  现在我只是跟着翁恺老师的视频跟着敲代码  当然老师的代码是输出了出来

标识符，identifier，指的是程序代码里的那些“名字”，各种东西的名字。 变量名是标识符的重要子集。 C中一个变量使用之前需要定义/声明，定义和声明当然还有自己的差别。 变量声明是一个说明，清晰表达这个名字的变量是什么类型的，这将会决定以后什么样的操作才是合法的，因为不同类型的操作集是有区别的。 而变量定义除了具有声明类型的功能，还向编译器要求在计算机内存里分配一块空间来存放这个变量。 综上，您敲代码时跳过的 int price; （在这个程序里简约形式可以这样写，也就是省略初始化，=0字样）就是一个承担了定义任务的声明。 上面最后这行内容再笼统一下就表达为  标识符price未定义。

教材还是要看的，细看，尤其不要主观上觉得哪部分没用或者“聪明地发现”内容重复，于是就忽略一些内容。

哦哦好的谢谢您  教材现在在看谭浩强老师的版本  当然只是粗看  之后我定会细看  感谢你提出的意见

我一直说，初学者排错只看第一个错，改之，重新编译。

意思是未定义标识符的问题吗？我的理解是；如果正确了应该就可以定义了不知道我的理解是否正确   还请指正

当然不正确，因为您的确没有定义标识符price。

您看看上面的那个回复   这里回复我发不了图片给您


Question: 链表求助：为什么建表不对啊，怎么改？

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

你的第一个函数，init...忘记调用了。

看 ShowList() 里，你的表链有个起始的空表头项，那 Linklist L; 就不对了，应该是 linnode L; 吧，这样的话，那些函数调用参数也要改下变成 &L 了。


Question: 更好的方法定义故障bit位

仅供参考： #include <stdio.h>  #define WIRTE_UINT(des ,x ,pos ,len)  (                                   \     (des)                                                                 \     &                                                                     \        ~(                                /* 除要修改的位为0，其余都为1 */ \             (                                                             \                 (1<<(len))-1             /* 长度为len位的1             */ \             )                                                             \             <<(32-(pos)-(len))           /* 左移32-(pos)-(len)位       */ \         )                                                                 \     |                                                                     \         (                                                                 \             (x)                                                           \             <<(32-(pos)-(len))                                            \         )                                                                 \ ) #define READ_UINT(src ,pos ,len)      (                                   \     (                                                                     \         (                                                                 \             (unsigned)(src)                                               \         )                                                                 \         >>(32-(pos)-(len))               /* 逻辑右移32-(pos)-(len)位   */ \     )                                                                     \     &                                                                     \     (                                                                     \         (1<<(len))-1                     /* 长度为len位的1             */ \     )                                                                     \ )  int main()                              //                1111111111222222222233 {                                       //bit   01234567890123456789012345678901     unsigned int des = 0x661;           //      00000000000000000000011001100001     unsigned int r;      des = WIRTE_UINT(des ,3 ,28 ,2);    //      00000000000000000000011001101101     printf("des==0x%08X\n",des);     r = READ_UINT(des ,28 ,2);     printf("r==%d\n",r);     return 0; } //des==0x0000066D //r==3

参考C:\Program Files (x86)\Windows Kits\8.1\Include\um\WinUser.h /*  * Extended Window Styles  */ #define WS_EX_DLGMODALFRAME     0x00000001L #define WS_EX_NOPARENTNOTIFY    0x00000004L #define WS_EX_TOPMOST           0x00000008L #define WS_EX_ACCEPTFILES       0x00000010L #define WS_EX_TRANSPARENT       0x00000020L #if(WINVER >= 0x0400) #define WS_EX_MDICHILD          0x00000040L #define WS_EX_TOOLWINDOW        0x00000080L #define WS_EX_WINDOWEDGE        0x00000100L #define WS_EX_CLIENTEDGE        0x00000200L #define WS_EX_CONTEXTHELP       0x00000400L  #endif /* WINVER >= 0x0400 */ #if(WINVER >= 0x0400)  #define WS_EX_RIGHT             0x00001000L #define WS_EX_LEFT              0x00000000L #define WS_EX_RTLREADING        0x00002000L #define WS_EX_LTRREADING        0x00000000L #define WS_EX_LEFTSCROLLBAR     0x00004000L #define WS_EX_RIGHTSCROLLBAR    0x00000000L  #define WS_EX_CONTROLPARENT     0x00010000L #define WS_EX_STATICEDGE        0x00020000L #define WS_EX_APPWINDOW         0x00040000L   #define WS_EX_OVERLAPPEDWINDOW  (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE) #define WS_EX_PALETTEWINDOW     (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)  #endif /* WINVER >= 0x0400 */  #if(_WIN32_WINNT >= 0x0500) #define WS_EX_LAYERED           0x00080000  #endif /* _WIN32_WINNT >= 0x0500 */   #if(WINVER >= 0x0500) #define WS_EX_NOINHERITLAYOUT   0x00100000L // Disable inheritence of mirroring by children #endif /* WINVER >= 0x0500 */  #if(WINVER >= 0x0602) #define WS_EX_NOREDIRECTIONBITMAP 0x00200000L #endif /* WINVER >= 0x0602 */  #if(WINVER >= 0x0500) #define WS_EX_LAYOUTRTL         0x00400000L // Right to left mirroring #endif /* WINVER >= 0x0500 */  #if(_WIN32_WINNT >= 0x0501) #define WS_EX_COMPOSITED        0x02000000L #endif /* _WIN32_WINNT >= 0x0501 */ #if(_WIN32_WINNT >= 0x0500) #define WS_EX_NOACTIVATE        0x08000000L #endif /* _WIN32_WINNT >= 0x0500 */

故障bit需要是变量，需要set和reset

既然是单片机，为什么不外置编码器来直接提供故障号呢？有了号，再来个函数指针数组直接搞定。

硬件不做改动

单从软件角度有没有更好的定义方法？

既然是软的那为什么不用故障号变量，却一定要用比特表达呢？ 所以您得说清楚什么需求什么约束，否则问题没啥意义呀。


Question: 有个问题想问一下 。。。。。

这是蝙蝠侠的第二台座驾的草稿啊，你从哪里翻出来的？当年还可以卖给超人，现在估计他不感兴趣了。


Question: 新手求助大佬， 如图

logged in被翻译为登录然后误作登陆然后再翻回去成了landed这种事会被人笑的

另外数组名就是地址，所以这个scanf里面就不要对数组名取地址了。

arr2 数组溢出了，你就定义了一个字符的空间，输入字符串，起码得两个吧，一个字符，一个字符串结束标记字节 0x00；所以，把 arr2 定义得大些试试，如 arr2[64]

懂了懂了，谢谢


Question: 新手求助，求各位大佬看看

%lf%lf%lf

另外我眼神不行，认不出%和f中间是数字1还是小写L，请确保用小写L 。

是小写l，感谢您的回答

格式串里的非格式符，例如逗号，是需要你精确地原样输入的。

好像还真是逗号的问题，把逗号换成空格就正常了。


Question: 三个程序员批斗JS.JPG

不要做A语言代码修改为B语言代码的无用功。也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。即可很方便地让A、B两种语言之间协调工作。比如：A将请求数据写到文件a.txt，写完后改名为aa.txtB发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，再将b.txt改名为bb.txtA发现bb.txt存在时，读取其内容，读完后删除bb.txt以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。除非A或B不支持判断文件是否存在、文件读写和文件更名。但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？可以将临时文件放在RamDisk上提高效率减少磨损磁盘。数据的结构很复杂的话，文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的：·进程之间松耦合·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。·方便在线开关服务，只需删除或创建该临时文本文件即可。·方便实现分布式和负载均衡。·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满）·…… “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边，回头是“使用共享纯文本文件进行信息交流”的岸！


Question: 没有报错但是输出时没有结果

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。提醒：再牛×的老师也无法代替学生自己领悟和上厕所！单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。不要依赖调试器输出复杂数据结构！而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出，非常有助于调试！或者可以说是“基础设施”数据结构对单链表进行数据排序  http://bbs.csdn.net/topics/392201633

initlist; 没有带入 l 指针，应该是 initlist(l); 吧；listinsert() 里最后没有填入数据；交换部分，没看懂，也不知道对不对。


Question: 求求ctf的re大佬帮帮

是因为ida版本问题吗还是在用ida打开文件的时候一些框框我没点

求教教了


Question: C语言斜上抛运动 的仿真

easyx.cn

能不能详细说一说，我们书上没这个内容，现在束手无策了，谢谢谢谢

绘图用easyx库，算法参考 https://blog.csdn.net/liuyuan_jq/article/details/6314261 中的python代码： from visual import *  scene.width = 400 scene.height = 300  scene.autoscale = 0 scene.range = (100,100,100) scene.center = (50,40,0)  ball = sphere(pos=(0,2,0),radius=2, color=color.green) ground = box(pos=(50,-1,0),size=(100,2,10))   gravity = 9.8  # m/s**2 velocity = 25   # m/s angle = 45     # degrees angle = angle * (pi/180) # converted to radians  VelocityY = velocity * sin(angle) VelocityX = velocity * cos(angle)  seconds = 0 dt = .01  finished = False while not finished:     rate(100) # go thru the loop no more than 100 times/s     seconds += dt      # position equation: y(t) = y0 + v0*t + .5 * a * t**2     ballY = 2 + VelocityY * seconds - .5 * gravity * seconds**2     ballX = VelocityX * seconds      ball.pos = vector(ballX,ballY,0)      if ballY - 2 <= 0:         finished = True         print "initial velocity: " + str(velocity)         print "angle thrown: " + str(angle)         print "seconds in flight: " + str(seconds)         print "distance in the x direction: " + str(ballX)

有没有用C语言写的那种呢？

谢谢各位朋友了，帮帮孩子


Question: 统计输入字符，结果没有输出，各位大老请帮忙看下。

用 EOF 来判别，最后得按个 Ctrl+Z 组合键吧

放话了     已经好了

谢谢


Question: 帮忙写个c语言程序设计

easyx.cn


Question: 求助，需求就是输出所有特定的是三位数，三位数个位十位百位相应数字，分别立方后相加等于这个三位数

/* 快来抄作业 */ #include <stdio.h> int main(){    int i, j, m, n, sum; for (i=100; i<1000; i++) {     m = i;     sum = 0;      for (j=0; j<3; j++)     {         n = m%10;         m /= 10;         sum += n*n*n;     }      if (sum == i)     {         printf("%d\n", i);     } }  return 0;  }


Question: 求问这里为什么会输出3个乱码？指针数组这里第四个元素不是NULL吗，*p=NULL后为什么还会输出？后来我多加了一个整型变量i，并赋值为1后乱码消失了，但printf不了任何东西。

所以是概念性错误，数组没有第四元素。

数组越界你的修改只是瞎猫碰上死耗子罢了 char *a[]={"asd","asda","sx",NULL};

谢谢


Question: vs报错，实参与形参不兼容

有两个问题： 1.在函数printHero的参数列表中，struct hero heroArray[]应该改为struct Hero heroArray[]，大小写不匹配导致编译错误。 2.在函数bubbleSort的实现中，应该包含头文件#include，以便在比较字符串时使用string类型，否则将无法编译程序

谢谢你！研究了好久都没发现自己写错了orz


Question: 大一小白提问C语言问题

b是静态变量，也就是说每次调用b，都是在上一个b的基础上进行调用。

第二第三次调用fun的时候，进去以后b就不是2了，上次结束时b是多少现在还是多少。这就是static的用处。


Question: 程序被异常情况关闭掉，该程序自己重新开启，导致再次写文件时候发现，在上次文件尾部会出现不可见的@@@，该如何解决。

目前是别的异常导致开发板出现断电重启，只能是在重启后，自己在遍历一次该文件，去掉这些不可见字符，在继续写了。

这个没办法。就好象头疼，如果不找到原因，你没办法直接避免头疼。同样的道理。


Question: 大一c语言题目期末练习题

学会在IDE中调试时看每句C对应的汇编指令

184#include <stdio.h>int d=1;void fun(int p){int d=15;            /* 这里定义个局部变量d，且初始化等于15 /d+=p++;             / 这个d是局部变量d, p++没啥意义，结果不会传出函数外面 /printf("%d",d);    / p=3 时 d=18 注意这里没换行 /}int main( ){int a=3;fun(a);d+=a++;           / 这个d是全局变量d，所以d等于4 */printf("%d",d);return 0;} /* 所以最终结果输出184 */

求解析 越详细越好


Question: 请大佬帮忙看一下此题，百思不能完成全部要求

灰常灰常简单滴啦，当然你非要什么函数的话就要增加几行代码~ #include <stdio.h>   int main() {   int b[1024], n = 0;     for (int c; (c = getchar()) != 10;)     if (c == '+' || c == '-' || (c > 47 && c < 58))     {       ungetc(c, stdin);       if (scanf("%d", &b[n]) == 1) n++;     }   for (int i = 0; i < n; i++) printf("%d ", b[i]); puts("");     return 0; }

非常感谢大佬

int flg = 0; // 标记是否已经执行atoiint n = 0;  // b数组下标char * str = "abc456sd78fd123s 789df";char * p = NULL; for (p = str; *p; ++p){    if (*p >= '0' && *p <= '9' && 0 == flg)    {        b[n++] = atoi(p);        flg = 1;    }    if (*p < '0' || *p > '9' && 1 == flg)    {        flg = 0;    }}

非常感谢，懂了！那要是随意输入一个字符串，去判断呢？

百思不能写出稍微完美的程序


Question: C语言中的数组的比较

你知道，回字有四种写法。什么时候用哪一种呢？仅仅这样问是不是挺扯？ 上下文都是简体字的时候，你自然写简体标准。上下文都是繁体字的时候，你就要写繁体写法。搞书法的时候尤其是写对联的时候呢，一般用繁体字，但是上下联用到同一个字的时候一般需要变体，于是变体也有用的地方了。 而楼主的问题就失之于表面，你不要背代码，你得理解进去，然后知该从0开始就从0开始，该从1开始就从1开始，该从2开始就从2开始...

这得看后续是什么功能和实现的方法吧；如排序，由于是两两比较，所以 10 个数 9 次比较就可实现一遍；如输出，就得是 10 次了。

1！


Question: C++递归,什么情况会栈溢出？？

step-- 的缘故吧，后自减，即语句执行后再减，那就是始终是 return(func2(1000));  了，所以，就溢出了。换 --step 试试？

对，是因为这个


Question: 有用Linux下c 读写spi从机，该如何操作，我下面是spi 主机模式，我想知道从机模式怎么写，谢谢了

spi从机是个外设，站在楼主的代码的角度看，外设那边一般没有处理器，也就没有代码，应该是靠芯片实现的功能。就好象U盘，U盘端本身一般是不运行软件代码的。


Question: CMD命令中的参数带有双引号，如何转义双引号？

仅供参考： #include <stdio.h> void main(int argc,char *argv[]) {     int i;     for (i=0;i<argc;i++) {         printf("argv[%d]=[%s]\n",i,argv[i]);     } } //C:\>arg 1 2 3 //argv[0]=[arg] //argv[1]=[1] //argv[2]=[2] //argv[3]=[3] // //C:\>arg 1 "2 3" //argv[0]=[arg] //argv[1]=[1] //argv[2]=[2 3] // //C:\>arg 1 "2 ""3" //argv[0]=[arg] //argv[1]=[1] //argv[2]=[2 "3] // //C:\>arg 1 "2 "" 3" //argv[0]=[arg] //argv[1]=[1] //argv[2]=[2 "] //argv[3]=[3] // //C:\>arg 1 "2 \" 3" //argv[0]=[arg] //argv[1]=[1] //argv[2]=[2 " 3] // //C:\>arg 1 "2 \\" 3" //argv[0]=[arg] //argv[1]=[1] //argv[2]=[2 \] //argv[3]=[3] // //C:\>arg 1 "2 \\\" 3" //argv[0]=[arg] //argv[1]=[1] //argv[2]=[2 \" 3] // //C:\>arg 1 "2 \"\ 3" //argv[0]=[arg] //argv[1]=[1] //argv[2]=[2 "\ 3] // //C:\>arg 1 "2 \"\\ 3" //argv[0]=[arg] //argv[1]=[1] //argv[2]=[2 "\\ 3] // //C:\>arg 1 "|" //argv[0]=[arg] //argv[1]=[1] //argv[2]=[|] // //C:\>arg 1 | //命令语法不正确。 // //C:\>arg 1 ^| //argv[0]=[arg] //argv[1]=[1] //argv[2]=[|] // //C:\>arg 1 > //命令语法不正确。 // //C:\>arg 1 ^> //argv[0]=[arg] //argv[1]=[1] //argv[2]=[>] // //C:\>arg 1 < //命令语法不正确。 // //C:\>arg 1 ^< //argv[0]=[arg] //argv[1]=[1] //argv[2]=[<] // //C:\>arg 1 & //argv[0]=[arg] //argv[1]=[1] // //C:\>arg 1 && //命令语法不正确。 // //C:\>arg 1 ^& //argv[0]=[arg] //argv[1]=[1] //argv[2]=[&] // //C:\>arg 1 ^&& //argv[0]=[arg] //argv[1]=[1] //argv[2]=[&] // //C:\>arg 1 ^&^& //argv[0]=[arg] //argv[1]=[1] //argv[2]=[&&] // //命令行解释器概述命令行解释器是一个单独的软件程序，它可以在用户和操作系统之间提供直接的通讯。非图形命令行解释器用户界面提供运行基于字符的应用程序和实用程序的环境。通过使用类似于 MS-DOS 命令解释程序 Command.com 的单独字符，命令行解释器执行程序并在屏幕上显示其输出。Windows 服务器操作系统命令行解释器使用命令解释程序 Cmd.exe（该程序加载应用程序并指导应用程序之间的信息流动）将用户输入转换为操作系统可理解的形式。 // //可以使用命令行解释器创建和编辑可自动执行常规任务的批处理文件（也称作脚本）。例如，可以使用脚本自动管理用户帐户或夜间备份。还可以使用 Windows 脚本宿主 CScript 的命令行版本在命令行解释器中运行更高级的脚本。详细信息，请参阅运行 Windows 脚本宿主。通过使用批处理文件来执行操作，可比使用用户界面更有效率。批处理文件接受命令行上可用的所有命令。有关批处理文件和脚本的详细信息，请参阅使用批处理文件。 // //您可以自定义命令提示符窗口以易于查看并增强对程序运行方式的控制。有关自定义命令提示符窗口的详细信息，请参阅配置命令提示符。 // //使用命令语法 //语法按命令及所带参数必须遵循的键入顺序出现。下面的 xcopy 命令示例显示了各种语法文本格式： // //xcopy Source [Destination] [/w] [/p] [/c] [/v] [/q] [/f] [/l] [/g] [/d[:MM-DD-YYYY]] [/u] [/i] [/s [/e]] [/t] [/k] [/r] [/h] [{/a | /m}] [/n] [/o] [/x] [/exclude:File1[+[File2]][+[File3]] [{/y | /-y}] [/z] // //下表说明如何解释不同的文本格式。 // //格式化图例 //    格式    含义 //    斜体    用户必须提供的信息 //    粗体    用户必须准确键入的要显示的元素 //    省略号  (...) 在命令行中可多次重复的参数 //    中括号  ([]) 可选项 //    大括号  ({})；选项用竖线 (|) 分隔。例如：{even|odd} 用户必须从选项集合中选择一个 // //使用多个命令和条件处理符号 //使用条件处理符号可以在单个命令行或脚本中运行多个命令。通过条件处理符号运行多个命令时，条件处理符号右边的命令根据条件处理符号左边命令的执行结果来发挥作用。例如，只有在前一个命令失败的情况下才可能需要运行一个新命令。或者，只有在前一个命令成功时才可能需要运行一个新命令。 // //可以使用下表列出的特殊字符来传递多个命令。 // //字符       语法                   定义 //& [...]    Command1 & Command2    用来分隔一个命令行中的多个命令。Cmd.exe 运行第一个命令，然后运行第二个命令。 //&& [...]   Command1 && Command2   只有在符号 && 前面的命令成功时，才运行该符号后面的命令。Cmd.exe 运行第一个命令，然后只有在第一个命令运行成功时才运行第二个命令。 //|| [...]   Command1 || Command2   只有在符号 || 前面的命令失败时，才运行符号 || 后面的命令。Cmd.exe 运行第一个命令，然后只有在第一个命令未能运行成功（接收到大于零的错误代码）时才运行第二个命令。 //( ) [...]  (Command1 & Command2)  用来分组或嵌套多个命令。 // // 注意 // //“与”符号 (&)、管道符号 (|) 以及括号 () 是特殊字符，将它们作为参数传递时，必须在其前面加上转义字符 (^) 或引号。 //如果某个命令成功完成操作，该命令就返回零 (0) 退出代码或不返回任何退出代码。有关退出代码的详细信息，请参阅 Microsoft Windows 部署和资源工具包。 //嵌套命令行解释器 //通过在命令提示符下打开新的 Cmd.exe 实例，可以在 Cmd.exe 内嵌套命令行解释器。默认情况下，Cmd.exe 的每个实例继承其父 Cmd.exe 应用程序的环境。通过嵌套 Cmd.exe 的实例，可以更改局部环境，而不会影响 Cmd.exe 的父应用程序。这使您能够保留 Cmd.exe 的原始环境，并在终止嵌套的命令行解释器之后返回到原始环境。但是在嵌套的命令行解释器中所做的更改将不会被保存。 // //要嵌套命令行解释器，请在命令提示符下键入： // //cmd // //出现类似于下面内容的消息： // //Microsoft (R) Windows Server 2003 Standard Edition (TM) //(C) 版权所有 1985-2002 Microsoft Corp. //要关闭嵌套的命令行解释器，请键入 exit。 // //使用 setlocal 和 endlocal 命令，可以在 Cmd.exe 的实例中（或在脚本中）进一步将更改局部化。Setlocal 创建局部作用范围，而 endlocal 终止局部作用范围。在 setlocal 和 endlocal 作用范围内所做的更改将会被放弃，从而保持原始环境不变。这两个命令的嵌套最高可达到 32 级。有关 setlocal 和 endlocal 命令的详细信息，请参阅 Setlocal 和 Endlocal。 // //将环境变量与 Cmd.exe 一起使用 //Cmd.exe 命令行解释器环境由确定命令行解释器和操作系统行为的变量进行定义。可以使用两种类型的环境变量（系统和局部）来定义命令行解释器环境或整个操作系统环境的行为。系统环境变量定义全局操作系统环境的行为。局部环境变量定义 Cmd.exe 当前实例环境的行为。 // //系统环境变量预置于操作系统之中，并可用于所有 Windows 服务器操作系统进程。只有具有管理凭据的用户才可以更改系统变量。这些变量最常用于登录脚本。 // //局部环境变量只有在创建变量时针对的目标用户登录到计算机时才有效。HKEY_CURRENT_USER 配置单元中设置的局部变量只对当前用户有效，但它们可定义全局操作系统环境的行为。 // //下表按优先顺序的降序描述变量的各种类型： // //内置系统变量 //在 HKEY_LOCAL_MACHINE 配置单元中找到的系统变量 //在 HKEY_CURRENT_USER 配置单元中找到的局部变量 //在 Autoexec.bat 文件中设置的所有环境变量和路径 //在登录脚本（如果有的话）中设置的所有环境变量 //在脚本或批处理文件中交互使用的变量 //在命令行解释器中，Cmd.exe 的每个实例都继承其父应用程序的环境。因此，可以在不影响父应用程序环境的情况下更改新的 Cmd.exe 环境中的变量。 // //下表列出 Windows server operating system 的系统和本地环境变量。 // //变量                     类型       描述 //%ALLUSERSPROFILE%        本地       返回“所有用户”配置文件的位置。 //%APPDATA%                本地       返回默认情况下应用程序存储数据的位置。 //%CD%                     本地       返回当前目录字符串。 //%CMDCMDLINE%             本地       返回用来启动当前的 Cmd.exe 的准确命令行。 //%CMDEXTVERSION%          系统       返回当前的“命令处理程序扩展”的版本号。 //%COMPUTERNAME%           系统       返回计算机的名称。 //%COMSPEC%                系统       返回命令行解释器可执行程序的准确路径。 //%DATE%                   系统       返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息，请参阅 Date。 //%ERRORLEVEL%             系统       返回上一条命令的错误代码。通常用非零值表示错误。 //%HOMEDRIVE%              系统       返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 //%HOMEPATH%               系统       返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 //%HOMESHARE%              系统       返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 //%LOGONSERVER%            本地       返回验证当前登录会话的域控制器的名称。 //%NUMBER_OF_PROCESSORS%   系统       指定安装在计算机上的处理器的数目。 //%OS%                     系统       返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。 //%PATH%                   系统       指定可执行文件的搜索路径。 //%PATHEXT%                系统       返回操作系统认为可执行的文件扩展名的列表。 //%PROCESSOR_ARCHITECTURE% 系统       返回处理器的芯片体系结构。值：x86 或 IA64（基于 Itanium）。 //%PROCESSOR_IDENTFIER%    系统       返回处理器说明。 //%PROCESSOR_LEVEL%        系统       返回计算机上安装的处理器的型号。 //%PROCESSOR_REVISION%     系统       返回处理器的版本号。 //%PROMPT%                 本地       返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。 //%RANDOM%                 系统       返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。 //%SYSTEMDRIVE%            系统       返回包含 Windows server operating system 根目录（即系统根目录）的驱动器。 //%SYSTEMROOT%             系统       返回 Windows server operating system 根目录的位置。 //%TEMP%和%TMP%            系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP，而其他应用程序则需要 TMP。 //%TIME%                   系统       返回当前时间。使用与                                                                                time       /t                                                                     命令相同的格式。由         Cmd.exe                  生成。有关                       time   命令的详细信息，请参阅 Time。 //%USERDOMAIN%             本地       返回包含用户帐户的域的名称。 //%USERNAME%               本地       返回当前登录的用户的名称。 //%USERPROFILE%            本地       返回当前用户的配置文件的位置。 //%WINDIR%                 系统       返回操作系统目录的位置。 // //设置环境变量 //使用 set 命令创建、更改、删除或显示环境变量。set 命令只更改当前解释器环境中的变量。 // //要查看变量，请在命令提示符下键入： // //set VariableName // //要添加变量，请在命令提示符下键入： // //set variablename=Value // //要删除变量，请在命令提示符下键入： // //set VariableName= // //可以将大多数字符用作变量值，其中包括空格。如果使用特殊字符 <、>、|、& 或 ^，则必须在它们前面加上转义字符 (^) 或引号。如果使用引号，则必须将引号作为值的组成部分，因为等号后面的任何内容都会被视为值。请考虑下列示例： // //要创建变量值 new&name，请键入： //set varname=new^&name // //要创建变量值 "new&name"，请键入： //set varname="new&name" // //如果在命令提示符下键入 set varname=new&name，就会出现与下面内容类似的错误消息： //“'name' 不是内部或外部文件，也不是可运行的程序或批处理文件。” //变量名不区分大小写。但是，set 显示的变量与您键入的完全相同。可以在变量名中结合使用大写字母和小写字母，这样可以使代码更具有可读性（例如，UserName）。 // // 注意 // //单个环境变量的最大大小为 8192 字节。 //所有环境变量的大小总和（包括变量名和等号）最大为 65,536 KB。 //替换环境变量值 //要在命令行或脚本中启用变量值替换，请将变量名包括在百分号之中（即，%VariableName%）。使用百分号可以确保 Cmd.exe 引用变量值，而不是进行文字比较。为变量名定义变量值之后，请将变量名包括在百分号之中。Cmd.exe 搜索该变量名的所有实例，并用定义的变量值进行替换。例如，如果创建包含不同值（例如，用户名）的脚本，并且想要用这些值为每个用户定义 USERNAME 环境变量，可以使用包括在百分号之中的 USERNAME 来编写代码。运行此脚本时，Cmd.exe 将用变量值替换 %USERNAME%，这样就消除了为每个用户手动执行此任务的必要。变量替换是不可递归的。Cmd.exe 检查变量一次。有关变量替换的详细信息，请参阅 For 和 Call。

命令行里转义字符好像是 Shift+6 的那个上尖角符号 ^ ；引号，直接使用不对的话，试试 ^" ?


Question: [C语言]关于数组指针的问题，代码如下：

p后面的方括号是多余的。


Question: C语言新手求助帖子，求大佬解答疑惑

1、输入的时候敲 a=7 b=9 2、3、一样的，等号左右的表达式评估过程不分先后，所以像 *b++= *b*2; 这样写不对。 4、级别不同不好相容，所以应该写 int *p=a[0];


Question: 求代码急需，在线等，快快快！！！

呃，前面的代码确实有考虑不全的地方。但是简洁呢，还是要的，很多年以前，在我开始学习编程的时候，一位师兄告诉我：代码不是old二，越长越好，从那之后，我一直记着这句话，作为代码的基本要求~修改一下： #include <stdio.h>  int main() {   int n, k, x = 0;    for (int i = (scanf("%d%d", &n, &k), 1); n; n /= 10, i *= k + 1)     x += (n % 10 < k ? n % 10 : k) * i;   printf("%d\n", x);    return 0; }

老赵的代码写得太繁琐，须知代码不是小二，越长越好~ #include <stdio.h>  int main() {   char n[8];   int k, x = 1;    for (int i = (scanf("%s%d", n, &k), 0), j; n[i]; i++)     x *= (n[i] - '0' > k ? k : n[i] - '0') + 1;   printf("%d\n", x - 1);    return 0; }

xs，自己代码都是错的 来说别人繁琐？

#include <stdio.h> int main() {     int n,k,i,t,f;     char s[8],*p;     scanf("%d%d",&n,&k);     t=0;     for (i=1;i<=n;i++) {         sprintf(s,"%d",i);         f=1;         p=&s[0];         while (1) {             if (*p==0) break;             if (*p>'0'+k) {                 f=0;                 break;             }             p++;         }         if (f) t++;     }     printf("%d\n",t);     return 0; }

灰常灰常简单滴啦～


Question: qsort对动态内存排序问题

#include <stdio.h> #include <stdlib.h> #include <malloc.h> struct PC {     int a;     char b; } *pc; int i; int compare( const void *arg1, const void *arg2 ) {     return ((struct PC *)arg1)->b - ((struct PC *)arg2)->b; } int main() {     pc=(struct PC *)malloc(3*sizeof(struct PC));     pc[0].a=1;     pc[0].b='z';     pc[1].a=2;     pc[1].b='y';     pc[2].a=3;     pc[2].b='x';     qsort( (void *)pc, 3, sizeof(struct PC), compare );     for (i=0;i<3;i++) {         printf("pc[%d].a:%d, pc[%d].b:'%c'\n",i,pc[i].a,i,pc[i].b);     }     free(pc);     return 0; } //pc[0].a:3, pc[0].b:'x' //pc[1].a:2, pc[1].b:'y' //pc[2].a:1, pc[2].b:'z' //


Question: 再问数据类型转化的问题

不明白你什么意思。

如果你熟悉MarkDown语法，在代码的前后加 ``` 可以让代码有语法高亮效果。例如： #include <stdio.h> int main(int argc,char** argv){   print("hello,wolrd!");   return 0; }

谢谢

错误不在调用上，在于你的指针没有目标空间，你得给它目标空间然后才好干活。

谢谢！得怎么给它目标空间呢？我比较愚钝，还请明示。


Question: 数据类型转化的为问题

谢谢！

SERCOM6_SPI_Write((void *)&dat, 1);


Question: 完全懵逼了，不符合小学数学啊

VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E  http://bbs.csdn.net/topics/391003898

#define square(x) ((x) * (x))

1+1*1+1=3 (1+1)*(1+1)=4


Question: 怎么不是16呢？木天理

VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-Ehttp://bbs.csdn.net/topics/391003898

3+1*3+1當然等於7啦。 #define sqr(x) (x* x)

( (x) * (x))


Question: 难道*i = *i * *i 运行了两次？

我一运行，他输出4,9毫无破绽啊

对学习编程者的忠告：多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！眼过千遍不如手过一遍！书看千行不如手敲一行！手敲千行不如单步一行！单步源代码千行不如单步Debug版对应汇编一行！单步Debug版对应汇编千行不如单步Release版对应汇编一行！不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！

用個中間變量過度下，不要直接*i=*i**i


Question: 求助 C语言习题水仙花数的bug疑问

100g改爲 100 * g 还有10s也改下，%dn\改为 %d\n

谢谢你 bug已经修好啦


Question: 求助 改错(C语言_数据结构单链表删除，学生管理系统)

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

86行造成结点自循环了嘛，所以后面的结点就都丢了。

那请问要改成啥压，，这里我改了好几遍，例如p=phead->next,pre->next=phead-next,等等，要么就是循环了，要么就是段错误 绕不出来 请帮忙做出改正和更加详细的解释谢谢谢谢谢谢

p 和 pre 的 next 不应该再设置的，你只是给 p 和 pre 初始化下，表里 next 成员这时又不应该发生变动。

也就是在这里将pre和p初始化成为一个在前一个在后的指针，然后并排跑是嘛


Question: 求助，有关结构体指针的初始化

fat* fat1 = (fat*)(v_addr0 + BLOCKSIZE);这个不是初始化，是指向v_addr0 + BLOCKSIZE 这个偏移地址。猜测BLOCKSIZE是fat结构体的大小，那么这个偏移就是指向下一个结构体。fat1当然可以当做数组了。

不是初始化结构体，只是让那指针指向已有的数据某部分；指针当数组，全看编译器是否支持了，指针类型确定了，作为数组指向某单元，偏移是可以确定的

不懂的部分就去溯源，不去找的话，大佬们也一样不懂。


Question: 请问怎么修改代码，能让输出的结果既能输出“没有与别人生日相同的人”，也能输出“生日相同的人”？

输入a 2000:1:3b 2000:1:2c 2000:1:2则输出1:2 b c1:3 a 以上本来就已经实现了既能输出“没有与别人生日相同的人”，也能输出“生日相同的人”呀？


Question: for (k = 1; 1; ++k)是什么意思

for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }

是的


Question: 请问 gcc 怎么查询默认的设置项？

gcc -v --help


Question: keil遇到问题了，真心求解。main.c（350）：错误 C141：语法错误接近“void”，预期为“__asm”

void nao_zhong(); 这个后面的分号是否多余？

好像，没有太大关系


Question: 自学了x86汇编，说一下我对内存的理解，如有错误请大家指正。

比较新的处理器通常是56位物理地址了，当然内存控制器一般只能支持几百GB的内存~

对于裸内存来说，您理解的都对。只是现有的硬件一般实现地址总线时不会搞64根，典型值是48根。所以理论上那么长的那根绳子在现阶段的实践中可能只有65536分之一的长度是实际可用的。

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址；人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 栈中的变量通常包括函数参数和函数里声明的临时变量。栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。而栈中的类变量退出其作用域时，会自动执行其析构函数，……所谓在栈中“申请”N字节的空间，其实只是将栈指针寄存器（16位sp，32位esp，64位rsp）的值多减N而已。 计算机组成原理→Shell命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… 对学习编程者的忠告：多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！眼过千遍不如手过一遍！书看千行不如手敲一行！手敲千行不如单步一行！单步源代码千行不如单步Debug版对应汇编一行！单步Debug版对应汇编千行不如单步Release版对应汇编一行！不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！） 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。（Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。”但我又不得不承认： 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物； 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。而我本人属前者。 不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质，而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。 这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！ 提醒：“学习用汇编语言写程序”和“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。（Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）想要从本质上理解C指针，必须学习C和汇编的对应关系。”不是一回事！ 不要迷信书、考题、老师、回帖；要迷信CPU、编译器、调试器、运行结果。并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

很欣慰，一年前你这段话还完全不理解，现在已经理解了至少80%。是你把我带进汇编这个坑里的。

我都说了：【 提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！ 】 为什么你还认为是我把你带“坑”里了呢？ (^_^)

《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》


Question: 请教大佬C++编译后Windows Defender和360报毒怎么解决

使用360杀毒杀一杀你的电脑

虚拟机里面跑的，主机没用360，其他杀毒软件（金山毒霸，腾讯电脑管家，火绒）都没报毒，只有360和Windows Defender报毒。

那就虚拟机里面杀毒


Question: 有一道非常简单的循环我实在搞不懂

原因是scanf会默认读取末尾空白字符并跳过，你输入的数字（比如1  2 3     4   6 7     8）后面有几个空格都无所谓，scanf会读取并抛弃，直到遇到一个非空白字符。也就是说你输入1 2之后，“1”才会被真正读取，"2"进入缓冲区。同理，你输入“8”之后，必须有一个非空白字符才会读取到“8”。

你的scanf的%d后面有空格，意味着你敲完8以后也得带个空格，然后再敲回车。而不是直接敲回车。所以，%d为什么要带空格呢？

并不是这个原因。scanf 不会读取空格。


Question: 先学完汇编基础，是否C语言的学习就不成问题了？

汇编更底层吧，C语言和汇编差别还是挺大的，语法也差很多，就当做一门新课程学了。

计算机组成原理→Shell命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… 对学习编程者的忠告：多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！眼过千遍不如手过一遍！书看千行不如手敲一行！手敲千行不如单步一行！单步源代码千行不如单步Debug版对应汇编一行！单步Debug版对应汇编千行不如单步Release版对应汇编一行！不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！） 想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。”但我又不得不承认： 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物； 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。而我本人属前者。 不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质，而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。 这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！ 提醒：“学习用汇编语言写程序”和“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。（Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）想要从本质上理解C指针，必须学习C和汇编的对应关系。”不是一回事！

汇编只对于理解高级语言生成的二进制代码有所帮助，对于高级语言编程并没有什么作用（几乎没有，如果你不使用嵌入汇编的话），二者并非楼房一层和二层之间的关系，只能说类似手工业和工业化大生产之间的关系~

也不是全无作用，比如没学汇编之前对C的指针和数组理解不透彻，所有文章都试图用printf解释，越解释越乱。学过汇编就能明白内存长什么样子，数组和指针就自然理解了。

不能理解，走路之前为什么一定要先砍一条腿呢？

每天只有1个小时学习，研究C的汇编代码就没空看书，看书就没空研究汇编。

问题是一个人只能有一棵技能树，独立于其他人，独特于其他人。 培养树是一辈子的事。 如果你坚持认为浇水施肥捉虫等等事情只能挑着做一件，那是没法培养树的。

家里养花吗，你真的有时间天天浇水施肥捉虫？大多数时候有浇水就不错了。等退休并且没子女拖累时，才能天天养花。 实际上我们每个人都是偏科的，因为人的精力和时间有限。我40岁，学编程只在坚持活到老学到老的最求。


Question: #求助  在输出数组时不知为何第一个数为0

你的代码第五行是干嘛的？你把它给忘了。


Question: 求助！不知道代码哪里出错了，运行不了，求求各位大佬帮忙看看

错误挺多的，首要的问题是，您没写输出有效信息的printf，运行它就不会有可见的结果啊。


Question: 编写一个函数，输入n为偶数时，调用函数求1/2+1/4+...+1/n,当输入n为奇数时，调用函数1/1+1/3+...+1/n(利用指针函数)。


Question: 如何实现跨平台、跨硬件读取CPUID等信息？

这个是无法做到硬件无关的，好比你要测量每个人老二的大小~

可能我的表达有误，我的意思其实是想说，因为不同的架构所以需要不同的指令，应该有代码可以判断或者读取的，只是我似乎搜索不到这样的代码，网上已有的代码千篇一律，只能查INTEL系列的，我只想看哪里能找得到，是LINUX的内核源码吗？

CPUID这个词本来就是Intel的私有术语，您不能凭想象把它推广到其他硬件啊。

这么说吧，如果能实现的话，Java还会这么滋润么？


Question: 救命啊！！为什么链表尾插数据无法退出循环，不知道哪里出问题，大佬救命！！！

while (y != NULL && strcmp(y->bookid, p->bookid) <= 0) {                             yf = y; y = y->next;                         }                         if (y == NULL) { yf->next = p; }                         else { p->next = y; yf->next = p; }  谢谢谢大佬，已解决。y = null 时， y->bookid 已经没有值无法比较while条件前后互换一下&&


Question: 请问有哪些书介绍C语言和汇编之间的对应关系？

C编译器都支持生成lst汇编代码并且带对应C源代码注释

没这样的书，高级语言和低级语言之间不是一对一的关系，而是多对多的干系~

我学习了一段时间x86汇编，visual studio的C语言反汇编可以看懂部分。 想要看懂全部，苦于网上资料零碎，希望有书全方位介绍。

我觉得作为司机没必要学习发动机制造过程中的金属表面热处理工艺。

如果您写一本的话，我买一本表示一下支持。


Question: 求助！这代码循环结构那里出问题了，但是不知道怎么改,感谢大佬！！！

for(i=1;i<n;i++) {   for(j=i+1;j<=n;j++)     {    if((p[i].a==p[j].a&&p[i].b==p[j].b) || (p[i].a==p[j].a&&p[i].c==p[j].c) || (p[i].b==p[j].b&&p[i].c==p[j].c))         ans++;     } }

谢谢大佬！！！！！


Question: #求助 fread函数总会读进一些意料之外的字符

Line 47把info当作字符串输出，但是从文件读出的info的内容是没有'\0'结尾的，所以，printf函数会越过info的边界继续输出字符，直到遇到'\0‘。而内存中info后面的内容是随机的。

fread本来是用来读二进制文件的，整个读结构体数组什么的很方便。你偏要用他读文本文件当然是各种别扭了。

想象一下给汽车去掉方向盘装上自行车车把的效果。

确实，很不方便

有可能是文件编码的一些问题，或者是out.txt末尾有不可见字符。如果在out.txt随便加入一些中文字符，程序的输出是？

我另起一行加了个“你好“，输出结果里没有中文字符，但是有更多的乱码 具体结果是这样的： Sum is: 33 Sum is: 45 浣犲ソ LOGONSERVERn?萬

首先确定out.txt的编码是Windows的缺省编码。notepad点击另存为，它显示的编码是Ansi吗？ 如果是其他编码，就会出现中文打印乱码的情况。 另外，在get_info()里面，建议里面的代码改成： char* get_info(FILE*fp) { 	int size=tell_len(fp); 	char*info= (char*)malloc(sizeof(char) *size + 1); 	.....  	fread(info,size,1,fp); 	// print %s 打印时， 字符串需要0结尾 	info[size] = 0;      rewind(fp); 	return info; }

out 的编码是utf-8不是ANSI


Question:
我正在参加年度博客之星评选，请大家帮我投票打分，您的每一分都是对我的支持与鼓励。
https://bbs.csdn.net/topics/611386885?spm=1001.2014.3001.69

已5星，欢迎回访！诚信互评⭐⭐⭐⭐⭐http://t.csdn.cn/KMfwt已5星，欢迎回访！诚信互评⭐⭐⭐⭐⭐http://t.csdn.cn/KMfwt已5星，欢迎回访！诚信互评⭐⭐⭐⭐⭐http://t.csdn.cn/KMfwt


Question: 2022年「博客之星」参赛博主：1 + 1=王

已支持，欢迎回访五星 ⭐⭐⭐⭐⭐：https://bbs.csdn.net/topics/611386885

已支持， 五星互访 https://bbs.csdn.net/topics/611390868

# 已五星好评，诚信五星，五星必回⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611388978 # 已五星好评，诚信五星，五星必回⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611388978 # 已五星好评，诚信五星，五星必回⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611388978

已给5星，诚信互评：https://bbs.csdn.net/topics/611387606 已给5星，诚信互评：https://bbs.csdn.net/topics/611387606 已给5星，诚信互评：https://bbs.csdn.net/topics/611387606

已回投

https://bbs.csdn.net/topics/611390422 ， 已五星好评，谢谢！

欢迎一起互访五星！https://bbs.csdn.net/topics/611390545

欢迎一起互访五星！！https://bbs.csdn.net/topics/611387550?spm=1001.2014.3001.6953

⭐⭐⭐⭐⭐诚信五星，五星必回⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611387545⭐⭐⭐⭐⭐五星后,请留下链接🔗,必回访⭐⭐⭐⭐⭐

已五星，欢迎回访https://bbs.csdn.net/topics/611390140

已给巨佬五星，期待回评。 http://t.csdn.cn/ounE2 已给巨佬五星，期待回评。 http://t.csdn.cn/ounE2  有🧧领 ✨✨✨✨✨

已投，诚信五星，五星必回⭐⭐⭐⭐⭐http://t.csdn.cn/XKj1X欢迎互访五星评论互投必回⭐⭐⭐⭐⭐http://t.csdn.cn/XKj1X

已投诚信五星互投⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611388261诚信五星互投⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611388261诚信五星互投⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611388261

已安排，五星，原力等级7，诚信互投https://bbs.csdn.net/topics/611389531已安排，五星，原力等级7，诚信互投https://bbs.csdn.net/topics/611389531已安排，五星，原力等级7，诚信互投https://bbs.csdn.net/topics/611389531

五星支持，原力7级，欢迎互投https://bbs.csdn.net/topics/611387935

五星已评！⭐⭐⭐⭐⭐满级原力最高加分互相五星支持！欢迎回访：https://bbs.csdn.net/topics/611389757

已五星 https://bbs.csdn.net/topics/611388380?utm_medium=notify.im.notify-business-fans.16584a08e070f000.a&username=wnn654321

已支持，欢迎回访五星 ⭐⭐⭐⭐⭐ https://bbs.csdn.net/topics/611388731

已五星支持。 https://bbs.csdn.net/topics/611389981


Question: 2022年「博客之星」参赛博主：1 + 1=王

已支持，欢迎回访五星 ⭐⭐⭐⭐⭐：https://bbs.csdn.net/topics/611386885

已支持， 五星互访 https://bbs.csdn.net/topics/611390868

# 已五星好评，诚信五星，五星必回⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611388978 # 已五星好评，诚信五星，五星必回⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611388978 # 已五星好评，诚信五星，五星必回⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611388978

已给5星，诚信互评：https://bbs.csdn.net/topics/611387606 已给5星，诚信互评：https://bbs.csdn.net/topics/611387606 已给5星，诚信互评：https://bbs.csdn.net/topics/611387606

已回投

https://bbs.csdn.net/topics/611390422 ， 已五星好评，谢谢！

欢迎一起互访五星！https://bbs.csdn.net/topics/611390545

欢迎一起互访五星！！https://bbs.csdn.net/topics/611387550?spm=1001.2014.3001.6953

⭐⭐⭐⭐⭐诚信五星，五星必回⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611387545⭐⭐⭐⭐⭐五星后,请留下链接🔗,必回访⭐⭐⭐⭐⭐

已五星，欢迎回访https://bbs.csdn.net/topics/611390140

已给巨佬五星，期待回评。 http://t.csdn.cn/ounE2 已给巨佬五星，期待回评。 http://t.csdn.cn/ounE2  有🧧领 ✨✨✨✨✨

已投，诚信五星，五星必回⭐⭐⭐⭐⭐http://t.csdn.cn/XKj1X欢迎互访五星评论互投必回⭐⭐⭐⭐⭐http://t.csdn.cn/XKj1X

已投诚信五星互投⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611388261诚信五星互投⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611388261诚信五星互投⭐⭐⭐⭐⭐https://bbs.csdn.net/topics/611388261

已安排，五星，原力等级7，诚信互投https://bbs.csdn.net/topics/611389531已安排，五星，原力等级7，诚信互投https://bbs.csdn.net/topics/611389531已安排，五星，原力等级7，诚信互投https://bbs.csdn.net/topics/611389531

五星支持，原力7级，欢迎互投https://bbs.csdn.net/topics/611387935

五星已评！⭐⭐⭐⭐⭐满级原力最高加分互相五星支持！欢迎回访：https://bbs.csdn.net/topics/611389757

已五星 https://bbs.csdn.net/topics/611388380?utm_medium=notify.im.notify-business-fans.16584a08e070f000.a&username=wnn654321

已支持，欢迎回访五星 ⭐⭐⭐⭐⭐ https://bbs.csdn.net/topics/611388731

已五星支持。 https://bbs.csdn.net/topics/611389981


Question: #求助 Python

把代码重新发一下，方便查看 m=3 while m<10:     n=2     while n<=m-1:         if m%n==0:             break         if n==m-1:             print(m)         n+=1     m+=1  这段代码是打印<10的质数把，因为当m=6时，n从2到5循环，测试是否 m%n==0,由于6%2==0, 会执行break,所以不会打印出来  想知道满足了if语句，那么n+=1还需要执行吗？  当 m%n==0时，会执行break, 跳出 while n<=m-1: 的循环，不会执行n+=1否则会执行


Question: 为什么c的程序运算结果不对？

这里错了：scanf("%d %d &d",&a,&b,&c); 应该是：scanf("%d%d%d",&a,&b,&c);

printf("请输入3个整数：");   scanf("%d%d%d", &a, &b, &c);   if (b > c) c += b -= c, b = c - b;   if (a > b) b += a -= b, a = b - a;   if (b > c) c += b -= c, b = c - b;   printf("max = %d, min = %d, median = %d\n", c, a, b);

max太多余了，把max删了

在scanf后把三個值都打出來就知道是哪的問題啦。懷疑是最後那個%d沒改，還是寫&d。

scanf("%d %d &d",&a,&b,&c); 改为   scanf("%d%d%d",&a,&b,&c);

改了也不对的。我输入 3 5 9，结果显示最大值为5。


Question: C语言fscanf无法将N赋值（一直都是0）

用 vc2008 编译执行了，有结果：6.0， -1.0, 1.0 。那，可能是你的 data.txt 不对，不是 ascii 格式？

也可能是文件存放的路径不对。 VS的运行环境，当前路径是项目目录，不是exe所在目录。 总之是不知道文件打开成功没有。

我是用dev写的


Question: 有没有大佬帮我看看这个基础链表（萌新求助，人已裂开？

struct data* p1 = new (struct data);  这个，去掉开头的 struct data* 否则是又定义了个新的变量 p1 和前面的不是一个变量，所以两处的 p1 是不一样的，就不对了。


Question: 清空数据栈的参数为什么可以是地址也可以不用地址

那个是引用，不是地址。

嗷嗷，那为什么引用和不引用都可以压，数据栈的清空有指针变化不应该只有引用可以吗

画面上没有证据表明可以，是你自己说可以的。


Question: 求助大佬   为什么输出的结果不对？

scanf() 里的第三个多了个 % 是两个了：%%d

看到了


Question: 这个代码的分析结果是啥呀

先来看一下C语言的运算优先级：   #include<stdio.h>  int main()  {     //定义数组     int a[]= {2,4,6,8,10};      //定义指针p指向数组a     int *p=a;      //指针p指向的数组元素为2，这里是(*(p++))     //实际上p++是表示指针p+1了但是返回的还是+之前的值     //再对这个值*引用，所以就是2     printf("%d\n",(*p++));      //上一行代码已经让p + 1了,这里指针p先运行(++p)指针+1     //然后在用*引用，也就是*(p + 2)的值     printf("%d\n",(* ++p));      //接着又先进行++p操作此时p指向的是8，但是执行的是(* ++p)++     //也就把8加一，只不过返回的还是8     printf("%d\n",(* ++p)++);      //实际上8+1=9     printf("%d\n",*p);     return 0;  }

指针的花花，头疼；结果是啥，先自己看看琢磨琢磨呗，结果记下来，再编译了运行下，看和自己的一样否。


Question: 大佬们，C语言怎么对sqlserver实现增删改查

C DAO/ADO SQL


Question: 求大佬帮帮孩子写一条小小的代码

百度一搜一大堆


Question: 求助大佬  为什么程序有时运行结果正确，有时又不对

m, n, x, y 都没有初始化，遇到首单元就是最大或最小的，就不对了；另外，最大和最小，可以一个循环。

谢谢大佬，懂了


Question: printf 打印总是乱码？

看上面图，那些 FF 应该是单字节被符号扩展到了双字的缘故。加密对否，可以和标准的代码的结果比较，也可以用解密模块解密下看看是否还原。

aes加密？加密后的数据，本来就是乱的啊；不乱的加密，往往只是简单的替换，强度在计算机面前近乎 0

不是我的意思是说，即使是乱码，应该也是ASCII码不是?然而返回的并不是啊

应该也是 ascii? 哪来的说法? aes 是 16字节一组进行的，结果是可能任何的 16字节数据，且是一个整体，'abc' 加密了后，不可能只是 'xyz' 。

我基础差啊，所以大侠，请假下如何屏幕打印这些字节码，以验证加密后的字符串数据是否正确？


Question: 求助，字符串大小写转换的问题

明白你的問題在哪啦，把c[ temp - 47]刪掉就可以啦。

if ( n[i]<'0' || n[i]>'9' )   continue; temp = n[i] - '0'; if ( c[temp] >= 'a' && c[temp] <= 'z' )     c[temp] &= 0x5f; if ( c[temp] >= 'A' && c[temp] <= 'Z' )     c[temp] != 0x20;

哦，第二个if前应该加上 else

thanks 我看看

你好，我想再请教一下，按位与计算的思路是怎么来的呢？（位运算不太了解有什么用（（（

竟然没看懂题意，输入的数字字符串怎样用，大小写变换的依据是

大小写转换的依据就是后面输入的数字，如果输入1那就是将字符数字中c［1］位转换大小写

或许是对题目的理解有误。这个事儿很常见。

但是我的代码执行结果跟我的预期也有出入，我想知道为什么

那两个函数是处理字符串的，不是处理字符的，用在这里不合适。

但是我如果取地址的话，不应该也相当于字符串吗？


Question: 请问这段代码应该怎么理解？（c语言初学者）

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

递归求斐波那契数列吧


Question: 求解：c语言矩阵置。急急！求求！谢谢！

将25行printf("% 3d ",num1[i][j]);改成了printf("   %d",num1[i][j]);或者printf("%4d",num1[i][j]);就可以了；字符里面的空格运用不当。

%4d就占4字節啦

改成4运行的时候，第一列占4个宽度，第二、三列占5个宽度。

已解决，谢谢。

所以你在格式串里写空格的目的是什么？

对空格的运用不准确，已修改，谢谢。


Question: 初学者 不会用xcode

先搞清楚打不开的是哪个。


Question: 求助,C语言关于如何得到数组存放元素的个数

你自己用常量记下数组的大小就可以了：    const int len1=3, len2=3;    int num1[len1]={1,2,3};    int num2[len2]={1,2,3};C因为是基础语言，很多语法糖都省略了，所以不是很适合用于开发应用软件，尤其是事务处理型软件，比如说连函数重载都不支持，不是做不到，而是为了追求简单灵活。一个C编译器，最小可以只用不到100KB源码实现，而C++编译器，比如gcc，光是前端语法解析部分，parser.c，就有12MB大小~

思维习惯不对呀，C里面的数组你就永远不应该企图“获取”它的大小，因为它的大小是由程序员主观意志决定的。换句话说是先有大小后有数组的。这么说吧，假如是上帝创造了人，那么上帝怎么可能需要数一数才知道人有几个手指头呢？

谢谢回复，我才开始学习C语言，感谢提醒。

C语言不象java,c#这些， 数组可以通过length属性获取个数，在C中，静态分配的数组，比如: int num1[3], 可以通过 sizeof(num1)/sizeof(num1[0])  获取数组的大小动态分配的数组，比如: int* num2; num2=new int[1000]; 则程序需要自己记住分配的大小至于为什么while... 有可能得不到正确的结果， 是因为，在内存中，1,2,3  后面有可能是任何其它数据，比如：1,2,3, 0   这种可以正确获得大小，但，如果是其它，就会出错。

谢谢回复，我后来了解到num[3]并不是直接是的给了3个位置存放数字，就算打印num[3],num[4]也会出现结果的，但是我并不知道为什么会出现这种情况。

建议从一些基础的了解开始， 比如 blog.csdn.net/weixin_55305220/article/details/116665000   当然， 适当的了解点 系统结构，数据结构 也会些帮助，网上也有很多这些资料， 加油！


Question: 怎么使下面的代码可多次查询

图中最后的 break 改为和上面一样的 continue ？


Question: result = (unsigned char*)calloc(length, 1); 的calloc使用困惑

函數調用改爲other_function(&resule)，函數體內也做相應修改，調用free前要判斷指針是否爲空。

没有问题啊，如果有问题那就是其他的问题，不是申请内存的问题。所以您没有问到点儿上。


Question: 求助，c语言程序运行超时

简单一点： double funcos(double e, double x) {   double f, i, v, xx, y;    for (f = i = 2, xx = x * x, x = -xx, y = 1; ; i += 2)   {     y += v = x / f, f *= (i + 1) * (i + 2), x *= -xx;     if (abs(v) < e) break;   }    return y; }

#include <stdio.h> #include <math.h> double funcos( double e, double x ); int main() {     double e, x; scanf("%lf %lf", &e, &x);     printf("cos(%.2f) = %.6f\n", x, funcos(e, x));     return 0; } double funcos(double e,double x) {     int i=2,j,t=1;     double a,sum=0;     if(x<e)         sum=x;     a=x;     while(a>e||a<(-e))     {         sum=sum+a;         for(j=1;j<=i;j++)             t=t*j;         a=-(pow(x,i)/j);         i=i+2;         return sum;     }     return sum;   }  注意while循环用法，你的代码while无限循环了，用break、continue、return退出


Question: 新人求大神解答呀 ，这段代码到底哪里错了

if（b==0 && a>=1）时即可

首先是if行末尾有个多余的分号。

大神 请指点下还有啥地方是错的吧 或者逻辑哪里不对 感谢了


Question: C语言字符串存储问题

还记得HelloWorld么？


Question: 我的这段代码软件没有报错，但是调试时有一段直接跳过了（我在VS调试的）

scanf("%d\n"...  格式里，别有 \n 吧，如 scanf("%d", &_S1);


Question: 求求大佬帮忙，为啥读文件读不对

程序中存在的问题：ReadLine()里面又调用 CountLine(), 程序会比较慢string.find()  返回的是 size_t , -1 表示没找到，C语言中， 只要不是0就返回true, 所以，程序的判断是否会有问题？另外，if (a.find("link"&&"code")),  "link"&&"code" 表示的是？ 字符串连接是用 "link" + "code",  还是应该是:?        if (a.find("link")!=string::npos && a.find("code")!=string::npos)如果test.txt里面是Link , Code, 代码也应该做相应大小写改动。

不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

“只能读取第二个以后的”，什么意思？上面的代码运行了，可以完整显示 test.txt 的内容啊；内容再复制一份，照样能显示所有的。


Question: 将一个数拷贝到字符数组中，结果多出六个f,是怎么回事？

因为类型提升，ca[0]被作为int传入，char默认是有符号数，所以0x83被符号扩展为0xffffff83。可以：sprintf_s(str, sizeof(str), "%x", (unsigned char)ca[0]);

谢谢

都是字符型拷贝到字符型，类型怎么会提升？

传入sprintf_s的参数做了类型提升，参考printf、sprintf的说明：https://en.cppreference.com/w/cpp/io/c/fprintf

不是多出，是0x66按照字符理解就是'f'


Question: 图形打印 求助各位大佬帮帮忙解答一下

思路如下:双重for循环,j表示次数,j小于等于i，i小于等于n,然后在j循环李打印i就行了，记得换行

思路，就是循环啊，一行行的是外循环，行内的几个字符是内循环；其它的就是输入和输出函数。

能不能写一下，不太明白

麻烦说说设计思路


Question: 我想问一下，a, *a, a[0]这种，为什么不输出他指向的内存单元，而都是输出地址

CPU只认地址不认标识符，CPU根据地址访问与其建立映射关系的物理内存，读写数据。你写得源代码中的一切变量名、函数名等等标识符，都仅仅只是你自己的设想。你的源代码要变成可执行程序，最终要经过编译器编译，将它翻译成CPU可识别的指令流程编译器中的符号表数据结构会收集你源代码中的标识符，然后把它们转换成相对进程基址的偏移地址可执行文件相当于是一个进程的内存模板，它描述了进程的内存分布和初始值所有你源代码中的变量名在可执行程序中都是一个地址

子曰：吾日！三省吾身～～～

子曰，思而不学则殆。


Question: 如果全部及格则输出没有不及格的科目，应该怎么改，请教大佬，部分程序如下

一般是增加个变量吧，查询前初始化为 0，后面查询到个不及格就 +1，最后看是否为 0 ；也可用逻辑类型的。


Question: 同样的C代码，不同的编译器生成的汇编代码是不同的吗？

對200多字節都覺得誇張的話改用匯編吧。

即便同一个编译器，不同编译选项，生成的代码也不能保证相同。至于楼主的代码，只是debug版本，如果是release版本，至少a, b都会被优化掉。

现代计算机平台上，两百多字节真不算大，咱不能拿单片机和1980年的计算机来与现代比较。

C语言不是简洁快速体积小吗？怎么没事还要搞掉那么多栈空间？


Question: 第一个判断能计算并排序，但是第二个往后就排序不了了，都是套用的不知道为什么后面的排序不了，求大神指点，部分程序如下

应该是 for(j=41; j<81-i+41; j++)  吧，要加上首单元序号的，上面的是 0 就可以不加了。

感谢


Question: 用for循环结构变成死循环了，不知道怎么解决，求大神指点，部分程序如下

if(j=2) 应该是 if(j==2) 吧，下面的类似；j=2 是赋值了，j 跳不出去的。

谢谢


Question: 总感觉myFun函数调用后，变量a没有被赋值或者变量a就没有传进去。

不要止步于感觉呀，验证一下。


Question: 【C语言有问题看过来这里】有问必答。。。

有问题看过来这里啊！


Question: C语言求助（这个只是部分正确）求求各位大佬帮忙

t未初始化。


Question: 为什么在函数里sizeof（a）（a是数组）是8而不是4

你但凡不那么细心地切图，就能看见上方某处有x64或amd64字样。

我去看看

这是我的图片


Question: 删除字符串中第m个字符哪位大神帮我看看哪里不对c语言

前面定義char s[10] 最多可以用到s[9]，後面卻用到s[50]。


Question: 求助大神！！！！！！

float Fscore(struct Student stu…) 這個結構名首字母是大寫 函數應該有個return

应该是 stu[i].sum += stu[i].score[j]; 吧

但楼主自己说的错误应该来源于大小写不分。


Question: 求大佬帮助   ！！！！

把struct test 改成： struct test {unsigned short a :4;unsigned short b :2;unsigned short c :4;unsigned short d :6;};整个struct test占用2个字节， 它每个字段在内存中的位置是： 15 ... .. .... ........ 0ddddddccccbbaaaa注意低位在右边 av->a = 0xf;test: 000....01111 (二进制)av->b = 0x0;test: 不变av->c = 0xf;test: 00...1111001111av->d = 0xf;test: 0011 1111 1100 11113 f c f (16进制)最后输出的时候，是从低地址输出的，所以是cf 3f

有可能是因为一些填充的原因，在我的机器上， printf("sizeof = %d\n", sizeof(struct test))打印的是4， 而不是2建议把程序改成:struct test{        unsigned short a :4;        unsigned short b :2;        unsigned short c :4;        unsigned short d :6;};

谢谢您的回答，不知道您试过没，结果是一样的， 不知道有一点您有没有注意到，这是bit赋值，添加类型应该没意义吧！

你好，如果我没记错的话，unsigned a :4 这里的unsigned 定义了一个unsigned int, struct test最后是 4个字节， 如果改成 unsigned short, struct test 则为2个字节，所以还是有影响的，的确， 程序的最后输出有点晕，可能跟编译器的存放字节顺序有关。。。

Android-Unity一起交流学习啊

位序的问题啊，这个，得看书上怎么说的了，全是规定，搞不好不同平台还不一样

位序无非是大端小端，我的平台是小端，不应该出现字节反转的现象啊


Question: 请教大神Dev-C++报错了

这个有点难度看不懂了……

Android-Unity一起交流学习啊

上面提示了啊，Netbios 没定义，大概是少了相应的 .h 文件

@是#include "nb30.h" #pragma comment(lib, "netapi32.lib")


Question: 请教，在vs用x64能启动我的代码，用x86不能。

我查到原因了，卡巴斯基误报。

选择了新模式后，要重新编译创建吧

请问如何重新编译，我只知道按F5。


Question: 一道编程题不知道为什么输出只能是整型，如何改动

i和c沒有初始化

循环里加个 printf() 语句，打印每次的 a,b,c 看看就知道了；不知题意，应该是你计算逻辑错了。


Question: 求这题怎么做？各位大佬

Android-Unity，一起交流啊


Question: devc++  指针和数组   最大值和最小值输出后是相反的，但程序看不出问题

实参次序反了嘛。


Question: unsigned long long 返回值为零

都是int类型乘积当然也是int类型。把随便哪项强转为结果的类型就好了。

求大佬解答


Question: 为啥VS2022 scanf函数用不了，求大佬帮助😘

前辈啊

看编译输出提示，是不是让你用scanf_s代替？你可以在项目->属性->C/C++->预处理器->预处理器定义中添加_CRT_SECURE_NO_WARNINGS


Question: c语言循环练习，小白求帮助

#include <stdio.h>double Power(double x,int n); double Power(double x,int n){    if(x == 0 && n < 0)    {        printf("参数不正确\n");        return 0;    }    else    {        double y = x;        if(n > 0)        {            while (--n > 0)            {                x*=y;            }        }        else        {             while (++n < 0)            {                x*=y;            }            x = 1/x;        }    }    return x;} int main(int argc, char const *argv[]){   double x;   int n;   scanf("%lg%d",&x,&n);   printf("%.8g\n",Power(x,n));}


Question: 一个函数动态分配一个数组空间为什么要使用指向指针的指针才能实现？

至于你说的为什么要用指针的指针实现，如果不转这一道函数的话是可以直接用malloc的。涉及到指针的参数传递一级指针的地址就必须要二级指针才能接收

malloc和free就是向程序员手动向堆区申请和释放空间，了解堆区和栈区的区别吗？

我不知道，我作业也是这个，求大佬解答！！

建议自己先百度一下，这是一个程序员的基本素质


Question: 大佬看看我哪里错了，有一个测试点一直过不了

随机最大n ，是不是没有对输入的 n 进行限定检验啊，预定义的是 100010，输入比这更大的呢？


Question: 数据结构二叉树求助！

仅供参考： #include <locale.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct BiTNode {//二叉树结点     char data;                      //数据     struct BiTNode *lchild,*rchild; //左右孩子指针 } BiTNode,*BiTree; int nn=0; int CreateBiTree(BiTree *T) {//按先序序列创建二叉树     char data;     scanf("%c",&data);//按先序次序输入二叉树中结点的值（一个字符），‘#’表示空树     if (data == '#') {         *T = NULL;     } else {         *T = (BiTree)malloc(sizeof(BiTNode)); nn++;         (*T)->data = data;         //生成根结点         CreateBiTree(&(*T)->lchild);//构造左子树         CreateBiTree(&(*T)->rchild);//构造右子树     }     return 0; } void Visit(BiTree T) {//输出     if (T->data != '#') {         printf("%c ",T->data);     } } void PreOrder(BiTree T) {//先序遍历     if (T != NULL) {         Visit(T);               //访问根节点         PreOrder(T->lchild);    //访问左子结点         PreOrder(T->rchild);    //访问右子结点     } } void InOrder(BiTree T) {//中序遍历     if (T != NULL) {         InOrder(T->lchild);     //访问左子结点         Visit(T);               //访问根节点         InOrder(T->rchild);     //访问右子结点     } } void PostOrder(BiTree T) {//后序遍历     if (T != NULL) {         PostOrder(T->lchild);   //访问左子结点         PostOrder(T->rchild);   //访问右子结点         Visit(T);               //访问根节点     } } void PreOrder2(BiTree T) {//先序遍历(非递归) //访问T->data后，将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，再先序遍历T的右子树。     BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));     int sp=0;     BiTree p = T;//p是遍历指针     while (p || sp) {   //栈不空或者p不空时循环         if (p != NULL) {             stack[sp]=p;sp++;       //存入栈中             printf("%c ",p->data);  //访问根节点             p = p->lchild;          //遍历左子树         } else {             sp--;p=stack[sp];       //退栈             p = p->rchild;          //访问右子树         }     }     free(stack); } void InOrder2(BiTree T) {//中序遍历(非递归) //T是要遍历树的根指针，中序遍历要求在遍历完左子树后，访问根，再遍历右子树。 //先将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，访问T->data，再中序遍历T的右子树。     BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));     int sp=0;     BiTree p = T;//p是遍历指针     while (p || sp) {   //栈不空或者p不空时循环         if (p != NULL) {             stack[sp]=p;sp++;       //存入栈中             p = p->lchild;          //遍历左子树         } else {             sp--;p=stack[sp];       //退栈             printf("%c ",p->data);             p = p->rchild;          //访问右子树         }     }     free(stack); }  typedef struct BiTNodePost{     BiTree biTree;     char tag; } BiTNodePost,*BiTreePost; void PostOrder2(BiTree T) {//后序遍历(非递归)     BiTreePost *stack=(BiTreePost *)malloc(nn*sizeof(BiTreePost));     int sp=0;     BiTree p = T;//p是遍历指针     BiTreePost BT;     while (p != NULL || sp) {//栈不空或者p不空时循环         while (p != NULL) {//遍历左子树             BT = (BiTreePost)malloc(sizeof(BiTNodePost));             BT->biTree = p;             BT->tag = 'L';//访问过左子树             stack[sp]=BT;sp++;       //存入栈中             p = p->lchild;         }         while (sp && (stack[sp-1])->tag == 'R') {//左右子树访问完毕访问根节点             sp--;BT=stack[sp];        //退栈             printf("%c ",BT->biTree->data);             free(BT);         }         if (sp) {//遍历右子树             BT=stack[sp-1];             BT->tag = 'R';//访问过右子树             p = BT->biTree;             p = p->rchild;         }     }     free(stack); } void LevelOrder(BiTree T) {//层次遍历     BiTree p;     BiTree *queue;     int h=0,t=0,n=0;      if (T == NULL) return;     p=T;     queue=(BiTree *)malloc(nn*sizeof(BiTree));     queue[t]=p;t=(t+1)%10;n++;//根节点入队     while (n) {    //队列不空循环         p=queue[h];             //对头元素出队         printf("%c ",p->data);  //访问p指向的结点         h=(h+1)%10;n--;         //退出队列         if (p->lchild != NULL) {//左子树不空，将左子树入队             queue[t]=p->lchild;t=(t+1)%10;n++;         }         if (p->rchild != NULL) {//右子树不空，将右子树入队             queue[t]=p->rchild;t=(t+1)%10;n++;         }     }     free(queue); } int main() {     BiTree T;      setlocale(LC_ALL,"chs");     CreateBiTree(&T);      printf("先序遍历        ：");PreOrder  (T);printf("\n");     printf("先序遍历(非递归)：");PreOrder2 (T);printf("\n");                                                printf("\n");     printf("中序遍历        ：");InOrder   (T);printf("\n");     printf("中序遍历(非递归)：");InOrder2  (T);printf("\n");                                                printf("\n");     printf("后序遍历        ：");PostOrder (T);printf("\n");     printf("后序遍历(非递归)：");PostOrder2(T);printf("\n");                                                printf("\n");     printf("层次遍历        ：");LevelOrder(T);printf("\n");      return 0; } //ABC##DE#G##F### //先序遍历        ：A B C D E G F //先序遍历(非递归)：A B C D E G F // //中序遍历        ：C B E G D F A //中序遍历(非递归)：C B E G D F A // //后序遍历        ：C G E F D B A //后序遍历(非递归)：C G E F D B A // //层次遍历        ：A B C D E F G //  ///       A ///      / ///     B ///    / \ ///   C   D ///      / \ ///     E   F ///      \ ///       G


Question: VS2012为何没有内存监控画面

等程序中断在断点处或单步运行时，再看看。

正如赵4老师所说啊，感谢感谢！


Question: 我看老师讲的while(ture)我的怎么报错 while（1）也不行 求求告诉我

true 不是 ture；while(1) 应该可以吧，除非又有其它的笔误

package Demo; import java.util.Random;import java.util.Scanner; public class 猜数游戏 { public static void main(String[] args) {     // TODO 自动生成的方法存根  //        生成1-100随机数            Random r=new Random();            int number=r.nextInt(100)+1;            Scanner sc=new Scanner(System.in);            System.out.println("请输入猜测数字：");            int luck=sc.nextInt();     while(ture){           if(luck>number){               System.out.println("猜大了");           }else if(luck<number){               System.out.println("猜小了");           }else{               System.out.println("恭喜您 猜对了 请买单~~~");               break;           }                  }                    }  }


Question: 利用指针排序三个数，输出第2和第3个数为何是地址值！

scanf() 中间的 % 误输入成 & 了

非常感谢您的指点!


Question: 求助float怎么转变成u8啊

如果数据float data的取值范围在0.0f～255.0f，直接u8 b=(u8)data; 如果数据float data的取值范围在0.0f～65535.0f，u8 b0=((unsigned short)data)%256;u8 b1=((unsigned short)data)/256;以此类推


Question: 64位windows 向系统申请40位的内存地址

把地址限制在低40bits，想问怎么样才可以申请到符合这种条件的地址


Question: 运行程序时崩溃，显示"program received signal sigsegv，segmentation fault"怎么解决

int n=0;   int a[n]; 的问题？vc 是不支持的，用 DEV-C 看，试了 3个 或 4个数据，没有问题。

我是用的dev写的，好像n输入很小的数是没问题的，但是我输入n=10就出问题了，调试的时候for循环进行到i=9就显示这个错误崩溃了


Question: 萌新小白求解c语言问题

所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。▼  http://bbs.csdn.net/topics/391975224


Question: 对数组指针进行解引用，得到数组的地址还是数组首元素的地址呢？

既然你把从p到*p称之为退化， 那么很自然你也可以把从*p到&*p称为进化嘛， 进化了就变大了不是很正常么？ 因为变量p的声明中是有5存在的，编译器牢记着这个，所以不是偏偏，而是顺理成章的5 。


Question: c语言递归练习题求解

谢谢啦

void PrintDec(unsigned x) {   if(x>9)PrintDec(x/10)   putchar(x%10+48); }


#include <stdio.h> int suma,sumb; void func(int x){   if(x>0)  suma+=x;   else if(x<0 )  sumb++; } int main(){   printf("输入整数:\n");   int x;   while(scanf("%d",&x)){     if(x==999)  break;     func(x);   }   printf("%d %d",suma,sumb);   return 0; }  不知道是不是这个意思，没做过这种题（）


Question: 性能测试， 进程cpu占用率上不去， 维持在30%左右， 如何分析？

你也说了，单线程工作，也就是每个时刻只占用单核。然后现代的系统怕CPU局部过热，所以使用的单核具体是哪一个物理核这件事是一直在变化的，以维持温度均匀。这就是上不去的原因。在进程级并发的情况下，只要保证你的并发服务进程的数量超过处理器的核数，就能上去了。


Question: c语言关于数组输出问题

gets_s(c, 9); 试试？ 这个函数对字符、字符串类要求跟随有最大长度参数的。

可能是没有把数组所有单元都置 0 而只是首个

不是，我试了一遍，我输入8个字符最后就有个问号，输入其他个数的字符就不会

我是一个大一小白，刚学c语言


Question: 为什么没有进行操作，但是变量的值自己在变化。万分感谢！

count++递增了count的值，count怎么能不变呢

还没执行到那就停下来了，在停着的时间里，count 还在变化；直接运行应该是没问题的。

你怎么确定没有执行，count 值变化代表程序在运行

楼主上面图示的和文字叙述的很清楚啊，执行到 int i=3; 就停下来了，没再继续；然后，偶尔地，光标移动到 count 上，就会提示当前的 count 值，这个值慢慢地就会变；如果 count 加到查看里，那里的内容是不变的，但删除了重加，就是变化后的值；count 实际是变了的，再运行下去，后面程序会出错，因为大于 1 的是无效的。

挺好奇的，想着也不会是无中生有，就去下载了个 gcc 来在虚拟机上安装了，把上面的代码敲了进去，折腾了一番，好像还真是哦。用 windbg 打开生成的 exe 程序文件，是正常的；所以，要么这 gcc 的调试功能有问题，要么就是哪里设置有不对，我对 gcc 也不熟，所以无从解决了，主要是它不能和 vs 似的可以切换到汇编码状态，对 count 内存进行写入断点设置，这样可以抓住哪里向 count 写入的。另外，上面的代码是有问题的，main() 里的 if() 行最后不应有大括号，i++; 语句应该是和 if() 语句平齐的，再下来的 for() 的后面就多了一个大括号。

好的，谢谢，错误的地方还没改，就是这个count乱跳导致无法去调试。

我看了一下，我截图完之后已经改掉了。谢谢


Question: 为什么必须要换行才能用EOF停止程序

scanf（）这个函数是有返回值的，返回值是它接收的格式化字符的个数（%d算一个）“ctrl + z”可以认为是取消输入，如果不输入，scanf 就没有接收值，编译器就会返回  -1循环里的 -1 != -1 判断为假就会退出循环

while((scanf("%d",&a)) == 1)


Question: 为什么编译通过进不了函数，红色的那个

因为e的类型不是QElemType

请问应该怎么修改啊


Question: 小白求解，为什么不输出结果呀？

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


Question: 救命，C语言，图书管理系统，不用链表

链表只是一种数据组织形式，还有很多其它的，比如用数组。


Question: 求助各路大佬，for循环判断后不执行for下{}中的语句直接开始循环，循环完才往{}中走

for() 那行最后多了个分号 ; 前面好像有贴有类似问题的

谢谢大佬，现在行了。我还专门去人家博客贴了一个同样的来运行，也是一样的结果就不知所以然了哈哈


Question: 结构体里的指针是字符，怎么改才可以可以输入整型？（小白）

"%d%d" 后面少了个分隔的逗号


Question: 求大佬带带我这个初学者

https://blog.csdn.net/goldenhawking/article/details/119845838 如果是VC应该要在项目属性设置里配置C++/ include ，Link/Library 等属性。


Question: 请教C语言宏定义 函数 问题


Question: 请教一个关于指针的问题

A(*buffer,buff_cnt) {}B(*buffer,count) {   A(buffer,count);}


Question: 这道题怎么实现输出c位小数，还有题目中说的数据陷阱是什么

#include <stdio.h>  int main(int argc, char * argv[]) {     int a = 0, b = 0, c = 0, i = 0;          scanf("%d,%d,%d",&a,&b,&c);     printf ("\n%d/%d=%.14lf\n",a,b,1.0*a/b);     if (b==0)         return 0;     int array[103];     do      {         int d = a / b;         int e = a % b;         array[i] = d;         a = e;         a *=10;             }while (i++ <= c+1);          if (array[c+1]>=5)     {         i = c;         do{             ++array[i];             --i;         }while (i>=0 && !array[i]);     }          for (i = 0; i<=c;++i)     {         printf ("%d",array[i]);         if (!i)             putchar('.');     }          return 0; }

呵呵请注意 c<=100   double哪儿来的那么高的精度？

題目并不是要自己做除法函數，儘管題目寫著c<=100，實際并不要求考慮c是否超double精度的問題。

题目中的表达不是输出c位小数，而是精确到小数点后c位。

陷阱，估计说的是（double）

char fmt[8] = {0};  sprintf(fmt, "%%.%df"，c); printf(fmt, (double)a / b);


Question: 有关调用函数实现大小写改变的问题

因为scanf看见空格就认为输入结束了。


Question: 恳请各位大佬帮我看看这该怎么处理？

那两个白色的a应该就是输入输出吧，程序应该都执行完了。

输入 a 运行程序？你的源文件是 1.c，生成的执行程序通常是 1.exe 吧，输入一般是输入 1 或 1.exe 运行它。


Question: 小白求解，为啥没有输出

可以去 ask.csdn.net 提问

第一个if行末有个多余的分号。

谢谢


Question: 有大佬帮我看一下为什么错了吗

异常，被 0 除，可能是 i=0 时作为除数求余引起的吧

感谢


Question:
#include
int main() {
	int x = 1, y = 0;
	printf("%d\n",x-->(x + y));

}

求值顺序的问题，先求值x---还是x+y未定义

请截个图证明一下dev显示是1

看看我的图,我都有点蒙了

的确无法解释，懵C中。

我已经知道答案了,1>(0+0),x到了大于号右边已经变成0了


Question: 【C语言】函数递归的简单理解 &画图理解递归过程_[初阶篇 _学习专用]

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


Question: 求解一道C语言题目.

这个挺容易的， 你自己先通关这个  clang.csdn.net


Question: 菜鸟求助，简单的问题但我写完就报错

大佬写完代码之后报更高级的错。平衡了么，亲？


Question: 新手小白求问（赋值从指针生成整数没有强制转换）的警告该如何解决

我觉得你想的，和编译器对你源码的理解可能不一样。你是想把 "YES" 或 “NO" 字符串放进 a[i] 里吧，编译器应该是以为你要放的是指针；这样的话，因为只是 ”YES“ 和 "NO" 两个内容，可以用简单的数据标记代替它，放入和取出显示时进行转换，只定义 a[n] 就可以了；一定要把字符串复制进去，首先，空间要保证够或进行检查截断，其次恐怕得用字符串复制函数。

谢谢您的解答，给我提供了一种编译思路，十分感谢


Question: 不带别名的struct应该怎么样引用(cgo)

typedef  struct  A{...}B; 引用它时要么用struct A  xxx要么用B xxx不要混着来。

按照您的说法改动之后，报错变了


Question: fabs返回值是一个奇怪的数值

因为你缺少了必要的头文件，因而缺少了必要的原型声明，所以函数值被误以为是整型。


Question: 大佬们救救，测试没问题，提交答案错误，hlep！！！

if (*p[j]>*p[j+1])应改为if (strcmp(p[j]>p[j+1])>0)

提交编译错误了。。。

对，我刚才>忘改为,了


Question: 求大佬解答一下结果不对

每个 i 循环，k=0;；min=a[0][k]; 要后移到循环外，同时 y=0; ；break; 应在 if 里     for(i=0;i<m;i++)//筛选开始     {         k = 0;         for(j=0;j<n;j++)//寻找每行最大值         {               if(a[i][k]<a[i][j])              {                  k=j;                  a[i][k]=a[i][j];              }              max=a[i][k];         }         min=a[0][k];         y = 0;         for(z=0;z<n;z++)         {             if(a[z][k]<min)             {                 min=a[z][k];                 y=z;             }         }         if(min==max)         {             printf("该数组a[%d][%d]有一个鞍点是%4d",y,k,a[y][k]);             printf("\n");             o++;             break;         }     }

谢谢啦，大佬可以给个关注位置吗？


Question: 调试和运行结果不一样

srand() 随机数初始化，time() 返回以秒为单位，这样程序运行时，每次的 srand() 几乎每次都一样，因为循环总共才 9次，跨秒的可能性极小，即使侥幸跨秒，数组里也只会有两不同的数，不会有整体随机的效果（也难个与个都不同）。

讲解很详细明白了谢谢啦

srand(); 应该挪到循环圈外面吧，即 for(i) 之前

谢谢已经解决了 ，不过这个原因是什么呢？烦请解释一下可以吗？


Question: 请问这个代码为什么编译的时候没有输出？跪谢了

通过简单的变换得出，要使两个表达式同时成立，必须是x比z大10。如x=10,y=0,z=0，或者z为负数，但是循环里y和z都是从1开始的，所以永远找不到能使两个表达式同时成立的数值，自然也就不会运行输出语句了。

x+y+z==10 3x+2y+ z==30 這2個表達式不可能同時成立。


Question: 这个哪里出错了  ？

abs是处理整数的，返回值也是整数。

浮点需要fabs

正常了，谢谢


Question: 谁能告诉我，为什么会这样啊？

这里的C99特性有两点一是随处定义变量二是用变量定义数组大小现在你愉快地使用了这两个特性，换个开发环境不让用了还不明说，就会很懵

第一，scanf里面不要带转义字符第二，使用C99特性是有风险的，很可能和你以后考试的环境不符第三，数组下标合法值在0到j-1之间，而且你得写个循环来输入才行

为什么scanf里不能带\n，书上都是这么写的

要不您去找找书？

你可能是看错了，一般是printf打印里面添加\n换行符，scanf带\n会存在有一个数据缓存区的问题，scanf遇到换行或者空格就会停止输入


Question: 为什么从指定文件取出来结构数组只有第一列是对的，其它列读的都好像是地址。

printf("Text_Chinese:%s image:%p W:%d h:%d\n",        lv_btn_image1[i].btn_text_Chinese , lv_btn_image1[i].btn_image, lv_btn_image1[i].btn_witch, lv_btn_image1[i].btn_hietch);


Question: 需要一位千里马！苦等

于是我陷入沉思，那么一定有问题，问题在哪儿呢？

凡是钱能解决的问题都不是问题。——《蜗居》宋思明


Question: C语言新人求大佬帮我看一下这个代码的问题

这道题还是有些难度的， 上面的程序有可能在： 当m<k时， 存在问题。下面程序抛砖引玉，还请大伙指正。  #include <stdio.h>  int min(int a, int b) {     if(a<b) {         return a;     }     return b; } unsigned long long cnt1(int m, int n, int k) {     if(k>n) {         return 0;     }      int i;     unsigned long long cnt = 1;      int x = min(k,m);     for(i=0;i<x;i++) {         cnt = cnt * (n-i);     }     for(i=k;i<m;i++) {         cnt = cnt * (n - k + 1);     }     return cnt; }  int main() {     int m, n, k;     scanf("%d %d %d", &m, &n, &k);      unsigned long long sum = cnt1(m,n,k);     if (sum==0) {         printf("Input Error");     }     else {         printf("%llu", sum);     }     return 0; } ```c    ```


Question: 新人C语言求助，程序没报错，但是运行不了

两 for 循环里的 a 或 b 都应该是大写的 A 或 B 吧，除了 int 语句里的：     for (int A=a; A != 0; A=A / 10)     {         e = A % 10;         f = f * 10 + e;     }

a = a / 10


Question: 数据类型求答案，谢谢！


Question: 没有这两个为什么运行是会一直显示error呢?

因为你在每次输入完数字之后都会输入一个回车键，而回车键也是一个字符（‘\n’），会被scanf（“%c”）读取，而‘\n’ 属于小于'0' || 大于‘9’的范围，所以会输出“error”加getchar函数，或者%*c都是不可取的，得到输出结果应该不是博主想要的建议在第一个if后边加 &&p！=‘\n’

为什么加getchar函数，或者%*c最后结果是我想要的呢

在每个最后不带\n的printf后面加fflush(stdout);在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。


Question: 请问这个代码为什么没法运行

我按照你写的能运行啊

刚才查了一会，是需要在name后加40，提高它的准确性和安全性，不知道为啥你的可以运行，我的加了这个40后才行

你代码里面name后面加了40 啊

是在第九行那的name后加


Question: 运行问题，求大佬解析

你试试在在输入的后面加上长度，比如scanf_s("%s",first_name,40);

可以也，这是什么原理？


Question: 第6段改为什么可以使键盘输入如何格式数据，输出结果都是1，2，34

如此修改，这般输入。


Question: 题目 一元二次方程代码

在输入数据之前进行 X, x （这两个变量名也值得商榷）计算？这，显然不合逻辑啊。


Question: 解一元二次方程，怎么总是显示有两个相等实根啊，求助

没有注释将就看一下

谢了

输入数据没带逗号造成输入错误。代码里要求逗号分隔输入数据的。

谢谢了，是这样的


Question: c语言有关字符串数据库的问题

结束符是'\0'而不是'/0'所以很难理解为什么能通过编译。

修改后后面的乱码消失了，但是输出结果是原s内容，没有显示d之前的字符串

编译出错信息都不看的么？ d两边应该是单引号 malloc(strlen(s)+1) 这里和p没啥关系

好了！感谢大佬


Question: 我想请问一下问出现什么问题了

fab 函数改为 fabs 函数，没有 fab 函数吧。以后发图片，建议用截图的方式，手机拍照可能会拍不清楚，QQ 截图快捷键：Ctrl + Alt + A

fabs吧

undefined reference to 'fab'你的fab没有定义

下面的提示，第一行说 fab 不知道是啥，我看了，也不知道是什么函数


Question: 大一新生关于最小公倍数问题的不理解

OJ是不是不能手工输入？scanf("%d%d",&a,&b)!=EOF

谢谢，已解决，穷举法过于费力，已经改为辗转相除法，谢谢你的回答！


Question: 大一新生刚学c语言遇到问题了，问问题求解答

谢谢各位！

printf("%d+%d=%d\n",a,b,c);这样是会输出a的值加b的值等于c的值。如果像单纯显示a，b的值是多少的话，直接printf("%d %d",a,b);

c也可以不需要，直接用a + b、a - b

printf("%d+%d=%d\n",a,b,c);  // 这样的吧


Question: C语言 日期推算：输入当前日期 输出两天后的日期

yday = month==2 ? ((year%400==0||year%4==0&&year%100!=0)+28) : ((int)fabs(month-7.5)%2 ? 30 : 31) ;

很有用，感谢作者帮助！

很简洁的代码，太厉害了


Question: 学习C语言的新手可以在哪里找C语言的练习题

国家出台的：终身教育平台里面的教程全部免费，看看教学视频跟着做，做好课堂笔记，不懂的就去网上查资料，实在找不到，论坛这么多大神总会有比较热心的大佬点拨一下的；又不是考试，没必要去找练习册；多在论坛看看别人写的东西，看看别人的评论有时候就会有答案了

搜索一下OJ


Question: 求大佬们帮忙

（‘a’+'b）2=(97+98)×2=390ab=6×3.4=20.4c/d=10.0÷5=2.0390+20.4-2.0=408.4double类型

困难在哪里？


Question: 大一新生，学校教python，自学c语言，请问为什么不对

#include <stdio.h> int main (){    int a = 1;    int b;    scanf ("%d",&b);    printf ("%d",a); while (a<b-1)//先循环后判断 {     a=a+2;     printf (" %d",a); } system ("pause"); return 0;  }你看看，这样不就行了，没必要判断他的奇数还是偶数

好的谢谢，想错了。。。

if ( m % 2 == 1) 吧，不过没意义；else 里的 while (m <= n) 吧，不能写成 =<

应该就是n吧 后面你说的是对的，我后来自己注意到了，改成这样了 #include <stdio.h> int main() { 	int n; 	int m = 1; 	scanf("%d",&n); 	if ( n % 2 == 1){         while(m <= n){             printf("%d",m);             m += 2;         } 		}else{ 		while(m <= n){ 			printf("%d",m); 			m = m + 2; 		} 	 	} 	return 0; } 但五分只得了2分，说我“检查程序输出格式”

既然两块里面内容一样，那为什么还要写两遍？ 另外你的输出格式不对，没有空格。

确实内容一样，当时想错了，但我不太知道哪里没有空格


Question: 为什么我运行不出想达到的效果，求解大神

scanf("%d",&x);while 循环中也要有 scanfif(x == 34) #include  <stdio.h> int  main() {     int  a=34;     int   x;     int  n=0;     printf("请输入猜的数字   ");     scanf("%d",&x);     while  (x!=34)     {              n++;         if(x<34)         {             printf("小了\n");          }         else  {printf("大了\n");                                       }         scanf("%d",&x);     }      if   (x==34)     {         printf("正确\n");         n++;      }     printf("一共猜测次数为  %d\n",n);      return  0;  }

if   (x==34)

while(x!=34) 等於34時不會進去while

看錯啦


Question: 请教各位大神C语言中如何编写&&&&

#include <stdio.h> int main() {  printf( "****\n" "****\n" "****\n" "\n" "\n" "\n" "&&&&&&\n" " &&&&&&\n" "  &&&&&&\n"  );  return 0; }

没懂什么意思


错误列表： typeof  在windows下c中是没有的。宏实现最外层有() 会导致解析错误。这个好解决，删掉最外层括号。


Question: c语言中给变量赋的初值不同有什么影响

看给谁赋值的。局部变量？ 栈区。char *str=NULL; 和 char *str="123"；。因为要存"123"这个常量字符串，编译的固件会比较大。也有可能影响业务逻辑。全局变量? 全局变量初始化为0 会影响这个变量是放到 数据段还是bss段。....

没啥影响。


Question: 萌新应该怎样学习C语言

C语言教程（附带C语言100例）  http://download.csdn.net/detail/zhao4zhong1/8830817

一般情况下，理论强的人，动手不行。实践强的人，动脑不行。我们要理论和实践相结合。既不动手，也不动脑。 =====就是用起来，理论+实践。去github找点简单的项目，看懂了。先模仿，在超越。？


Question: 大一新生求教！！！！！

你先推导它的表达式，然后就简单了。


Question: 【Linux】不得不掌握的开发工具 —— vim

TSEPro11_Setup.exe 百万军中取上将首级如探囊取物， 千万行里改关键源码在弹指瞬间。 功能超强的程序编辑器！  https://blog.csdn.net/zhao4zhong1/article/details/126596717


Question: 动态内存管理（malloc,calloc, realloc）

收藏大佬文章了，大佬支持下我呗，感谢：https://bbs.csdn.net/topics/611387347


Question: 冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲

这是什么情况


Question: 求解C:\Users\59659\Documents\C-Free\Temp\未命名4.cpp:11: error: case label `'+'' not within a switch

switch(c) 后面不应该有那个分号 ; 吧


Question: 运行卡死了，求助zsbd

你觉得好奇，于是决定租一块地，种四颗double菜尝试一下。地主（系统）租给你一块地，在地头打了个桩子上面写着p_d然后你看看你都干了啥？你种地你收获这都没啥说的。你悄悄把桩子挪了个位置，然后企图把地还给地主的时候，地主揍了你。还觉得冤吗，亲？

如果你在剧本里对还地的情节避而不谈，当然我们就不会看到你卡住的遭遇，但仅仅是没看到，你懂的。

哈哈哈哈，很生动

那如果我只是把桩子挪了个位置，会产生哪些影响呢

p_d都+=1了，就不能再delete[] p_d了

可以详细解释下吗，我刚学这个看不懂谢谢

new返回的内容在delete的时候不能变，您应该另外用一个变量比如p_d_old记住p_d刚刚new返回的值，delete[] p_d_old而不能delete[] p_d，因为你已经使用p_d+=1改动了p_d的值。

谢谢


Question: cmake 怎么指定所有源目录

百度搜“跟我一起写MakeFile”

makefile我会  太麻烦 没有cmake方便 现在我都用cmake

makefile指定目录我会


Question: 为什么这个while 循环只进行了一次？

while(scanf("%d",&num))把数字输入完成后，最后再输入一个非数字字符作为结束。    for(j=0;j<n;j++)  //不是j<=n    {        printf("% d",list[j]);        sum += list[j] ;    }

while((scanf("%d",&num)!=EOF)) 显示偶数的循环，应该是 list[j]

谢谢！！

scanf("%d",&num)

谢谢，但是我试了一下还是循环不了

有没有一种可能，除此之外还有其他错误？


Question: 这个三角型怎末输出啊，我输出的正好反了

我总是在说：代码不是2nd~ #include <stdio.h>  int main() {   for (int n, i = (scanf("%d", &n), 1); i <= n; i++, puts(""))   {     for (int j = 0; j < n - i; j++) printf("   ");     for (int j = 1; j <= i; j++) printf("%3d", j);   }        return 0; }

看要求的模样，输出数据前，不应该是要输出相应的空格的吗，(10-i) 个 printf("   ");

#include <stdio.h>  int main() {     int N;     int a;      scanf("%d", &N);       for (int i = 1; i <= N; i++) {         a=i;         while(a<N){             printf("   ");//空格的数量根据 "%3d"，是3就3个空格，是4就四个空格              a++;         }         for (int j = 1; j <= i; j++) {             printf("%3d", j);         }         if (i < N) {             printf("\n");         }     }     return 0; }


Question: C语言编写计，要满足下列条件算器

仅供参考： #pragma warning(disable:4996) /*--------------------------------------- 函数型计算器(VC++6.0,Win32 Console) 功能： 目前提供了10多个常用数学函数: ⑴正弦sin ⑵余弦cos ⑶正切tan ⑷开平方sqrt ⑸反正弦arcsin ⑹反余弦arccos ⑺反正切arctan ⑻常用对数lg ⑼自然对数ln ⑽ｅ指数exp ⑾乘幂函数^ ⑿向上取整ceil ⒀向下取整floor ⒁四舍五入取整round ⒂取符号sign ⒃取绝对值abs 用法： 如果要求2的32次幂，可以打入2^32<回车> 如果要求30度角的正切可键入tan(Pi/6)<回车> 注意不能打入：tan(30)<Enter> 如果要求1.23弧度的正弦，有几种方法都有效： sin(1.23)<Enter> sin 1.23 <Enter> sin1.23  <Enter> 如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter> 此外两函数表达式连在一起,自动理解为相乘如：sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77) 当然你还可以依据三角变换，再用sin(1.23+0.77)也即sin2验证一下。 本计算器充分考虑了运算符的优先级因此诸如：2+3*4^2 实际上相当于：2+(3*(4*4)) 另外函数名前面如果是数字,那么自动认为二者相乘. 同理，如果某数的右侧是左括号，则自动认为该数与括弧项之间隐含一乘号。 如：3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1) 又如：4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5) 此外，本计算器提供了圆周率Pi键入字母时不区分大小写,以方便使用。 16进制整数以0x或0X开头。 ----------------------------------------*/ #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> #include <stdio.h> #include <string.h> #include <locale.h> #include <windows.h> const char Tab = 0x9; const int  DIGIT = 1; #define MAXLEN 16384 char s[MAXLEN],t[MAXLEN], *endss; int pcs = 15; FILE *fp; double sign(double dVal) {          if (dVal>0.0) return  1.0;     else if (dVal<0.0) return -1.0;     else               return  0.0; } double round(double dVal, short iPlaces) {//iPlaces>=0     char tmp[30];     double dRetval;      sprintf(tmp, "%.*lf", iPlaces, dVal);     sscanf(tmp, "%lf", &dRetval);     return (dRetval); } double fun(double x, char op[], int *iop) {     while (op[*iop - 1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>         switch (op[*iop - 1]) {         case  7: x = sin(x);    (*iop)--; break;         case  8: x = cos(x);    (*iop)--; break;         case  9: x = tan(x);    (*iop)--; break;         case 10: x = sqrt(x);   (*iop)--; break;         case 11: x = asin(x);   (*iop)--; break;         case 12: x = acos(x);   (*iop)--; break;         case 13: x = atan(x);   (*iop)--; break;         case 14: x = log10(x);  (*iop)--; break;         case 15: x = log(x);    (*iop)--; break;         case 16: x = exp(x);    (*iop)--; break;         case 17: x = ceil(x);   (*iop)--; break;         case 18: x = floor(x);  (*iop)--; break;         case 19: x = round(x,0);(*iop)--; break;         case 20: x = sign(x);   (*iop)--; break;         case 21: x = fabs(x);   (*iop)--; break;         }     return x; } int isKMG(char c) {     if (c=='k'||c=='K'||c=='m'||c=='M'||c=='g'||c=='G') return 1;     return 0; } double calc(char *expr, char **addr) {     static int deep; //递归深度     static char *fname[] = { "sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp","ceil","floor","round","sign","abs",NULL };     double ST[10] = { 0.0 }; //数字栈     char op[10] = { '+' }; //运算符栈     char c, *rexp, *pp, *pf;     int ist = 1, iop = 1, last, i, n;     __int64 i64;      if (!deep) {         pp = pf = expr;         do {             c = *pp++;             if (c != ' '&& c != Tab && c != ',')//跳过半角逗号(通常作为千分位分割符)                 *pf++ = c;         } while (c != '\0');     }     pp = expr;     if ((c = *pp) == '-' || c == '+') {         op[0] = c;         pp++;     }     last = !DIGIT;     while ((c = *pp) != '\0') {         if (c == '(') {//左圆括弧             deep++;             ST[ist++] = calc(++pp, addr);             deep--;             ST[ist - 1] = fun(ST[ist - 1], op, &iop);             pp = *addr;             last = DIGIT;             if (*pp == '(' || isalpha(*pp) && strnicmp(pp, "Pi", 2) && !isKMG(*pp)) {//目的是：当右圆括弧的右侧为左圆括弧或函数名字时，默认其为乘法                 op[iop++] = '*';                 last = !DIGIT;                 c = op[--iop];                 goto operate;             }         }         else if (c == ')') {//右圆括弧             pp++;             break;         }         else if (isalpha(c)) {             if (!strnicmp(pp, "Pi", 2)) {                 if (last == DIGIT) {                     fprintf(fp,"π左侧遇）\n"); if (fp!=stdout) fclose(fp); exit(1);                 }                 ST[ist++] = 3.14159265358979323846264338328;                 ST[ist - 1] = fun(ST[ist - 1], op, &iop);                 pp += 2;                 last = DIGIT;                 if (isalpha(pp[0]) && pp[0]!='x' && pp[0]!='X') {                     fprintf(fp,"两个π或K/M/G相连\n"); if (fp!=stdout) fclose(fp); exit(2);                 }                 if (*pp == '(') {                     fprintf(fp,"π右侧遇（\n"); if (fp!=stdout) fclose(fp); exit(3);                 }             } else if (isKMG(pp[0])) {                 if (last == DIGIT) {                     fprintf(fp,"%c左侧遇）\n",pp[0]); if (fp!=stdout) fclose(fp); exit(1);                 }                 double value=1.0;                 switch (pp[0]) {                 case 'k':value=1000.0      ;break;                 case 'K':value=1024.0      ;break;                 case 'm':value=1000000.0   ;break;                 case 'M':value=1048576.0   ;break;                 case 'g':value=1000000000.0;break;                 case 'G':value=1073741824.0;break;                 }                 ST[ist++] = value;                 ST[ist - 1] = fun(ST[ist - 1], op, &iop);                 pp += 1;                 last = DIGIT;                 if (isalpha(pp[0]) && pp[0]!='x' && pp[0]!='X') {                     fprintf(fp,"两个π或K/M/G相连\n"); if (fp!=stdout) fclose(fp); exit(2);                 }                 if (*pp == '(') {                     fprintf(fp,"%c右侧遇（\n",pp[-1]); if (fp!=stdout) fclose(fp); exit(3);                 }             } else {                 for (i = 0; (pf = fname[i]) != NULL; i++)                     if (!strnicmp(pp, pf, strlen(pf))) break;                 if (pf != NULL) {                     op[iop++] = 07 + i;                     pp += strlen(pf);                 } else {                     fprintf(fp,"陌生函数名\n"); if (fp!=stdout) fclose(fp); exit(4);                 }             }         }         else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '%' || c == '^') {             char cc;             if (last != DIGIT) {                 fprintf(fp,"运算符粘连\n"); if (fp!=stdout) fclose(fp); exit(5);             }             pp++;             if (c == '+' || c == '-') {                 do {                     cc = op[--iop];                     --ist;                     switch (cc) {                     case '+':  ST[ist - 1] += ST[ist]; break;                     case '-':  ST[ist - 1] -= ST[ist]; break;                     case '*':  ST[ist - 1] *= ST[ist]; break;                     case '/':  ST[ist - 1] /= ST[ist]; break;                     case '%':  ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;                     case '^':  ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;                     }                 } while (iop);                 op[iop++] = c;             }             else if (c == '*' || c == '/' || c == '%') {             operate:        cc = op[iop - 1];                 if (cc == '+' || cc == '-') {                     op[iop++] = c;                 } else {                     --ist;                     op[iop - 1] = c;                     switch (cc) {                     case '*':  ST[ist - 1] *= ST[ist]; break;                     case '/':  ST[ist - 1] /= ST[ist]; break;                     case '%':  ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;                     case '^':  ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;                     }                 }             } else {                 cc = op[iop - 1];                 if (cc == '^') {                     fprintf(fp,"乘幂符连用\n"); if (fp!=stdout) fclose(fp); exit(6);                 }                 op[iop++] = c;             }             last = !DIGIT;         } else {             if (last == DIGIT) {                 fprintf(fp,"两数字粘连\n"); if (fp!=stdout) fclose(fp); exit(7);             }             if (pp[0] == '0' && (pp[1] == 'x' || pp[1] == 'X')) {                 sscanf(pp + 2, "%I64x%n", &i64, &n);                 rexp = pp + 2 + n;                 ST[ist++] = (double)i64;             }             else ST[ist++] = strtod(pp, &rexp);             ST[ist - 1] = fun(ST[ist - 1], op, &iop);             if (pp == rexp) {                 fprintf(fp,"非法字符\n"); if (fp!=stdout) fclose(fp); exit(8);             }             pp = rexp;             last = DIGIT;             if (*pp == '(' || isalpha(*pp)) {                 op[iop++] = '*';                 last = !DIGIT;                 c = op[--iop];                 goto operate;             }         }     }     *addr = pp;     if (iop >= ist) {         fprintf(fp,"表达式有误\n"); if (fp!=stdout) fclose(fp); exit(9);     }     while (iop) {         --ist;         switch (op[--iop]) {         case '+':  ST[ist - 1] += ST[ist]; break;         case '-':  ST[ist - 1] -= ST[ist]; break;         case '*':  ST[ist - 1] *= ST[ist]; break;         case '/':  ST[ist - 1] /= ST[ist]; break;         case '%':  ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;         case '^':  ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;         }     }     return ST[0]; } void pretreatment() {//预处理     int i,L,n,r;     char *p,*q;     double v;     char D[2];      //x2star将两边不是字母且左边不是非数字或串开头紧跟0的x替换为*,目的是支持用x代替*,且和0x开头的16进制数不冲突     L=strlen(s);     for (i=1;i<L;i++) {         if (s[i]=='x' && (!isalpha(s[i-1]) || isKMG(s[i-1])) && !isalpha(s[i+1])) {             if (!(                  (i==1 && s[0]=='0')               || (i>1 && s[i-1]=='0' && !isdigit(s[i-2]))                )) s[i]='*';         }     }      //将"数字\.数字[kmgKMG]"用()括住     strcpy(t,s);     p=&t[0];     q=s;     while (1) {         r=sscanf(p,"%lf%n%1[GKMgkm]",&v,&n,D);         if (r==EOF) break;//         if (r==0) {             L=sprintf(q,"%c",*p);             q+=L;             p++;         } else if (r==1) {             L=sprintf(q,"%.*s",n,p);             q+=L;             p+=n;         } else if (r==2) {             L=sprintf(q,"(%.*s%c)",n,p,D[0]);             q+=L;             p+=n+1;         }     } } int main(int argc, char **argv) {     int a;      setlocale( LC_ALL,"chs");     fp=stdout;     if (argc<2) {         //if (GetConsoleOutputCP() != 936) system("chcp 936>NUL");//中文代码页         printf("计算函数表达式的值。\n支持(),+,-,*,x,/,%%,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round,sign,abs,k,m,g,K,M,G\n");         while (1) {             printf("请输入表达式：");             fgets(s,MAXLEN,stdin);             if ('\n' == s[strlen(s)-1]) s[strlen(s) - 1] = 0;             if (s[0] == 0) break;//             pretreatment();printf("%s=%.15lg\n",s,calc(s, &endss));         }         return 0;     }     if (argc == 2 && 0 == strcmp(argv[1], "/?")) {         //if (GetConsoleOutputCP() != 936) system("chcp 936>NUL");//中文代码页         printf(             "计算由≥1个命令行参数给出的函数表达式的值。\n"             "最后一个参数是.0～.15表示将计算结果小数点后保留0～15位\n"             "最后一个参数是g1～g15表示将计算结果保留有效数字1～15位\n"             "最后一个参数是e0～e15表示将计算结果用科学计数法表示，且小数点后保留0～15位\n"             "最后一个参数是x表示将计算结果以16进制正整数格式输出\n"             "支持(),+,-,*,x,/,%%,^^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round,sign,abs,k,m,g,K,M,G\n"             "16进制整数以0x或0X开头\n"             "忽略表达式中的半角逗号(通常作为千分位分割符)\n"             "如果第一个参数是/f且c:\\jsresult.txt可写，就将所有输出重定向到该文件\n"         );         return 0;     }     if (argc>2 && 0 == strcmp(argv[1], "/f")) {         fp=fopen("c:\\jsresult.txt","w");         if (NULL==fp) fp=stdout;         for (a=2;a<argc;a++) argv[a-1]=argv[a];         argc--;     }     strncpy(s, argv[1], MAXLEN - 1); s[MAXLEN - 1] = 0;     if (argc>2) {         for (a = 2; a<argc - 1; a++) strncat(s, argv[a], MAXLEN - 1);//将空格间隔的各参数连接到s         if (1 == sscanf(argv[a], ".%d", &pcs) && 0 <= pcs && pcs <= 15) {//最后一个参数是.0～.15表示将计算结果保留小数0～15位             pretreatment();fprintf(fp,"%.*lf\n", pcs, calc(s, &endss));         } else if (1 == sscanf(argv[a], "g%d", &pcs) && 1 <= pcs && pcs <= 15) {//最后一个参数是g1～g15表示将计算结果保留有效数字1～15位             pretreatment();fprintf(fp,"%.*lg\n", pcs, calc(s, &endss));         } else if (1 == sscanf(argv[a], "e%d", &pcs) && 0 <= pcs && pcs <= 15) {//最后一个参数是e0～e15表示将计算结果用科学计数法表示，且小数点后保留0～15位             pretreatment();fprintf(fp,"%.*le\n", pcs, calc(s, &endss));         } else if (argv[a][0] == 'x' || argv[a][0] == 'X') {//最后一个参数是x表示将计算结果以16进制正整数格式输出             pretreatment();fprintf(fp,"0x%016I64x\n", (__int64)calc(s, &endss));         } else {             strncat(s, argv[a], MAXLEN - 1);             pretreatment();fprintf(fp,"%.15lg\n", calc(s, &endss));         }     } else {         pretreatment();fprintf(fp,"%.15lg\n", calc(s, &endss));     }     if (fp!=stdout) fclose(fp);     return 0; }


Question: 这个用c语言怎么写啊？大神们

#include <stdio.h> int main() {     int a[] = {12,20,6,4,52,6,77,83,91} ;     int arrsize = 8;     int left=0,right=arrsize,temp;     while(left<right)     {         if(a[left]%2==0)         {             while(left<right)             {                 if(a[right]%2==1)                 {                     temp = a[left];                     a[left]=a[right];                     a[right]= temp;                     right--;                     break;                 }                  right--;             }         }         left++;     }     for (temp=0;temp<=arrsize;temp++)         printf("%d ", a[temp]);       return 0;   }

#include <stdio.h>void move(int arr[], int sz){    int left = 0;    int right = sz - 1;    while (left < right)    {        while ((left < right) && (arr[left] % 2 == 1))        {            left++;        }        while ((left < right) && (arr[right] % 2 == 0))        {            right--;        }        if (left <right)        {            int temp = arr[left];            arr[left] = arr[right];            arr[right] = temp;        }    }}void print(int arr[],int sz){    for (int i = 0; i < sz; i++)    {        printf("%d ", arr[i]);    }}int main(){    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};    int sz = sizeof(arr) / sizeof(arr[0]);    move(arr, sz);    print(arr, sz);    return 0;}可以参考一下

如果不用排序的话：从数组第一个数开始判断，如果是偶数则接着判断数组最后一个数是奇数还是偶数，最后一个是奇数则把其和第一个数交换；如果是偶数则不动，继续判断倒数第二个数，同样处理。如果第一个数是奇数或者第一个数已完成处理，则继续判断第二个数，同上处理。以此类推直到把数组遍历一遍后，数组就符合要求了，这时再把数组输出就行了。

遍历2次A数组，第一次输出奇数，第二次输出偶数。

另声明一个数组B，遍历一遍A,将奇数依次放入B,再遍历一遍A,将偶数继续放入B,将B所有元素依次放入A覆盖旧A


Question: 小白请教一个问题。。。

a[i]=true;

谢谢

脑子临时卡住了


Question: 第一次接触，输出的时候是黑屏，帮帮新人吧

scanf中各%X之间应该啥也没有，输入时用空格或Tab键或回车换行间隔各项数据

你得输入用空格分隔的两个整数吧，然后才输出它们的和；交互友好计，可以输入前来个提示；输入整数无须用 scanf_s()

刚上大学的萌新


Question: dev c++源文件未编译，怎么办？

建立一个含有该源文件的项目。

怎么建立呀？


Question: 求助怎么不用getche输入输出一行

一行就可以了：for (int c = getchar(); printf("%c%c%c\n", c - 1, c, c + 1);) break;

题目没有让你输入输出在一行，你想多了。


Question: 小白求助！！未声明的标识符

不要啃故弄玄虚的视频，谢谢。

看下面的图，那个_Format: 应该只是提示当前输入域的参数说明，不是要你也输入这么个内容的

好的，十分感谢！！


Question: 求助各位大佬们，在c中数字字符串可以进行运算吗

按照字符串接收输入内容，直接通过查找定位小数点在字符串中的位置，剩下的就是字符串索引的事儿了

嗯嗯，谢谢

不可以的，可以通过读取转换函数转换为内部浮点数值 12.36 然后再行后续处理；如果仅仅是获取整数部分个各小数位，可以通过查询小数点来对字符串进行切分。

好的，感谢老哥


Question: C#求解方程组 进行到一半 不知道怎么写了

思路，一个是试差迭代，一个是求反函数；你这里好像求反函数即 di 的公式简单，A=f1(...)*di^2，V=f2(...)di^(2/3) AV=di^(8/3)*f3(...) 这样 di 的公式就出来了。


Question: %s出现了冲突什么原因呢，求大神帮忙

Visual Studio 2017 这个软件

加了_s以后的参数与原来不同了，不要直接把它当作scanf用。对于%s和%c两个格式符，后面需要有两个参数与之对应，分别是地址和长度。文档还是要读的。

地址和长度，这个我没有设定long这个变量啊所以还需要设定一个吗 还是

形如 scanf_s("%s",buf,128);

scanf_s("%s", &buf); 这里加&画蛇添足了，直接用buf就好，但并不是错误。

这个&地址我已经去掉了，但是呢还是会冲突  特别是%s  其他还好

你把地址运算符去掉试试

这个我知道但是呢 一样还是有冲突

感谢


Question: 求大神求解决啊大神们

在下已经把全部代码都放在网了，还请各位大神帮忙解决 在下在此谢过了

并非在下惜墨如金是以此%s为误啊而以此%c%d皆可罢了就以各位所说予以改善

楼主惜墨如金吾等徒呼奈何


Question: 有人遇到  c写文本文件 ，个别时候内容前多一串不可见的@@@@，为什么，有什么办法解决这个问题，请指教，谢谢了

_tmp_Data_DateFormat.tmpNowtime有问题，不知道这字符串怎么来的。用ue打开文本文件，可以看到写入的不可见字符是什么。

显然在某些情况下，_tmp_Data_DateFormat.tmpNowtime、strdata的内容就是错的，你得先检查这两个数据的写操作，而且这两个数据就是字符串，你还sprintf干嘛呢～

进程意外退出或电脑意外掉电都有可能导致文件中多一串看不见的@

遇到这样的问题  只能人为去修复这样的数据，让他标准化，是这样吗

大抵如此


Question: 我不知道为什么我i这个运行不了，代码没问题啊。。求解答

scanner是接收输入的所以要输数字然后以一个非数字结束 类似这样


Question: 把DOS时代的C代码运行在手机上了,感觉很神奇

DosBox了解一下

不存在 BorlandC++3.2 这个产品～

bc 到 vc ，改动不小吧；纯 dos ，简单的就是直接上 dosbox 了，什么都不用改

bc当年为win3.2提供了支持,所以改动真不大,我的目的是编译运行源代码,和把EXE放到虚拟机里面跑是两个概念.这玩得是编程.不过说到这里又让我感叹了,这年头哪里还有我这样的业余编程爱好者,从CSDN就看的出来,一说到编程就像一群饿红了眼的狼,满脑子就是钱钱钱.代码就是个搞钱的工具,谁还会去研究把玩这些.


Question: udp服务端的socket与多个UDP客户端同时通讯的话，能处理的过来吗？

参考一下BIND ，它大概率就是这么干活的。

药科学生有个梗，叫做抛开剂量谈毒性都是耍流氓。用在这里就是说，抛开工作量不能探讨是否处理得过来。工作量在一定规模以下，那就处理得过来。BTW: 性能分析与优化这种事相当复杂，也确实值钱。因为它需要具体情况具体分析。

150个左右客户端不知怎样？

一条铁路线上两端每天对开两对列车够不够？

现在正在考虑做这个事情，之前没做过，所以不知从何下手。

多线程，每个线程处理若干个客户端的数据，如果仍然处理不过来就要用集群了


Question: 执行SQL后的table有三条数据，for循环，报错在第三行没有任何值。怎么解决。

求解


Question: 求大佬帮做C语言学生成绩管理系统

活太大，建议去悬赏区或者去网上找个demo改下


Question: 请问一下scanf的问题

scanf输入要考虑内存问题

仅供参考： #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

%c一次读一个字符%s一次读一串字符，引起内存溢出


Question: C语言学习第一天，记录一下自己的代码池

加油


Question: 为什么C语言运行没有结果,c语言编程代码感觉没错，dev c++也没报错，为什么运行结果始终不对？

如果想看s值，可以printf打印下s。 如果觉得回答的不错，欢迎关注下我

结果，你要什么结果？你让程序怎么结果了？程序如何知道你要什么结果？


Question: 有木有大佬求教这两种寄存器该怎么用地址来配置数值   没有单独一位一位的功能 卡住了！

强制转换+位运算大多单片机不都是这么干的么？


Question: char a='a'; --a 为什么还是 a

因为 a++ 的又被 --a 给抵消了；自运算，前置和后置的区别


Question: 有没有大神看看我这报错是为啥啊

那请问一个结构体指针 要把它等于一个宏定义的地址 要怎么写呢  我网上找了很久都没找到！！！ 救命

强制类型转换

亲，关注下我还行？


Question: 各位大佬，请问这个到底错在哪里了

不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

谢谢，明白了！

while(n == 0)， 你想要判断的是n != 0的时候继续计算

谢谢！


Question: C语言小白在线求查错

10 的 n 次方，不是 ^ 操作符吧，这个是逻辑异或，可能要用 pow() 函数？其它问题，要么调试，要么关键步上放个 printf() 函数显示内容。


Question: 编程如何 通过netfilter 修改 目标ip地址

配置是可以实现功能，我在开发一个网络安全的系统，需要通过代码修改目标ip地址

不能理解您的意图，打算做什么？您提到了netfilter我觉得就应该是配置问题而不是编程问题。可是您又提到编程代码，这就让我糊涂了。不过您提到的那个函数的返回值是32位的类型，所以显然没有能力处理128位的类型。


Question: NTFS用FSCTL_GET_RETRIEVAL_POINTERS读取小挡案的问题

小文件没有分配到磁盘的数据空间, 而是直接储存在mft, 所以没有这个东西

直接储存在mft, 要如何找出小文件的资料区位置?

NTFS每个文件都在MFT存储属性, 比如文件名, 时间等, 小文件直接在这个里面有个数据属性, 数据就在这里 数据不是独立的, 是属性的一部分  ntfs系统比较复杂, 如果要读取这个文件的数据, 过程: 1. 从MFT的root根据目标文件路径, 找到文件对应的mft的索引 2. 读取并解释该索引的属性, 其中就有文件的数据

这方面是初学者, 请问有没有C CODE范例能参考?


Question: 求解答，如何利用scanf()函数的返回值终止循环

运行中做不到，反思一下，就说明这样写是不对的。%c格式符是荤素不计的，任意内容都能满足它----跟是否字母没啥关系。

scanf()的返回值是实际输入的参数个数，所以可以用x[a]的值是否是字母来判断。

不要用带回显的输入函数，用getch()，这个虽然不是标准c库函数，但是几乎所有c库实现都支持


Question: 基础c语言奇偶大小排序的问题

排序上有问题吧，简单的冒泡，得两重循环的，一个循环无法实现。

哦哦，是吼，谢谢大佬指点


Question: 为什么else后面不执行直接跳过

“确认删除”后面的那个 else ？如果是的话，可能是你的 scanf() 有问题，格式字符串里 %c 前面竟然有个空格？


Question: 初学拷贝构造函数VC能过编译DEV过不了

Add的返回类型是CBall，你return r;肯定不行。可以：    CBall& Add(CBall& t)  // 注意返回的是引用，不是临时对象    {      r = ...      return *(CBall *)this;    }

谢谢啦

报错是在鼠标光标那行


Question: 请各位大佬看看代码有什么问题

if (*p > n) 这个改成 if(*p > num) 因为要和输入num比大小  *q = n;    这里改成 *q = num，把num插入数组 printf("%2d", *p); 这里改成 printf("%2d ", *p);，在2d后面加一个空格，显示的更清楚

谢谢谢写大佬，我检查的时候没看见，真的是太感动了，真的十分感谢老哥

再次感谢老哥，真的是非常感动

不客气，互相学习


Question: 求代码！急！新人表示很难。

谢谢

#include<stdio.h>#include<math.h>int Func(int n){    int i,leap=1;    for(i=2;i<=sqrt(n);i++)        {            if(n%i==0)                leap=0;        }    return leap;}int main(){    int n,i,sum=0,a[10],j=0;    printf("请输入n的值：");    scanf("%d",&n);    for(i=2;i<=n;i++)    {        if(Func(i))        //判断从2开始到n(包括n)的数是否是质数        {            a[j]=i;        //是质数的存入数组            sum+=i;            j++;        }    }    for(i=0;i<j-1;i++)        printf("%d+",a[i]);        //最后一个先不打，因为最后一个数后面没有+号    printf("%d=%d",a[i],sum);    //打印最后一个数和它们的和。}

谢谢

百度可以搜到的


Question: 求大神帮我看看 为什么输出不了

getcher改为getchar


Question: c语言怎么设置单独修改信息

cout << "旧姓名：" << abs->personArray[ret].m_Name << endl;         cout << "请输入新姓名(输入_保持旧姓名不变)：" << endl;         string name;         cin >> name;         if (name!="_") abs->personArray[ret].m_Name = name;

感谢！！！我还想问一下为什么我修改另一个邮政编码的时候！=报错了

单看这段代码似乎没啥问题

就是不知道怎么单独修改姓名或者编码这些，就不用再重复输入别的信息了

修改前，显示旧信息，修改时，提示输入一个下划线"_"表示保持原来内容不修改，输入后，判断如果刚输入的是"_"就不赋值给原来内容。

这个应该怎么写呀


Question: c语言怎么设置不重复输入

/添加联系人 void addPerson(Addressbooks * abs) {     //判断联系人是否满了     if (abs->m_Size == MAX)     {         cout << "通讯录已满，无法添加" << endl;         return;     }     else     {     string name;     cout << "请输入姓名：" << endl;     cin >> name;     int ret = isExist(abs, name);     if (ret != -1)     {         cout << "通讯录中已经有姓名为 "<<name<<" 的人，无法重复添加" << endl;         return;     }     abs->personArray[abs->m_Size].m_Name = name;      cout << "请输入邮政编码：" << endl;     int postcode;     cin >> postcode;     abs->personArray[abs->m_Size].m_Code = postcode;      cout << "请输入联系电话：" << endl;     string phone = "";     cin >> phone;     abs->personArray[abs->m_Size].m_Phone = phone;      cout << "请输入家庭住址：" << endl;     string address;     cin >> address;     abs->personArray[abs->m_Size].m_Addr = address;      cout << "请输入E_mail：" << endl;     string e_mail;     cin >> e_mail;     abs->personArray[abs->m_Size].m_Mail = e_mail;      //更新通讯录人数     abs->m_Size++;      cout << "添加成功：" << endl;     system("pause");     system("cls");  } }

谢谢你！！！！太厉害了老师

Who am I！


Question: 求助 求助怎么修改字串

ue看出来是这样的看不到前面那个源代码不知道哪里改

这里应该把是上面的地方吧，直接用 211.149... 搜索，若搜不到试试 unicode 模式，还搜不到，就是压缩或加密了；修改 exe ，可能有问题，你这里，看顶楼都有 align 4 语句，可能正好还有 1个字节的空间，但实际 exe 里就要看了，若无空间，就麻烦了。

用UE改

我不懂啊就是ue打开看都看不懂个

这是源程序，不就是直接改下面一行吗，如 db  '192.168.200.100', 0 ；标签不能改的，改了其它地方引用这里的就会找不到了。

我是用pe反编辑看的但是字串哪里改不了，标签改的了，我要把211 ip改成192 ip的，能私信我帮一下不


Question: 文件操作函数read(...)返回值不正确？？

对read这个函数不熟，我一般喜欢用fread。还有你里边的lseek，也属于已经被废弃的函数名。不如换成fseek，，， open,read,close,lseek，好像就这4个函数吧，建议使用stdio.h标准库里边的函数将你的程序重写一下： open==fopen read==fread close==fclose lseek==fseek 注意有些函数的参数顺序会存在差异，你研究一下应该不难替代。完事再试试看还有没有问题。头文件也不用包含辣么多，windows.h一个足矣。

fd = open(_pcFullFileName, O_RDWR｜O_BINARY, 0x604);不要把fopen("...","...");fscanf,fprintf,fgets,fgetc,fputc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待和fopen("...","...b");fseek,ftell,fread,fwrite,fscanf,fprintf,fgets,fgetc,fputc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待弄混了

确实 那个位置的字符是 0x1A...

Who am I !


Question: 求各位大神们帮帮孩子！！！真的做不出来了啊.

回复有分吗

什么分，哥


Question: 能帮忙看看这是什么问题吗

红字说得很清楚了，有啥不好理解的么？


Question: 请看一看为什么没有输出结果

第一个for循环中你写的是p='\0'，应该改成p=='\0'，写代码要细心呀

OKOK😅

敲代码时丢掉了一个感叹号。

OK😅


Question: Windows API函数CryptUIWizImport在部分系统调用时卡住

参数看起来没有问题，怎么会卡住呢，而且是个别电脑上

UAC、防火墙、杀毒软件、以管理员身份运行、未打最新补丁、未导入最新证书、……


Question: 二叉树递归搜索的return为什么可有可无？

这个函数要是没有return的话，你还写他干嘛？

不好意思，我没有说清楚问题，现在已将问题补充完整了

哦，是这样啊。 那么不加return理论上是不对的。 如果运行结果是对的，那都是偶然的恰巧的，毕竟彩票中奖这种事也发生过。


Question: 求大佬讲讲，int整型变量初始化不赋值的话，在for循环里打印出来值为什么会是1？

sum 是个随机值

明白了，谢谢


Question: 以指针作为参数进行传递的问题

char p0[10]; strcpy(p0,p1); strcpy(p1,p2); strcpy(p2,p0);

多谢！！

没看明白你要干啥

已解决！


Question: 我给堆栈区内存足够大,为何realloc返回了NULL

如果确实是空间限制引起的的话，堆栈说的是栈，和malloc系列没关系，上方的堆才是管这个的。

我改了堆也不行，是通过用x64编译器才成功的😂


Question: 关于gets函数和空格的问题

每个定义了 8个字符空间，输入多了就到了下一个的地方了，后面输入又会破坏前面渗透到其位置的，形成了前一个的前8个字符加后一个的（如果它也超长，还会向后继续），即最后的 11 是第二个的，可以第二个时输入 22 试试。

我在第一条记录里输了这样三个字符串："11 11 11ssssssss","22","33"。结果打印出来相应的是："11 11 1111","22","33"，所有看起来第一个字符串末尾多出现的两个"11"不是来自第二个字符串"22"呀？

理解有误，后面的是第二记录的第一个域的字符串，不是同一记录的第二个域的；因为数据定义是同类的储存在一起的，不是同一记录储存在一起。

哦哦


Question: 一直出现这个告警，不知道怎么解决，望大家告知

那个“说明”还不清楚？翻译下也没什么意思的。照着做就是了。


Question: 怎么将分数字符串转化为浮点型数据？

还有是否有将1/6转化为字符串的函数

f = (double)1 / 6; sprintf(s, "%f", (double)1/6); 是不是这意思？

是的谢谢，因为 / 得到的一直是整型 没考虑强转 原来强转就行了 谢谢

麻烦能给我讲下原理吗？1/6等于0 强转之后应该还是0啊 有点不太明白


Question: 请问如何不用循环求出两个日期之间的闰年个数？

首先从日期（想必是年月日）规范为年份，也就是2月28日之前的日期只算到前一年。然后对于一个年份，从公元开始到这个年份共有多少个闰年是直接算的，y/4-y/100+y/400即可。两个年份算的闰年数一减即可。


Question: 求助，好像是误删了一个东西导致的

控制面板、程序和功能、Visual Studio xxxx、修复

一般是重新安装。或者看看这个文件被移到哪啦，拷回来。


Question: 加了-mcmode=large无效，一直relocation truncate to fit。model.o文件超过4GB

江湖救急

@赵4老师，过来帮忙


Question: C语言conio.h文件

试试 TC2.0

？？你的意思是说开发环境有问题

是吧，vc2008 没过，tc2.0 过了，大概就是了；题目本身应该也能看出来吧。

你使用TC2.0编译能通过，是吗？哦，那应该就是开发环境的问题了。那个TC2.0的官网能顺便发一下？？


Question: 如何在VS里用C语言实现复数的定义与输出？

同出现复数定义不出来的问题，请问楼主解决了吗？

我用vs2022也出现这个问题了，看有的说是编译器不同的原因。请问楼主解决了吗？


Question: 为什么文件无法写入啊

关闭UAC、防火墙、杀毒软件、……以管理员身份运行……

什么叫文件无法写入？截个图什么的说明一下呗？

scanf ("%s",&Text); 修改为           scanf ("%s",Text);  取掉前面的 &


Question: [Warning] assignment from incompatible pointer typ怎么解决

定义 stu 里的应该是 struct student*next; 吧，有输入错误；其它还有类似的键入错误


Question: 100人民币换零问题（C语言）

100 - 1 - 0.5 = 98.5 / 5 ≈ 19100 - 5 - 0.5 = 94.5 / 1 ≈ 94   ----- 95?100 - 5 - 1 = 94 （94/0.5=188 > 100）

题目里 换成5元、1元、0.5元面值的零钱100张，以上三种面值的零钱至少有一张，限死了，再多循环也是无用功。

每种都要有，那 0.5 最低只能 (100-5-1)=94 再乘以 2 又限制总共 100张，所以，合适的最大值似乎应该是 98；取大了也没太大关系，只是多算了些可能组合。


Question: 开局一张图，题目全靠猜

#include<stdio.h> int main() {     for (int i = 1; i < 8; i++) {         int step = 6;          int sum = 0;         for (int j = 1; j <= i; j++) {             if (j == 1) {                 sum = i;             } else {                 sum += step;                 step--;             }             printf("%-4d", sum);         }         printf("\n");     }          return 0; }

简化一些： #include <stdio.h>  int main() {   for (int i = 1, j = 1, k = 6; i < 8; j <= (k + 8) * i / 2 ?         printf("%d ", j), j += k-- : (j = (puts(""), ++i), k = 6));    return 0; }

我来一种

供参考： #include <stdio.h> int main() {     int i, j, n = 7, k;     scanf("%d", &n);     for (i = 0; i < n; i++) {         for (j = 0, k = i + 1; j <= i; k += (n - j - 1), j++)             printf(j == i ? "%d\n" : "%-4d", k);     }     return 0; }

帅


Question: 输入数据后程序为什么不运行，不显示计算结果

scanf里面不能有\n


Question: 这代码啥问题 奇怪的初始化元素太多

第二个数4.3 写成了 4,3 了吧，即小数点写成了逗号

谢谢蠢死了


Question: 【UDT】求纯C语言实现的UDT库源码，急急急！！！

【UDT】求纯C语言实现的UDT库源码，急急急！！！

求纯C语言实现的UDP库源码，有重谢！！！


Question: 三子棋的棋盘 无法对齐

是什么问题我也是这样，我找不到原因

啊我找到问题了，把char打成int了。谢谢各位啊

board初始化为{0}， printf("%c", board.....);  这个打不出东西的。

这个我改好了

觉得你用的竖线是全角字符，横线和空格是半角字符，全都改成一样的字符应该就可以啦。

不是欸，我试了全半角一样不行

这个是我输出的结果

看着不象是字体的缘故。那就单步吧，就看第一行，首个空好像是 3 个空格大小，而中间的却似 2 个，绘制语句一个字符一个字符地运行了看，哪里有不对。

命令行窗口的字体不是等距字体？

什么意思，能详细说下吗


Question: c语言 字符串指针 请教各位大神 帮帮孩子！！！

char *p;只是给申请了指针变量p的地址，地址的值不能被修改。char [] p="ABCDE";是将字符串的值放进了找个字符数组里，这种写法会自动补全"\0"

这说法不对哦，是指针p指向了常量区，常量区内存不允许被修改。char []p 本身会放一份在常量区，并且会在栈中开辟一块内存区域，并把常量区的字符复制到来。 以上两种都会默认加“\0”。

constint,AMOMNT=?

char * p = "ABCDE";指向的是常量的地址，不可以修改。


Question: linux源码问题？？？？

...是什么让你认为能在用户态的程序里面调用内核函数？

使用驱动模块的方式是可以的，只是觉得这种方法太复杂

那是必然的啊，自己挂个驱动封装 ioctl 算了

还有其它不用驱动这种的方法吗？


Question: 字符型数组输出全是方框是怎么回事

赋值=的优先级比较低，所以先计算 getchar() != '\n' ，结果赋值给 c[i]

(c[i] = getchar()) != '\n'

谢谢彭于晏！

(c[i] = getchar()) != '\n

谢谢吴彦祖！


Question: 新手学习 问题请教1：Scanf使用问题 请高手指教

在头文件前加这一段代码#define _CRT_SECURE_NO_WARNINGS

scanf返回值被忽略 就是scanf有一个返回值，是返回接收到的数据的个数，如果你用不到这个参数，可以不用管他 putchar(a);这是一个问题，a是双精度浮点数，你用输出字符的函数去输出，这是无理的行为，不会有正确结果的，应该用printf("%lf\n",a)输出，另外，程序中的错误提示意思是使用了不安全的函数scanf 可以改用scanf_s 函数代替。

putchar((int)a);


Question: 输入文件路径时，直接输入的可以正常使用，通过strcat拼接而成的无法使用；并且有时直接输入路径也无法使用，如何解决？

好像是PlayMusic函数后加个循环，否则程序直接结束了。

assert(40-1<strlen("D:\\music\\You_Never_Leave.mp3 alias bkmusic"));

赵老师最近回答的水平偏低啊，拼接上 alias bkmusic 的那段是 70 的长度


Question: 求救VS2022输入这个代码，是什么问题

#include <stdio.h> int main() {     float fahr,celsius; //float fahr, float celsius;     int step;     float lower,upper; //float lower, float upper;     lower = 0, upper = 300.00, step = 20;     fahr = lower;     while (fahr <= upper) {         celsius = (5.0 / 9.0) * (fahr - 32.0);         printf("fahr:%f℉, celsius:%f℃\n",fahr,celsius);         fahr = fahr + step;         //return 0;     }     return 0; }

搞明白了，非常感谢！

类型声明的格式是一个类型，后面跟一个或多个被声明的标识符，多个的情况用逗号分隔，最后用分号结束。

没看懂，请问要怎么修改？

搞明白了，非常感谢


Question: 请问各位运行多源文件程序时出现下列错误怎么破？

我都是复制错误信息直接百度


Question: vscode报错信息含义及主函数如何定义

sqrt() 就是浮点数啊，单精度或高精度的，要给整形，可能要加个类型转换。


Question: 二维数组加一和二维数组加一解引用

如果你仅希望ptr2指向aa[1][0]这个后果的话，没有区别。 但是稍有冗余。 其实可以 int * ptr2 = (int * )(aa+1); 也可以 int * ptr2 = * (aa+1); 也就是说，在有了这个解引用以后，它前面的强制类型转换就是多余的了，因为右侧表达式 * (aa+1)本来就是int * 类型的了。 但是没有这个解引用的话，由于(aa+1)这个表达式是int (* ) [5]类型的，所以强制类型转换是需要写上去的。

真累人，网站总是把星号理解成斜体格式符，建议网站关注。

懂了,感谢大佬 *(aa+1)之后 类型是int*

也就是说，在有了这个解引用以后，它前面的强制类型转换就是多余的了，因为右侧表达式 * (aa+1)本来就是int * 类型的了。 这是不是有问题啊？解引用出来后是数组的值，怎么会是地址呢？

同学，不是加不加*的问题，，看似赋值没问题，但你这句根本是错误的，左边是指针，右边是数组aa的第2个位置的值。so1、如果你是想将ptr2指向数组的第2个位置，这样：int *ptr2 = aa + 1;（这样也可以：int ptr2 = &((aa+1));，但就多些一举了）2、如果你是想获取数组的第2个位置的值，这样：int ptr2 = *(aa + 1);

老铁 int *ptr2 = aa + 1; //这个右边是数组左边是指针,最好不是应该强制转化一下吗,(虽然地址是相同的) 第2个你是写错了吗? 如果像你这样子写 int ptr2 = *(aa + 1); 不就成把地址赋给整形了吗?

数组的名称就是数组的首地址啊，怎么了？为什么要强转？*(aa + 1)就是解引用，得到就是数组下标1的值啊

对，它是二维数组！


Question: 求值 9Bh=-27，1Bh=27 如何计算这个值，c

既然1000 0101可以是-5，那么1001 1011是-27那不是顺理成章的么？

至于为什么用原码而不是补码，那得问系统设计者。 不过咱得承认原码对人类肉眼更友好不是么？


Question: 这个里面的c++和++c两种自增出来的结果为什么是一样的？

是因为，我就拿你的a = i++来回答吧。编译器在遇到a = i++的时候，它会这样理解：i先把自己值赋给a，再i+1而编译器再遇到a = ++i的时候，它会这样理解：i先加1，再返回a里你看看，i先 + 1和后+1都是一样的，而a就不同了：一个是得到i原来的值，一个是得到i+1后的值。

一是 for() 循环体执行序列的问题，先执行初始化语句，再执行判断语句若成立执行循环体否则结束循环，循环体执行完后是第三个增量语句，再去判断语句；单独的语句，自增在前或在后，对变量自己没影响，影响的是以之赋值的对象，所以第二个例子，i 为 1，a 为 0 （因为自增在后，先执行赋值语句[其时a=i=0]再自增[i=1，a仍为0]）。


Question: 静态变量和初始化为0的全局变量在.bss段吗？

.data当然名字是无所谓的，加载后都合并了，只是映射的页面属性不一样而已。

好的大佬


Question: 求助 代码在dev-c++成功运行，vs2022却运行失败

使用vc 2022时在头文件前加#define _CRT_SECURE_NO_WARNINGS，就不用scanf_s了

scanf_s("%s%s", stu[a].num, 10, stu[a].name, 20);

谢谢大佬，解决了。这是scanf_s函数必须要限定范围吗？刚刚接触vs studio的时候我就知道scanf_s是防止越界的，但是发现在日常使用中scanf_s并不需要设定范围,就没有注意。在数组，结构体这种可能越界的都需要限定范围吗？


Question: 我又来了，内存对齐问题

结构体在创建时，会按照占用空间最大的那个类型为单位开辟空间，所以都是按照8开辟的，第一个结构体，他会开辟88，后面的2和4，可以放到第2个8里面。第二个，先开辟一个8，放short a2,剩余6个，不够存放long a1，载开辟一个8,存放a1，然后第三次开辟一个8存放a3.这个也就面试的时候可能会问到，用处不太大。

明白了，谢谢大佬

内存对齐这种事，知道有这回事就行，不求自己算。因为不同平台不同编译器不同编译参数造成不同的对齐后果，所以没法算。

哦，谢谢大佬


Question: c语言指针交换两个值的问题

c语言里面的变量名称是区分大小写的将pa 改为 Pa，或者将Pa改为pa，即可

c语言的代码里面是区分大小写的。


Question: 求助，leetcode heap buffer overflow错误

在我印象中，二分查找好象不是这样吧？是不是应该改为这样呢？ int search(int* nums, int numsSize, int target)  {     int low = 0;     int hight = numsSize -1;     while (low <= high) {          int middle = (low + high) / 2;          if (target == nums[middle]) {              return middle;          } else if (target > nums[middle]) {              low = middle + 1;          } else {              high = middle - 1;          }     }           return -1; }


Question: 力扣网的练习题，请问这个 *returnSize = 2; 这一句意义何在

意义在于，用来通知这个函数的调用者，你刚才让我做的问题有解，别忘了free 。

只是有无解的话，返回值就可以的，是 NULL 还是其它有效指针。

所以说写代码和答题是两回事。

这个函数其实返回两个内容，一个是 return 语句返回的，一个就是这个 returnSize 表示的，它应该是调用者里的一个变量的地址，那个变量用来存放所寻得区间的大小；从这个函数里的语句来看，是没有意义，因为固定了返回有效时它总是 2，但便于函数后来的扩展和变更。


Question: 求大佬解答该如何让此软件运行，本人电脑是windows11，这个软件是老师上课要求要下载的。

如果不能换老师的话，就换系统吧。在自己的机器上装虚拟机或者租用云主机用它的远程桌面，然后在里面安装windows98，接着在上面安装VC6。


Question: TCP TIME_WAIT问题

顶