Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 关于c库的一些疑问 

回复:
user: user-1
content: 1. 标准里只有一章 Library 介绍所有的库函数，并没有给这个库起名字。C库应该是来源与"C 语言的库"。 2. C 标准里 Library 一章介绍的 C 语言中应该包含的头文件，头文件中应该定义的函数、宏、常量、变量等，并详细说明了所有这些符号的含义和功能。这可能就是所谓的 C 库吧。 3. C 库既然是 C 语言的库，那个就只有 C 语言才会需要。鉴于系统里很多程序是用 C 语言写的，所以在系统中可能也可以找到。    对一个已经编译好的 C 程序来说，它可以将（它所用到的） C 库完全包含在自己的可执行文件中，这是你是看不到独立的 C 库的。当然它也可以动态链接库的形式依赖一个 C 库的 dll 。这个 dll 可能在系统目录，也可能在其它目录，只要程序运行时可以找到（如何找需要参阅 Windows 的文档）。由于不同的程序可能去不同的地方找，从而系统中也可能存在多个（可能相同也可能不同的）C 库。   至于 lib ，那是 C 语言编译需要的。lib 里存放的是已编译好 C 库，在 C 编译器遇到 C 库中的内容的时候，可以直接引用。 4. 靠名字。   上面说了，lib 里有已经编译好的 C 库。当你调用一个库函数的时候，编译器会去 lib 通过名字查找这个函数（这一步称作链接）。当你的程序包含几个源文件的时候，不同源文件中的函数调用也是这样通过名字查找的。 5. 老的 C 标准（C89）不要求在调用函数之前事先声明。新标准（C99）要求声明。但是并不是所有的C编译器都会按照新标准强制要求声明。所以现在你可能依然可以不经声明调用一个函数（比如不包含 stdio.h ，调用 stdio.h 中的函数）。 6. 这个，可能包括库的位置，你要链接那些库，等等。这里的库不一定只包含 C 库，还可以有其它库。只有 C 库的话，通常不用，编译器就搞定了。具体的要查询编译器文档。

user: user-2
content: https://www.baidu.com/s?wd=C%E8%BF%90%E8%A1%8C%E6%97%B6%E5%BA%93&rsv_spt=1&rsv_iqid=0xf5f21cf700009d0e&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_sug3=16&rsv_sug1=15&rsv_t=9926HxsCyqALmYe%2FrboDdbe47vU9PCiDmwQ4Ukaqp0onIL%2FYddV%2BYvKD0Cj%2Fup76%2BPwg&prefixsug=C%25E8%25BF%2590%25E8%25A1%258C%25E6%2597%25B6%25E5%25BA%2593&rsp=0&inputT=9753&rsv_sug4=9753

user: user-3
content: 1. c库指c语言可以用的库 2. c库里面没有函数定义, 而是已经翻译好的电脑能看懂的语言. 3. c库保存的位置与编译器有关, 是lib还是dll也与编译器有关. 4. 没错只有声明, 声明是给编译器看的, 编译后还有链接过程, 链接时, 就必须确保有定义了. 5. 因为stdio中的只是声明, 可以手工写出来, 6. 某个阶段就是链接阶段, 有些库是默认链接的, 所以不用显式地指定. 而有些需要显式指定.

user: user-4
content: C标准中定义的一些函数，比如printf，fopen这些库函数，写代码时直接调用就可以了，但是它们的实现是由各个编译器作者们提供的。比如在Windows，你用vs写C代码，最终代码在链接阶段需要把msvcrt（msvcrt.dll）引用到生成的可执行文件中，程序在执行的时候遇到printf就自动进入msvcrt.dll中完成相应功能，这个msvcrt.dll就是Microsoft提供的。Linux系统中的实现是glibc，编程过程中需要libc.so。
user-0 提问: 新人提两个问题！！非常急！！！

回复:
user: user-1
content: 如果“单步printf对应的汇编指令几步后，你就会来到printf的源代码处。”不灵，请换VS20XX。

user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）  单步printf对应的汇编指令几步后，你就会来到printf的源代码处。

user: user-2
content: 这是一种可能的解释：往屏幕上输出的字符最后是要写到显存中的。如果是可打印字符，如'a'、'b'、'c'之类，需要将他们写进去；如果是'\b'、'\n'、'\t'之类，调整显存中下一个字符的位置；等等。'\0'呢，不属于前面任何一种，就简单地向后移动一个位置得了，原来显存中可能有其他的东西，比如'a'，于是显示的就是上次遗留的符号了

user: user-0
content: 没人来拯救我吗

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:将printf("%c ",a[i]);改为printf("%02x ",(unsigned char)a[i]);  引用 4 楼 wang0635 的回复:1、那个a实际上是输出 '\0' 的效果 2、有的C系统中，对一些常用的函数可以不加头文件说明  引用 2 楼 q3733353520 的回复:是scanf的原因， "1112223333\0"，这才是你输入的字符串  你们看看我再最后一句输出a【9】的ascll码（’a‘）为0，然后在输出’\0‘的ascll码为0这是为什么我很苦恼。

user: user-1
content: void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-0
content: 请问为什么我的‘a'的ascll码是零？  引用 3 楼 shen_wei 的回复:0x0A 这个是换行符。。。。

user: user-1
content: 将printf("%c ",a[i]);改为printf("%02x ",(unsigned char)a[i]);

user: user-3
content: 关于2，猜测一下： C 语言使用函数是不需要声明的，但是如果不声明的话对函数的参数类型会有限制（不满足限制的函数就必须先声明在使用了，否则程序会出错）。你对 sqrt 函数的使用可能正好满足这个限制。  % 是不需要引用任何头的。

user: user-4
content: 0x0A 这个是换行符。。。。

user: user-2
content: 1、那个a实际上是输出 '\0' 的效果 2、有的C系统中，对一些常用的函数可以不加头文件说明

user: user-5
content: 是scanf的原因， "1112223333\0"，这才是你输入的字符串

user: user-0
content: 诚心求教！！！
user-0 提问: 关于汇总数据的实现代码

回复:
user: user-1
content: 给你一个类似的问题作为参考：http://blog.csdn.net/super_admi/article/details/46006789

user: user-0
content: 引用 2 楼 wang0635 的回复:代码没有问题。但是这个if是多余的，因为 iData_Counter < MAX_DATA_BUFF 的条件始终成立 是的，谢谢提醒。 开始的时候是没有加if的，后来在调试的时候逐步逼近，就有了这个if没有删除。  两段代码应该是相同功能，不知道为什么在Keil C51里面编译没有问题，运行起来就会有问题  今天调试的结果是在数据量MAX_DATA_BUFF很少，比如小于20的话，都没有问题，但是在大于200时运行就出状况，头疼

user: user-0
content: 引用 3 楼 super_admi 的回复:给你一个类似的问题作为参考：http://blog.csdn.net/super_admi/article/details/46006789 谢谢！

user: user-0
content: 引用 1 楼 hnwyllmm 的回复:第一个if少了一个右大括号没看到哪里缺少，这两端代码编译都可以通过的

user: user-2
content: 代码没有问题。但是这个if是多余的，因为 iData_Counter < MAX_DATA_BUFF 的条件始终成立

user: user-3
content: 第一个if少了一个右大括号
user-0 提问: 矩阵操作

回复:
user: user-0

user: user-0
content: 已解决！我还是通过编程实现上面的梯度值的。不过楼上提供的A*算法比较经典！

user: user-1
content: http://blog.csdn.net/shanshanpt/article/details/8977512

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:搜A*寻路算法. 好像不太一样啊？看得不太明白。我这个能实现吗！

user: user-0
content: 引用 2 楼 user-2 的回复:不太明白,这些值怎么来的 上面一个矩阵中数值为1的位置，他在该位置就需要一个梯度值，这个梯度值赋值到下一个矩阵中。看懂了没？

user: user-2
content: 不太明白,这些值怎么来的

user: user-1
content: 搜A*寻路算法.
user-0 提问: 指针数组与数组指针

回复:
user: user-1
content: //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-2
content: 楼上的解释的挺好，我在VS上试了下。  学习了，谢谢！

user: user-3
content: 指针是有类型的，你不能把一个指向 int 的指针 (int *) 赋值给一个指向字符的指针(char *)。 同样，你也不能把一个指向数组的指针（ int (*)[3]， &laxy[0] ) ，赋值个一个指向 int 的指针 (int *， p[0] ）
user-0 提问: windows下安装libxml2出错

回复:
user: user-1
content: 我是在VS中编译libxml2出现的这样的错误，解决如下，在 工程属性 -> 配置属性 -> 链接器 -> 输入 -> 附加依赖项 添加libiconv.lib库文件

user: user-0
content: 引用 7 楼 xiaoshang_program 的回复:标准的链接错误  缺少iconv 这个函数库  iconv 函数库 是linux 版本 有win  你可以看看 我记得我原来编译过 可以的 iconv函数库我已经用include=F:\sohu_code\p2plive\third\libiconv-1.9.2-1-lib\include lib=F:\sohu_code\p2plive\third\libiconv-1.9.2-1-lib\lib命令include进来了

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 u012115420 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项我用的是dev C++跟keil，没这些设置的[/quote] 肯定有类似这些设置的地方，找找看。[/quote] 恩

user: user-2
content: 标准的链接错误  缺少iconv 这个函数库  iconv 函数库 是linux 版本 有win  你可以看看 我记得我原来编译过 可以的

user: user-3
content: 引用 5 楼 u012115420 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项我用的是dev C++跟keil，没这些设置的[/quote] 肯定有类似这些设置的地方，找找看。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项我用的是dev C++跟keil，没这些设置的

user: user-3
content: 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:重建所有试试看。重建过了，没有用，现在改mini xml了，不过mini XML可以#include <mxml.h>，使用mxml_node_t*xml;也没问题，但是调用mxmlNewXML("1.0")这几个函数就报错，请问你知道什么原因吗？

user: user-3
content: 重建所有试试看。

user: user-0
content: 求大神解答·····
user-0 提问: 对一个数组赋值，为什么会改变另一个数组的值。

回复:
user: user-0
content: 引用 3 楼 lm_whales 的回复:[quote=引用 1 楼 user-4 的回复:] j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了++ [/quote]  引用 3 楼 lm_whales 的回复:[quote=引用 1 楼 user-4 的回复:] j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了++ [/quote]  引用 3 楼 lm_whales 的回复:[quote=引用 1 楼 user-4 的回复:] j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了++ [/quote]  引用 3 楼 lm_whales 的回复:[quote=引用 1 楼 user-4 的回复:] j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了++ [/quote]  引用 3 楼 lm_whales 的回复:[quote=引用 1 楼 user-4 的回复:] j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了++ [/quote]  引用 3 楼 lm_whales 的回复:[quote=引用 1 楼 user-4 的回复:] j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了++ [/quote]  引用 3 楼 lm_whales 的回复:[quote=引用 1 楼 user-4 的回复:] j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了++ [/quote]谢谢

user: user-0
content: 引用 1 楼 user-4 的回复:j为29时j+1是30越界了  谢谢

user: user-1
content: 编译器缺少越位 吹哨！！！

user: user-2
content: for(j=29;j>=0;j--) { OUT_ARI_TEM_AM[j+1]=OUT_ARI_TEM_AM[j]; }  j=29的时候 j+1就是30 OUT_ARI_TEM_AM[30] 已经越界。对其操作其结果是不可预料的。  至于对30下标赋值改变了另外一个数组。只不是是刚好另外一个数组的内存在30这里。  不知道你知道for执行的顺序不。明明+1了。  for（1；2；4） {       3 }  执行顺序 1 2 3 4.这么循环下去，直到退出

user: user-3
content: 引用 1 楼 user-4 的回复:j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了++

user: user-0
content: 引用 1 楼 user-4 的回复:j为29时j+1是30越界了  引用 1 楼 user-4 的回复:j为29时j+1是30越界了  不好意思，我并没有+1

user: user-4
content: j为29时j+1是30越界了
user-0 提问: 有三个问题请教，非常感谢

回复:
user: user-1
content: scanf那句改：scanf("%d", &score[index]);  你多了一个换行符，scanf会跳过其去读下一个字符，所以你必须再输入一个数

user: user-2
content: http://blog.csdn.net/21aspnet/article/details/174326

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

user: user-0
content: 如果第一次输入11个数而不是10个数，下面可以显示10个数。输入10个数只显示九个数，再输入1个才会显示第10个输入的数，这是为什么？
user-0 提问: 关于linux c 文件读写

回复:
user: user-1
content: 两个文件都没有 close

user: user-0
content: 我直接到文件夹，直接打开，但是开不了

user: user-2
content: 用什么打不开？ 你的文本编辑器吗？ 用 more 可以说明文件本身是没问题的撒
user-0 提问: 这个获取文件信息的意思应该怎么理解呢？

回复:
user: user-1
content: 引用 2 楼 cl781121 的回复:[quote=引用 1 楼 adlay 的回复:] myfile 除了是一个结构，应该还有一个函数也叫这个名字才对  E:\share\examples/.prefs  Windows 的路径分隔符为 \ , UNIX 的路径分割符为 /  。 某些函数可能都接受，都是路径分隔符 .prefs 只是一个文件，并不是代表所有文件。 在 UNIX 系统下， 以 . 开头的文件作为隐藏文件  但是prefs前面还有个“.”，正常的文件是文件名+逗号+后缀名，这里只有逗号+后缀名 应该怎么解释呢[/quote]  windows 一般情况下文件名不能为空，但是通过一些手段也可以建立只有 .后缀的文件（文件名为空）。  Linux 下 . 在文件名里没有特殊含义（只含有 . 的文件名是有特殊含义的，表示当前目录），文件命名也没有所谓“文件名+.+后缀"的约束， .prefs 是一个很普通的文件名。（Linux 下 . 开始文件默认是隐藏的）  这个程序估计是 Linux 的直接拿到 windows 下来用了。

user: user-0
content: 引用 1 楼 adlay 的回复:myfile 除了是一个结构，应该还有一个函数也叫这个名字才对  E:\share\examples/.prefs  Windows 的路径分隔符为 \ , UNIX 的路径分割符为 /  。 某些函数可能都接受，都是路径分隔符 .prefs 只是一个文件，并不是代表所有文件。 在 UNIX 系统下， 以 . 开头的文件作为隐藏文件  但是prefs前面还有个“.”，正常的文件是文件名+逗号+后缀名，这里只有逗号+后缀名 应该怎么解释呢

user: user-0
content: 原来如此，多谢两位 彻底明白了

user: user-2
content: myfile 除了是一个结构，应该还有一个函数也叫这个名字才对  E:\share\examples/.prefs  Windows 的路径分隔符为 \ , UNIX 的路径分割符为 /  。 某些函数可能都接受，都是路径分隔符 .prefs 只是一个文件，并不是代表所有文件。 在 UNIX 系统下， 以 . 开头的文件作为隐藏文件
user-0 提问: c语言     函数参数和隐式转换问题

回复:
user: user-1
content: 1. C 允许不声明函数直接使用，或者声明函数但是不指明参数表。这两种情况下函数都可以接受任意参数。     但是，此时某些参数会有类型提升，如 char 会提升成 int ，float 会提升成 double 。  2. 对于在调用时函数已经声明了参数表的，调用的参数个数与类型需要与参数表匹配。每个参数都会转换为声明中对应参数的类型。  3. 如果函数调用时的参数数量、类型与定义时的不一致，结果是不可预知的。     C 对这中情况不能给出错误或警告，所以只能依赖程序员自己控制了。

user: user-2
content: 引用 4 楼 u010424970 的回复:第二个，如果说编译器足够聪明，如果是我给的提示多还好，如果是这二个问题一起的话： 对于库 函数，int func2(float,float,float)是它实际的定义时的，结果我头文件声明却是int  func2(int,int,int),调用是func(2,2,2);那编译器的聪明也会少条件数据，提前先做相应的转换。 如果是这样，程序员只能去查看反汇编了去确定问题了吗？ 制作库的人如果给出一个错误声明的头文件，自然要对此负责， 库里面代码所使用的参数个数，类型，函数调用约定如果和头文件中的不一致，崩溃是很正常的。

user: user-0
content: 引用 1 楼 stupid_boy2007 的回复:"对于c，函数的声明和调用参数个数和参数类型都可以不同，那在预处理、编译、汇编、链接中的编译过程中，对函数调用的参数个数和类型在声明或定义做了什么？" 应该只是在语义解析时，表明了是函数名而非其它。  “那这种隐式转换是出现在什么地方？” 编绎器足够聪明，在调用位置，先把参数隐式转换。  语义解析，我想到的是生成重定位目标文件时，编译器只是在ELF文件中的.symtab中确认一个func符号且为函数类型。  第二个，如果说编译器足够聪明，如果是我给的提示多还好，如果是这二个问题一起的话： 对于库 函数，int func2(float,float,float)是它实际的定义时的，结果我头文件声明却是int  func2(int,int,int),调用是func(2,2,2);那编译器的聪明也会少条件数据，提前先做相应的转换。 如果是这样，程序员只能去查看反汇编了去确定问题了吗？

user: user-2
content: 1. 函数如果声明了参数，调用的时候就要求相同。如果没有参数，就写成 int func1(void)。 int func1() 这种形式在 C 里面是表示它接受任意参数了。      函数声明只是用来加查后面的函数调用是否正确，只在语法检查的时候起作用。     函数定义编译后会产生函数的代码，并给这个代码的首地址一个符号，链接的时候其他 obj 引用这个符号就替换成对应的地址。  2. 在 main 函数中。

user: user-3
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-4
content: "对于c，函数的声明和调用参数个数和参数类型都可以不同，那在预处理、编译、汇编、链接中的编译过程中，对函数调用的参数个数和类型在声明或定义做了什么？" 应该只是在语义解析时，表明了是函数名而非其它。  “那这种隐式转换是出现在什么地方？” 编绎器足够聪明，在调用位置，先把参数隐式转换。
user-0 提问: 关于printf输出的数据类型

回复:
user: user-1
content: #include <stdio.h>  int main(int argc, char *argv[]) {     int a = 0x12345678;      printf("%x %llx\n", a, a);     printf("%x %llx\n", a, (long long)a);     return 0; }

user: user-1
content: %lld会从栈里取8个字节，a 是int型，压栈的时候只压了4个字，改成(long long)a就可以了

user: user-2
content: 引用 4 楼 qq_31361473 的回复:[quote=引用 3 楼 赵4老师的回复:]将int a的值在内存中保存的起始地址处的8个字节按照long long int的格式输出。a实际占了前4个字节，后面的4个字节没人保证它全是00 为什么说是后面四个？不是前面四个？[/quote] 自己在调试器中打开内存窗口输入&a，查看内存中的字节值。  理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: 引用 3 楼 赵4老师的回复:将int a的值在内存中保存的起始地址处的8个字节按照long long int的格式输出。a实际占了前4个字节，后面的4个字节没人保证它全是00 为什么说是后面四个？不是前面四个？

user: user-2
content: 将int a的值在内存中保存的起始地址处的8个字节按照long long int的格式输出。a实际占了前4个字节，后面的4个字节没人保证它全是00

user: user-4
content: 你给的格式符与实际变量的类型不符，那结果肯定很难是正确的了。

user: user-5
content: 错误的代码产生错误的结果，你看编译器都警告了  [root@localhost jwj]# cat main.c  #include <stdio.h>  int main () {   int a = 1;    printf ("%d,%lld\n", a, a);    return 0; } [root@localhost jwj]# gcc -g -Wall main.c  main.c: In function ‘main’: main.c:7: warning: format ‘%lld’ expects type ‘long long int’, but argument 3 has type ‘int’ [root@localhost jwj]# ./a.out  1,577731895119314945  如果你非要纠结的话，那下面这个你怎么解释？  [root@localhost jwj]# cat main.c  #include <stdio.h>  int main () {   int a = 1;    printf ("%d,%lld\n", a, a, 0);    return 0; } [root@localhost jwj]# gcc -g -Wall main.c  main.c: In function ‘main’: main.c:7: warning: format ‘%lld’ expects type ‘long long int’, but argument 3 has type ‘int’ main.c:7: warning: too many arguments for format [root@localhost jwj]# ./a.out  1,1
user-0 提问: 一个数如果等于其每一位数字的立方之和，则称此数为水仙花数，如153就是一个水仙花数，因为153=13+53+33。使用for语句编程求出100到999之间所有的

回复:
user: user-1
content: 153=13+53+33?哈哈这叫水仙花？153 =1 +125+27

user: user-2
content: 看错了  不要在意

user: user-2
content: 个十百位的数字求错了吧

user: user-3
content: if(i=ge*ge*ge+shi*shi*shi+bai*bai*bai)  {  printf("%d ",i);  } 改成== 不然会把100到999的数字都打出来

user: user-4
content: 比较是二个等号,==, 把编译开关全打开,应该有提示的

user: user-5
content: if(i=ge*ge*ge+shi*shi*shi+bai*bai*bai)  //里面是关系表达式，不是赋值表达式 还有主函数定义为空，就不要有返回值了。
user-0 提问: 程序运行都没什么问题，就是记事本里的数字要么是问号，要么是方框，其中数字为 19 2000 1001 20.

回复:
user: user-1
content: fwrite、fread是按二进制的，当打开记事本查看时都是乱码。fprintf()、fscanf()是以文本写入读出的，打开记事本查看时才不会是乱码

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

user: user-3
content: fwrite、fread是按二进制的 想能在记事本中看，需要按文本方式
user-0 提问: 利用分治算法求中位数的算法设计

回复:
user: user-1
content: 1.若midA=midB，返回midA； 2.若midA<midB，舍弃A中较小的一半，舍弃B中较大的一半； 3.若midA>midB，舍弃A中较大的一半，舍弃B中较小的一半；

user: user-2
content: 求两有序数组x和y的第k个数，思路如下： 若k为1，则返回两数组的最小值 取x的第i个数x0，取y的第(k-i)个数y0 若x0=y0，则x0即为所求 若x0<y0，则丢弃x的前i个数，k=k-i，递归 若x0>y0，则丢弃y的前(k-i)个数，k=i，递归  i取值尽可能地为k/2，每次丢弃k/2个数，O(log k) 取中位数时，k=(m+n)/2，O(log (m+n)) 当m=n时，k=n，O(log n)  public class Solution {     public double findMedianSortedArrays(int[] nums1, int[] nums2) {         if ((null == nums1) || (null == nums2)) {             return 0;         }          int total = nums1.length + nums2.length;         int middle = total >> 1;         if (0 == (total & 0x01)) {             int val1 = findKthSortedArrays(nums1, 0, nums1.length, nums2, 0,                     nums2.length, middle);             int val2 = findKthSortedArrays(nums1, 0, nums1.length, nums2, 0,                     nums2.length, middle + 1);             return (val1 + val2) / 2.0;         } else {             return findKthSortedArrays(nums1, 0, nums1.length, nums2, 0,                     nums2.length, middle + 1);         }     }      private int findKthSortedArrays(int[] nums1, int b1, int e1, int[] nums2,             int b2, int e2, int k) {         if (e1 - b1 > e2 - b2) {             return findKthSortedArrays(nums2, b2, e2, nums1, b1, e1, k);         }          if (b1 == e1) {             return nums2[b2 + k - 1];         } else if (1 == k) {             return Math.min(nums1[b1], nums2[b2]);         }          int i = Math.min(k / 2, e1 - b1);         int j = k - i;         int val1 = nums1[b1 + i - 1];         int val2 = nums2[b2 + j - 1];         if (val1 == val2) {             return val1;         } else if (val1 < val2) {             return findKthSortedArrays(nums1, b1 + i, e1, nums2, b2, e2, k - i);         } else {             return findKthSortedArrays(nums1, b1, e1, nums2, b2 + j, e2, k - j);         }     } }

user: user-3
content: 分别求x,y数组的中位数，mid_x, mid_y，如果mid_x<mid_y，则将x的前一半舍弃，y的后一半舍弃;如果mid_x>mid_y，则反之;如果两个相等，则找到中位数。 第二步，接着找被折半的x,y的中位数
user-0 提问: 打印'\0'与“\0”与实际不相符

回复:
user: user-1
content: 添加如下代码： char c[2]={'\0'}; 	printf("|%c|",c[0]);

user: user-2
content: 所有字符，如果你一定要输出的话总会用一个样子的，具体样子是啥与操作系统(win, linux ...)，区域/语言设置(中文、英文、法文...)，终端程序(cmd, powshell, bash, ...)，字体设置等等都有关。  大概只有 ASCII 可显示字符区的显示起来一致性比较高，其它的（包括'\0'），显示成啥就只能自求多福了。

user: user-3
content: %s是输出\0之前的字符, 不包过\0 printf("|%c|\n",a[0]); %c是输出字符

user: user-4
content: 输出字符，不管这个字符能不能正确输出，都会占一个字符格位，不光是'\0'，楼主，你可以试试别的不能显示的字符，都是如此

user: user-5
content: 为什么不参考printf对应的源代码呢？
user-0 提问: 使用for语句编程求以下表达式的值

回复:
user: user-1
content: 先找规律。然后分成几个模块。接着全部连在一起。最后就是用语言实现。

user: user-2
content: 这样：  int main(void) { 	int i, fenmu; 	double sum = 0; 	fenmu = 0; 	for (i = 1; i <= 10; i++) { 		fenmu += i; 		sum += 1.0 / fenmu; 	} 	printf("%f\n", sum); 	return 0; }

user: user-2
content: int main(void) { 	int i, fenmu; 	double sum = 0; 	fenmu = 0; 	for (i = 1; i <= 10; i++) { 		fenmu += i; 		sum += 1.0 / fenmu; 	} 	printf("%f\n", sum); 	return 0; }

user: user-3
content: 你得循序渐进了  先写个程序输出 1 1+2 1+2+3 ... 1+2+...+10 的结果吧。  然后在写一个（或者修改一下）求 1/1 1/(1+2) ... 1/(1+2+...+10) 的结果。  都调对了再做累加。

user: user-2
content: 在C语言中，整数之间做除法：/，其结果仍是整数
user-0 提问: 有n个人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

回复:
user: user-1
content: 约瑟夫环 用循环链表易于理解，易于找错

user: user-2
content: 楼主，且不说你的问题出在哪里，就看您提问的方式。 1.直接上代码，问出什么问题，起码要有自己的一些分析过程，出问题的点在哪里。。等。 2.代码乱七八糟，连个缩进格式都没有。这样大家都没心情帮你调试了。 你看看回复你的两位高手的代码格式。

user: user-3
content: N年前面试时遇到过这个题，当时答错了，面试官跟我说用循环链表比较好做。

user: user-4
content: 使用循环列表，这个问题就比较简单了

user: user-5
content: 其实这道题最好的是用循环链表，这个时候考虑数据的组织比较好

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:仅供参考：//假设有n个人团团围做，从第1个人开始数数，数到第m个人时候，第m个人出列， //然后继续从1开始数数，数到第m个人退出 #include <stdio.h> #include <conio.h> int i,k,t; int n,m; static char f[1001];//0该座位未出圈,1该座位已出圈 void main() {     while (1) {         printf("Input n m(1000>=n>=m>=1):");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1000>=n && n>=m && m>=1) break;         }     }     t=0;//已出圈总人数     i=1;//座位编号     k=1;//当前要数的数     while (1) {         if (0==f[i]) {             if (m==k) {                 t++;                 f[i]=1;                 printf("%3d ",i);                 if (0==t%10) printf("\n");                 if (t>=n) break;             }             k++;if (k>m) k=1;         }         i++;if (i>n) i=1;     }     cprintf("Press any key ...");     getch(); }    我已经有答案了，但是我不知道我写的错在哪里了，您能帮我看一下吗？谢谢！

user: user-6
content: 仅供参考：//假设有n个人团团围做，从第1个人开始数数，数到第m个人时候，第m个人出列， //然后继续从1开始数数，数到第m个人退出 #include <stdio.h> #include <conio.h> int i,k,t; int n,m; static char f[1001];//0该座位未出圈,1该座位已出圈 void main() {     while (1) {         printf("Input n m(1000>=n>=m>=1):");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1000>=n && n>=m && m>=1) break;         }     }     t=0;//已出圈总人数     i=1;//座位编号     k=1;//当前要数的数     while (1) {         if (0==f[i]) {             if (m==k) {                 t++;                 f[i]=1;                 printf("%3d ",i);                 if (0==t%10) printf("\n");                 if (t>=n) break;             }             k++;if (k>m) k=1;         }         i++;if (i>n) i=1;     }     cprintf("Press any key ...");     getch(); }
user-0 提问: 求算法   将2的14次方个的二进制数字，打印输出第3位和第11位的数字相同的所有数!!!!!!!!!!!!

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

user: user-2
content: #define BIT3(x) ((x)&4)     for(int i=0;i<(1<<14);i++)     {         if(BIT3(i>>8)==BIT3(i))             printf("%d\n",i);     }

user: user-3
content: int IsBit3SameBit11(int n) { 	return !((n >> 8 ^ n) >> 3 & 1); }
user-0 提问: C语言指针问题

回复:
user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）  受教了

user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-2
content: 请在debug时，查看内存信息即可。。

user: user-3
content: 楼主真想弄明白的话，建议查一下什么是大端，什么是小端

user: user-0
content: 引用 1 楼 adlay 的回复:i 在内存里面的内容是 0x78, 0x56, 0x34, 0x12 p++ 后指向第二个，自然就是 56 了  i 在内存里面的内容是 0x78, 0x56, 0x34, 0x12  //不是很明能解释清楚点吗？谢谢！

user: user-4
content: 引用 1 楼 adlay 的回复:i 在内存里面的内容是 0x78, 0x56, 0x34, 0x12 p++ 后指向第二个，自然就是 56 了 同意一楼的说法

user: user-5
content: 楼主的程序编译不过吧，无法从”int *“转换为"char *"

user: user-6
content: 这个已经设计到编译器的具体实现与系统结构了。  不同的系统结构下可能会得到不同的结果。如果只是在学 C 的话，还是应该先不要管这种问题为好。

user: user-7
content: i 在内存里面的内容是 0x78, 0x56, 0x34, 0x12 p++ 后指向第二个，自然就是 56 了
user-0 提问: 新手练习，一元二次方程求解报错，求大神帮忙。error C2143: syntax error : missing ';' before '{'

回复:
user: user-1
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-2
content: else (delta < 0)   ==>  else if (delta < 0)
user-0 提问: 请问什么是流，流的定义是什么？

回复:
user: user-1
content: 以我个人的理解，流就是纯粹的二进制，也就是字节流。对于二进制而言，就没有什么字符串，数字，文字或乱码，长度等概念。

user: user-2
content: Ｃ流操作有，scanf,printf 系列函数，fread,fwrite ，getc,fgetc,gets,fgets　fopen,fclose,fflush,fseek,rewind等 ｃ 有　stdin,stdout,stderr　等流指针 c++ 有 cin,cout,cerr 等标准流对象 <<,>>　是输入输出，基本流操作，也有一些流类的方法　用于访问流。、

user: user-2
content: 流的概念就是水流，气流，连绵不断的那种。 计算机里，指的是　连绵不断的字节，数据块等　带缓冲的数据流。  C,C++流，分别对应与 FILE* 和stream　类模板 （istream.ostream,iostream,等） 分为字节符流（文本文件），二进制流（二进制文件）等等， 其实就是文件（带缓冲的文件的数据结构）　包括设备文件，和磁盘文件。  这些流　代表　屏幕，串口，（网络），打印机　等设备　和磁盘文件。  有时候，字符串，也被看成是流。

user: user-3
content: 7.21.2 Streams 1 Input and output, whether to or from physical devices such as terminals and tape drives, or whether to or from files supported on structured storage devices, are mapped into logical data streams, whose properties are more uniform than their various inputs and outputs. Two forms of mapping are supported, for text streams and for binary streams.266)

user: user-4
content: http://baike.baidu.com/link?url=OpYYCFaiBmEtAQab7mW5wIz9d9tEvtaviJJIS-RllWUcJybYVib0Q_lzwP80NqLAY-G5IAOilCyB0tvv3Wt2LK
user-0 提问: 函数递归调用

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

user: user-2
content: #include <stdio.h> #include <string.h>  void DisplayNames(char **cNameArray);  char*cNames[]= {     "Aaron",     "Jim",     "Charles",     "Sam",     "Ken",     "end" };  int main() {     DisplayNames(cNames);     return 0; }  void DisplayNames(char** cNameArray) {     if(!strcmp(*cNameArray, "end"))     {         return;     }     else     {         DisplayNames(cNameArray + 1);         printf("%s\n", *cNameArray);     } }
user-0 提问: 字符串替换功能，会随机出错。望指教。

回复:
user: user-1
content: 好讨厌这种一行注释都不写的程序员

user: user-0
content: 终于正常了. #include "stdio.h" #include "stdlib.h" #include "string.h"  char *strrpl(const char *src, const char *search, const char *replace){  	char *dst = NULL; 	char *FindedPos = NULL; 	const char *SrcCurPos = src; 	int lensw = strlen(search); 	int lenrw = strlen(replace);     int lendst = 0; 	int count = 0; 	while( (FindedPos = strstr(SrcCurPos,search)) != NULL ){ 		 		char *y = (char *)malloc((FindedPos - SrcCurPos + lenrw + 1)*sizeof(char));  		*(y + (FindedPos - SrcCurPos) ) = '\0'; 		if( count == 0 ){ 			dst = (char *)calloc((FindedPos - SrcCurPos + lenrw + 1),sizeof(char));  		} 		else{             lendst = strlen(dst); 			dst = (char *)realloc(dst, (FindedPos - SrcCurPos + lenrw + lendst + 1)*sizeof(char)); 			*(dst + lendst) = '\0'; 		}  		int len = FindedPos - SrcCurPos; 		memmove(y, SrcCurPos, len); 		strcat(y, replace); 		strcat(dst, y); 		SrcCurPos = FindedPos + lensw; 		free(y); 		y = NULL; 		count++;  	}  	int lenSrcCurPos = strlen(SrcCurPos); 	lendst = strlen(dst); 	dst = (char *)realloc(dst, (lendst + lenSrcCurPos + 1)*sizeof(char)); 	strcat(dst, SrcCurPos);  	FindedPos = NULL; 	SrcCurPos = NULL; 	return dst;  }   int main(int argc, char *argv[]){  	char *testsrc = "asd234mn3;4j;bef2344jr23455"; 	char *findword = "23"; 	char *replaceword ="|*-"; 	char *resultdst = strrpl(testsrc,findword,replaceword); 	printf("%s\n",resultdst); 	return 0; }

user: user-0
content: 谢谢各位, 是 字符串长度 + 1就OK

user: user-2
content: 字符串长度 + 1 试试！！

user: user-3
content: 你好像开辟空间的时候都没有给最后的 '\0' 留地方啊。 把所有的 malloc realloc calloc 啥的开辟的长度都加个 1 吧
user-0 提问: 读取输入行里的第一个单词到数组，丢掉该行的其他字符，下列程序有什么错误？为什么每次运行输入稍长的字符串时，都会在单词后面加个奇怪的字符？

回复:
user: user-1
content: ct 自增在a[ct]赋值之后，即a[ct]总是为未赋值状态，添加'\0'的时候直接赋给a[ct]即可
user-0 提问: c语言结构体地址的问题

回复:
user: user-1
content: //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-2
content: 可以得出结论： abc.a == 0x0028FF68 abc.b == 0x00401CBE

user: user-3
content: abc abc.a 都不是地址，不能用 %p 输出。

user: user-4
content: 为什么啊，求解释！

user: user-5
content: 懂了就好，自己搞懂忘不了

user: user-6
content: 恭喜恭喜

user: user-0
content: 我已经懂了！
user-0 提问: 深夜求教一个算法问题，求大神们来看看

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <vector> #include <algorithm> using namespace std; int i; int L; void main(int argc,char **argv) {     if (argc<2) {         printf("%s 要排列的字符串\n",argv[0]);         return;     }     L=strlen(argv[1]);     vector<char> P(L);     vector<char>::iterator b,e,it;     b=P.begin();     e=P.end();     for (i=0;i<L;i++) P[i]=argv[1][i];     sort(b,e);     i=0;     do {         printf("%10d: ",++i);         for(it=b;it!=e;it++) printf("%c",*it);         printf("\n");     } while (next_permutation(b,e));     printf("The total: %d",i); }  #include <stdio.h> #include <stdlib.h> void print(int res[], int num) {     static int L=0;     L++;     printf("%8d:",L);     for (int i=0;i<num;++i) {         printf(" %d", res[i]);     }     printf("\n"); } void split(int n, int m) {// n表示总数，m表示最大因子     static int res[100];// 保存结果     static int num=-1;// 当前因子下标      if (n<m || n<0 || m<1) return;     num++;     if (0==n) {// 递归终止条件，为0不可再分，直接输出         print(res,num+1);         num--;         return;     } else {         if (n==m) {// 不拆，直接输出             res[num]=m;             print(res,num+1);             num--;         } else {             // 拆分出第一个             res[num]=m;             n=n-m;              if (m>n) m = n; // 最大因子不可能大于总数              for (int i=m;i>=1;--i) {// 循环，第二个因子可以继续拆分，而且按照最大因子不同可以拆分成多个                 split(n,i);             }             num--;         }     } } void Split(int n) {     if (n<=0) return;     if (100<n) {         printf("Up to 100\n");         return;     }     for (int i=n;i>=1;--i) {         split(n, i);     } } void main(int argc,char **argv) {          if (argc<=1) Split(5);     else if (argc>=3) split(atoi(argv[1]),atoi(argv[2]));     else              Split(atoi(argv[1])); }

user: user-2
content: 穷举法. 1. 网上搜一个排列的函数 2. 写一个检测排列中有没有冲突的函数 3. 对于分2个集合,就有<1,11>, <2,10>, <3,9>,  <4,8>, <5,7>, <6,6> 六大种分种, 每一种分别是C(12, 1) = 12, C(12, 2) = 66, ... C(12, 6) = 924种, 对每一种, 都检测一下有没有冲突, 然后统计之.

user: user-3
content: 用一个表表示能不能共存 这个似乎是图算法
user-0 提问: K阶斐波那契数列，为什么我编的运行不了？

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

user: user-2
content: void initqueue(SeQueue *q,int size) { 	//q=(SeQueue*)malloc(sizeof(SeQueue)); 	q->front=q->rear=0; 	q->size=size+1; }

user: user-3
content: 楼主，自己先插断点跟踪一下，看看是哪出的问题
user-0 提问: C 问题分析!求大家分析过程...高分

回复:
user: user-1
content: 整型的每一种都有无符号（unsigned）和有符号（signed）两种类型， （基本数据类型其实只有整型和浮点型  char  int  long  都是整型） 无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的正整数数据。 由于在计算机中,整数是以补码形式存放的。根据最高位的不同，如果是1,有符号数的话就是负数；如果是无符号数,则都解释为正数。 所以声明为unsigned 的数据类型 编译器最后处理的时候 都表示正数。 所以最高位1的时候不做符号处理 而是做数值处理。 for(i = 2 ; i >= 0 ; i--) {  }  i 的值永远是0到2^sizeof（long）   i >= 0永远满足。 for会一直循环下去，或者崩溃

user: user-2
content: 学习了！

user: user-3
content: 效果不错

user: user-4
content: 就是死循环呗，因为 unsigned 类型无法表示负值，向下越界了之后会循环回去变成很大的正值。

user: user-5
content: unsigned long i; 无论你怎么加还是减都不会小于零啊

user: user-6
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-7
content: 目测是作业题

user: user-8
content: 学习了

user: user-9
content: 我最大的问题是这题值100份？

user: user-10
content: while（1） ｛  ｝

user: user-11
content: 程序没错，只是是个死循环，或许不是程序员的本意。。当i=0时，i--后，i将变成long能取到的最大整数（正数），而不是-1，所以循环一直会继续

user: user-12
content: i是无符号长整型，for循环的判断语句永远都满足，永远处于循环中。

user: user-13
content: i是无符号long，没有负数，当i=0之后执行i--得到的值将是一个极大值也就是说这个程序将要陷入死循环

user: user-14
content: 对于 unsigned long i 来说， i >= 0 永远是 true
user-0 提问: 怎么去掉注册表的父项继承的权限呢？附上代码

回复:
user: user-1
content: 我的这里真没用。。不知道你那里是如何显示的！！！

user: user-0
content: 引用 3 楼 shen_wei 的回复:MACHINE\\SYSTEM\\CurrentControlSet\\Control\\TabletPC  按照楼主的描述。。我的注册表里面是空的。。不知道你要修改成什么的项？？ 只是是  win7 以后的 桌面用户系统 都有此注册表项啊     因为从vista之后  应该都支持平板了把

user: user-2
content: 用 Process Monitor 实时监视文件系统、注册表、进程、线程和 DLL 活动。 http://www.microsoft.com/china/technet/sysinternals/utilities/processmonitor.mspx 或 WinAPIOverridehttp://jacquelin.potier.free.fr/winapioverride32/ 监视Explorer的行为。

user: user-0
content: 都看不到我发的帖子？。

user: user-1
content: MACHINE\\SYSTEM\\CurrentControlSet\\Control\\TabletPC  按照楼主的描述。。我的注册表里面是空的。。不知道你要修改成什么的项？？
user-0 提问: 窗口中标签页和能点击的文字的标识是什么，不是button

回复:
user: user-0
content: 这个标签页的元素获取不到阿，还有就是如果我这边程序用了多线程，我在判断环节可以用多进程么？？？

user: user-0
content: 引用 2 楼 lm_whales 的回复:自己的程序中，你可以在消息循环中处理，也可以在窗口的PreTranslateMessage中处理 你是用钩子嘛？钩子的话，钩住消息或者钩住鼠标就可以了 不是钩子，我是想找到所有能点击的元素，然后发一个点击的消息，但是只能获取按钮的，标签页不能获取。

user: user-0
content: 引用 1 楼 hnwyllmm 的回复:楼主你用的啥写的界面？MFC吗？找个MFC的版块问下吧 所有能点击的控件，就是能够接受点击事件或者重载了点击事件的控件了 好吧我去看看

user: user-1
content: 自己的程序中，你可以在消息循环中处理，也可以在窗口的PreTranslateMessage中处理 你是用钩子嘛？钩子的话，钩住消息或者钩住鼠标就可以了

user: user-2
content: 楼主你用的啥写的界面？MFC吗？找个MFC的版块问下吧 所有能点击的控件，就是能够接受点击事件或者重载了点击事件的控件了
user-0 提问: UVA455 水题,然而我总是WA,实在是检查不出来了,各位帮忙看看吧

回复:
user: user-1
content: 我的也不行，

user: user-1
content: #include <iostream> #include <cstring> using namespace std;  int strcmpx(char *str1,int k){ 	int len1=strlen(str1); 	int i; 	for(i=0;i<len1-k;i++){ 			if(str1[i]!=str1[i+k]) 			    return 0;  		} 	return 1; }  int main(int argc, char** argv) { 	int i,n,k=1; 	int len; 	cin>>n; 	char a[n][200]={0}; //	for(i=0;i<n;i++){ //		cin>>a[i]; //	} 	for(i=0;i<n;i++){ 		cin>>a[i]; 		len=strlen(a[i]); 		for(k=1;k<len/2;k++){ 			if(a[i][0] == a[i][k] && (len % k) == 0) 				if (strcmpx(a[i], k) ==1) 	break;	 		} 		if(strcmpx(a[i], k)) 			printf("%d\n",k); 		else 		    printf("%d\n",len); 		if(i!=n-1) 		    cout<<endl; 	} 	return 0; }

user: user-0
content: 谢谢！！！ LZ本来以为还是格式问题，找了好久 谢谢谢谢

user: user-2
content: LZ程序 对于如下输入不能输出正确结果: aba abca abcda abcdea
user-0 提问: 数组和指针之间有什么关系？

回复:
user: user-1
content: 指针： 一个地址 数组： 连续存储的 n 个相同类型的元素  在绝大多数情况下，当一个数组类型的变量被使用的时候，会被自动的转换为一个指向数组第一元素的指针。 少数数组变量不会转换的情况包括数组变量出现在 sizeof 运算符后时，等。  数组不能作为函数的参数传递。函数参数位置的数组形式的参数声明，实际上是声明了一个指针。在函数参数位置上，数组形式的声明与指针声明是等价的。

user: user-2
content: 指针可以说是C语言中最核心的东西了，弄懂指针（以及数组）一定能困扰很多人吧。作为过来人，我已经忘记当初是怎么学会指针的，因为那时候先学的C++，之后自己有兴趣再看的C，期间看了汇编，操作系统，以及少量编译知识，综合起来理解指针和数组还是不难的。这个话题要讲清楚，我想至少可以写一本小书了。网上找点资料吧，有一本书叫《The C Puzzle Book》，里面列出了很多编程中容易出错的地方，包括语法，操作符，数组，指针。书很小巧，电子书大约2天就能看完，前半部分全是题目，后半部分全是答案，里面的题目全部做对可以称得上是C语言运用高手了。另外其他的书像《C和指针》和《C专家编程》，我自己没看过，不过豆瓣评价都很高。希望对你有所帮助。
user-0 提问: ctrl+c 会导致孤儿进程死了？

回复:
user: user-1
content: 不对啊，    centos7里，   ./test.sh   执行后，   ps  -ef | grep test  搜索不到任何东西，说明 ./test.sh已经 结束了。  我对脚本已经彻底无语了。  顺便指出 centos7里，  ps -fe|grep hello.sh也是搜索不到的。 能搜索到的只有./hello

user: user-1
content: 引用 8楼www_adintr_com 的回复:你确定你没看错？  hello.sh    : ./hello  这个脚本是会等待 ./hello 退出后它才退出的，父进程怎么可能会是 test.sh++ 会等到hello退出，这种前台调用方式是堵塞的

user: user-2
content: 你确定你没看错？  hello.sh    : ./hello  这个脚本是会等待 ./hello 退出后它才退出的，父进程怎么可能会是 test.sh

user: user-3
content: 问题2：   test.sh    #!/bin/bash  ./hello.sh  while ((1))  do      echo "xxx"  done    exit 0     hello.sh    :  ./hello    hello.c:  int main()  {      while(1)        sleep(3);      return 0;  }    你们实验一下， 惊奇地发现，  hello这个进程 父进程变成了test.sh， 其父进程似乎被修改过了。   /////////////////////////////////////// 请问这个问题如何解答？  父进程似乎不存在过继的概念啊？

user: user-2
content: nohup 是忽略 SIGHUP 信号, Ctrl + C 发送的是 SIGINT 信号吧

user: user-0
content: 引用 4 楼 adlay 的回复:[quote=引用 3 楼 caddor9100 的回复:] [quote=引用 2 楼 adlay 的回复:] 他们还是属于同一个进程组的吧  1.  除了代码外，用什么法子可以看出 是否属于同一个进程组，  2. 属于谁和谁属于同一个进程组，还有属于同一个进程组怎么了？  感谢你的参与[/quote]  1. 用 ps -o pgid,pid  命令，输出的 PGID 列就是进程组 ID 2. Ctrl + C 会发送给 shell 的前台进程组. [/quote]  你好，  你注意看主楼里的 nohup 进程 &

user: user-2
content: 引用 3 楼 caddor9100 的回复:[quote=引用 2 楼 adlay 的回复:] 他们还是属于同一个进程组的吧  1.  除了代码外，用什么法子可以看出 是否属于同一个进程组，  2. 属于谁和谁属于同一个进程组，还有属于同一个进程组怎么了？  感谢你的参与[/quote]  1. 用 ps -o pgid,pid  命令，输出的 PGID 列就是进程组 ID 2. Ctrl + C 会发送给 shell 的前台进程组.

user: user-0
content: 引用 2 楼 adlay 的回复:他们还是属于同一个进程组的吧  1.  除了代码外，用什么法子可以看出 是否属于同一个进程组，  2. 属于谁和谁属于同一个进程组，还有属于同一个进程组怎么了？  感谢你的参与

user: user-2
content: 他们还是属于同一个进程组的吧

user: user-0
content: 问题2：   test.sh    #!/bin/bash ./hello.sh while ((1)) do     echo "xxx" done  exit 0   hello.sh    :  ./hello  hello.c:  int main() {     while(1)       sleep(3);     return 0; }   你们实验一下， 惊奇地发现，  hello这个进程 父进程变成了test.sh， 其父进程似乎被修改过了。
user-0 提问: c语言语法问题，求教啊~ 谁能教我一下？谢谢

回复:
user: user-1
content: 引用 3 楼 u013790834 的回复:代码意思是开辟一个结构体指针，指向数组，但是却没有开辟空间，这么用是错误的，需要在使用数组之前把数组的大小确定，再使用，使用完毕还要进行内存释放。  我感觉是2楼，3楼的对 ，    这么用指针， 指针肯定指向的一个数组的首地址啊，  不然指向一个变量，这么 操作肯定有问题

user: user-2
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价

user: user-0
content: 引用 3 楼 u013790834 的回复:代码意思是开辟一个结构体指针，指向数组，但是却没有开辟空间，这么用是错误的，需要在使用数组之前把数组的大小确定，再使用，使用完毕还要进行内存释放。你说的不对

user: user-0
content: 引用 2 楼 fefe82 的回复:for 之前应该有一句 streams_pool = malloc(sizeof(struct tcp_stream) * max_stream); 才对。为什么要这样用呢？

user: user-0
content: 3楼净乱说

user: user-3
content: 引用 5 楼 realmardrid 的回复:引用 2 楼 fefe82 的回复:for 之前应该有一句 streams_pool = malloc(sizeof(struct tcp_stream) * max_stream); 才对。为什么要这样用呢？  你的指针要指向一块已分配的空间之后你才可以用啊 ...

user: user-4
content: 代码意思是开辟一个结构体指针，指向数组，但是却没有开辟空间，这么用是错误的，需要在使用数组之前把数组的大小确定，再使用，使用完毕还要进行内存释放。

user: user-3
content: for 之前应该有一句 streams_pool = malloc(sizeof(struct tcp_stream) * max_stream); 才对。

user: user-0
content: 求教......
user-0 提问: float存在的意义是什么

回复:
user: user-1
content: 比如MFC下CString类的Format也是这么做。。

user: user-2
content: 因为printf自动把float提升为double，所以float无意义。 这是什么逻辑？

user: user-3
content: C语言支持不定参数, 经过这条函数, float会提升到double. 然后就认为float没意义? 有了double, float没意义? 那是不是有了long long, 那long, int, short,... 都没意义了. 民用级别显卡double处理速度远低于float处理速度, 就一个语言特性而已, 记住就行, 不要扯意义什么的.

user: user-4
content: 引用 7 楼 dgwreghwr 的回复:[quote=引用 4 楼 lm_whales 的回复:] ｆloat 小，计算也快 以前的做法是　除了存储外 所有参数传递，乃至数学运算，都是按照提升后的数据类型进行的。 如今，标准里，可以不提升了。 但是printf 这一类　变长参数函数，还是提升后再传入函数的 多谢，那为什么printf这一类函数要这么做？除了printf还有哪些函数也是这么做的？[/quote]  可变参数的 ... 部分都会这么做。

user: user-1
content: 现在double是用%lf了 float占用内存比double少一半啊，试想一个很大的数组或矩阵，不需要很高的精度，用double存就会比float浪费出很多空间 这也好比int与short的关系

user: user-5
content: printf 是后来人为了输出写的一个函数，只是被做到标准里面去了， 如果它为了方便讲double 都变成float输出的话 ，你觉得double还有意义么？

user: user-0
content: 引用 4 楼 lm_whales 的回复:ｆloat 小，计算也快 以前的做法是　除了存储外 所有参数传递，乃至数学运算，都是按照提升后的数据类型进行的。 如今，标准里，可以不提升了。 但是printf 这一类　变长参数函数，还是提升后再传入函数的 多谢，那为什么printf这一类函数要这么做？除了printf还有哪些函数也是这么做的？

user: user-6
content: 注意open GL 许多数据类型内部，都是用的　float ,不是　double

user: user-6
content: ｆloat 小，计算也快 以前的做法是　除了存储外 所有参数传递，乃至数学运算，都是按照提升后的数据类型进行的。 如今，标准里，可以不提升了。 但是printf 这一类　变长参数函数，还是提升后再传入函数的

user: user-7
content: 意义就是它小了, 一般也用不了小数点后几位, 没必要double, 寸有所长吧

user: user-4
content: 比如 float 的大小只有 double 的一半
user-0 提问: Linux 信号题 新手求解

回复:
user: user-1
content: void PushBackTable（int sig）是这个,上面写错了

user: user-1
content: void PushBackTabke() {        ...    //这里插入表的函数        alarm(30*60*60); }   int main() {   signal(SIGALARM, PushBackTable);    alarm(0);    while(1); }  当然你可可以使用settimer来做，那个我就不多写了

user: user-0
content: 引用 3 楼 bsnry的回复:明显定时器啊 给个代码可以嘛。不是很了解定时器

user: user-0
content: 引用 2 楼 羽飞的回复:为毛要用信号，定时器不行吗？ 能给个简单的代码嘛。定时器不是很了解

user: user-2
content: 明显定时器啊

user: user-3
content: 为毛要用信号，定时器不行吗？

user: user-4
content: http://blog.sina.com.cn/s/blog_6a1837e90100uhl3.html
user-0 提问: c 操作SQL(orcale数据库)

回复:
user: user-1
content: 选择A表所有的列 插入B表 这个主要是ＳＱＬ语言，本质上和Ｃ没有关系 如果有需要合并的项，可能需要一些计算 那就先生成一个视图 把需要合并的找出来 合并的按照需要合并 其他直接插入
user-0 提问: 为什么使用strcat之后出现堆已损坏错误

回复:
user: user-1
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-2
content: 楼主，你有没有考虑'\0'  pContent = (char *)realloc(pContent, strlen(pContent) + strlen(pStr) + 1);
user-0 提问: 父进程向0号进程随便发送一个信号，比如SIGUSR1，怎么该进程的子进程也收到了？？？

回复:
user: user-0
content: 好的!谢谢！

user: user-1
content: If process number 0 is specified, all processes in the current process group shall be signaled. 0是一个特殊的参数，楼主看下手册
user-0 提问: c语言编译器第三方库问题

回复:
user: user-1
content: 将错误信息中出现的标识符放在百度里面搜一下，看其在哪个.lib中，然后在本地硬盘上搜索该.lib,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加依赖库所在目录”中，将其名字添加到“附加依赖库”中，重新连接。 VC6： 工程、设置、C/C++、分类：Preprocessor、附加包含路径：填写附加头文件所在目录 逗号间隔多项 工程、设置、Link、分类：Input、附加库路径：填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类：Input、对象/库模块：填写附加依赖库的名字.lib 空格间隔多项 VS20xx： 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-2
content: 引用 2 楼 user-3 的回复:我初步解决了上述问题。在我说的那些步骤之后，再在cfree的工程-设置中，找到连接，将几个lib库的名字填写进去，就可以链接通过了。注意两点，1，在构建-构建选项里，有一个一模一样的菜单界面，也有连接，但是在那里设置就不行。2，填写库的名字，不可以带路径，也不可以有后缀，直接填名字才行。  经过上述几步，我链接虽然通过了，可是运行时有问题（不是源代码的问题）。程序会直接结束，直接输出“按任意键继续”，什么也不显示，也不报错。 产生这种情况的必要条件是源代码中有引用xml的库函数。没有引用xml库函数则不会有上述错误。一旦有引用，即便引用的函数根本就没有被main函数调用，也会出现上述问题。  这又是哪里出了问题？怎么会有根本就没被调用的函数也会导致程序运行出错的问题，而且是连main函数第一句都不会执行。 全局变量在main函数之前就初始化，看看哪个全局变数执行初始化时会出错

user: user-3
content: 我初步解决了上述问题。在我说的那些步骤之后，再在cfree的工程-设置中，找到连接，将几个lib库的名字填写进去，就可以链接通过了。注意两点，1，在构建-构建选项里，有一个一模一样的菜单界面，也有连接，但是在那里设置就不行。2，填写库的名字，不可以带路径，也不可以有后缀，直接填名字才行。  经过上述几步，我链接虽然通过了，可是运行时有问题（不是源代码的问题）。程序会直接结束，直接输出“按任意键继续”，什么也不显示，也不报错。 产生这种情况的必要条件是源代码中有引用xml的库函数。没有引用xml库函数则不会有上述错误。一旦有引用，即便引用的函数根本就没有被main函数调用，也会出现上述问题。  这又是哪里出了问题？怎么会有根本就没被调用的函数也会导致程序运行出错的问题，而且是连main函数第一句都不会执行。
user-0 提问: 关于socket的基本接收问题，求教，哪里不对

回复:
user: user-1
content: 建议查MSDN,对照着规范代码学习 先要WSAStartup才能进行其它相关处理

user: user-2
content: socket服务都没有开启，怎么怎么能进行socket服务呢

user: user-3
content: 1楼说的对，因为http://blog.csdn.net/stpeace/article/details/13279349

user: user-4
content: sre = socket(AF_INET, SOCK_DGRAM, 0);  这句需要放到   WSAStartup(ver, &WSAData);  之后才行
user-0 提问: C语言不知道那里错了，求解

回复:
user: user-1
content: 引用 3 楼 NiuloveZhu 的回复:引用一下别人的说法: 加\n是过滤空格、制表符、回车等输入，也就是说 scanf("%d\n", &i); printf("%d\n", i); 你输入一个数后，它是不会立即显示的，要等再接收到一个非（空格、制表符、回车）的输入scanf语句才结束。 然后下一个scanf继续读到这个非空字符，然后把此字符放回队列，不作任何事情，执行下一句

user: user-2
content: 顶起顶起，混人气，

user: user-3
content: 引用一下别人的说法: 加\n是过滤空格、制表符、回车等输入，也就是说 scanf("%d\n", &i); printf("%d\n", i); 你输入一个数后，它是不会立即显示的，要等再接收到一个非（空格、制表符、回车）的输入scanf语句才结束。

user: user-4
content: 引用 1 楼 NiuloveZhu 的回复:把两个scanf里面的"\n"，去掉就可以了  我在VS上试了下，去掉两个scanf里面的"\n"就可以。 请教下，为啥加上“\n"就不行？？

user: user-3
content: 把两个scanf里面的"\n"，去掉就可以了
user-0 提问: 求这题的输出结果，笔试题

回复:
user: user-1
content: 如果是笔试, 我想出题人要么是不懂,要么是找了个编译器发现在i=0 可能在acNew之后,总之就是无聊

user: user-2
content: 楼上解答的很好 楼主也可以参考下面这两个帖子的问题 http://bbs.csdn.net/topics/390911090 http://bbs.csdn.net/topics/390934607

user: user-3
content: 输出的值是一个随机的数字，这个数字取决于何时遇到'\0'。因为acNew没有初始化，里头是脏数据；而acNew[i]='0';并不是acNew[i]='\0';strlen是遇到'\0'结束 strlen所作的仅仅是一个计数器的工作，它从内存的某个位置（可以是字符串开头，中间某个位置，甚至是某个不确定的内存区域）开始扫描，直到碰到第一个字符串结束符'\0'为止，然后返回计数器值(长度不包含“\0”)。
user-0 提问: gcc -l选项必须放在文件名后面吗？关于apue中libapue的问题

回复:
user: user-0
content: 引用 3 楼 mymtom 的回复:对于静态库的链接，有顺序要求的，被调用的函数所在的库必须在调用函数所在的模块或库的后面  http://blog.csdn.net/mymtom/article/details/1674184 看来的确是这样的，不知道有没有官方说明。 PS，看兄台的头像也是war3爱好者啊，有空切磋切磋。 +q 20789379

user: user-0
content: 引用 5 楼 zxqatqd 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 我以前遇到过很多次当文件名以数字开头时，被命令行程序解析为option而非filename的意外情况。 试试将文件名用半角双引号括住或将文件名作为第一个参数。 我是了一下，吧文件名加上引号也不起作用，只能是把文件名作为第一个参数[/quote] 两个错别字，"是“ 应为 "试‘, "吧” 应为 "把“

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:我以前遇到过很多次当文件名以数字开头时，被命令行程序解析为option而非filename的意外情况。 试试将文件名用半角双引号括住或将文件名作为第一个参数。 我是了一下，吧文件名加上引号也不起作用，只能是把文件名作为第一个参数

user: user-1
content: -L 目录 -I  目录  L = lib I = include

user: user-2
content: 对于静态库的链接，有顺序要求的，被调用的函数所在的库必须在调用函数所在的模块或库的后面  http://blog.csdn.net/mymtom/article/details/1674184

user: user-3
content: 我以前遇到过很多次当文件名以数字开头时，被命令行程序解析为option而非filename的意外情况。 试试将文件名用半角双引号括住或将文件名作为第一个参数。

user: user-4
content: 源文件在最前面就行了，其他顺序无所谓
user-0 提问: 关于strtok的问题

回复:
user: user-0
content: 明白了，谢谢

user: user-1
content: char *string 与char string[] 的区别 当对这两者字符串处理时，前者字符串本身并不会变，变的只是指针，只有后者才可以改变字符串内容 而strtok()函数会改变原字符串， 所以用前者错误，后者正确

user: user-2
content: 指针也可以的，但是你要给它动态分配内存。
user-0 提问: 求大神指教卡尔曼滤波算法C 程序中的"rinv.c"函数在哪里

回复:
user: user-1
content: 这是一本书的实例代码修改而来的程序，rinv.c文件其实是同一本书矩阵求逆函数rinv(double*, int)的代码文件……

user: user-2
content: 兄弟搞定没 能不能教教我

user: user-3
content: https://www.baidu.com/s?wd=%22rinv.c%22&rsv_spt=1&rsv_iqid=0xb7827f4200036a81&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_sug3=8&rsv_sug1=4&inputT=8148&rsv_sug4=8148
user-0 提问: 实参为uint，形参为指针。调用函数问题~~~

回复:
user: user-0
content: 谢谢，我明白了。

user: user-1
content: 引用 2 楼 afdlig 的回复:这是发送一组数据进行交互信息，第一个字符数据为\0后面的数据就不会读取了吗？  字符串以\0结尾

user: user-2
content: 那你定义一个uchar*变量把字符串填进去呢？

user: user-1
content: 引用 6 楼 niino 的回复:[quote=引用 4 楼 q3733353520 的回复:] [quote=引用 2 楼 afdlig 的回复:] 这是发送一组数据进行交互信息，第一个字符数据为\0后面的数据就不会读取了吗？  字符串以\0结尾[/quote] 你理解错了，这里并不是对字符串的处理，这是数据[/quote] 数据？编译器不认识，它只知道这是个常量字符串

user: user-3
content: 引用 4 楼 q3733353520 的回复:[quote=引用 2 楼 afdlig 的回复:] 这是发送一组数据进行交互信息，第一个字符数据为\0后面的数据就不会读取了吗？  字符串以\0结尾[/quote] 你理解错了，这里并不是对字符串的处理，这是数据

user: user-3
content: 这个是编译的时候报的错？不是吧，感觉你是想查找某个symbol呢？代码没有什么问题

user: user-1
content: 你那个字符串的开头第一个字符就是\0

user: user-0
content: 引用 1 楼 q3733353520 的回复:你那个字符串的开头第一个字符就是\0 这是发送一组数据进行交互信息，第一个字符数据为\0后面的数据就不会读取了吗？

user: user-0
content: 这是发送一组数据进行交互信息，第一个字符数据为\0后面的数据就不会读取了吗？
user-0 提问: 一个无意间发现的关于指针的问题？

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-2
content: %d用于整型，实型用%f或%e

user: user-3
content: %d代表的是int类型，而你的参数是一个double类型，数据在内存里面都是0101的二进制，数据类型决定你取数的长度和方式

user: user-4
content: 打印double类型，用%e而不是%d。

user: user-5
content: printf里面都%d了，能正常吗