Question: static

引用 4 楼 Stacey的专栏的回复:所以如果变量b在一个子函数里,b会比子函数里的其他普通变量更早的就存在了,在编译时就存在了,对吗? 对，这一点和全局变量一样

编译时就确定了，之后函数中每次运行不会为b赋值2

静态变量是在程序运行时就存在了，而不是函数启动时

编译时就确定了值 执行前、程序装入内存时，变量的值也存入了


Question: 小白求助...关于C语言socket传输失败的问题

好了，解决了...原来是lon不小心设成char型了....

刚刚发现小文件（一次可以传输完的）都没问题，但是大文件（需循环传输）客户端好像不能接收... 请问这是为什么呢?

但是服务器每传输一个文件就开一个新的socket来等待客户端开始,每传一个文件结束后都用shutdown()来等待传输结束然后令客户端结束recv()，好像这样子强制同步不存在数据包分割的问题啊.....

不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

检查过被写入文件的内容，内容是正确的，并没有发现有粘包的问题... 同一台机器内传输，阻塞TCP，应该也不存在丢包的问题... Orz

刚刚发现代码中fwrite()少写了一个‘f’，改过来后errno全部正常（为0），也有文件写入了。 但是写入的文件数少于应传的文件数。。。都是在本地进行传输（127.0.0.1），怎么会这样呢？

send()的返回值一直是大于0的，然后我在客户端调用了errno有一些值显示是9.... 这是怎么回事...

看看send返回值是啥


Question: 关于float能否表示数 的问题

比如用十进制无法精确表示1/3，但用三进制0.1就可以。

引用 23 楼 zhao4zhong1 的回复:[quote=引用 22 楼 Sanlence 的回复:] [quote=引用 21 楼 zhao4zhong1 的回复:] [quote=引用 20 楼 Sanlence 的回复:] 1楼正解，关于这个问题，建议你看书《深入理解计算机系统》第二章，里面有详细的解释。float只是近似值。 十进制数也是近似值好不啦。[/quote] 你说的十进制是指int还是float啊？int全都是精确的，float才有精度这一说。[/quote] 我说的十进制跟电脑无关。[/quote] 十进制只跟字长有关，字长只是表示数的范围有关，跟精度无关。在数学上，从没听说十进制有精度一说

既然任意进制之间可以互相转换，那么一种进制有精度问题必然其他进制也有精度问题，比如单精度浮点数小数点后23位尾数（二进制），十进制精度就是小数点后6~7位。

引用 22 楼 Sanlence 的回复:[quote=引用 21 楼 zhao4zhong1 的回复:] [quote=引用 20 楼 Sanlence 的回复:] 1楼正解，关于这个问题，建议你看书《深入理解计算机系统》第二章，里面有详细的解释。float只是近似值。 十进制数也是近似值好不啦。[/quote] 你说的十进制是指int还是float啊？int全都是精确的，float才有精度这一说。[/quote] 我说的十进制跟电脑无关。

引用 21 楼 zhao4zhong1 的回复:[quote=引用 20 楼 Sanlence 的回复:] 1楼正解，关于这个问题，建议你看书《深入理解计算机系统》第二章，里面有详细的解释。float只是近似值。 十进制数也是近似值好不啦。[/quote] 你说的十进制是指int还是float啊？int全都是精确的，float才有精度这一说。

引用 20 楼 Sanlence 的回复:1楼正解，关于这个问题，建议你看书《深入理解计算机系统》第二章，里面有详细的解释。float只是近似值。 十进制数也是近似值好不啦。

关于十进制数能否表示所有数的问题……

引用 9 楼 DelphiGuy 的回复:[quote=引用 6 楼 lm_whales 的回复:]   请问什么叫“数据在2^-127～2^（127+23） 只能表示23个数，也就是23 个位 只有一个位为1 的23个数。”？ 尾数23位中，二进制值为 100000000.。。。。 010000000。。。。 001000000。。。。 这一系列浮点数（隐藏位为0，指数 是-127 ）。是除了0之外，绝对值最小的浮点数23个浮点数了，称为非规格化浮点数 哦，加上正负号，共有46 个

引用 6 楼 lm_whales 的回复:凡是可以表示成± （Σａ[i]*2^i+Σa[j]*2^-j)  其中，a[i[,a[j] 为0或者1 并且 max(i)+max(j) <126的, i,j<=126的，大约都没问题 数据在2^-127～2^（127+23） 只能表示23个数，也就是23 个位 只有一个位为1 的23个数。 最大数，大概是2^128-1  大约是这样，没太仔细计算 实际上会不会这样，要去验证，可能未必都是这样的  请问什么叫“数据在2^-127～2^（127+23） 只能表示23个数，也就是23 个位 只有一个位为1 的23个数。”？

根据IEEE 754标准,浮点数在计算机内部存储时主要分为符号位（sign）、指数（exponent）部分、尾数（fraction）部分 http://blog.csdn.net/lzyzk/article/details/49949061

计算机能精确表示的小数只有那么几个

引用 14 楼 lm_whales 的回复:我只是说个大概，怎么就乱说了 这是IEEE浮点数的规范 我只是没有搬原文而已  难道IEEE浮点数的规范 非规格化数只有46个？

引用 14 楼 lm_whales 的回复:我只是说个大概，怎么就乱说了 这是IEEE浮点数的规范 我只是没有搬原文而已  说错了就是错了，不是大概，你对于非规格化数的解释完全是错的。

引用 3 楼 zhao4zhong1 的回复:浮点数格式 http://bbs.csdn.net/topics/390676437 理解和讨论之前请先学会如何观察！

我只是说个大概，怎么就乱说了 这是IEEE浮点数的规范 我只是没有搬原文而已

#11还在乱说，我建议您吧，最好自己先搞清楚再出来说，否则既误导别人，还加深了错误认知，浪费自己的时间，害人害己。

引用 10 楼 lm_whales 的回复:[quote=引用 9 楼 DelphiGuy 的回复:] [quote=引用 6 楼 lm_whales 的回复:]   请问什么叫“数据在2^-127～2^（127+23） 只能表示23个数，也就是23 个位 只有一个位为1 的23个数。”？ 尾数23位中，二进制值为 100000000.。。。。 010000000。。。。 001000000。。。。 这一系列浮点数（隐藏位为0，指数 是-127 ）。是除了0之外，绝对值最小的浮点数23个浮点数了，称为非规格化浮点数 哦，加上正负号，共有46 个  [/quote]  您能不能先把语文学好。难道您认为： “数据在2^-127～2^（127+23） 只能表示23个数，也就是23 个位 只有一个位为1 的23个数。” 和您上面解释的能是一个意思？  而且您上面的解释也不知所云，非规格化浮点数是指数为0（+-0），尾数不全为0的数（并非尾数中只有1位为1），对于单精度非规格化浮点，指数也不代表-127，而是-126，所以表达范围是+- 2^-126 * 0.nnnnn... 怎么可能只有23/46个呢？

浮点数 float 类型，有几个特例 0 有+0，-0 尾数指数全0 ，符号位 分别为0,1 有+inf正无穷，-inf负无穷, 尾数为0 ，符号 分别为0，1指数部分全1 nan 不是一个数 （指数全1的其他编码）  等特殊编码 抛开符号位 还有23个编码的尾数，每个数只有一个位为1，指数值 固定为-127 ， ------这里指的是指数编码部分表示的值为2^-127。不是指数的编码---------- 算上符号位 ，每种编码正负 各一对，是46 个 非规格化浮点数，他们的隐藏位固定为0。 除了。以上特殊编码。和非规格化浮点数外 其余都是规格化浮点数. 隐藏位为1 尾数为0~111 。。。 （23个位）。 尾数部分，可表示数为 1～(2^24-1)*2^-23 除了隐藏位固定为1外，23个尾数位,从0～全1 可表示  2^24-1 个数,范围是1～(2 - 2^-23) 算上指数部分，和符号位，就是所有可表示的规格化浮点数

lz研究下 二进制 十进制相互转换 就明白了


Question: 新手求解

先从基础慢慢来即可

还不如找个师傅来的合适

学习编程还是别加群，水军太多，自己看书看资料，不懂来逛论坛，请教前辈们，同新手小白一枚，一起努力

赞同三楼的说法， 工具太先进， 编程能力会下降！ 还是多写代码实在， 交流是虚的！ 除非讨论概念上的东西，还得自己动手练！

很多时候，使用的工具越先进，人越笨；得到得越轻松，人越懒。

学语言不是靠群的，需要静下心看书，有问题可以来论坛提问

对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。


Question: 新手求解

代码是对的，换个IDE吧。 http://blog.csdn.net/cometnet/article/details/19551125

代码没有问题

半角全角问题

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

补齐代码 In file included from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\ios:40:0,                  from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\ostream:38,                  from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\iostream:39,                  from C:\Users\Administrator\ClionProjects\sss\main.cpp:1: c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\bits\char_traits.h: In static member function 'static std::char_traits<wchar_t>::char_type* std::char_traits<wchar_t>::move(std::char_traits<wchar_t>::char_type*, const char_type*, std::size_t)': c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\bits\char_traits.h:373:33: error: 'wmemmove' was not declared in this scope   return wmemmove(__s1, __s2, __n);                                  ^ c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\bits\char_traits.h: In static member function 'static std::char_traits<wchar_t>::char_type* std::char_traits<wchar_t>::copy(std::char_traits<wchar_t>::char_type*, const char_type*, std::size_t)': c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\bits\char_traits.h:381:32: error: 'wmemcpy' was not declared in this scope   return wmemcpy(__s1, __s2, __n);                                 ^ c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\bits\char_traits.h: In static member function 'static std::char_traits<wchar_t>::char_type* std::char_traits<wchar_t>::assign(std::char_traits<wchar_t>::char_type*, std::size_t, std::char_traits<wchar_t>::char_type)': c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\bits\char_traits.h:389:30: error: 'wmemset' was not declared in this scope   return wmemset(__s, __a, __n);                               ^ mingw32-make.exe[3]: *** [CMakeFiles/sss.dir/main.cpp.obj] Error 1 CMakeFiles\sss.dir\build.make:62: recipe for target 'CMakeFiles/sss.dir/main.cpp.obj' failed CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/sss.dir/all' failed mingw32-make.exe[2]: *** [CMakeFiles/sss.dir/all] Error 2 mingw32-make.exe[1]: *** [CMakeFiles/sss.dir/rule] Error 2 CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/sss.dir/rule' failed Makefile:117: recipe for target 'sss' failed mingw32-make.exe: *** [sss] Error 2

补齐代码 c:\mingw\include\sys/stat.h:173:14: error: '_dev_t' does not name a type  struct _stat __struct_stat_defined( _off_t, time_t );               ^ c:\mingw\include\sys/stat.h:173:14: error: '_ino_t' does not name a type  struct _stat __struct_stat_defined( _off_t, time_t );               ^ c:\mingw\include\sys/stat.h:173:14: error: '_mode_t' does not name a type  struct _stat __struct_stat_defined( _off_t, time_t );               ^ c:\mingw\include\sys/stat.h:173:14: error: '_dev_t' does not name a type  struct _stat __struct_stat_defined( _off_t, time_t );               ^ c:\mingw\include\sys/stat.h:173:14: error: '_off_t' does not name a type  struct _stat __struct_stat_defined( _off_t, time_t );               ^ c:\mingw\include\sys/stat.h:173:14: error: 'time_t' does not name a type  struct _stat __struct_stat_defined( _off_t, time_t );               ^ c:\mingw\include\sys/stat.h:173:14: error: 'time_t' does not name a type  struct _stat __struct_stat_defined( _off_t, time_t );               ^ c:\mingw\include\sys/stat.h:173:14: error: 'time_t' does not name a type  struct _stat __struct_stat_defined( _off_t, time_t );               ^ c:\mingw\include\sys/stat.h:180:13: error: '_dev_t' does not name a type  struct stat __struct_stat_defined( _off_t, time_t );              ^ c:\mingw\include\sys/stat.h:180:13: error: '_ino_t' does not name a type  struct stat __struct_stat_defined( _off_t, time_t );              ^ c:\mingw\include\sys/stat.h:180:13: error: '_mode_t' does not name a type  struct stat __struct_stat_defined( _off_t, time_t );              ^ c:\mingw\include\sys/stat.h:180:13: error: '_dev_t' does not name a type  struct stat __struct_stat_defined( _off_t, time_t );              ^ c:\mingw\include\sys/stat.h:180:13: error: '_off_t' does not name a type  struct stat __struct_stat_defined( _off_t, time_t );              ^ c:\mingw\include\sys/stat.h:180:13: error: 'time_t' does not name a type  struct stat __struct_stat_defined( _off_t, time_t );              ^ c:\mingw\include\sys/stat.h:180:13: error: 'time_t' does not name a type  struct stat __struct_stat_defined( _off_t, time_t );              ^ c:\mingw\include\sys/stat.h:180:13: error: 'time_t' does not name a type  struct stat __struct_stat_defined( _off_t, time_t );              ^ c:\mingw\include\sys/stat.h:188:17: error: '_dev_t' does not name a type  struct _stati64 __struct_stat_defined( __off64_t, time_t );                  ^ c:\mingw\include\sys/stat.h:188:17: error: '_ino_t' does not name a type  struct _stati64 __struct_stat_defined( __off64_t, time_t );                  ^ c:\mingw\include\sys/stat.h:188:17: error: '_mode_t' does not name a type  struct _stati64 __struct_stat_defined( __off64_t, time_t );                  ^ c:\mingw\include\sys/stat.h:188:17: error: '_dev_t' does not name a type  struct _stati64 __struct_stat_defined( __off64_t, time_t );                  ^ c:\mingw\include\sys/stat.h:188:17: error: '__off64_t' does not name a type  struct _stati64 __struct_stat_defined( __off64_t, time_t );                  ^ c:\mingw\include\sys/stat.h:188:17: error: 'time_t' does not name a type  struct _stati64 __struct_stat_defined( __off64_t, time_t );                  ^ c:\mingw\include\sys/stat.h:188:17: error: 'time_t' does not name a type  struct _stati64 __struct_stat_defined( __off64_t, time_t );                  ^ c:\mingw\include\sys/stat.h:188:17: error: 'time_t' does not name a type  struct _stati64 __struct_stat_defined( __off64_t, time_t );                  ^ c:\mingw\include\sys/stat.h:195:17: error: '_dev_t' does not name a type  struct __stat64 __struct_stat_defined( __off64_t, __time64_t );                  ^ c:\mingw\include\sys/stat.h:195:17: error: '_ino_t' does not name a type  struct __stat64 __struct_stat_defined( __off64_t, __time64_t );                  ^ c:\mingw\include\sys/stat.h:195:17: error: '_mode_t' does not name a type  struct __stat64 __struct_stat_defined( __off64_t, __time64_t );                  ^ c:\mingw\include\sys/stat.h:195:17: error: '_dev_t' does not name a type  struct __stat64 __struct_stat_defined( __off64_t, __time64_t );                  ^ c:\mingw\include\sys/stat.h:195:17: error: '__off64_t' does not name a type  struct __stat64 __struct_stat_defined( __off64_t, __time64_t );                  ^ c:\mingw\include\sys/stat.h:195:17: error: '__time64_t' does not name a type  struct __stat64 __struct_stat_defined( __off64_t, __time64_t );                  ^ c:\mingw\include\sys/stat.h:195:17: error: '__time64_t' does not name a type  struct __stat64 __struct_stat_defined( __off64_t, __time64_t );                  ^ c:\mingw\include\sys/stat.h:195:17: error: '__time64_t' does not name a type  struct __stat64 __struct_stat_defined( __off64_t, __time64_t );                  ^ In file included from c:\mingw\include\wchar.h:233:0,                  from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\cwchar:44,                  from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\bits\postypes.h:40,                  from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\iosfwd:40,                  from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\ios:38,                  from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\ostream:38,                  from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\iostream:39,                  from C:\Users\Administrator\ClionProjects\sss\main.cpp:1: c:\mingw\include\io.h:335:21: error: 'time_t' does not name a type  struct _wfinddata_t __struct_finddata_t (time_t, _fsize_t);                      ^ c:\mingw\include\io.h:335:21: error: 'time_t' does not name a type  struct _wfinddata_t __struct_finddata_t (time_t, _fsize_t);                      ^ c:\mingw\include\io.h:335:21: error: 'time_t' does not name a type  struct _wfinddata_t __struct_finddata_t (time_t, _fsize_t);                      ^ c:\mingw\include\io.h:336:24: error: 'time_t' does not name a type  struct _wfinddatai64_t __struct_finddata_t (time_t, __int64);                         ^ c:\mingw\include\io.h:336:24: error: 'time_t' does not name a type  struct _wfinddatai64_t __struct_finddata_t (time_t, __int64);                         ^ c:\mingw\include\io.h:336:24: error: 'time_t' does not name a type  struct _wfinddatai64_t __struct_finddata_t (time_t, __int64);                         ^ c:\mingw\include\io.h:362:24: error: '__time64_t' does not name a type  struct __wfinddata64_t __struct_finddata_t (__time64_t, __int64);                         ^ c:\mingw\include\io.h:362:24: error: '__time64_t' does not name a type  struct __wfinddata64_t __struct_finddata_t (__time64_t, __int64);                         ^ c:\mingw\include\io.h:362:24: error: '__time64_t' does not name a type  struct __wfinddata64_t __struct_finddata_t (__time64_t, __int64);                         ^ In file included from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\bits\postypes.h:40:0,                  from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\iosfwd:40,                  from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\ios:38,                  from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\ostream:38,                  from c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\iostream:39,                  from C:\Users\Administrator\ClionProjects\sss\main.cpp:1: c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\cwchar:146:11: error: '::fwide' has not been declared    using ::fwide;            ^ c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\cwchar:153:11: error: '::mbsinit' has not been declared    using ::mbsinit;            ^ c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\cwchar:198:11: error: '::wmemcmp' has not been declared    using ::wmemcmp;            ^ c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\cwchar:199:11: error: '::wmemcpy' has not been declared    using ::wmemcpy;            ^ c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\cwchar:200:11: error: '::wmemmove' has not been declared    using ::wmemmove;            ^ c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\cwchar:201:11: error: '::wmemset' has not been declared    using ::wmemset;            ^ c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\cwchar:208:11: error: '::wmemchr' has not been declared    using ::wmemchr;            ^ c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\cwchar: In function 'wchar_t* std::wmemchr(wchar_t*, wchar_t, std::size_t)': c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\cwchar:229:61: error: invalid conversion from 'const wchar_t*' to 'wchar_t*' [-fpermissive]    { return wmemchr(const_cast<const wchar_t*>(__p), __c, __n); }                                                              ^ c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\cwchar:228:3: note:   initializing argument 1 of 'wchar_t* std::wmemchr(wchar_t*, wchar_t, std::size_t)'    wmemchr(wchar_t* __p, wchar_t __c, size_t __n)    ^


Question: 想自学编程，请问c语言怎么学

下载个虚拟机，我用的是ubuntu12.04 然后看谭浩强的C语言、、、不断编程，不断百度

引用 10 楼 zhao4zhong1 的回复:[quote=引用 9 楼 g62r83t27 的回复:] 软件：一台虚拟机，一个Linux操作系统，一本好书http://docs.linuxtone.org/ebooks/C&CPP/c/，一个百度 ＋每天默念zhao4zhong1语录若干遍。[/quote]  这个的确有用，本人亲测好使！

买一本C语言书，先用txt把代码抄写几遍

引用 9 楼 g62r83t27 的回复:软件：一台虚拟机，一个Linux操作系统，一本好书http://docs.linuxtone.org/ebooks/C&CPP/c/，一个百度 ＋每天默念zhao4zhong1语录若干遍。

想自学编程，请问c语言怎么学 --- 你不都说了吗，自学呀,,,

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

我用的dev c++

primer puls

你要是有编程的基础的话可以用VC6.0编写试试，书嘛一般就是C PULS

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

买本教材吧，以下任选一本都可以，能力好的买前面，能力中等的买谭浩强： C Primer Plus  C语言程序设计：现代方法：第2版(被誉为"近10年来最好的一部C语言著作") C和指针 或者谭浩强  编程软件可以用《C与C++程序设计学习与实验系统 2013.3》，比较方便。


Question: 中文输入

根据你的描述，你实现的程序是运行在DOS(16位)下的，并且支持处理汉字。 我们知道，BC(或TC，指Turboc 2.0)是不支持汉字的，所以使用BC(或TC)开发程序，要使程序 支持汉字，一般需要了解或学习或具备以下几个主要知识点： 1、该程序需要运行在图形模式下，可使用 graphics.h 或自己实现，程序需要支持鼠标（才方便操作）。 2、[可选]熟悉寄存器与伪变量。在BC或TC中的伪变量，就是对应的寄存器名称前面多加个下划线“_”(如寄存器“AH”的伪变量是“_AH”)，伪变量如汇编语言一样，可以直接操作(读或写)硬件。 3、了解BC或TC的内存模式，根据程序的规模，选择对应的内存模式。 4、[可选]熟悉扩展内存及其编程，汉字库（使用点阵字库，16点阵国标字库大概260KB）一般加载到扩展内存中。 5、熟悉BIOS与DOS调用，主要用于驱动鼠标(或显示卡）。鼠标信息需要从DOS调用来获取。 6、了解显示器的基本显示原理。如：屏幕坐标，各种图形模式的分辨率。汉字就是通过打点来显示到屏幕上的。 7、[可选]熟悉对显卡的编程，可直接向显存中读写数据，提高显示速度。 8、熟悉国标汉字(使用最基本的GB2312),包括汉字内码(区位码)的表示方式，内码和字库的关系(通过内码取得对应的点阵数据)。 9、程序中增加编写一个简单的输入模块（拼音单字输入就可以了，相当于建立拼音串和汉字内码的对应关系）。  备注： 如果程序数据量比较大，则以上第4点需要； 如果程序要求刷新较快，则以上第2,7点需要，这时就不需要BC中的头文件 graphics.h 了，完全可以自己实现。 以上知识点，在图书馆中关于C语言的高级编程书籍一般都找得到，这道题不是“小程序”了。

引用 2 楼 AUTO_jun 的回复:DOS下输入不了汉字，只能是输入英文打开中文输入法 ctrl+空格，或其他组合键

DOS下输入不了汉字，只能是输入英文

dos下直接输入就行呗

Win-TC里面自带CCDOS

TW天汇汉字系统


Question: 问一下if if和if else if的区别

啊啊啊啊啊 知道鸟 谢谢

后面带else的是找只符合一个条件的

第一种代码：判断count[i*j]为0，随即赋值为1；判断它为1（一定为1），再赋值为0，又回去啦


Question: C语言新手求助一段代码的问题

bool is_full(struct Array * pArr) {     if(pArr->cnt=pArr->len)  <<<==== 这里！pArr->cnt == pArr->len         return true;     else         return false; }


Question: 运行结果中，提示的scanf输入，没有后面的printf内容，只有再次输入才有

Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

1.空白字符空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符，空白符可以是space,tab,newline等等，直到第一个非空白符出现为止。 2.非空白字符一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。

去掉scanf中的\n   scanf中有空白符会继续去匹配

scanf 格式串中的 空白符（空格，回车，制表符等） 的作用是： 跳过此后的所有空白符，直到出现非空白为止。 把%d后面的回车删除就好


Question: 单击鼠标自动输入数字。

用C++ Builder做很简单，不过你这个想法好像不实用。  图形用户界面可以学习C++ Builder，入门比较容易。 仅供参考： 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/ 学C++还是C#、Java？ http://blog.163.com/tab_98/blog/static/11924097201511274543737/

响应单击事件，事件中记录已单击次数并在满足条件时执行你需要的代码


Question: C语言解码png图片


Question: 热烈庆祝本人受关注人数即将突破11000大关！散分！！

蹭蹭喜气

我分可怜，来接个分。

好多次在论坛都受到赵老师的指点  受益良多  谢谢

哇，厉害厉害，抢分抢分

我也刚给你关注了，大哥，我那问题还没解决，能帮忙看下吗，第一个

又建一楼

建楼

牛b

想知道Matlab怎么安装

666好多都是事实就是近近景近景

收收收收收收

我一般是狙击枪

6了，赵老师

谢谢老师散分

厉害了，在很多帖子中都能看到

新手不懂什么是抢分，分是什么 ，有干货就行

新人报道，外加祝贺


Question: char *s[]={。。。}，s的类型是char *[]还是char ** ？

可以让编译器告诉我们变量类型 代码： 	char *s[]={"Hello","world","123","abc","test"}; 	char t[][6]={"Hello","world","123","abc","test"}; 	s=1; 	t=2; 编译错误信息： cannot convert from 'const int' to 'char *[5]' cannot convert from 'const int' to 'char [5][6]'

把声明变量时的变量名去掉，剩下的就是它的类型。 所以是 char *[] 类型。 如果要用它作为实际参数，形式参数变量的类型用该是 char **。

理解和讨论之前请先学会如何观察！ 仅供参考：//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]

s本身是个数组，数组中的元素是char*指针而已  区分数组和指针的区别，某些情况下数组可以退化为指针，但数组与指针是两种类型，所以不造价于char**

s 是 char*[5] 类型

char *s[]；注意优先级，[]这个符号的优先级要高，所以s先于它结合，即s是一个数组，而数组内的元素为char*。

s是一个指针数组，和普通的数组一样，s代表数组首地址，不能移动 char **定义的是一个二级指针，这个指针又指向一个指针，而这个指针指向一个char变量，这个二级指针是一个指针变量，是可以移动的


Question: note: expected ‘int * (*)()’ but argument is of type ‘int’

贴代码 截屏看不完整

引用 5 楼 lm_whales 的回复:errno 比较特殊，可能会变成 int *(*)() 正解！！ errno被定义正宏了，会变成int *（*）（）型

errno 比较特殊，可能会变成 int *(*)()

错误提示说的很明白。 要么多贴点代码。

引用 1 楼 user-4 的回复:参数应该是int * (*)()类型，但你给的是int类型，类型不对 可是我的Logger 第二个参数就是定义int型啊 void Logger(int priority, int errno, char* fmt, ...);

参数应该是int * (*)()类型，但你给的是int类型，类型不对


Question: 小白刚学c，求助大神

引用 6 楼 sixto47的回复:[quote=引用 5 楼 paschen 的回复:] 如果要用逗号，scanf那句改成：scanf("%d,%d,%d",&a,&b,&c); 我发个修改版，你再帮我看看到底还有什么问题，谢谢 #include <stdio.h> #include <math.h> int main() {    int a,b,c;    printf("input a,b,c\n");    scanf("%d%d%d",&a,&b,&c);    double  delta;    double  x1;    double  x2;    delta = b * b - 4 * a * c ;    if(delta > 0)    { 	   x1 = (-b - sqrt( delta ))/ (2 * a) ;        x2 = (-b + sqrt( delta ))/(2 * a) ; 	   printf("x1 = %.2f,x2 = %.2f\n",x1,x2) ;    }    else if (delta == 0)    { 	   x1=(-b) / (2 * a ); 	   x2=x1 ; 	   printf("x1 = %.2f,x2 = %.2f\n",x1,x2 ;    }    else     { 	   printf("无解\n");    } } [/quote] printf("x1 = %.2f,x2 = %.2f\n",x1,x2 ;  后面少了一半括号

引用 5 楼 paschen 的回复:如果要用逗号，scanf那句改成：scanf("%d,%d,%d",&a,&b,&c); 我发个修改版，你再帮我看看到底还有什么问题，谢谢 #include <stdio.h> #include <math.h> int main() {    int a,b,c;    printf("input a,b,c\n");    scanf("%d%d%d",&a,&b,&c);    double  delta;    double  x1;    double  x2;    delta = b * b - 4 * a * c ;    if(delta > 0)    { 	   x1 = (-b - sqrt( delta ))/ (2 * a) ;        x2 = (-b + sqrt( delta ))/(2 * a) ; 	   printf("x1 = %.2f,x2 = %.2f\n",x1,x2) ;    }    else if (delta == 0)    { 	   x1=(-b) / (2 * a ); 	   x2=x1 ; 	   printf("x1 = %.2f,x2 = %.2f\n",x1,x2 ;    }    else     { 	   printf("无解\n");    } }

引用 3 楼 sixto47的回复:运行还是有点问题，答案不太对，输入1,2,1    1,5,6依然还是显示无解，上面的代码问题，我是已经改过了 你应该输入 1 2 1  也就是中间用空格隔开，而不是逗号

else if (delta =0)  改成 else if (delta ==0)  经常写错就写成else if (0 == delta)，这样少了=号编译器会报错

1.printf("input a,b,c/n");应该是printf("input a,b,c\n"); 2.else if (delta = 0)应该是else if (delta == 0)  #include <stdio.h> #include <math.h> int main() { 	int a, b, c; 	printf("input a,b,c\n"); 	scanf("%d%d%d", &a, &b, &c); 	double delta; 	double x1; 	double x2; 	delta = (b*b - 4 * a*c); 	if (delta > 0) 	{ 		x1 = (-b - sqrt(delta) / (2 * a)); 		x2 = (-b + sqrt(delta) / (2 * a)); 		printf("x1=%.2f,   x2=%.2f\n", x1, x2); 	} 	else if (delta == 0) 	{ 		x1 = (-b) / (2 * a); 		x2 = x1; 		printf("x1=%.2f,  x2=%.2f\n", x1, x2); 	} 	else 	{ 		printf("无解”!\n"); 	} 	return 0; }


Question: 构造数据类型的不解

这个就是值传递和地址传递的区别了。 值传递时被调函数和主调函数操作的变量并不是同一个。 http://blog.csdn.net/u011045793/article/details/40264263

第二题，数组c传递时退化为指针，指针是值值传递，但指针函数中修改的不是指针，而是指针手电筒的值，故可修改到

第一题 f 函数是按值传递，所以函数中修改的一切都不会反应到主函数中的a，所以显示的仍然是主函数中初始时候的值

因为一个是指针另一个不是啊


Question: 这是为什么

可以用codeblocks哦

换visual studio, 好看多了，用起来也更方便

换VS肯定比他看好

Ctrl + A  ， Alt + F8

引用 4 楼 qq_36139729的回复:[quote=引用 1 楼 珍惜生命远离CPP的回复:]VC6 ? alt+F8 前面的好了，怎么后面的汉字不会向后移。[/quote] http://bbs.csdn.net/topics/391817815?page=1  可用于VC6

引用 1 楼 珍惜生命远离CPP的回复:VC6 ? alt+F8 前面的好了，怎么后面的汉字不会向后移。

注意代码的缩进等，如果觉得自己控制麻烦，可以下载VAX插件

换成VS，你就比它好看了 http://blog.csdn.net/cometnet/article/details/19551125

VC6 ? alt+F8


Question: 关于c语言结构体初始化的问题

scanf("%s %s %d\n", &Book[i].title, &Book[i].author, &Book[i].book_id);//这样会吃掉输入的回车，回车就不能结束输入了。 //改成   scanf(" %s %s %d", &Book[i].title, &Book[i].author, &Book[i].book_id); //第一个字符串不允许空白，空行等,输入的空白符，会被吃掉 //或者  scanf("%s %s %d", &Book[i].title, &Book[i].author, &Book[i].book_id);//第一个字符串可以是空白，空行等 PS： 输入的时候，开始的回车（等空白符)可以吃掉， 如果不需要输入一行的空格，以及空行等的的话 结尾的回车，不要吃掉，因为scanf 输入，是以回车结束的  如果格式的最后是空白符， 就会把所有输入的空白符吃掉直到输入非空白为止。

你用单步调试看看就知道了。比如第一次输入后，程序到哪里了i=?

将字符串读入字符数组不需要用&

而且你使用scanf需要接着使用个getchar清除掉回车，四处错误，数组个球错误与约束条件错误，已经scanf使用的错误

除了scand有错，你还需要看到你的for里的条件也错了，你的结构体数组知有两个

scanf("%s %s %d\n", &Book[i].title, &Book[i].author, &Book[i].book_id);  scanf里面去掉\n  空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符，空白符包括空格,\t,\n等等，直到第一个非空白符出现为止。

scanf("%s %s %d\n", &Book[i].title, &Book[i].author, &Book[i].book_id);这句里面多了一个'\n'  #include <stdio.h> #include <string.h>  struct Books { 	char  title[50]; 	char  author[50]; 	int   book_id; };  int main() {  	struct Books Book[2]; 	int i, j;  	/*给结构体数组赋值*/ 	for (i = 0; i <= 2; i++) 	{ 		scanf("%s %s %d", &Book[i].title, &Book[i].author, &Book[i].book_id); 	} 	/*显示结构体内容*/ 	for (j = 0; j <= 2; j++) 	{ 		printf("Book[%d] title : %s\nBook[%d] author : %s\nBook[%d] book_id : %d\n", j, Book[j].title, j, Book[j].author, j, Book[j].book_id);  	} 	return 0; }


这个问题就是没有把图片路径加载正确，可以这样做：运行前先点击运行（空运行），然后在你的VS2010的PROjects中找到刚那个工程，选择刚才那个文件，然后点击进去，知道看到有debug，m.cpp为止，把需要的图片复制进去就可以直接引用了

楼主问题解决了吗？怎么解决的呢

如果确定图片及路径没有问题，在最后加上 return(0); 试试。

我也遇到了 请问楼主最后解决了吗？

遇到了同样的问题，程序运行成功，就是不显示图片，改成绝对路径也还是不显示，请各位大神指教

VS的当前目录是指你工程所在目录，不是你的EXE所在目录 改成绝对路径后试试

把你的图片复制到C盘  Mat img = imread("C:\\1.jpg"); imshow("【载入的图片】", img); waitKey(6000);

代码运行完了不代表函数执行成功，检查你路径文件，建议用绝对路径试下

Mat img = imread("d:\\mydir\\1.jpg");


Question: 求教大神如何读取两个Button上的值并返回主函数

initGPIO(4);     while(1) {         a=-1;b=-1;//加这两句         buttonreading(&a,&b);         if(a==0) {             for(int i=4;i>=1;i--) {                 PORTB |= (1<<i);                 delay(50);                 PORTB &=~(1<<i);             }         }         if(b==0) {             PORTB &=~(1<<PORTB1);             PORTB &=~(1<<PORTB2);             PORTB &=~(1<<PORTB3);             PORTB &=~(1<<PORTB4);         }     }

引用 1 楼 zhao4zhong1 的回复:#include <avr/io.h> #include <inttypes.h> #include <MSOE/delay.c> int a,b; void initGPIO(int x); void delay(uint16_t x); int buttonreading(int *x,int *y); int main(void) {     DDRB |= (1<<PORTB1);     DDRB |= (1<<PORTB2);     DDRB |= (1<<PORTB3);     DDRB |= (1<<PORTB4);     DDRD &= ~(1<<PORTD1);     PORTD |= (1<<PORTD1);     DDRD &= ~(1<<PORTD2);     PORTD |= (1<<PORTD2);     initGPIO(4);     while(1) {         buttonreading(&a,&b);         if(a==0) {             for(int i=4;i>=1;i--) {                 PORTB |= (1<<i);                 delay(50);                 PORTB &=~(1<<i);             }         }         if(b==0) {             PORTB &=~(1<<PORTB1);             PORTB &=~(1<<PORTB2);             PORTB &=~(1<<PORTB3);             PORTB &=~(1<<PORTB4);         }     } } void initGPIO(int x) {     for(int i=1;i<=x;i++) {         PORTB |= (1<<i);         delay(50);         PORTB &= ~(1<<i);     } } void delay(uint16_t x) {     uint16_t i,j;     for(i=0;i<x;i++)         for(j=0;j<10000;j++)             ;     return; } int buttonreading(int *x,int *y) {     *x=PIND&(1<<PORTD1);     *y=PIND&(1<<PORTD2); } 你好，的确比刚刚有所改善了，但是现在小灯泡只挨个亮一次就全部不亮了，那个InitGPIO的function感觉还是应该放在while（1）里头，但是放进去之后按钮还是没用

引用 楼主 baidu_36127636 的回复:#include <avr/io.h> #include <inttypes.h> #include <MSOE/delay.c> void initGPIO (int x); void delay(uint16_t x); int buttonreading(int *x,int *y); int main(void) { 	DDRB |= (1<<PORTB1); 	DDRB |= (1<<PORTB2); 	DDRB |= (1<<PORTB3); 	DDRB |= (1<<PORTB4); 	DDRD &= ~(1<<PORTD1); 	PORTD |= (1<<PORTD1); 	DDRD &= ~(1<<PORTD2); 	PORTD |= (1<<PORTD2); 	while(1) 	{ 		initGPIO(4); 		int a,b; 		buttonreading(&a,&b); 	    while(a==0) 	    { 	    	for(int i=4;i>=1;i--) 	    	{ 	    		PORTB |= (1<<i); 	    		delay(50); 	    		PORTB &=~(1<<i); 	    	} 	    } 	    while(b==0) 	    { 	    	PORTB &=~(1<<PORTB1); 	    	PORTB &=~(1<<PORTB2); 	    	PORTB &=~(1<<PORTB3); 	    	PORTB &=~(1<<PORTB4); 	    } 	} } void initGPIO(int x) { 	for(int i=1;i<=x;i++){ 		PORTB |= (1<<i); 		delay(50); 		PORTB &= ~(1<<i); 	} } void delay(uint16_t x) { 	uint16_t i,j; 	for(i=0;i<x;i++) 		for(j=0;j<10000;j++) 			; 	return; } int buttonreading(int *x,int *y) { 	x=PIND&(1<<PORTD1); 	y=PIND&(1<<PORTD2); }  这是我写的代码 但是连接到arduino board上似乎按钮是没反应的，按钮的连接应该是没问题。要求是一定要用函数来读取两个button的值，并返回主函数，如果第一个按钮按下去做for(int i=4;i>=1;i--) 	    	{ 	    		PORTB |= (1<<i); 	    		delay(50); 	    		PORTB &=~(1<<i); 	    	} 如果第二个按钮按下去做 while(b==0) 	    { 	    	PORTB &=~(1<<PORTB1); 	    	PORTB &=~(1<<PORTB2); 	    	PORTB &=~(1<<PORTB3); 	    	PORTB &=~(1<<PORTB4); 	    } 请大家帮忙看看我的buttonreading函数是出了什么问题？如果有更好的函数能读取两个button的值也请发上来参考一下。 你好，的确比刚刚有所改善了，但是现在小灯泡只挨个亮一次就全部不亮了，那个InitGPIO的function感觉还是应该放在while（1）里头，但是放进去之后按钮还是没用


仅供参考：// 按下列数级计算e的近视值，使e有小数点后1000位有效数字。 // e=1+1/1!+1/2!+1/3!+......1/n! #include <iostream> #include <string> using namespace std; inline int compare(string str1,string str2) {//相等返回0，大于返回1，小于返回-1          if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数     else if (str1.size()<str2.size()) return -1;     else                              return str1.compare(str2); //若长度相等，则头到尾按位比较 } string SUB_INT(string str1,string str2); string ADD_INT(string str1,string str2) {//高精度加法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         if (str2[0]=='-') {             sign=-1;             str=ADD_INT(str1.erase(0,1),str2.erase(0,1));         } else {             str=SUB_INT(str2,str1.erase(0,1));         }     } else {         if (str2[0]=='-') {             str=SUB_INT(str1,str2.erase(0,1));         } else { //把两个整数对齐，短整数前面加0补齐             string::size_type L1,L2;             int i;             L1=str1.size();             L2=str2.size();             if (L1<L2) {                 for (i=1;i<=L2-L1;i++) str1="0"+str1;             } else {                 for (i=1;i<=L1-L2;i++) str2="0"+str2;             }             int int1=0,int2=0; //int2 记录进位             for (i=str1.size()-1;i>=0;i--) {                 int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;                 int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;                 str=char(int1+'0')+str;             }             if (int2!=0) str=char(int2+'0')+str;         }     }     //运算后处理符号位     if ((sign==-1)&&(str[0]!='0')) str="-"+str;     return str; } string SUB_INT(string str1,string str2) {//高精度减法     int sign=1; //sign 为符号位     string str;     int i,j;     if (str2[0]=='-') {         str=ADD_INT(str1,str2.erase(0,1));     } else {         int res=compare(str1,str2);         if (res==0) return "0";         if (res<0) {             sign=-1;             string temp =str1;             str1=str2;             str2=temp;         }         string::size_type tempint;         tempint=str1.size()-str2.size();         for (i=str2.size()-1;i>=0;i--) {             if (str1[i+tempint]<str2[i]) {                 j=1;                 while (1) {//zhao4zhong1添加                     if (str1[i+tempint-j]=='0') {                         str1[i+tempint-j]='9';                         j++;                     } else {                         str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);                         break;                     }                 }                 str=char(str1[i+tempint]-str2[i]+':')+str;             } else {                 str=char(str1[i+tempint]-str2[i]+'0')+str;             }         }         for (i=tempint-1;i>=0;i--) str=str1[i]+str;     }     //去除结果中多余的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str ="-"+str;     return str; } string MUL_INT(string str1,string str2) {//高精度乘法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         sign*=-1;         str1 =str1.erase(0,1);     }     if (str2[0]=='-') {         sign*=-1;         str2 =str2.erase(0,1);     }     int i,j;     string::size_type L1,L2;     L1=str1.size();     L2=str2.size();     for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式         string tempstr;         int int1=0,int2=0,int3=int(str2[i])-'0';         if (int3!=0) {             for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;             for (j=L1-1;j>=0;j--) {                 int1=(int3*(int(str1[j])-'0')+int2)%10;                 int2=(int3*(int(str1[j])-'0')+int2)/10;                 tempstr=char(int1+'0')+tempstr;             }             if (int2!=0) tempstr=char(int2+'0')+tempstr;         }         str=ADD_INT(str,tempstr);     }     //去除结果中的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str="-"+str;     return str; } string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商; flag==0时,返回余数     string quotient,residue; //定义商和余数     int sign1=1,sign2=1;     if (str2 == "0") {  //判断除数是否为0         quotient= "ERROR!";         residue = "ERROR!";         if (flag==1) return quotient;         else         return residue ;     }     if (str1=="0") { //判断被除数是否为0         quotient="0";         residue ="0";     }     if (str1[0]=='-') {         str1   = str1.erase(0,1);         sign1 *= -1;         sign2  = -1;     }     if (str2[0]=='-') {         str2   = str2.erase(0,1);         sign1 *= -1;     }     int res=compare(str1,str2);     if (res<0) {         quotient="0";         residue =str1;     } else if (res == 0) {         quotient="1";         residue ="0";     } else {         string::size_type L1,L2;         L1=str1.size();         L2=str2.size();         string tempstr;         tempstr.append(str1,0,L2-1);         for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式             tempstr=tempstr+str1[i];             tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加             if (tempstr.empty()) tempstr="0";//zhao4zhong1添加             for (char ch='9';ch>='0';ch--) { //试商                 string str;                 str=str+ch;                 if (compare(MUL_INT(str2,str),tempstr)<=0) {                     quotient=quotient+ch;                     tempstr =SUB_INT(tempstr,MUL_INT(str2,str));                     break;                 }             }         }         residue=tempstr;     }     //去除结果中的前导0     quotient.erase(0,quotient.find_first_not_of('0'));     if (quotient.empty()) quotient="0";     if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;     if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;     if (flag==1) return quotient;     else         return residue ; } string DIV_INT(string str1,string str2) {//高精度除法,返回商     return DIVIDE_INT(str1,str2,1); } string MOD_INT(string str1,string str2) {//高精度除法,返回余数     return DIVIDE_INT(str1,str2,0); } int main() {     string s1,s2,s3,s4;     int i;      s4="0";      s3="1";     for (i=0;i<1002;i++) s3+="0";      s1="1";     s2="1";      s4=ADD_INT(s4,DIV_INT(s3,s1));     s4=ADD_INT(s4,DIV_INT(s3,s1));      for (i=2;i<451;i++) {//因为450!是一个1001位数         s2=ADD_INT(s2,string("1"));         s1=MUL_INT(s1,s2);         s4=ADD_INT(s4,DIV_INT(s3,s1));     }      cout<<s4<<endl;      return(0); } //271828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992 //181741359662904357290033429526059563073813232862794349076323382988075319525101901157383418793070215408914993488416750924 //476146066808226480016847741185374234544243710753907774499206955170276183860626133138458300075204493382656029760673711320 //070932870912744374704723069697720931014169283681902551510865746377211125238978442505695369677078544996996794686445490598 //793163688923009879312773617821542499922957635148220826989519366803318252886939849646510582093923982948879332036250944311 //730123819706841614039701983767932068328237646480429531180232878250981945581530175671736133206981125099618188159304169035 //159888851934580727386673858942287922849989208680582574927961048419844436346324496848756023362482704197862320900216099023 //530436994184914631409343173814364054625315209618369088870701676839642437814059271456354906130310720851038375051011574770 //4171898610687396965521267154688957035035174

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

你是每次重新求 n!  当然要每次初始化了  每次迭代，求出 当前 i 的阶乘，就不用每次初始化了。 阶乘 的递推关系是 (n+1)! =n!*(n+1); 迭代，和递归。都要求，了解 递推关系。 有了递推关系，按照它，写就成了  e =1 //初始化为1 ，0!=1 +1/1! //1!=1 +1/2! //(n+1)! =n!*(n+1) +...... //......  ------------------------- 一元n次 方程 数值方法求根  必须保证计算方法，在区间内 收敛 不然求不出来

没赋初值就使用，这个值可能是个随机值  其他问题不懂你意思

额，第二个好像就是单调函数，所以只有一个零点，只有零一个零点···所以facs（x-y）改成facs（z）就能得出零。······ 诶，我也不知道，求指正

#include<stdio.h> #include<math.h> void main() {float a,b,c,x,y,z; x=2*a*a*a-4*a*a+3*a;  y=2*b*b*b-4*b*b+3*b; for(a=-20,b=10;fabs(x-y)>1e-6;) {x=2*a*a*a-4*a*a+3*a;  y=2*b*b*b-4*b*b+3*b;  c=(a+b)/2;  z=2*c*c*c-4*c*c+3*c;  if(x*z<0) 	 b=(a+b)/2;  if(z*y<0) 	 a=(a+b)/2;  if(x*y>0)   {printf("please input a,b(f(a)*f(b)<0:");   scanf("%f,%f",&a,&b);} } printf("%f\n",c); }   还有这个，······求方程2x^3-4x^2+3x=0在（-10，10）附近的根，用二分法


Question: 现在开发c语言的软件是什么

我们平时用source insight多一些，比vs占据内存小，运行流畅。

手机 VS 可以通过模拟器开发

嵌入式，一般是keil C 或者某一类芯片专用C语言,可能是厂家自行开发的 例如DSP 的就是

WINDOWS下可以用VS开发

Code::Blocks

Dev-cpp

VS GCC Clang 其他的就不多了

Visual Studio 6/2005/2008/2010/2012/2013 各版本编译器 下载 http://bbs.csdn.net/topics/390812579 Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt


Question: 为什么在VS2013会运行不了，怎么回事，求教！

引用 3 楼 paschen 的回复:如果你要动态分配内存，LNode应该是指针类型， 而不是结构体类型  其次，你的InitList并不能成功分到内存，因为你参数是按值传递的  我把这一行L = (LinkList*)malloc(sizeof(LinkList));注释掉就可以编译了，是因为表头不用存储数据只做指针用也可以，所以不用分配空间？ “你的InitList并不能成功分到内存，因为你参数是按值传递的”我没看太懂，能解释下吗？

引用 5 楼 paschen 的回复:[quote=引用 4 楼 qq_35751500的回复:][quote=引用 3 楼 paschen 的回复:] 如果你要动态分配内存，LNode应该是指针类型， 而不是结构体类型  其次，你的InitList并不能成功分到内存，因为你参数是按值传递的  我把这一行L = (LinkList*)malloc(sizeof(LinkList));注释掉就可以编译了，是因为表头不用存储数据只做指针用也可以，所以不用分配空间？ “你的InitList并不能成功分到内存，因为你参数是按值传递的”我没看太懂，能解释下吗？[/quote] 你得到分配后的内存的指针是函数中的局部变量，函数结束后就销毁了，你函数外并没有得到分配的空间[/quote] 非常感谢！！

引用 4 楼 qq_35751500的回复:[quote=引用 3 楼 paschen 的回复:] 如果你要动态分配内存，LNode应该是指针类型， 而不是结构体类型  其次，你的InitList并不能成功分到内存，因为你参数是按值传递的  我把这一行L = (LinkList*)malloc(sizeof(LinkList));注释掉就可以编译了，是因为表头不用存储数据只做指针用也可以，所以不用分配空间？ “你的InitList并不能成功分到内存，因为你参数是按值传递的”我没看太懂，能解释下吗？[/quote] 你得到分配后的内存的指针是函数中的局部变量，函数结束后就销毁了，你函数外并没有得到分配的空间

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  仅供参考：//不带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #include <locale.h> struct NODE {     int          data;     struct NODE *next; } *head,*p,*q,*s,*p1,*p2,*q1,**ta; int i,k,n,t,m,v,N=10; int main() {     setlocale(LC_ALL,"chs");     srand(time(NULL));      head=NULL;      printf("创建%d个节点的单链表:",N);//创建N个节点的单链表     p=head;     for (i=0;i<N;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) exit(1);         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         if (NULL==p) {             head=q;             p=head;         } else {             p->next=q;             p=q;         }     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=3;     v=5;     printf("将值为%d的结点插入到单链表的第%d个结点前:",v,k);//将值为v的结点插入到单链表的第k个结点前     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) exit(1);             q->data=v;             q->next=head;             head=q;             break;         } else {             if (k-1==n) {                 q=(struct NODE *)malloc(sizeof(struct NODE));                 if (NULL==q) exit(1);                 q->data=v;                 q->next=p->next;                 p->next=q;                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=5;     printf("删除第%d个节点:",k);//删除第k个节点     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=head;             head=head->next;             free(q);             break;         } else {             if (k-1==n) {                 q=p->next;                 if (q) {                     p->next=q->next;                     free(q);                 }                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      printf("从小到大排序:");//从小到大排序     for (p=head,p1=NULL;p!=NULL;p1=p,p=p->next) {         for (q=p->next,q1=p;q!=NULL;q1=q,q=q->next) {             if (p->data > q->data) {                  //交换data //              printf("swap %02d %02d\n",p->data,q->data); //              t=p->data;p->data=q->data;q->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->data,q->data);                 if (p==head) {//p是头                     if (p->next==q) {//pq挨着                         head=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=head;                     } else {//pq不挨着                         head=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=head;                     }                 } else {//p不是头                     if (p->next==q) {//pq挨着                         p1->next=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=p1->next;                     } else {//pq不挨着                         p1->next=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=p1->next;                     }                 }                  //输出整个单链表 //              s=head; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表并计算链表长度n     n=0;     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         n++;         s=s->next;     }      printf("将整个链表逆序:");//将整个链表逆序     if (n>=2) {         p=head;         q=p->next;         p->next=NULL;         while (1) {             q1=q->next;             q->next=p;             p=q;             q=q1;             if (NULL==q) break;         }         head=p;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      m=4;     n=6;     printf("将单链表中前%d个结点和后%d个结点进行互换:",m,n);//将单链表中前m个结点和后n个结点进行互换,m+n为链表总长     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m==k) {             q=p;         }         s=p;         p=p->next;     }     q1=head;     head=q->next;     s->next=q1;     q->next=NULL;      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //创建10个节点的单链表:08->74->07->23->03->99->31->56->88->16-> //将值为5的结点插入到单链表的第3个结点前:08->74->05->07->23->03->99->31->56->88->16-> //删除第5个节点:08->74->05->07->03->99->31->56->88->16-> //从小到大排序:03->05->07->08->16->31->56->74->88->99-> //将整个链表逆序:99->88->74->56->31->16->08->07->05->03-> //将单链表中前4个结点和后6个结点进行互换:31->16->08->07->05->03->99->88->74->56-> //

明明没有报错啊！ 但调试的时候会出现：0x00AA1565 处有未经处理的异常(在 单链表_1.exe 中):  0xC0000005:  写入位置 0xCCCCCCD0 时发生访问冲突。 这是什么问题？


Question: 安装vc6.0出现的问题，求各位大神帮忙

引用 4 楼 qq_19471959 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] Visual Studio 6/2005/2008/2010/2012/2013 各版本编译器 下载 http://bbs.csdn.net/topics/390812579 Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt  赵老师啊   麻烦推荐下c语言视频嘛[/quote] http://edu.csdn.net/courses/o280_s281

引用 3 楼 zhao4zhong1 的回复:Visual Studio 6/2005/2008/2010/2012/2013 各版本编译器 下载 http://bbs.csdn.net/topics/390812579 Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt  赵老师啊   麻烦推荐下c语言视频嘛

别用VC6了，VC6和现在操作系统兼容不好，对标准支持也不好，15年前的东西了，使用新版VS吧，可以去 MSDN我告诉你 上下载

VC6太老了，换成VS http://blog.csdn.net/cometnet/article/details/19551125


Question: 关于算法时间的一些思考

无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

仅供参考：//随机产生100000000个取值范围为[0～2的32次方减1]的数据， //然后让用户输入一个数据，判断用户输入的数据是不是包含在前面随机产生的数据中。 //要求：当用户输入完成后，必须在1毫秒(千分之一秒)之内完成判断。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <malloc.h> long int i; unsigned long ul; unsigned long *d; unsigned long ulrand(void) {     return (      (((unsigned long)rand()<<24)&0xFF000000ul)     |(((unsigned long)rand()<<12)&0x00FFF000ul)     |(((unsigned long)rand()    )&0x00000FFFul)); } void main() {     d=(unsigned long *)calloc(1<<(32-5),sizeof(unsigned long));     if (NULL==d) {         printf("Can not calloc(%d,%d)!\n",1<<(32-5),sizeof(unsigned long));         return;     }     srand(time(NULL));     for (i=0;i<100000000;i++) {         while (1) {             ul=ulrand();             if (0==(d[ul>>5]&(1lu<<(ul%32)))) {                 d[ul>>5]|=1<<(ul%32);                 break;             }         }         if (0==i%1000000) printf("%09d,%10lu\n",i,ul);     }     while (1) {         printf("\nInput a number:");         fflush(stdout);         rewind(stdin);         if (1==scanf("%lu",&ul)) break;     }     if (d[ul>>5]&(1<<(ul%32))) printf("Include.\n"    );     else                       printf("Not include.\n");     free(d); } //000000000,2135468533 //001000000,2465805973 //002000000,3844079964 //003000000,1883232874 //004000000,1204697784 //005000000,4050838287 //006000000,3802081245 //007000000,1586042671 //008000000,3119931368 //009000000, 251096899 //010000000,3491239701 //011000000,3365323844 //012000000,2191846708 //013000000,1879478195 //014000000,1112631457 //015000000,1927301519 //016000000,1717332861 //017000000,2922278240 //018000000, 694854106 //019000000, 273255526 //020000000, 398518467 //021000000,3270756812 //022000000,1500289424 //023000000,1502241936 //024000000,1770380660 //025000000,3668842116 //026000000,3255869879 //027000000,1299184024 //028000000,1072990028 //029000000, 242094712 //030000000,3789344297 //031000000,2599365925 //032000000, 962754138 //033000000,2055075654 //034000000,4083452879 //035000000, 489250842 //036000000, 611455230 //037000000, 277350616 //038000000,1597410795 //039000000,3224173662 //040000000,2291446877 //041000000,2546280575 //042000000,2509145642 //043000000,2371773252 //044000000, 635555963 //045000000,2674538666 //046000000,4253690312 //047000000,2675755514 //048000000,1269320296 //049000000,3172516920 //050000000,1430265210 //051000000, 196156173 //052000000,2470825669 //053000000,2536750977 //054000000,1182829949 //055000000,3202826434 //056000000,2263336265 //057000000, 313302924 //058000000,3630264578 //059000000,1154892716 //060000000,2985304230 //061000000,1252204837 //062000000,1292076720 //063000000, 242249250 //064000000,3999999961 //065000000, 431166416 //066000000,1366947236 //067000000,1414387330 //068000000,2143784481 //069000000,3242175409 //070000000,4158065163 //071000000,1425449573 //072000000,2493600232 //073000000,1316783455 //074000000,3723170478 //075000000,3064111466 //076000000, 408557403 //077000000,3722586955 //078000000,3801652651 //079000000,3788160154 //080000000,3329440047 //081000000,1408976868 //082000000, 471838899 //083000000,2145198260 //084000000,3781081738 //085000000,3439027738 //086000000,1150808750 //087000000,2782578638 //088000000,  85604584 //089000000,2704078162 //090000000, 584840269 //091000000,3854577719 //092000000,2823653537 //093000000, 797877025 //094000000,2248017755 //095000000,1787038685 //096000000,2816548567 //097000000, 489107494 //098000000, 911680090 //099000000,3677777147 // //Input a number:3677777147 //Include.

intel VTune，很高级的profiler

VS本身就有性能分析工具可以统计每条代码或函数执行时间


Question: 读取、逆向输出英文句子（二维数组存储）遇到的问题

谢谢小灸舞版主以及user-2版主。 十分感谢你们。 明天中秋佳节，大家节日快乐。

1.指针数组中的每个元素都是一个指针，而每个指针指向各自的字符串 相当于你存了很多个字符串（类似二维数组，但和二维稍有区别，每个字符串占据的空间可以不同） 2.可以不添，因为scanf(" %s", sentence[i]);会自动帮你补上'\0' 3.scanf(" %s", sentence[i]);是不能读入回车符的. strlen是以读到'\0'来计算字符串长度的，“abcdef\n"是7和不能读入回车符并没有什么关系 4.可以啊 5.动态分配好处很多，1.动态分配的空间都是在堆上的，空间够大（相比于栈） 2.可能需要根据某些变量才能分配空间（可以省空间）

释放内存和置空用以下的方法合适吗？ free(*sentence); *sentence = NULL; 编译无error、warning，可是不能理解。 或者使用循环来一个个释放和置空

@小灸舞 版主，麻烦你再看看啦！ 我重新改了一下，不过还是有一些迷惑的地方，代码后面注释有“问题n：”的是有疑惑的地方，疑惑在最后 #include <stdio.h> #include <string.h> #include <stdlib.h>  #define LENGTH_WORD 20 #define COUNT_WORDS 30   int main(void) {     char *sentence[COUNT_WORDS], ch, punctuation;     //问题1：     int i, len, j;      printf("Enter a sentence: ");     for (i = 0; i < COUNT_WORDS; i++) {         sentence[i] = (char *)malloc(LENGTH_WORD * sizeof(char));         if (sentence[i] == NULL) {             printf("allocation failed“)             exit(1);         }         scanf(" %s", sentence[i]);         ch = getchar();         len = strlen(sentence[i]);         sentence[i][len] = '\0';  //问题2：         if (ch == '\n') {  //问题3：             if (sentence[i][len - 1] == '.'     ||                 sentence[i][len - 1] == '\?'    ||                 sentence[i][len - 1] == '!'                 ) {                 //问题4：                 punctuation = sentence[i][len - 1];                 sentence[i][len - 1] = '\0';             }   //second-if             break;         }   //first-if     }   //for      for ( ; i > 0; i--)         printf("%s ", sentence[i]);     printf("%s%c", sentence[0], punctuation);      return 0; } 问题1：在这里我声明的是指针数组，是一维的？我知道可以把二维数组当成一维数组处理，但是我声明的时候本意是需要二维数组，还是一维数组（这莫非是把一维数组当二维数组用？） 问题2：这里需要添加'\0'吗？ 问题3：在这里我尝试过if(sentence[i][len - 1] == '\n')但是循环没有在我输入换行符的时候跳出，这是说明在最后的换行符不能储存到字符串中吗？可是“abcdef\n"的字符长度还是7啊 问题4：在判断条件中使用sentence[i][len-1] == '.'&&'\?'&&'!'这种做法怎么样（经测试，结果是正确，有没有隐藏的缺陷） 问题5：“动态分配数组”是指动态分配数组元素的个数？可是这样的作用是什么？为了将声明了但没有初始化的数组元素占据的内存释放？ 例子： 声明但没有初始化： int a[20], i; for (i = 0; i < 10; i++)     a[i] = i; 声明了也初始化了： int a[20] = {0}, i; for (i = 0; i < 10; i++)     a[i] = i;  谢谢啦！

(*sentence)[COUNT_WORDS]这样写表示的是数组指针      表示：指向数组sentence的指针  而你需要的是存放多个字符串的指针数组（指针数组的每个元素都是一个指针）  你可以网上搜搜资料，看下概念。 http://www.cnblogs.com/Romi/archive/2012/01/10/2317898.html

@小灸舞 版主 确实不是很理解，现在在跟着《c语言程序设计-现代方法》自学。  还有一个问题，关于“指针数组”和“指向指针的数组”问题，那既然是指向字符串指针的数组，那这里是不是要这样用 (*sentence)[COUNT_WORDS]  其他的等我再找找资料和看一下“指针的高级应用”这章，有不懂的再请教各位啦。 谢谢大家，溢出节快乐啊！

1.你的scanf,strlen,puts都不需要取地址，sentence[i]本身就是个指针 2.你需要为每个元素都malloc空间（感觉楼主没有很好理解指针数组的概念） 3.最后多puts了一个元素  #include <stdio.h> #include <string.h> #include <stdlib.h> #define LENGTH_WORD 20 #define COUNT_WORDS 3   int main() { 	char *sentence[COUNT_WORDS], ch; 	int i, len, j;  	printf("Enter a sentence: "); 	for (i = 0; i < COUNT_WORDS; i++) { 		sentence[i] = (char *)malloc(sizeof(char)* LENGTH_WORD); 		scanf(" %s", sentence[i]); 		len = strlen(sentence[i]); 		printf("i: %d;len: %d\n", i, len); 		//用来检验字符串长度，显示是正确的，但输出时出现奇怪的错误 	}  	printf("\n"); 	puts(sentence[0]); 	puts(sentence[1]); 	puts(sentence[2]); 	//puts(sentence[3]); }

谢谢！ 翻了翻书，看到后面还有一章讲“指针的高级应用”，我先看看书先，如果还是不能解决再请教，所以先不结帖。 还有，溢出节快乐！

其他问题没细看，如果有不明白，给出问题说明与你输入的内容

方法一中：红色S去掉  char sentence[COUNT_WORDS][LENGTH_WORDS + 1] = {0}, ch, punctuation;

方法二使用指针奨要先为指针分配内存


Question: 考研真题 能详细帮我解释一下吗 谢谢了！！！

谢谢谢谢 我是跨专业考C的 正在努力学习中 谢谢大家了

仅仅是个二进制与10进制转换而已，比如第一次输入2， 第一步，输出(2)10=，第二步,d=2/2;d=1;S=1*2=2; 第三步,调用自己，传递n=1;因为d=1; 第四步,d=1/2=0;if(d==0) e=1; 因为e=1;输出n%M结果(2)10=(1， 因为s=2，不等e；所以这步不执行，返回e, 往下走，从刚才自己调用自己那里出来，因为这里的e不等1, 所以下一步，输出n%M，输出1, 因为S等于e，所以输出), 当前的显示结果是(2)10=(10)2;执行完毕 ，回到main函数,执行return 0；执行完。      自己单步跟踪，不会就画流程图，不然你这样靠什么研，赵老师都救不了你。。

为啥我看到楼上两个，突然笑了

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

起码说下哪不明白，process函数中递归调用自己  如果还是困惑，建议调试时单步跟踪程序运行观察分析

里面有个递归调用， 递归调用的关键 1.递归结束条件 2.每一轮与上一轮的关系 要是觉得实在不好理解， 下断点自己看吧

大四了都看不懂这个。。。我建议你别考研了。。。


Question: 输入一个字符串统计并输出其中正整数和负整数的个数以及对应的平均值

引用 3 楼 user-1 的回复:[quote=引用 2 楼 popowa的回复:]好吧，我知道了，是ab没赋初值······ 编译没有报错,  编译器不行…[/quote] 额，当初因为安不好，就装了一个绿色版

引用 8 楼 popowa的回复:[quote=引用 6 楼 user-1 的回复:] [quote=引用 5 楼 popowa的回复:]用公式e=1+1/1!+1/2!+1/3!+···+1/n! 计算e的值  #include<stdio.h> void main() {int i,j,n; double e,fac; scanf("%d",&n); for(e=1,i=1;i<=n;i++) {for(fac=1,j=1;j<=i;j++)   fac=fac*i; e=e+1/fac;} printf("%.20lf\n",e); }   继续求解救啊亲们，输入的n为100都只能得出2.29几结果 第二个for用j，还有就是程序的书写规范，注意缩进，老师，应给上课强调的，这样程序可读性就强！[/quote]  我错了！我好像搞错了阶乘要求的东西了！ 是的，就是把fac*i改成fac*j [/quote] 恩，哈哈，考计算机二级的话，学点基础的，在学点指针，应该就可以了！

引用 6 楼 user-1 的回复:[quote=引用 5 楼 popowa的回复:]用公式e=1+1/1!+1/2!+1/3!+···+1/n! 计算e的值  #include<stdio.h> void main() {int i,j,n; double e,fac; scanf("%d",&n); for(e=1,i=1;i<=n;i++) {for(fac=1,j=1;j<=i;j++)   fac=fac*i; e=e+1/fac;} printf("%.20lf\n",e); }   继续求解救啊亲们，输入的n为100都只能得出2.29几结果 第二个for用j，还有就是程序的书写规范，注意缩进，老师，应给上课强调的，这样程序可读性就强！[/quote]  我错了！我好像搞错了阶乘要求的东西了！ 是的，就是把fac*i改成fac*j

额，第二个for是用的 j 啊，额缩进好像也差不多是那样了吧，可是问题到底出在哪？

引用 5 楼 popowa的回复:用公式e=1+1/1!+1/2!+1/3!+···+1/n! 计算e的值  #include<stdio.h> void main() {int i,j,n; double e,fac; scanf("%d",&n); for(e=1,i=1;i<=n;i++) {for(fac=1,j=1;j<=i;j++)   fac=fac*i; e=e+1/fac;} printf("%.20lf\n",e); }   继续求解救啊亲们，输入的n为100都只能得出2.29几结果 第二个for用j，还有就是程序的书写规范，注意缩进，老师，应给上课强调的，这样程序可读性就强！

引用 2 楼 popowa的回复:好吧，我知道了，是ab没赋初值······ 编译没有报错,  编译器不行…

好吧，我知道了，是ab没赋初值······

有没有人救救我


Question: 请教下这个递归程序的栈结构怎么理解？

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

楼主单步跟踪程序运行，看程序运行流程，就能理解了

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


Question: VC6.0 提示  this file does not exist

写代码就不要用中文输入法，整天出现标点符号不对这种问题，就别用了VC6了吧，下载个DevC++也好，顺便说一下，谭浩强的书不太好，还不如搞个C Primer Plus。

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

换成VS，这种错误都有提示的，两个大括号都会出现红线，你就知道不对了 VC6太老了  #include <stdio.h> int main()  { 	float a, b, t; 	scanf("%f,%f", &a, &b); 	if (a > b) //将ab的值互换 	{ 		t = a; 		a = b; 		b = t; 	} 	printf("%5.2f,%5.2f \n", a, b); 	return 0; }

if的大括号要用英文下的括号，你的是中文下的

你 if 后面那对大括号是全角的吧 ...


Question: 数据结构线表插入问题

for(k=L->last;k>=i-1;k++)  这里是滞应该是 k--

# include<stdio.h> # define Maxsize 100 # define OK 1 # define ERROR 0 typedef struct { 	int elem[Maxsize]; 	int last; }SeqList; //1. last为顺序表长度 SeqList Create(SeqList L) //2. 这里你用的是传值的方式，并不会修改你传入对象的状态，建议使用传引用的方式 { 	//3. 你这里的意思看起来是想对静态表做初始化 	for(int i=0;i<L.last;i++) 		scanf("%d",&L.elem[i]); 	return L;//如果非要这样返回也能接受，但并科学 } void visit(SeqList L)  { 	for(int i=0;i<L.last;i++) 		printf("%d\t",L.elem[i]); 	printf("\n");  } int InsList(SeqList *L,int i,int e) { 	int k; 	// 条件应改成：if( i < 0 || i > 5) 	//if((i<1)||(i>L->last+2)) 	if( i < 0 || i > 5) 	{ 		printf("插入位置i值不合法");  		return (ERROR);  	} 	//移动条件有问题 	//for(k=L->last;k>=i-1;k++) 	//	L->elem[k+1]=L->elem[k]; 	for(k = L->last; k > i; -- k)  	{ 		L->elem[k] = L->elem[k-1]; 	}  	L->elem[i]=e; 	L->last++; 	visit(*L); 	return (OK); } int main() { 	SeqList L1; 	L1.last=5; 	L1=Create(L1); 	visit(L1); 	int i=InsList(&L1,5,3); }

谢谢你们的回复


Question: C语言值传递和地址传递 不明白

仅供参考： 《深入理解C指针》

调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  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、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

仅供参考：#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

你需要用引用传递或者改成指针（都是地址传递）才行，否则交换的只是一个拷贝，并不会影响到main函数里的两个实参。 http://blog.csdn.net/embeddedman/article/details/7521216

通俗的说，值传递是授之以鱼，而地址传递是授之以渔。

你有一副半成品画（实参），想让别人（函数）帮你加工成一幅成品，有两种方式，第一种（值传递）：别人按照你这个原作（实参）复制一份，然后加工成成品。第二种（地址传递）：直接拿你这个半成品（实参）来加工。很好理解的东西

C 只有一种参数传递方式，值传递 。。。。。。。。。。。。。。。。。 C 往往用 指针的值传递， 模拟，地址传递（引用传递）  *p ,p[i]，p->x 是指针的应有之意。 指针通过这一类操作，可以修改它指向的值 也可以读到，他指向的值。   C++ 另有 引用传递，这是其他语言的所谓地址传递（引用传递） C++ 采用的方式是，定义一种叫引用的类型。 以此实现引用（地址）传递，方法和C传递指针，如出一辙。 实际上，实现上，多半也是利用指针的值传递实现的。 但是C++对引用做了巧妙处理，使之更像一个被引用的对象本身， 而不是一个独立的对象。 而指针是独立的对象。

你的swap只是按值传递，这样不能真正达到交换两个参数的目的  因为值传递传入函数的只是参数的复制品，函数中的修改只是对复制品的修改，不会影响到原始传入的参数  按地址传递则传入的是原参数的地址，可以修改到原参数


Question: C语言链表问题

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

引用 7楼我是你的主体 的回复:createMember函数中：  printf("姓名：");scanf("%s",&head->name); printf("性别：");scanf("%s",&head->sex);  这两句中的&去掉和加上&的区别处在哪里你这里加不加&都是一样的，对数组名取地址还是它本身的地址，如果是指针成员才有区别

引用 7 楼 qq_36084484的回复:createMember函数中：  printf("姓名：");scanf("%s",&head->name); printf("性别：");scanf("%s",&head->sex);  这两句中的&去掉和加上&的区别处在哪里 char[]数组不需要加&，因为数组名是可以直接转换成指针的，而id是 int成员，要加&的才能得到指针类型

引用 5 楼 qq_36084484的回复:我检查过了，没有漏写getchar().而且只有第一次的score的值有问题，之后第二次测试结果就正确了，不知道为什么 认真检查，第二次是在add函数里，第一次是在createMember函数里输入  建议不要把多条语句写在一行，不然你很难发现....

1.你的add函数里，head写成了m(楼上已经说到了) 2.你的score之所以不对，是因为你在输入个人信息的时候输入缓冲区里是有遗留的字符的（包括回车符）。 所以不对，你在start1函数的开头加一句fflush(stdin);清空输入缓冲区就行了  #include <stdio.h> #include <stdlib.h> int score = 0; typedef struct member{ 	char name[10], sex[5]; int id; char type; 	struct member* pNext;  }Member, *PMember;  PMember createMember(){//创造新的头节点 	PMember head = NULL; 	head = (PMember)malloc(sizeof(Member)); 	head->pNext = NULL; 	printf("请输入你的个人信息：\n"); 	printf("学号："); scanf("%d", &head->id); 	printf("姓名："); scanf("%s", &head->name); 	printf("性别："); scanf("%s", &head->sex); 	return head; } void display(PMember head){//显示输出 	system("CLS"); 	if (NULL == head) return; 	PMember temp1 = head; 	printf("\t学号\t姓名\t性别\t测试结果\n"); 	for (; temp1 != NULL; temp1 = temp1->pNext){  		printf("\t%d\t%s\t%s\t%c\n", temp1->id, temp1->name, temp1->sex, temp1->type);   	}  }  void start1(void){ 	fflush(stdin); 	system("CLS"); 	printf("(1)你走路时是……\n"); 	printf("a)大步的快走\n"); 	printf("b)小步的快走\n"); 	printf("c)不快，仰著头面对著世界\n"); 	printf("d)不快，低著头\n"); 	printf("e)很慢\n"); 	char answer; 	printf("你的选择是："); 	scanf("%c", &answer); 	getchar(); 	if (answer == 'a'){ score += 6; } 	if (answer == 'b'){ score += 4; } 	if (answer == 'c'){ score += 7; } 	if (answer == 'd'){ score += 2; } 	if (answer == 'e'){ score += 1; }  } void start2(void){ 	system("CLS"); 	printf("(2)和人说话时，你……\n"); 	printf("a)手臂交叠的站著\n"); 	printf("b)双手紧握著\n"); 	printf("c)一只手或两手放在臀部\n"); 	printf("d)碰著或推著与你说话的人\n"); 	printf("e)玩著你的耳朵、摸著你的下巴、或用手整理头发\n"); 	char answer1; printf("你的选择是："); 	scanf("%c", &answer1); getchar(); 	if (answer1 == 'a'){ score += 4; } 	if (answer1 == 'b'){ score += 2; } 	if (answer1 == 'c'){ score += 5; } 	if (answer1 == 'd'){ score += 7; } 	if (answer1 == 'e'){ score += 6; } } void start3(void){ 	system("CLS"); 	printf("((3)你何时感觉最好?\n"); 	printf("a)早晨\n"); 	printf("b)下午及傍晚\n"); 	printf("c)夜里\n");  	char answer1; printf("你的选择是："); 	scanf("%c", &answer1); getchar(); 	if (answer1 == 'a'){ score += 2; } 	if (answer1 == 'b'){ score += 4; } 	if (answer1 == 'c'){ score += 6; }  } void start4(void){ 	system("CLS"); 	printf("((4)坐著休息时，你的……\n"); 	printf("a)两膝盖并拢\n"); 	printf("b)两腿交插\n"); 	printf("c)两腿伸直\n"); 	printf("d)一腿卷在身下\n"); 	char answer1; printf("你的选择是："); 	scanf("%c", &answer1); getchar(); 	if (answer1 == 'a'){ score += 4; } 	if (answer1 == 'b'){ score += 6; } 	if (answer1 == 'c'){ score += 2; } 	if (answer1 == 'd'){ score += 1; } } void start5(void){ 	system("CLS"); 	printf("(5)碰到你感到发笑的事时，你的反应是……\n"); 	printf("a)一个欣赏的大笑\n"); 	printf("b)笑著，但不大声\n"); 	printf("c)轻声的咯咯地笑\n"); 	printf("d)羞怯的微笑\n"); 	char answer1; printf("你的选择是："); 	scanf("%c", &answer1); getchar(); 	if (answer1 == 'a'){ score += 4; } 	if (answer1 == 'b'){ score += 6; } 	if (answer1 == 'c'){ score += 2; } 	if (answer1 == 'd'){ score += 1; }  } void start6(void){ 	system("CLS"); 	printf("(6)当你去一个派对或社交场合时，你……\n"); 	printf("a)很大声地入场以引起注意\n"); 	printf("b)安静地入场，找你认识的人\n"); 	printf("c)非常安静地入场，尽量保持不被注意\n");  	char answer1; printf("你的选择是："); 	scanf("%c", &answer1); getchar(); 	if (answer1 == 'a'){ score += 6; } 	if (answer1 == 'b'){ score += 4; } 	if (answer1 == 'c'){ score += 2; }  } void start7(void){ 	system("CLS"); 	printf("(7)当你非常专心工作时，有人打断你，你会……\n"); 	printf("a)欢迎他\n"); 	printf("b)感到非常恼怒\n"); 	printf("c)在上两极端之间\n");  	char answer1; printf("你的选择是："); 	scanf("%c", &answer1); getchar(); 	if (answer1 == 'a'){ score += 6; } 	if (answer1 == 'b'){ score += 4; } 	if (answer1 == 'c'){ score += 2; } } void start8(){ 	system("CLS"); 	printf("(8)下列颜色中，你最喜欢哪一颜色?\n"); 	printf("a)红或橘色\n"); 	printf("b)黑色\n"); 	printf("c)黄或浅蓝色\n"); 	printf("d)绿色\n"); 	printf("e)深蓝或紫色\n"); 	printf("f)白色\n"); 	printf("g)棕或灰色\n"); 	char answer; printf("你的选择是："); 	scanf("%c", &answer); getchar(); 	if (answer == 'a'){ score += 6; } 	if (answer == 'b'){ score += 7; } 	if (answer == 'c'){ score += 5; } 	if (answer == 'd'){ score += 4; } 	if (answer == 'e'){ score += 3; } 	if (answer == 'f'){ score += 2; } 	if (answer == 'g'){ score += 1; } } void start9(){ 	system("CLS"); 	printf("(9)你经常梦到你在……\n"); 	printf("a)落下\n"); 	printf("b)打架或挣扎\n"); 	printf("c)找东西或人\n"); 	printf("d)飞或漂浮\n"); 	printf("e)你平常不做梦\n"); 	printf("f)你的梦都是愉快的\n");  	char answer; printf("你的选择是："); 	scanf("%c", &answer); getchar(); 	if (answer == 'a'){ score += 4; } 	if (answer == 'b'){ score += 2; } 	if (answer == 'c'){ score += 3; } 	if (answer == 'd'){ score += 5; } 	if (answer == 'e'){ score += 6; } 	if (answer == 'f'){ score += 1; } } void start10(){ 	system("CLS"); 	printf("(10)临入睡的前几分钟，你在床上的姿势是……\n"); 	printf("a)仰躺，伸直\n"); 	printf("b)俯躺，伸直\n"); 	printf("c)侧躺，微卷\n"); 	printf("d)头睡在一手臂上\n"); 	printf("e)被盖过头\n");  	char answer; printf("你的选择是："); 	scanf("%c", &answer); getchar(); 	if (answer == 'a'){ score += 7; } 	if (answer == 'b'){ score += 6; } 	if (answer == 'c'){ score += 4; } 	if (answer == 'd'){ score += 2; } 	if (answer == 'e'){ score += 1; }  } void add(PMember head){//添加新成员 	system("CLS"); 	score = 0; 	PMember m = NULL; PMember temp = NULL; 	if (NULL == head)return; 	m = (PMember)malloc(sizeof(Member)); 	printf("请输入你的个人信息：\n"); 	printf("学号："); scanf("%d", &m->id);	getchar(); 	printf("姓名："); scanf("%s", &m->name); getchar(); 	printf("性别："); scanf("%s", &m->sex); getchar(); 	m->pNext = NULL; 	for (temp = head; temp->pNext != NULL; temp = temp->pNext); 	temp->pNext = m; 	start1(); 	start2(); 	start3(); 	start4(); 	start5(); 	start6(); 	start7(); 	start8(); 	start9(); 	start10(); 	if (score <= 21){ 		printf("类型[A]\n"); m->type = 'A'; 		printf("  人们认为你是一个害羞的、神经质的、优柔寡断的，是须人照顾、永远要别人为你做决定、不想与任何事或任何人有关。他们认为你是一个杞人忧天者，一个永远看到不存在的问题的人。有些人认为你令人乏味，只有那些深知你的人知道你不是这样的人。\n"); 	} 	if (score>21 && score <= 30){ 		printf("类型[B]\n"); m->type = 'B'; 		printf("  你的朋友认为你勤勉刻苦、很挑剔。他们认为你是一个谨慎的、十分小心的人，一个缓慢而稳定辛勤工作的人。如果你做任何冲动的事或无准备的事，你会令他们大吃一惊。他们认为你会从各个角度仔细地检查一切之后仍经常决定不做。他们认为对你的这种反应一部分是因为你的小心的天性所引起的。\n"); 	} 	if (score >= 31 && score <= 40){ 		printf("类型[C]\n"); m->type = 'C'; 		printf("　别人认为你是一个明智、谨慎、注重实效的人。也认为你是一个伶俐、有天赋有才干且谦虚的人。你不会很快、很容易和人成为朋友，但是是一个对朋友非常忠诚的人，同时要求朋友对你也有忠诚的回报。那些真正有机会了解你的人会知道要动摇你对朋友的信任是很难的，但相等的，一旦这信任被破坏，会使你很难熬过。\n"); 	} 	if (score >= 41 && score <= 50){ 		printf("类型[D]\n"); m->type = 'D'; 		printf("  别人认为你是一个新鲜的、有活力的、有魅力的、好玩的、讲究实际的、而永远有趣的人;一个经常是群众注意力的焦点，但是你是一个足够平衡的人，不至於因此而昏了头。他们也认为你亲切、和蔼、体贴、能谅解人;一个永远会使人高兴起来并会帮助别人的人。\n"); 	} 	if (score >= 51 && score <= 60){ 		printf("类型[E]\n"); m->type = 'E'; 		printf("  别人认为你是一个令人兴奋的、高度活泼的、相当易冲动的个性;你是一个天生的领袖、一个做决定会很快的人，虽然你的决定不总是对的。他们认为你是大胆的和冒险的，会愿意试做任何事至少一次;是一个愿意尝试机会而欣赏冒险的人。因为你散发的刺激，他们喜欢跟你在一起。\n"); 	} 	if (score >= 60){ 		printf("类型[F]\n"); m->type = 'F'; 		printf("  别人认为对你必须“小心处理”。在别人的眼中，你是自负的、自我中心的、是个极端有支配欲、统治欲的。别人可能钦佩你，希望能多像你一点，但不会永远相信你，会对与你更深入的来往有所踌躇及犹豫.世界本来就是层层嵌套，周而复始;不以任何的意志而改变。\n"); 	}  } int main(void){ 	printf("这是一个简单的心理测试，请根据实际情况做出选择，希望这个测试可以给你帮助,解析仅供参考，多谢合作\n"); 	PMember head = NULL; 	head = createMember(); 	 	start1(); 	start2(); 	start3(); 	start4(); 	start5(); 	start6(); 	start7(); 	start8(); 	start9(); 	start10(); 	system("CLS"); 	int flag; 	printf("以下是测试的结果：\n"); 	if (score <= 21){ 		printf("类型[A]\n"); head->type = 'A'; 		printf("  人们认为你是一个害羞的、神经质的、优柔寡断的，是须人照顾、永远要别人为你做决定、不想与任何事或任何人有关。他们认为你是一个杞人忧天者，一个永远看到不存在的问题的人。有些人认为你令人乏味，只有那些深知你的人知道你不是这样的人。\n"); 	} 	if (score>21 && score <= 30){ 		printf("类型[B]\n"); head->type = 'B'; 		printf("  你的朋友认为你勤勉刻苦、很挑剔。他们认为你是一个谨慎的、十分小心的人，一个缓慢而稳定辛勤工作的人。如果你做任何冲动的事或无准备的事，你会令他们大吃一惊。他们认为你会从各个角度仔细地检查一切之后仍经常决定不做。他们认为对你的这种反应一部分是因为你的小心的天性所引起的。\n"); 	} 	if (score >= 31 && score <= 40){ 		printf("类型[C]\n"); head->type = 'C'; 		printf("　别人认为你是一个明智、谨慎、注重实效的人。也认为你是一个伶俐、有天赋有才干且谦虚的人。你不会很快、很容易和人成为朋友，但是是一个对朋友非常忠诚的人，同时要求朋友对你也有忠诚的回报。那些真正有机会了解你的人会知道要动摇你对朋友的信任是很难的，但相等的，一旦这信任被破坏，会使你很难熬过。\n"); 	} 	if (score >= 41 && score <= 50){ 		printf("类型[D]\n"); head->type = 'D'; 		printf("  别人认为你是一个新鲜的、有活力的、有魅力的、好玩的、讲究实际的、而永远有趣的人;一个经常是群众注意力的焦点，但是你是一个足够平衡的人，不至於因此而昏了头。他们也认为你亲切、和蔼、体贴、能谅解人;一个永远会使人高兴起来并会帮助别人的人。\n"); 	} 	if (score >= 51 && score <= 60){ 		printf("类型[E]\n"); head->type = 'E'; 		printf("  别人认为你是一个令人兴奋的、高度活泼的、相当易冲动的个性;你是一个天生的领袖、一个做决定会很快的人，虽然你的决定不总是对的。他们认为你是大胆的和冒险的，会愿意试做任何事至少一次;是一个愿意尝试机会而欣赏冒险的人。因为你散发的刺激，他们喜欢跟你在一起。\n"); 	} 	if (score >= 60){ 		printf("类型[F]\n"); head->type = 'F'; 		printf("  别人认为对你必须“小心处理”。在别人的眼中，你是自负的、自我中心的、是个极端有支配欲、统治欲的。别人可能钦佩你，希望能多像你一点，但不会永远相信你，会对与你更深入的来往有所踌躇及犹豫.世界本来就是层层嵌套，周而复始;不以任何的意志而改变。\n"); 	} 	printf("\n"); 	printf("\n"); 	printf("请继续操作\n"); 	printf("(0)退出系统\n"); 	printf("(1)添加新用户进行测试\n"); 	printf("(2)查看所有用户的信息\n"); 	scanf("%d", &flag); 	while (flag){ 		switch (flag) 		{ 		case 1:add(head); 		case 2:display(head); 		default:break; 		} 		printf("请继续操作\n"); 		printf("(0)退出系统\n"); 		printf("(1)添加新用户进行测试\n"); 		printf("(2)查看所有用户的信息\n"); 		scanf("%d", &flag); 	}   	return 0; }

引用 3 楼 qq_36084484的回复:多谢啊，那个显示的问题解决了，但是我第一次的score结果不在范围是什么原因呢？不管怎么输入答案结果都是类型【A】；score的值变得很奇怪 检查你是否有些scanf后没有getchar，导致在start系列函数里接收到的是\n字符，故不匹配

另外,add函数中：  printf("学号：");scanf("%d",&head->id); getchar(); 	printf("姓名：");scanf("%s",head->name);getchar(); 	printf("性别：");scanf("%s",head->sex);getchar();  这里的head是否应该要改成m，楼主仔细想下

createMember函数中：  printf("姓名：");scanf("%s",&head->name); printf("性别：");scanf("%s",&head->sex);  这两句中的&去掉，add函数中的也是


Question: 语言{a^n b^m c^n d^m}是上下文无关文法吗?

C/C++里的^运算符不表示幂，而是异或运算


Question: 谁能帮忙翻译成pascal，谢谢，在线等=============可以加分

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


Question: C语言模拟密码输入（显示星号）问题，帮看一下【请大神光临寒舍】

还是if (ch=='\r')应该改为if (ch=='\n')吧

字符串是要以\0结尾的，你第一段代码里，字符数组后面并未以\0结尾

加一句pwd[i]='\0';就可以了。。。。。。。。


Question: scanf的奇怪问题

Scanf的问题，不用管，用getchar清一下回车就好了

scanf(" %c",&c);可以解决上次遗留的空白符号 但是要想收到回车就不行了 如果有其他多余字符，也会被接收 scanf 并不是同步输入的 用户输入一次（到回车才算结束）， 可以被 几次scanf ，或者 几个 数据接收。 直到缓冲区数据用完，才会用新数据，不足就会等待新数据的输入。

接收完之后加上这个 fflush(stdin);

解救办法：第一种：把最后的printf("cVal = %c\n",cVal);  改为printf("%c\n",cVal);         第二种：在输入的时候写为cVal = 1 解析：scanf()函数的工作原理是将你在屏幕输入的字符都存入缓冲区里，当你按下回车键的时候，计算机再读取缓冲区里的字符，然后输出，假如你分别输入：w e r  然后你再摁下回车键等待输出，这时候scanf函数会检测第一个字符是 w 把它输出，并且将w删掉，这时缓冲区就剩 e r \r 了，同理将 e r都输出后剩下\r这个回车的字符，重要时刻来了！你的输出格式是cVal = %c，那么你在输入的时候就必须写为cVal = 某某某这个格式，如果不这样写，直接输入某某某，就会起冲突！cVal = 某某某 和 某某某 是对不上号的！     所以关键时你的输入格式不对！！！！！！

回车也是个char，所以需要加getchar();过滤掉

int main() {   char cVal;   while(1)   {      printf("input a char\n");      scanf("%c",&cVal); 	 while(getchar()!='\n') 		 continue;//扔掉缓冲区换行符以前的所有字符      printf("cVal = %c\n",cVal);   } } 遇到这种问题加个getchar()就好

getchar


Question: 编译原理里面研究的"句柄"的概念，到底只要解决什么问题?

句柄就是控制一件事物的手段。例如文件句柄就是控制一个文件的写入和读取操作，直至系统关闭回收。

不是解决编译问题  是操作系统用来管理不同的对象，给他们一个编号而已  比如窗口、线程、图标等都会对应一个句柄，这样可以方便标识与管理   句柄其实也就是一个整数值，而且是唯一的


Question: C语言输入问题

scanf 语句后面加上一个getchar  不然最后的换行符还留在缓冲区，会被你下一次接收掉


Question: 线性表操作的实现中建立顺序表时显示windows停止运行

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

Windows已停止说明，运行发生了严重的运行时错误，例如除零，数组越界，段错误等等。从你的情况来看，很可能是指针操作的问题，这一检查指针操作是否合法

好的，不过我又改了另一个 代码是正确的，如下 #include <stdio.h> #include<stdlib.h> #define maxsize 50 typedef struct { int data[maxsize]; int last; }Sequenlist;  Sequenlist * InitList () //创建顺序表 { Sequenlist * L ; L= (Sequenlist *) malloc( sizeof(Sequenlist) ); L->last =0; return(L); }  Sequenlist * creat() //创建一个有具体内容的顺序表 { Sequenlist * L; int i=1,n; L=InitList( ); printf("请插入数据,以0结束\n"); scanf("%d",&n); while(n!=0 && L->last<maxsize) { L->data[i]=n; i=i++; L->last++; scanf("%d",&n); } return(L); } int Length (Sequenlist * L) //求表的长度 { return (L->last); }  int GetData (Sequenlist * L, int i ) //获取第i个元素 { if ( i >=1 && i <=L->last) return (L->data[i]); else { printf ("参数 i 不合理！\n"); return 0; }  } int Find (Sequenlist *L, int x ) // 查找元素x { int i=1; while ( i <=L->last && L->data[i] != x ) i++; if ( i <=L->last ) return (i); else return (0); } int Insert ( Sequenlist * L, int x, int i ) //在某一位置插入数据 { int j; //在表中第 i 个位置插入新元素 x if (i < 1|| i > L->last +1|| L->last == maxsize) return 0; //插入不成功 else { for ( j=L->last; j >=i; j-- ) { L->data[j+1] = L->data[j]; } L->data[i] = x; L->last++; return 1; //插入成功 } } int Delete ( Sequenlist *L, int i ) //删除某一位置的数据 { //在表中删除节点i int j; if ( i <1 || i >L->last) return 0; for ( j=i+1; j <=L->last; j++ ) L->data[j-1] =L->data[j]; L->last=L->last -1; return 1; //成功删除  } void print(Sequenlist *L) //打印函数 { int i; for(i=1;i<=L->last;i++) printf("%d\n",L->data[i]); }  void main() {     int length,i;     int value,number,location;     int j,k,m;     int flag;     Sequenlist * L ;     do {         printf("\n======================================"); 		printf("\n"); 		printf("\n     0. 初始化线性表 " ); 		printf("\n"); 		printf("\n     1. 建立线性表 " ); 		printf("\n     2. 在i位置插入元素e"); 		printf("\n     3. 删除第i个元素，返回其值"); 		printf("\n     4. 查找值为 e 的元素"); 		printf("\n     6. 结束程序运行"); 		printf("\n======================================"); 		printf("\n    请输入您的选择（0，1，2，3，4，6）"); 		scanf("%d",&m); 		switch(m) 		{ 			case 0:{ 			    Sequenlist * InitList (); 				  printf("ok\n"); 			   } 				break; 			case 1:{ L=creat();                     length=Length(L);                     printf("The length is %d\n",length);                     printf("Please input the location\n");                     scanf("%d",&location);                     value=GetData(L,location);                     printf("The number is %d\n",value); 		      } 				break; 			case 2:{ 				printf("Which place do you want to insert?\n"); //插入功能                 scanf("%d",&j);                 printf("Please input the number\n");                 scanf("%d",&number);                 flag=Insert(L,number,j);                 if(flag==0)                 printf("Failing to insert!\n");                 else                 {                     printf("Done!\n");                     print(L);                 } 		      } 				break; 			case 3:{ 				printf("Which place do you want to delete?\n"); //删除功能                 scanf("%d",&k);                 flag=Delete(L,k);                 if(flag==0)                 printf("Failing to delete!\n");                 else                 { printf("Done!\n");                 print(L);                 } 		      } 				break; 			case 4:{ 				printf("Which number do you want to find?\n"); //查找功能                 scanf("%d",&i);                 value=Find(L,i+1);                 if(value!=0)                 printf("The location is %d\n",value);                 else                 printf("There is no such number!\n"); 				break; 			} 	   } /*  switch  */      }while(m!=6);     printf("\n               再见！"); 	printf("\n          打回车键，返回。");   }引用

引用 3 楼 shanghj-的回复:那个，这两个问题改了，可是还是不行。 在调试模式下运行程序，出错了点中断，通过调用堆栈等窗口观察分析原因

那个，这两个问题改了，可是还是不行。

ListDelete_Sq( &a,  i, e);  改成  ListDelete_Sq( &a,  i, &e);


Question: c程序编译正常，运行出错，初步判定问题在指针上，求解决

引用 7 楼 user-4 的回复:ThreadPoint next;     next=(ThreadPoint)malloc(sizeof(ThreadPoint)); ///??? 你这里 分配一个 “ 指针大小” 的内存是做啥子？ ///一般都是 ：               struct  XXX *p = //结构体指针类型  (struct  XXX *) //强制转换成结构体指针类型 malloc( sizeof(struct  XXX) //结构体的大小 );   如果您有兴趣，可以看看刚写的博客，如有错误，请您指正。万分感谢！ 戳这儿：http://blog.csdn.net/firparks/article/details/52495525

引用 7 楼 user-4 的回复:ThreadPoint next;     next=(ThreadPoint)malloc(sizeof(ThreadPoint)); ///??? 你这里 分配一个 “ 指针大小” 的内存是做啥子？ ///一般都是 ：               struct  XXX *p = //结构体指针类型  (struct  XXX *) //强制转换成结构体指针类型 malloc( sizeof(struct  XXX) //结构体的大小 );  学习了 谢谢

引用 3 楼 qq423399099 的回复:1.你main函数调用createBinaryTree的时候，传的是&branch,也就是char **类型的，而函数声明是char * 2.createBinaryTree函数里字符串赋值用strcpy,而不是直接用= 学习了，多谢指教  很有用

引用 2 楼 adlay 的回复:char * branch;    scanf("%s",branch);        //一次性输入  这个指针都没有初始化, 使用当然出问题 你的编译器都不提醒你吗? dev c++ ，一下就编译通过了，措手不及。。。谢谢指教

引用 1 楼 zycxnanwang 的回复:楼主，建议你调试一下，别人调试没有自己来得深刻， 有百分之80的可能是你的结构体指针未分配空间，就直接对其指向， 典型的野指针问题！ 多谢指教 我试试


Question: 为什么输入一个字母后，会连续输出两个printf内容呢

因为读取到回车才结束，所以缓冲区还留着回车符，第二次循环直接从缓冲区读取了回车 所有显示了2次！可以在后面加上getchar 吃掉回车！

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

再或者这样：   #include <stdio.h> int main() { 	char ch[2]; 	char s; 	int i = 0; 	do{ 		printf("please enter the string!\n"); 		scanf_s("%s", ch, 2); 		s = ch[0]; 		if (s >= 'a'&&s <= 'z' || s >= 'A'&&s <= 'Z') 		{ 			printf("YES!"); 		} 	} while (s != '0'); 	printf("NO!\n"); }

每次输入完后的换行符 \n 会在下一次接收进来


Question: 结构体强制转换问题！！求教

这跟结构体转换没半毛钱关系，memcpy操作的是地址


Question: 如何用C语言在电脑上编程获取由单片机控制的wifi模块传输的数据

引用 4 楼 xr_zy1110 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] C和wifi中间还隔了一层socket 赵老师，有没有对socket初学者学习的知识链接呢？[/quote] 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

引用 1 楼 zhao4zhong1 的回复:C和wifi中间还隔了一层socket 赵老师，有没有对socket初学者学习的知识链接呢？

引用 2 楼 user-2 的回复:可以，楼主，我现在也在做这个，把外设监控的到信息，即时传递给显示服务器 您用的是在网页上显示吗

可以，楼主，我现在也在做这个，把外设监控的到信息，即时传递给显示服务器

C和wifi中间还隔了一层socket


Question: 有没有用c语言写过服务端通信接口的程序，求指导

不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

上  git ，上面有你想要的一切一切！！！  https://github.com/

#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/shm.h>   #define MYPORT  8887 #define QUEUE   20 #define BUFFER_SIZE 1024   int main() {		     ///定义sockfd     int server_sockfd = socket(AF_INET,SOCK_STREAM, 0);       ///定义sockaddr_in     struct sockaddr_in server_sockaddr; 	server_sockaddr.sin_family = AF_INET;     server_sockaddr.sin_port = htons(MYPORT);     server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);  	///bind，成功返回0，出错返回-1 	if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)     {	         perror("bind");         exit(1);     }   	///listen，成功返回0，出错返回-1     if(listen(server_sockfd,QUEUE) == -1)     {		         perror("listen");         exit(1); 	}       ///客户端套接字 	char buffer[BUFFER_SIZE];     struct sockaddr_in client_addr;     socklen_t length = sizeof(client_addr);      ///成功返回非负描述字，出错返回-1     int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);     if(conn<0)     {	         perror("connect");         exit(1);     }      while(1)     {	         memset(buffer,0,sizeof(buffer));         int len = recv(conn, buffer, sizeof(buffer),0);         if(strcmp(buffer,"exit\n")==0) 		    break;         fputs(buffer, stdout);         send(conn, buffer, len, 0);     } 	close(conn); 	close(server_sockfd);     return 0; }  我应该把我的数据加到这个程序的那块呀

我是要把批处理程序中的数据传到界面中显示， 我要写的是服务端， 前台给我发送请求，所以我要连接前台把数据把数据传给它

从前台发送命名，要求后台执行某种操作。

你说的后台和服务端是什么关系？  你已经有后台了为什么还要写服务端？

前台是一个报表系统，是用java写的客户端程序，我想用socket写服务端通信，但是不知道怎么写

你所说的“前台”是指什么？网页？还是pc的客户端程序？ 简单的可以使用xml json 传输，复杂的可以用soap。 当然也可以用protobuf之类的序列化工具

开一个socket服务器端

把整个架构大概描述一下啊，看到有报表系统，应该比较完备了吧，那把数据按格式填数据库里不完事了？

建议openresty建立http服务器，然后openresty和你的c程序通信来解决数据分发的问题。 如果是主动推送，那就得自己写服务器了。


Question: 帮我分析一下这个运算过程，谢谢

C++里的表达式 跟 算数里的算式 完全不是一回事。  把这个搞清楚很多事情就好理解了 ...

引用 11 楼 Zjuexing的回复:b++先用b运算再+1   b--也类似 ++a先+1再用a运算   --a也类似 楼主举的例题c=a-(b--)； 是因为b--为1，a为12 所以c=11  d=((a++)-b++)+(--c); a++为3， 因为++/--运算优先级高于+/- 所以先算b++为12， --c为3， d=3-12+3为-6 OK thank you

代码游戏, 合格的程序员从不会写这样的语句: d = ((a++)-b++)+(--c); 对C, C++程序员来说, 有时候避免错误最好的方式就是: Absolutely not to do that.

我推算了一下也是-6，这种++，--的东西有时候推论毫无意义

3-12+3 = -6

引用 6 楼 w15234491291的回复:[quote=引用 2 楼 小灸舞的回复:]楼主是怎么推算出的-5 就是++，--在变量前还是变量后的区别 是先参与计算再自加自减，还是先自加自减再参与计算 我是这样运算的，①先算a++得4；②因为b++是后自增，所以先运算4-b得-8，然后b++（b得13）；③再算--c得3；④最后-8+3得5。  （我是先算（a++）-b的），因为有这样一道题:     int a = 12;    int b = 1;    int c;        int c = a-(b--);     得到c =11;(这个过程就是先算a-b的)[/quote] a++ 和 b++ 都是后置的++，所以都最后才自加

引用 2 楼 小灸舞的回复:楼主是怎么推算出的-5 就是++，--在变量前还是变量后的区别 是先参与计算再自加自减，还是先自加自减再参与计算 我是这样运算的，①先算a++得4；②因为b++是后自增，所以先运算4-b得-8，然后b++（b得13）；③再算--c得3；④最后-8+3得5。  （我是先算（a++）-b的），因为有这样一道题:     int a = 12;    int b = 1;    int c;        int c = a-(b--);     得到c =11;(这个过程就是先算a-b的)

引用 1 楼 user-8的回复:d = ((a++)-b++)+(--c); 这个是看运算符的优先级：++和--都是高优先级，然后（）更高，最后是+，-。 所以第一步：计算a++：返回自加之前的结果，所以(a++) = 3; 第二步：计算b++：返回自加之前的结果，所以(b++) = 12; 第三步：计算--c：返回自减之后的结果，所以(--c) = 3; 第四步：计算上面结果的值：3 - 12 + 3 = -6; -8+3=-5（不好意思，写错了）

引用 1 楼 user-8的回复:d = ((a++)-b++)+(--c); 这个是看运算符的优先级：++和--都是高优先级，然后（）更高，最后是+，-。 所以第一步：计算a++：返回自加之前的结果，所以(a++) = 3; 第二步：计算b++：返回自加之前的结果，所以(b++) = 12; 第三步：计算--c：返回自减之后的结果，所以(--c) = 3; 第四步：计算上面结果的值：3 - 12 + 3 = -6; 我是这样运算的，①先算a++得4；②因为b++是后自增，所以先运算4-b得-8，然后b++（b得13）；③再算--c得3；④最后-8+3得5。  （我是先算（a++）-b的），因为有这样一道题:     int a = 12;    int b = 1;    int c;        int c = a-(b--);     得到c =11;(这个过程就是先算a-b的)

关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775


Question: C语言链表问题

你结构体的成员name,sex指针都是需要分配空间的，或者你就改成数组就行了，像下面这样：  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct member{ 	char name[32], sex[32]; 	struct member* pNext;  }Member, *PMember;  PMember createMember(){//创造头节点 	PMember head = NULL; 	head = (PMember)malloc(sizeof(Member)); 	head->pNext = NULL; 	strcpy(head->name, "1"); 	strcpy(head->sex, "1"); 	return head; } void display(PMember head){//显示输出 	if (NULL == head) return; 	PMember temp1 = head; 	for (; temp1 != NULL; temp1 = temp1->pNext){ 		printf("\t%s\t%s\n", temp1->name, temp1->sex);   	}  } void add(PMember head){//添加新成员 	PMember m = NULL; PMember temp = NULL; 	if (NULL == head)return; 	m = (PMember)malloc(sizeof(Member)); 	printf("请输入你的个人信息：\n"); 	scanf("%s%s", &m->name, &m->sex); 	m->pNext = NULL;  	for (temp = head; temp->pNext != NULL; temp = temp->pNext);  	temp->pNext = m; } int main(){ 	PMember head = NULL; 	head = createMember(); 	add(head); 	add(head); 	add(head); 	display(head); 	return 0; }

add函数中没有为name sex指针分配内存就直接在scanf中使用了  你只分配了member结构体内存，结构体中的指针仍指向一块不确定的位置


Question: C  语言顺序表实现问题--快求大神来解答

谢啦！！ 引用 1 楼 qq423399099 的回复:你malloc那句错了，所以导致有的内存空间被覆盖重写，所以打印出了这样的信息 Lc->elem = (ElemType*)malloc(sizeof(Lc->listsize));应该是： Lc->elem = (ElemType*)malloc(Lc->listsize * sizeof(ElemType));  #include <stdio.h> #include <stdlib.h>  #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10   #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASABLE -1 #define OVERFLOW -2  typedef int Status; typedef int ElemType;   //元素类型设置为int型  typedef struct { 	ElemType *elem; 	int length; 	int listsize; }SqList;      //顺序表定义  Status initList_Sq(SqList *L)             //初始化线性表 { 	L->elem = (ElemType *)malloc(sizeof(ElemType)*LIST_INIT_SIZE); 	if (!L->elem) 		exit(OVERFLOW); 	L->length = 0; 	L->listsize = LIST_INIT_SIZE; 	return OK; }  Status ListInsert_Sq(SqList *L, int i, ElemType e)   //在线性表的第i个位置插入元素e { 	if (i<1 || i>L->length + 1) 		return ERROR;  	if (L->listsize<L->length + 1) 	{ 		ElemType *newbase = (ElemType*)(realloc(L->elem, sizeof(ElemType)*(LIST_INIT_SIZE))); 		if (!newbase) 			exit(OVERFLOW); 		L->elem = newbase; 		L->listsize = L->length + LIST_INIT_SIZE; 	}  	ElemType *p = L->elem + i - 1, *q = L->elem + L->length - 1; 	for (; q >= p; q--) 		*(q + 1) = *q;  	*p = e; 	++L->length;  	return OK; }    int ListLength(SqList *L) { 	if (!L) 		exit(ERROR); 	else return L->length; }  Status GetElem(SqList *L, int i, ElemType *e)        //获取线性表中的第i个元素 { 	if (!L->elem) exit(ERROR); 	if (i<1 || i>L->length) return ERROR; 	*e = *(L->elem + i - 1); 	printf("%p:  ", L->elem + i - 1); 	return OK; }   Status MergeList_Sq(SqList *La, SqList *Lb, SqList *Lc)//合并两个线性表A和B到C中 { 	Lc->listsize = La->length + Lb->length;  	Lc->elem = (ElemType*)malloc(Lc->listsize * sizeof(ElemType)); 	ElemType *pa = La->elem, *pb = Lb->elem, *pc = Lc->elem; 	if (!pc) 		exit(OVERFLOW);  	while (pa < La->elem + La->length&&pb < Lb->elem + Lb->length) 	{ 		if (*pa < *pb) 		{ 			*pc++ = *pa++; 			//printf("%3d ",*(pc-1)); 		} 		else 		{ 			*pc++ = *pb++; 			// printf("%3d ",*(pc-1)); 		} 	}  	while (pa < La->elem + La->length) 	{ 		*pc++ = *pa++; 		// printf("%3d ",*(pc-1)); 	} 	while (pb < Lb->elem + Lb->length) 	{ 		*pc++ = *pb++; 		// printf("%3d ",*(pc-1)); 	} 	Lc->length = Lc->listsize; 	return OK; }  int main() { 	SqList *listA = (SqList*)(malloc(sizeof(SqList))); 	SqList *listB = (SqList*)(malloc(sizeof(SqList)));  	printf("%d\n", initList_Sq(listA)); 	printf("%d\n", initList_Sq(listB));  	int i = 100; 	for (i = 100; i<110; i++) 	{ 		ListInsert_Sq(listA, i - 99, i);    /*将100-109插入A中，*/ 		ListInsert_Sq(listB, i - 99, i + 20);       /*将120-129插入B中，*/ 	}  	SqList *listC = (SqList*)(malloc(sizeof(SqList))); 	MergeList_Sq(listA, listB, listC);      /*合并A,B到C中*/  	ElemType *e = (ElemType*)(malloc(sizeof(ElemType)));    //就是这里的malloc出问题了，结果中会看到。 	if (!e) 		exit(OVERFLOW); 	ElemType *p = listC->elem; 	for (i = 1; i <= listC->length; i++) 	{ 		GetElem(listC, i, e);      /* 将第i个元素赋予e,并将C中的元素打印出来*/ 								   printf("%3d\n ",*e);         	}  	free(listA->elem); 	free(listB->elem); 	free(listC->elem); 	free(listA); 	free(listB); 	free(listC); 	//free(e); 	return 0; }

谢啦！！ 引用 楼主 cothee 的回复:自己模仿课本（《数据结构（C语言版）》，严蔚敏，清华大学出版社，第2版）在数据结构线性表的顺序实现部分代码如下：  #include <stdio.h> #include <stdlib.h>  #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10   #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASABLE -1 #define OVERFLOW -2  typedef int Status; typedef int ElemType;   //元素类型设置为int型  typedef struct {     ElemType *elem;     int length;     int listsize; }SqList;      //顺序表定义  Status initList_Sq(SqList *L)             //初始化线性表 {     L->elem=(ElemType *)malloc(sizeof(ElemType)*LIST_INIT_SIZE);     if(!L->elem)         exit(OVERFLOW);     L->length=0;     L->listsize=LIST_INIT_SIZE;     return OK; }  Status ListInsert_Sq(SqList *L,int i,ElemType e)   //在线性表的第i个位置插入元素e {     if(i<1||i>L->length+1)         return ERROR;      if(L->listsize<L->length+1)     {         ElemType *newbase=(ElemType*)(realloc(L->elem,sizeof(ElemType)*(LIST_INIT_SIZE)));         if(!newbase)             exit(OVERFLOW);         L->elem=newbase;         L->listsize=L->length+LIST_INIT_SIZE;     }      ElemType *p=L->elem+i-1,*q=L->elem+L->length-1;     for(;q>=p;q--)         *(q+1)=*q;      *p=e;     ++L->length;      return OK; }    int ListLength(SqList *L) {     if(!L)         exit(ERROR);         else return L->length; }  Status GetElem(SqList *L,int i,ElemType *e)        //获取线性表中的第i个元素 {     if(!L->elem) exit(ERROR);     if(i<1||i>L->length) return ERROR;     *e=*(L->elem+i-1);     printf("%p:  ",L->elem+i-1);     return OK; }   Status MergeList_Sq(SqList *La,SqList *Lb,SqList *Lc)//合并两个线性表A和B到C中 {     Lc->listsize=La->length+Lb->length;      Lc->elem=(ElemType*)malloc(sizeof(Lc->listsize));     ElemType *pa=La->elem,*pb=Lb->elem,*pc=Lc->elem;     if(!pc)         exit(OVERFLOW);      while(pa<La->elem+La->length&&pb<Lb->elem+Lb->length)     {         if(*pa<*pb)         {             *pc++=*pa++;             //printf("%3d ",*(pc-1));         }             else             {                 *pc++=*pb++;                // printf("%3d ",*(pc-1));             }     }      while(pa<La->elem+La->length)     {         *pc++=*pa++;        // printf("%3d ",*(pc-1));     }     while(pb<Lb->elem+Lb->length)     {         *pc++=*pb++;        // printf("%3d ",*(pc-1));     }     Lc->length=Lc->listsize;     return OK; }  int main() {     SqList *listA=(SqList*)(malloc(sizeof(SqList)));     SqList *listB=(SqList*)(malloc(sizeof(SqList)));      printf("%d\n",initList_Sq(listA));     printf("%d\n",initList_Sq(listB));      int i=100;     for(i=100;i<110;i++)     {         ListInsert_Sq(listA,i-99,i);    /*将100-109插入A中，*/         ListInsert_Sq(listB,i-99,i+20);       /*将120-129插入B中，*/     }      SqList *listC=(SqList*)(malloc(sizeof(SqList)));          MergeList_Sq(listA,listB,listC);      /*合并A,B到C中*/      ElemType *e=(ElemType*)(malloc(sizeof(ElemType)));    //就是这里的malloc出问题了，结果中会看到。     if(!e)         exit(OVERFLOW);     ElemType *p=listC->elem;     for(i=1;i<=listC->length;i++)     {         GetElem(listC,i,e);      /* 将第i个元素赋予e,         printf("%3d\n ",*e);        并将C中的元素打印出来*/     }      free(listA->elem);     free(listB->elem);     free(listC->elem);     free(listA);     free(listB);     free(listC);     //free(e);     return 0; }  下面是debug的结果(运行环境是64位 linux<ubuntu16.04>)截图：    显然中间有几个不正常的值，正确输出应该是100到129的。从0x6037d8开始连续到0x6037e0,这段地址存的值应该是106,107,108的。以及后面0x6037f8和0x6037fc也不对，这里应该是124,125的。  然后看debug时的变量情况：    比较怪异的地方出现了，指针e是用malloc分配的，e指向了0x6037e0, 而这个地址竟然在malloc之前就已经被listC使用了（108因该存放在这个地址的，而上面该打印108的地方打印了0出来），这当然不合常理，于是这就耐人寻味了，所以，请大神来解答啦，已经被困惑一周了……


Question: c实现将mysql数据库中的数据转化为json数据在前台显示

在百度搜“C源代码 mysql json”

我现在要把后台程序中（c语言编写）的数据转化为json数据在前台显示（前台是JAVA)


Question: c语言

好久没用了，记不大清快捷键了。不要用F5执行，要用alt+F5？ 好像是调试运行那个，你多试几把，不是代码的问题，是运行方式不对

引用 6 楼 AS1832的回复: 那么，无法打开pdb文件是怎么回事呀。如果没这个问题，是不是就不会出现闪退问题呢？ 忽略这些提示，对你没有什么用

因为程序执行完就退出了  在main函数最后加上getchar();等待输入一个字符方才退出

现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！

直接点执行（ctrl+F5），而不要直接点调试（F5） 或者在函数结束前加一句system("pause") 那个PDB无法打开对你程序没影响，如果要解决可以参考：http://www.tuicool.com/articles/R3EBF3M

你scanf中的%f%f之间没有空格，为什么输入的时候有空格。这个是肯定要蹦

那我要不加断点呢，直接调试出结果。要怎么做呢，在哪设置呢

从背景来看，只看到有5行代码，应该是你输出之后没有暂停，所以结果才一闪而过，导致看不到输出结果吧； 你可以加入断点，调试确认

可能是出了结果，然后马上退出进程了。  你在代码中设置断点，然后按F5看看。

代码呢？  如果代码没错！是不是一闪而过? 如果是的话 在最后加个 system("pause");   记得带上stdlib.h


Question: C语言编程

嗯，我在你的指导下将scanf改为scanf_s.果然解决了这个问题。可是这个工程在哪里呀。求指导啊。刚刚接触这个软件，谢谢了啊

因为这个函数是不安全，可能造成缓冲区溢出，所以现在建议用scanf_s来代替 如果仍想用可以选择以下任何一种方法： 1、新建项目时不要勾选安全开发生命周期检查 2、在项目属性C/C++命令行中加上 /D _CRT_SECURE_NO_WARNINGS

1.高版本VS会让你用scanf_s来替代scanf 2.右击工程 - 属性 - 配置属性 - C/C++  - 命令行 命令行增加 /D _CRT_SECURE_NO_WARNINGS


Question: 得到有效数字为小数点后6位的数

需要得到小数点后第n位，之需将原数乘以10的n次方，然后对10取余

有效数字 与 小数点后位数 是两码事

#include <stdio.h>  int main() {     const double a = 1.0 / (3.0*3.0);     const double b = a * 1e6;     const int c = (int)b % 10;     printf("%d", c);     return 0; }

自己写个分数计算 或者用大整数当作实数计算

作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

仅供参考：#include <stdio.h> void a(double d,int n) {//有效数字为n位的数     printf("%.*lg\n",n,d); } void b(double d,int n) {//小数点后n位的数     printf("%.*lf\n",n,d); } int main() {     double c=100.0/(3.0*3.0);     int w;      //有效数字为6位的数     printf("%.6lg\n",c);      //小数点后6位的数     printf("%.6lf\n",c);      printf("\n");     for (w=1;w<15;w+=2) {         a(c,w);     }      printf("\n");     for (w=1;w<15;w+=2) {         b(c,w);     }      return 0; } //11.1111 //11.111111 // //1e+001 //11.1 //11.111 //11.11111 //11.1111111 //11.111111111 //11.11111111111 // //11.1 //11.111 //11.11111 //11.1111111 //11.111111111 //11.11111111111 //11.1111111111111 //


Question: struct hostent *phost= NULL;

引用 4 楼 liangziwan 的回复:[quote=引用 3 楼 adlay 的回复:] 先检查 phost = gethostbyname 返回的值是不是为 NULL, 如果为 NULL, 打印下错误信息看.  手动 ping 一下 ftp.gnu.org 看 DNS 设置是否有问题.  不为NULL，有值的。 是这样，我在虚拟机上已经编译通过，可以正常运行，但移植到开发板上，遇到“phost->”就报错！  Segmentation fault  这个应该是指针错误，属于内存分配的问题，关键我不知道怎么改！[/quote] 内存访问错误都会出 Segmentation fault, 不一定是内存分配问题. 把你返回值检查加到你的代码里面去, 而不是在调试器里面检查下不为 NULL 就行了. 这个是否为 NULL 是运行的时候做 DNS 解析能否成功的问题, 在不同的环境, 不同的时间都是可能不同的.

引用 3 楼 adlay 的回复:先检查 phost = gethostbyname 返回的值是不是为 NULL, 如果为 NULL, 打印下错误信息看.  手动 ping 一下 ftp.gnu.org 看 DNS 设置是否有问题.  不为NULL，有值的。 是这样，我在虚拟机上已经编译通过，可以正常运行，但移植到开发板上，遇到“phost->”就报错！  Segmentation fault  这个应该是指针错误，属于内存分配的问题，关键我不知道怎么改！

单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。


Question: 连接错误

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

1.getchar少了个括号 2.你的makeinfo写成了makeifo 3.showinfo写成了show  #include<stdio.h> #include<string.h> #pragma comment(lib,"ws2_32.lib")  #define NLEN 30 struct namect { 	char fname[NLEN]; 	char lname[NLEN]; 	int letters; };  struct namect getinfo(void); struct namect makeinfo(struct namect jiegou); void showinfo(const struct namect jiegou); char *s_gets(char * st, int n);  int main(void) { 	struct namect person;  	person = getinfo(); 	person = makeinfo(person); 	showinfo(person);  	return 0; }  struct namect getinfo(void) { 	struct namect person; 	printf("Please enter your first name."); 	s_gets(person.fname, NLEN); 	printf("Please enter your last name.\n"); 	s_gets(person.lname, NLEN);  	return person; }  struct namect makeinfo(struct namect jiegou) { 	jiegou.letters = strlen(jiegou.fname) + strlen(jiegou.lname);  	return jiegou; }  void showinfo(const struct namect jiegou) { 	printf("%s %s,your name contains %d letters.\n", jiegou.fname, jiegou.lname, jiegou.letters); }  char * s_gets(char * st, int n) { 	char *ret_val; 	char * find;  	ret_val = fgets(st, n, stdin); 	if (ret_val) 	{ 		find = strchr(st, '\n'); 		if (find) 			*find = '\0'; 		else 		while (getchar() != '\n') 			continue; 	} 	return ret_val; }

准确得说是 有无法解析的外部符号， 楼主倒数第五行的 getchar() 少一个括号


Question: 今天电脑被入侵发现了wmic中这段代码

怎么被入侵了？

执行成功，返回值 参数=2，就这样，看不出什么

不是create process吗?


Question: c语言编程

还有建议楼主， 程序的路径尽量不要有英文。

楼主 ， 你检查一下你打开的文件是否正确得打开， 看一下文件指针是否为null,注意文件路劲的写法!

断言失败，点中间重试，然后点中断，通过调用堆栈定位到相关代码，从断言内容看，你的问题应该是文件打开mode写错了

引用 4 楼 OnePeace888的回复:引用 2 楼 zycxnanwang 的回复:还有建议楼主， 程序的路径尽量不要有英文。没觉得有关系啊 打快错了，尽量不要有中文…

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

是不是打开模式有问题。 你把打开文件的那句话贴一下。


Question: C语言链表问题，在经过查询语句之后想再次输出或查询信息直接崩溃

1.search没有返回值 2.你main函数的head也有问题,switch外面有一个head,case1里面又有一个？ PS：你可以单步调试看看每一步的值是不是正确，经过查询语句之后你再输出崩溃了。 你可以打印下调用search前后的head地址是不是变了（甚至可以打印每个节点的地址），就知道问题了 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

引用 2 楼 user-4 的回复:你的 search 函数没有返回一个值 谢谢，少了 return

引用 3 楼 qq_36068954 的回复:做项目就好好做，干嘛跑来问别人 项目遇到不会的了，你给我继续做啊，请教过老师，但没有怎么说明，叫我自己测试，我不会请教下别人又怎么了，你这样搜有意思吗？

做项目就好好做，干嘛跑来问别人

你的 search 函数没有返回一个值

好像是数据丢失了。。。。。。。。。。。。希望大家帮帮忙


Question: C语言指针问题！总觉得p改变了

参考： 《深入理解C指针》

传引用，形参是实参的别名。 否则，都是传值，形参是函数内一个局部变量，实参拷贝给形参，形参改变后不影响实参。 参考swap函数。

引用 6 楼 visiual的回复:[quote=引用 5 楼 paschen 的回复:] 要改指针的值，要传入指针的指针 这个程序的输出是4,3，3，如果我注释掉int b=2;a=&b;输出是6，6，6，我觉得这时候，a作为一个临时变量，它与p指向的内容是相同的，对它的内容操作就改变了*p，k也改变了，这样理解对不对？ [/quote] 注释掉a=&b，后面那句*a将会修改到p指向的值（也即k或者是*p）

你记住实型，整形，字符型变量是单向值传递，如果是数组的话指针P指向的数据才会改变。

引用 5 楼 paschen 的回复:要改指针的值，要传入指针的指针 这个程序的输出是4,3，3，如果我注释掉int b=2;a=&b;输出是6，6，6，我觉得这时候，a作为一个临时变量，它与p指向的内容是相同的，对它的内容操作就改变了*p，k也改变了，这样理解对不对？

要改指针的值，要传入指针的指针

a=&b 没有改变p的值，你的函数是按值传递的，也就是传过来的只是一个复制品，你改也只是在改复制品

“这个p的副本，假设是p1”， 不用假定p1, 就是sp的参数a.  本质肯定差不多, 要么压入栈, 要么用寄存器传递, 要么被内联优化掉了, 可以尝试看一下汇编代码. 不需要懂汇编, 然后分别传递int k的值，与地址，看看生成的代码区别

引用 1 楼 user-4 的回复:sp(p)传了p的值...可以认为是传递了一个p的副本 sp函数里面修改了p的副本, 没有修改p本身, 要修改p本身就要传递p的地址.  想象一下:     int k = 3;     sp(&k);   这样也是完全合法的  这个p的副本，假设是p1，相当于设置了两个不同名的指针变量但都指向了k，在函数中p1指向了b，接着有改变了它的内容，整个过程与p无关是吗？我还想知道的是这个地址传递和值传递的本质是一样的吗？都是要创建临时副本？“假设注释掉int b=2;和a=&b;这样以来p1和p所指的内容是相同的，表面上改变了p1，实际上也p改变了，是不是？


Question: 关于链表的查询。学生信息系统的查找

楼主程序界面做的不错！  推荐楼主使用C++ Builder学习图形用户界面编程，入门比较容易。  仅供参考： 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/

引用 4 楼 blank__box的回复:[quote=引用 3 楼 paschen 的回复:] 在调试模式下运行程序，出错了点中断，通过调用堆栈定位到出错位置，然后观察分析原因，必要时单步跟踪程序运行 只要不运行查询语句块就是对的，但是一经过查询语句块之后就不能进行再次的显示和查询了，好像链表再那之后就消失了一样[/quote] 不要抱着脑袋去想好像是这好像是那，找问题最好的方式就是调试

我只想知道楼主是东软的吗

引用 5 楼 qq423399099 的回复:你用学号不是可以的吗？ 你用姓名查询会崩溃？ 建议楼主单步调试找到是哪句引发的。 或者贴出完整代码。 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  都能用，只是只能查一次，里面录入的信息好像就没有了，如果我第一次就用姓名查找也能查，反正就是查完之后，再想显示后者查找就出错

引用 3 楼 paschen 的回复:在调试模式下运行程序，出错了点中断，通过调用堆栈定位到出错位置，然后观察分析原因，必要时单步跟踪程序运行 只要不运行查询语句块就是对的，但是一经过查询语句块之后就不能进行再次的显示和查询了，好像链表再那之后就消失了一样

补图

补图