Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 还是功能机实例

回复:
user: user-1
content: 建议楼主先研读一下《编译原理》中的词法分析和有限状态自动机。

user: user-0
content: 引用 8 楼 u010030181 的回复:可以定义两个数组么？ A数组控制A操作，B数组控制B操作，当A和B操作的数字满足条件时就进行显示……A操作和B操作都是更复杂的代码，不能改变吧，不过可以将switch拆开试试，谢谢你给了个思路，还是大清早的，比较有精神^_^

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:建议楼主先研读一下《编译原理》中的词法分析和有限状态自动机。多谢赵老师赐教，编译原理是这本么，作者为Alfred V. Aho / Monica S.Lam / Ravi Sethi / Jeffrey D. Ullman

user: user-2
content: 可以定义两个数组么？ A数组控制A操作，B数组控制B操作，当A和B操作的数字满足条件时就进行显示……

user: user-0
content: 引用 6 楼 lovesmiles 的回复:[quote=引用 5 楼 liaocao2010 的回复:] [quote=引用 3 楼 lovesmiles 的回复:]  for(i = 0; i < 18; i++) { 	if(s[i]) 	{ 		switch(s[i]) 		{ 			case 0: 				显示空白；break; 			case 1:                                {                              				显示Mute On; break;//A发生了                              f(s[9]==5)                                  显示来电；break;//A发生时，B同时也发生了。                                 } 			case 5: 				显示来电；break; 		} 	} } 我说了两种情况下的s数组每个值不一样的，if（s[9]）这个时候不等于5[/quote]  我现在需要的就是当我进行A操作的时候，显示Mute On，在此基础上，再进行B操作，又显示来电，注意  是两者同时发生，都显示  那你这句话是什么意思？两者不同时发生？[/quote]两者是同时发生，但是我代码写的简单，不代表case 1:break之后一直停在这里等你按B操作啊，这一段函数都是重复在运行着，case1之后，你再进行B操作就已经是开始进行又一轮的switch了，不可能刚好你按的时候就是case1break的那一瞬间

user: user-3
content: 引用 5 楼 liaocao2010 的回复:[quote=引用 3 楼 lovesmiles 的回复:]  for(i = 0; i < 18; i++) { 	if(s[i]) 	{ 		switch(s[i]) 		{ 			case 0: 				显示空白；break; 			case 1:                                {                              				显示Mute On; break;//A发生了                              f(s[9]==5)                                  显示来电；break;//A发生时，B同时也发生了。                                 } 			case 5: 				显示来电；break; 		} 	} } 我说了两种情况下的s数组每个值不一样的，if（s[9]）这个时候不等于5[/quote]  我现在需要的就是当我进行A操作的时候，显示Mute On，在此基础上，再进行B操作，又显示来电，注意  是两者同时发生，都显示  那你这句话是什么意思？两者不同时发生？

user: user-0
content: 引用 3 楼 lovesmiles 的回复: for(i = 0; i < 18; i++) { 	if(s[i]) 	{ 		switch(s[i]) 		{ 			case 0: 				显示空白；break; 			case 1:                                {                              				显示Mute On; break;//A发生了                              f(s[9]==5)                                  显示来电；break;//A发生时，B同时也发生了。                                 } 			case 5: 				显示来电；break; 		} 	} } 我说了两种情况下的s数组每个值不一样的，if（s[9]）这个时候不等于5

user: user-0
content: 引用 2 楼 r_Jimy 的回复:现在你进行A操作，会显示MUTE ON 然后进行B操作，MUTE ON消失，显示来电对吗？ 首先确定MUTE ON与来电显示位置不冲突，接着要实现的话，只能去看下显示来电的相关代码 里，哪里把MUTE ON关掉了，把它干掉就可以了 关掉MUTE ON就是case0啊，显示位置不会冲突，来电的代码就是在CASE2里面，我简化了

user: user-3
content: for(i = 0; i < 18; i++) { 	if(s[i]) 	{ 		switch(s[i]) 		{ 			case 0: 				显示空白；break; 			case 1:                                {                              				显示Mute On; break;//A发生了                              f(s[9]==5)                                  显示来电；break;//A发生时，B同时也发生了。                                 } 			case 5: 				显示来电；break; 		} 	} }

user: user-4
content: 现在你进行A操作，会显示MUTE ON 然后进行B操作，MUTE ON消失，显示来电对吗？ 首先确定MUTE ON与来电显示位置不冲突，接着要实现的话，只能去看下显示来电的相关代码 里，哪里把MUTE ON关掉了，把它干掉就可以了

user: user-5
content: 既然 A操作s[4]=1，其他值为0 B操作s[9]=5，其他值为0 那怎么可能“当我进行A操作的时候，显示Mute On，在此基础上，再进行B操作，又显示来电”呢？？？ 你这种要求得要s[4]、s[5]可以同时不为0才可以。
user-0 提问: Linux Posix Timer

回复:
user: user-1
content: 1、启动时间是不受用户个性系统时间影响的 系统时间则会随用户修改而变化 这个的影响你测试一下应该就能明白  2、你不是测的挺明白了吗

user: user-0
content: Update
user-0 提问: C函数指针的值与指向函数的地址不同的疑惑

回复:
user: user-1
content: 在debug模式下, VS会在函数头部加一些保护，用于检查代码中可能出现的内存越界等错误。 你换成release模式或者用gcc试一下，就没有这个问题了。

user: user-2
content: vc默认是打开增量链接，所以指向转跳地址，关闭增量链接再试试...

user: user-3
content: 当你把这个函数地址当作数据的时候，都是偏移量。 只有当 CALL 的时候，才使用 E8 指令。

user: user-3
content: 这是优化了。一个是直接的地址，一个是偏移量。 她们在 CALL 的时候，不是同一个 CALL 指令。

user: user-0
content: 引用 2 楼 JiMoKuangXiangQu 的回复:给函数加上 static 限制。 这里（全局）函数调用被编译器处理成了间接调用，函数指针指向了跳转地址。 涉及到了编译链接的处理，重定位等。  个人意见，仅供参考。 打印出来的值是对的，上楼有图

user: user-0
content: 引用 1 楼 user-5 的回复:我用GDB调试，发现funPtr指向函数的地址，如下所示： (gdb) print &max $10 = (int (*)(int, int)) 0x400579 <max> (gdb) print &min $11 = (int (*)(int, int)) 0x400595 <min> (gdb) print funPtr $12 = (int (*)(int, int)) 0x400579 <max>  我用vs打印了一下，出来的结果是两者相同，但是变量监控窗口的值仍然不同。如图

user: user-4
content: 每个编译器的处理可能不同，多测试几个编译器试试看。

user: user-4
content: 给函数加上 static 限制。 这里（全局）函数调用被编译器处理成了间接调用，函数指针指向了跳转地址。 涉及到了编译链接的处理，重定位等。  个人意见，仅供参考。

user: user-5
content: 我用GDB调试，发现funPtr指向函数的地址，如下所示： (gdb) print &max $10 = (int (*)(int, int)) 0x400579 <max> (gdb) print &min $11 = (int (*)(int, int)) 0x400595 <min> (gdb) print funPtr $12 = (int (*)(int, int)) 0x400579 <max>
user-0 提问: float与double精度到底多少

回复:
user: user-1
content: http://bbs.csdn.net/topics/390676437

user: user-1
content: 请楼主亲自打开include\float.h查看其内容。

user: user-2
content: float的有效数字是6至7位。 最好不要超过6位。

user: user-3
content: 单精度有效数字是24位 -2*2^23 --- 2*2^23 ，大小范围是 -2^128 ~ +2^128

user: user-4
content: 去看《计算机组成原理》！！！
user-0 提问: 怎样用C语言设计一个类似滚动条的显示思路？

回复:
user: user-1
content: 如果只有英文和字母的话，　可以讲一下我做过的一个类似的东东  1. 做成一个8X22的显示Buffer 2. 以每行22个数据计算滚动最大值，滚动到最大值时，　刚好显示最后８行数据 3. 向上或者向下时计算出滚动位置，并且向显示模块发出更新通知  4. 显示模块收到更新通知时，根据滚动位置，把数据填写到 8X22的数据buffer中 　省略号可以考虑在这个步骤做成 5. 循环8次，　以行为单位把8X22的数据buffer中的数据显示出来  PS:　如果夹杂着中文，　计算滚动最大值和滚动位置会比较麻烦。

user: user-2
content: 引用 2 楼 zhao4zhong1 的回复:仅供参考//输入一个小于200的字符串，将该字符串以“_”分割成小于20的字串。请输出原串和子串。 //请注意以下测试用例： //·输入空串 //·输入长度为9的字符串 //·输入长度为19的字符串 //·输入长度为20的字符串 //·输入长度为38的字符串 //·输入长度为205的字符串 //·理论上还应该考虑输入串中包含_如何处理的逻辑（这个在我的代码中没有体现） #include <stdio.h> #include <string.h> char s[201]; char d[11][21]; int i,L,n; void main() {     fgets(s,201,stdin);     L=strlen(s);     if ('\n'==s[L-1]) {s[L-1]=0;L--;}     for (i=0;i<L;i++) {         d[i/19][i%19]=s[i];         if (i!=L-1 && 18==(i%19)) {             d[i/19][19]='_';             d[i/19][20]=0;         }     }     d[i/19][i%19]=0;     if (i>0 && 0==(i%19)) {         n=i/19;     } else {         n=i/19+1;     }     printf("s=\"%s\"\n",s);     for (i=0;i<n;i++) {         printf("d[%2d]=\"%s\"\n",i,d[i]);     } }  看不懂，把人看的眼花缭乱的

user: user-0
content: 引用 1 楼 u014444402 的回复:我的语文是体育老师教的，还是楼主的体育老师是教语文的？ 是我表述得不清楚。大概意思就是：因为屏幕一次最多显示8行数据，按下键盘的“上”和“下”按键，字符串会根据按下的按钮移动（就像我们平时浏览网页时拖动滚动条所看到的的效果），这样就可以回看到所有字符串了。现在就想设计这么一个功能的模块。没有任何控件，只有显示函数。

user: user-3
content: 仅供参考//输入一个小于200的字符串，将该字符串以“_”分割成小于20的字串。请输出原串和子串。 //请注意以下测试用例： //·输入空串 //·输入长度为9的字符串 //·输入长度为19的字符串 //·输入长度为20的字符串 //·输入长度为38的字符串 //·输入长度为205的字符串 //·理论上还应该考虑输入串中包含_如何处理的逻辑（这个在我的代码中没有体现） #include <stdio.h> #include <string.h> char s[201]; char d[11][21]; int i,L,n; void main() {     fgets(s,201,stdin);     L=strlen(s);     if ('\n'==s[L-1]) {s[L-1]=0;L--;}     for (i=0;i<L;i++) {         d[i/19][i%19]=s[i];         if (i!=L-1 && 18==(i%19)) {             d[i/19][19]='_';             d[i/19][20]=0;         }     }     d[i/19][i%19]=0;     if (i>0 && 0==(i%19)) {         n=i/19;     } else {         n=i/19+1;     }     printf("s=\"%s\"\n",s);     for (i=0;i<n;i++) {         printf("d[%2d]=\"%s\"\n",i,d[i]);     } }

user: user-4
content: 我的语文是体育老师教的，还是楼主的体育老师是教语文的？
user-0 提问: GetPrivateProfileString 访问冲突

回复:
user: user-1
content: 你的代码问题： 1. 很多的 new 没有对应 delete； 2. 字符集不统一。LPTSTR 是一个通用类型，可能是 char 也可能是 WCHAR，包括 API； 不知道你为什么那么喜欢用 new 呢，又不是未知大小。用 TCHAR lpPath[MAX_PATH]; 岂不更好？int main(int argc, char *argv[]) {     TCHAR lpPath[MAX_PATH] = TEXT("..\\") CONF_FILE_PATH;     TCHAR Path[32];     int Port;           //端口号     TCHAR Ip[16];       //ip地址     TCHAR Username[32]; //用户名     TCHAR Password[32]; //密码 //  UINT num; //  lstrcpy(lpPath, TEXT("..\\config.ini"));     Port = GetPrivateProfileInt(TEXT("config"), TEXT("port"), 80000, lpPath);     GetPrivateProfileString(TEXT("config"), TEXT("username"), TEXT("admin"), Username, _countof(Username), lpPath);     GetPrivateProfileString(TEXT("config"), TEXT("path"), NULL, Path, _countof(Path), lpPath);     GetPrivateProfileString(TEXT("config"), TEXT("ip"), TEXT("192.168.99.182"), Ip, _countof(Ip), lpPath);     GetPrivateProfileString(TEXT("config"), TEXT("password"), TEXT("12345"), Password, _countof(Password), lpPath);       _tprintf(TEXT("%s%d%s%s%s"), Path, Port, Ip, Username, Password);          return 0; }

user: user-0
content: 是在这里提示错误 GetPrivateProfileString("config", "username", "admin", "Username", 20, lpPath);
user-0 提问: 一个C语言疑问

回复:
user: user-1
content: 引用 11 楼 zhao4zhong1 的回复:栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，…… 赵老师从事什么行业？ 为什么csdn的引用没有消息提醒呢？

user: user-2
content: 你是什么系统啊 什么编译器啊，我怎么玩不出你这效果。

user: user-3
content: i 的存储位置开始时未初始化，输出随机，第二次调用时i 分配的还是同一空间，输出是上次留下的值

user: user-4
content: 把printf去掉，栈上的数据在第一次foo之后没有被破坏，foo返回只是栈顶指针修改了，第二次foo，i的栈地址不是刚好，而是肯定与第一次相同，所以是999

user: user-5
content: 当你第一次向一块内存写入一个数，然后把这块内存刚好分给了另一个变量，那个变量没有赋值来改变这块内存，所以就是第一个变量的值。

user: user-5
content: 当你第一次向一块内存写入一个数，然后把这块变量刚好分给了另一个变量，那个变量没有赋值来改变这块内存，所以就是第一个变量的值。

user: user-6
content: 第一次调用foo,　i在栈上被赋值999,第２次调用foo,i的栈地址刚好与第一次相同，所以就是９９９了。

user: user-0
content: 我的问题是第二个foo为什么会出现999，而不是一个随机数

user: user-7
content: 错误的代码 输出什么都不必奇怪  包括输出999

user: user-0
content: 能给个详细的说法么？

user: user-8
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-8
content: 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……
user-0 提问: 急啊，有人有openssh for windows的源码吗

回复:
user: user-0
content: 引用 7 楼 mLee79 的回复:试了下, 在cygwin下编译 dropbear 很方便, 几分钟就编译, 配置好了, 依赖的 库也很少.. 谢谢，已参考 KpyM SSH Server搞定了

user: user-1
content: 试了下, 在cygwin下编译 dropbear 很方便, 几分钟就编译, 配置好了, 依赖的 库也很少..

user: user-1
content: 错了, 在上面移植个 dropbear 很方便..

user: user-1
content: 引用 4 楼 yy175703252 的回复:[quote=引用 2 楼 mLee79 的回复:] 直接用 cygwin 版本啊.. 我要做些二次开发，所以不适合吧[/quote]  cygwin 整个都是开源的, 你编译出 libssh2.a 链接到你程序里就是了..

user: user-0
content: 引用 2 楼 mLee79 的回复:直接用 cygwin 版本啊.. 我要做些二次开发，所以不适合吧

user: user-0
content: 引用 1 楼 user-2 的回复:移植 openssh 不好做, 不如去修改 KpyM Telnet/SSH Server. c++ win32 cryptlib. BSD 协议. 很好. 恩貌似很不错，看看能不能为我所用，谢谢！

user: user-2
content: 移植 openssh 不好做, 不如去修改 KpyM Telnet/SSH Server. c++ win32 cryptlib. BSD 协议. 很好.

user: user-1
content: 直接用 cygwin 版本啊..
user-0 提问: 关于删除字符串中的一段字符的问题，懂的帮看看~~~

回复:
user: user-1
content: 仅供参考#include <stdio.h> #include <string.h> #include <locale.h> char s[256]; char *p; int r,n,i; int main() {     setlocale(LC_ALL,"chs");     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //

user: user-2
content: 我自己随便写的，不一定对。楼主也可以找strstr的源码自己照着写。 int Match(char *str,char const *want) {   int offset, i;   int len1, len2;   for (len1 = 0; str[len1] != '\0'; len1++) {     ;   }   for (len2 = 0; want[len2] != '\0'; len2++) {     ;   }   for (offset = 0; offset <= len1 - len2; offset++) {     for (i = 0; i < len2; i++) {       if (str[offset+i] != want[i]) {         break;       }     }     if (i == len2) {       return offset;     }   }   return -1; }

user: user-0
content: 引用 1 楼 user-2 的回复:先把所有的'/0'都改成'\0' 太丢人了~~~

user: user-0
content: 引用 2 楼 user-2 的回复:Match函数没看懂，我自己写了一个 int Match(char *str,char const *want)                      //查找目标字符串 {   char *p = strstr(str, want);   return (p == NULL) ? -1 : p - str; }  Del_substr函数里面这几行改一下就好了  p+=i;  if(*cq++ != '/0')  {  i++;  } 改成  while(*cq++ != '\0')  {  i++;  }  p+=i;不好意思，人家题目不让用str库函数~~~~

user: user-2
content: Match函数没看懂，我自己写了一个 int Match(char *str,char const *want)                      //查找目标字符串 {   char *p = strstr(str, want);   return (p == NULL) ? -1 : p - str; }  Del_substr函数里面这几行改一下就好了  p+=i;  if(*cq++ != '/0')  {  i++;  } 改成  while(*cq++ != '\0')  {  i++;  }  p+=i;

user: user-2
content: 先把所有的'/0'都改成'\0'
user-0 提问: xmlStringGetNodeList这个函数和xmlStringLenGetNodeList的区别

回复:
user: user-1
content: 问题1：xmlstringgetnodelist是获取节点的list，因为xml每个节点多有对应的标签 xmlstringlengthgetnodelist获取他的总长度  xml的节点都是根据标签来获取的，不管他多深，一级级的访问，获取对应的标签的内容
user-0 提问: 实在不知道什么回事啊

回复:
user: user-0
content: 引用 13 楼 jikexiyg 的回复:[quote=引用 10 楼 tyuiop1232 的回复:] [quote=引用 3 楼 jikexiyg 的回复:] float 乘以float数学上得到的结果应该是double 型的数据，但是你float add(float m,float n)函数返回的时float型数据，所以有警告信息说truncation from 'const double ' to 'float。 另外：你这两个数相乘干嘛起个名字叫add啊，这样容易引起误解，可读性差。 你说的这个我知道，但我不知道这个和我的问题有什么关系？乘后得到的是double型数23.46，但就算截断为float我想也不会变吧，真不知道这到底是怎么回事啊[/quote] 我上面只是解释了为什么会出现truncation from 'const double ' to 'float警告信息。关于为什么计算结果是23.459999而不是23.46这个问题的话就复杂了，这个是浮点数进度的问题，有很多定点数用浮点数只能近似的表示，这也是为什么浮点数不能替代定点数的一个原因，与浮点数在计算机中的存储方式等有关，这个深究的话就是计算机组成原理的知识了，这里给你推荐篇文章，详细讲解了这些问题： http://bbs.chinaunix.net/thread-3746530-1-1.html[/quote] 十分感谢

user: user-1
content: http://bbs.csdn.net/topics/390676437

user: user-2
content: 引用 10 楼 tyuiop1232 的回复:[quote=引用 3 楼 jikexiyg 的回复:] float 乘以float数学上得到的结果应该是double 型的数据，但是你float add(float m,float n)函数返回的时float型数据，所以有警告信息说truncation from 'const double ' to 'float。 另外：你这两个数相乘干嘛起个名字叫add啊，这样容易引起误解，可读性差。 你说的这个我知道，但我不知道这个和我的问题有什么关系？乘后得到的是double型数23.46，但就算截断为float我想也不会变吧，真不知道这到底是怎么回事啊[/quote] 我上面只是解释了为什么会出现truncation from 'const double ' to 'float警告信息。关于为什么计算结果是23.459999而不是23.46这个问题的话就复杂了，这个是浮点数进度的问题，有很多定点数用浮点数只能近似的表示，这也是为什么浮点数不能替代定点数的一个原因，与浮点数在计算机中的存储方式等有关，这个深究的话就是计算机组成原理的知识了，这里给你推荐篇文章，详细讲解了这些问题： http://bbs.chinaunix.net/thread-3746530-1-1.html

user: user-3
content: add怎么写return (m*n);

user: user-2
content: float 乘以float数学上得到的结果应该是double 型的数据，但是你float add(float m,float n)函数返回的时float型数据，所以有警告信息说truncation from 'const double ' to 'float。 另外：你这两个数相乘干嘛起个名字叫add啊，这样容易引起误解，可读性差。

user: user-4
content: 给大一点就会出现精度问题了。小的看不出来。

user: user-5
content: return (m*n);  4*5.865不就是23.45么？

user: user-6
content: 在计算机中一般的存储方式是无法精确存储浮点数的 http://zhidao.baidu.com/link?url=vUBysZ2qfeZne7AUYqcVxDp2kvJB0xk8BXVNg7rzvA1qG4ixG-gVuBd5utiHk0jCeSRJViQ64bjOt-0MovPR8_

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390676437 您好，谢谢你的帮助，但我才刚学，水平太次，不太能看的明白啊能告诉我怎样规避这种情形的发生吗？

user: user-0
content: 引用 3 楼 jikexiyg 的回复:float 乘以float数学上得到的结果应该是double 型的数据，但是你float add(float m,float n)函数返回的时float型数据，所以有警告信息说truncation from 'const double ' to 'float。 另外：你这两个数相乘干嘛起个名字叫add啊，这样容易引起误解，可读性差。 你说的这个我知道，但我不知道这个和我的问题有什么关系？乘后得到的是double型数23.46，但就算截断为float我想也不会变吧，真不知道这到底是怎么回事啊

user: user-0
content: 引用 4 楼 Indestiny 的回复:add怎么写return (m*n); 只是随手写个为了说明这个问题的，何况乘法的英语我不会

user: user-7
content: 浮点数本来就有这样的问题。

user: user-8
content: float的字面常量 需要加 f 后缀  float x=5.865f; float y=4f;

user: user-9
content: 引用 3 楼 jikexiyg 的回复:float 乘以float数学上得到的结果应该是double 型的数据，但是你float add(float m,float n)函数返回的时float型数据，所以有警告信息说truncation from 'const double ' to 'float。 ++
user-0 提问: 代码中有紧接着的两个独立的if语句，两个if分别判断两个按键是否被按下，是不是下面的if不会被执行？

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

user: user-1
content: 几句话的事情，自己动手比较好

user: user-2
content: if() { } if() { } 是这样的结构？这两个没有啥关系，只要上边的if没有return，下边的就会被执行到

user: user-0
content: 感谢两位,又学到了点东西

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

user: user-4
content: 如果第一个if中修改了第二个if的判断条件，则第二个if有可能不执行  如果第一个if中有流程控制语句，类似break，return，continue，goto，throw等等，则第二个if有可能不执行  如果第一个if中有越界，或者是栈溢出，恰好修改到了接下来的代码段地址，则第二个if有可能不执行  否则都是顺序执行下去的

user: user-5
content: 如果第一个if语句中没有跳过或返回的话，一般是按顺序执行的。 	 if (...) 	{  //以下情况第二个if不会执行 		//goto  RET  //goto跳过了第二个if语句 		return ;   //return直接返回  	} 	if () 	{ 	} RET: 	return ;  除非是if后面用else if语句才会是第一个if执行完第二个就不执行了： 	if (...) 	{  	} 	else if (...) 	{ 	} 	return ;
user-0 提问: C语言，十佳讲师

回复:
user: user-0
content: 样例输出 1 2 3 4

user: user-0
content: 题目描述 指针数组都替你定义好了，就看你会不会用，注意在评测系统中，一个汉字占三个字节，区别于平时我们系统中的两个字节，所以你在自己机器上运行时比较前2位，而提交系统时应比较串的前3位，而不是前2位  char *strs[407]={"赵","钱","孙","李","周","吴","郑","王","冯","陈","褚","卫","蒋","沈","韩","杨","朱","秦","尤","许","何","吕","施","张","孔","曹","严","华","金","魏","陶","姜","戚","谢","邹","喻","柏","水","窦","章","云","苏","潘","葛","奚","范","彭","郎","鲁","韦","昌","马","苗","凤","花","方","俞","任","袁","柳","酆","鲍","史","唐","费","廉","岑","薛","雷","贺","倪","汤","滕","殷","罗","毕","郝","邬","安","常","乐","于","时","傅","皮","卞","齐","康","伍","余","元","卜","顾","孟","平","黄","和","穆","萧","尹","姚","邵","湛","汪","祁","毛","禹","狄","米","贝","明","臧","计","伏","成","戴","谈","宋","茅","庞","熊","纪","舒","屈","项","祝","董","梁","杜","阮","蓝","闵","席","季","麻","强","贾","路","娄","危","江","童","颜","郭","梅","盛","林","刁","钟","徐","邱","骆","高","夏","蔡","田","樊","胡","凌","霍","虞","万","支","柯","昝","管","卢","莫","经","房","裘","缪","干","解","应","宗","丁","宣","贲","邓","郁","单","杭","洪","包","诸","左","石","崔","吉","钮","龚","程","嵇","邢","滑","裴","陆","荣","翁","荀","羊","於","惠","甄","曲","家","封","芮","羿","储","靳","汲","邴","糜","松","井","段","富","巫","乌","焦","巴","弓","牧","隗","山","谷","车","侯","宓","蓬","全","郗","班","仰","秋","仲","伊","宫","宁","仇","栾","暴","甘","钭","厉","戎","祖","武","符","刘","景","詹","束","龙","叶","幸","司","韶","郜","黎","蓟","薄","印","宿","白","怀","蒲","台","丛","鄂","索","咸","籍","赖","卓","蔺","屠","蒙","池","乔","阴","佟","胥","能","苍","双","闻","莘","党","翟","谭","贡","劳","逄","姬","申","扶","堵","冉","宰","郦","雍","却","璩","桑","桂","濮","牛","寿","通","边","扈","燕","冀","郏","浦","尚","农","温","别","庄","晏","柴","瞿","阎","充","慕","连","茹","习","宦","艾","鱼","容","向","古","易","慎","戈","廖","庚","终","暨","居","衡","步","都","耿","满","弘","匡","国","文","寇","广","禄","阙","东","殴","殳","沃","利","蔚","越","夔","隆","师","巩","厍","聂","晁","勾","敖","融","冷","訾","辛","阚","那","简","饶","空","曾","毋","沙","乜","养","鞠","须","丰","巢","关","蒯","相","查","后","荆","红","游","竺","权","逯","盖","益","桓","公"};  输入 整数n，接下来的n行有n个人名  输出 输出每个人的姓氏的编号  样例输入 4 赵本山 钱三强 孙悟空 李连富     写这道题。或者上面那道题，都行，需要一道
user-0 提问: 写字符串数组进入文件中

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  int main() {   FILE *outfile;   char string[256];    outfile=fopen("text.dat","w");   if(outfile==NULL)   {       printf("\nFailed to open the file.\n");       exit(1);   }    while (gets(string) && string[0] != '\0') {     fputs(string,outfile);     fputs("\n",outfile);   }    fclose(outfile);   return 0; }

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

user: user-1
content: 引用 2 楼 z530650681 的回复:while (gets(string) && string[0] != '\0') {     fputs(string,outfile);     fputs("\n",outfile);   } 这段的意思是什么？  fputs(string,outfile);不是全部写入了文件吧，为什么还有  fputs("\n",outfile); 每次循环读入一行，然后写入文件。 gets读到的字符串不包括回车，所以再单独打一个换行

user: user-0
content: while (gets(string) && string[0] != '\0') {     fputs(string,outfile);     fputs("\n",outfile);   } 这段的意思是什么？  fputs(string,outfile);不是全部写入了文件吧，为什么还有  fputs("\n",outfile);
user-0 提问: 如何找出n个数的全部子列，并输出

回复:
user: user-0
content: 大神果然厉害

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

user: user-2
content: 其实就是输出n位的二进制数。

user: user-3
content: 引用 2 楼 zhao4zhong1 的回复:二进制赵老师，我觉得你是搞底层的

user: user-1
content: 二进制

user: user-4
content: ...好不喜欢写c  你子列就是某一元素有或者没有  你是不是想到了什么
user-0 提问: 动态内存分配问题

回复:
user: user-0
content: 引用 1 楼 lovesmiles 的回复:不知道说什么。我说不行，你信吗？ 上午一个题目出现的问题，可能我问题没说清，算了吧，我自己查查书吧？，谢谢了

user: user-0
content: 引用 1 楼 lovesmiles 的回复:不知道说什么。我说不行，你信吗？ 不行指的是哪个？

user: user-1
content: 不知道说什么。我说不行，你信吗？
user-0 提问: 关于一个综合排序程序的几个小问题 我有些地方看不懂

回复:
user: user-1
content: int main() {     int i;     int rdm[SIZE];     int m[SIZE];     char name[20]  = "Random.txt";     char name1[20] = "BubbleSort.txt";     char name2[20] = "SelectSort.txt";     char name3[20] = "InsertSort.txt";     char name4[20]="Shellsort.txt";     choose();     printf("Start Creating 20000 random number\n");     Random(rdm,SIZE);     printf("Save them in file:Random.txt\n\n");     FileSave(name,rdm,SIZE);     system( "pause" );//如果你弹窗直接关闭的话可以加上这一行代码 }

user: user-1
content: 一: void Copy(int m1[],int m2[],int num) {    int i;    for(i = 0;i < num;i ++)      m1[i] = m2[i];    return; } 这里要复制是因为你每次排序前要把排序内容还原  二:       exchange += 3;这里是3是因为你下面有3次赋值           temp = m[min];           m[min] = m[i];           m[i] = temp;  三:     compare += 2;        exchange ++;       //compare += 2;这里你前面要加注释,要不然就重复了, 比较是(j >= 0) && (m[j] > temp)这两个比较,在上面if里  四: exchange += 1; 这里要看你这个变量是干什么,如果是说数据交换次数的换,1也是对的

user: user-1
content: 你的switch 不仅没把后面的加大括号, 还缺少case单个完后的break;  至于没有输出, 是因为你的输入被封装到choose方法里了, 你没用, 你可以把main拆开,并改成如下的:  void choose() { 	int k; 	printf("please choose 0:all sort  1 SelectSort\2 InsertSort\3 BubbleSort:"); 	scanf("%d",k); 	switch(k) 	{ 	case 0 : 		Copy(m,rdm,SIZE); 		printf("1 Run SelectSort..\n"); 		SelectSort(m,SIZE); 		FileSave(name1,m,SIZE);  		Copy(m,rdm,SIZE); 		printf(" 2 Run InsertSort..\n"); 		InsertSort(m,SIZE); 		FileSave(name2,m,SIZE);  		Copy(m,rdm,SIZE); 		printf("3 Run BubbleSort..\n"); 		BubbleSort(m,SIZE); 		FileSave(name3,m,SIZE);                 break; 	case 1: 		Copy(m,rdm,SIZE); 		printf("1 Run SelectSort..\n"); 		SelectSort(m,SIZE); 		FileSave(name1,m,SIZE);                 break; 	case 2: 		Copy(m,rdm,SIZE); 		printf(" 2 Run InsertSort..\n"); 		InsertSort(m,SIZE); 		FileSave(name2,m,SIZE);                 break; 	case 3: 		Copy(m,rdm,SIZE); 		printf("3 Run BubbleSort..\n"); 		BubbleSort(m,SIZE); 		FileSave(name3,m,SIZE);                 break; 	case 4: 		Copy(m,rdm,SIZE); 		printf("4 Run ShellSort..\n"); 		ShellSort(m,SIZE); 		FileSave(name4,m,SIZE);                 break; 	}  }  int main() { 	int i; 	int rdm[SIZE]; 	int m[SIZE]; 	char name[20]  = "Random.txt"; 	char name1[20] = "BubbleSort.txt"; 	char name2[20] = "SelectSort.txt"; 	char name3[20] = "InsertSort.txt"; 	char name4[20]="Shellsort.txt"; 	choose(); 	printf("Start Creating 20000 random number\n"); 	Random(rdm,SIZE); 	printf("Save them in file:Random.txt\n\n"); 	FileSave(name,rdm,SIZE); }

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-3
content: 你只是上了一堆代码，没有任何注释的代码，没人有耐心把每块代码都看一看的。 你的switch编译错误，是因为你的switch(k)后面的执行代码，没有用花括号全部括起来。

user: user-4
content: 楼下正解

user: user-0
content: 还有，如何把此程序修改为 可以比较排序耗时并显示 选出 较快的2种方法呢？

user: user-0
content: 把它们括起来以后程序可以编译运行了但是括号里面原本该PRINTF出来的内容都不显示了这是为什么啊？

user: user-0
content: 好的，我以后尽量把代码加上注释。还有，谢谢解答！
user-0 提问: socket客户端连接时必须用IP吗？

回复:
user: user-1
content: socket 要将域名转成ip

user: user-2
content: SOCKET sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sockfd != INVALID_SOCKET) { 	struct sockaddr_in addr = { 0 }; 	addr.sin_family      = AF_INET; 	addr.sin_port        = htons(6000); 	addr.sin_addr.s_addr = inet_addr("111.222.123.123"); 	memset(&addr.sin_zero, 0, sizeof(addr.sin_zero)); 	int ret = connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)); 	if (ret != 0) { 		struct hostent *host = gethostbyname("www.xxx.com"); 		if (host != NULL) { 			addr.sin_addr.s_addr = *(u_long *)*host->h_addr_list; 			ret = connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)); 		} 	} 	if (ret == 0) { 		// ...... 	} 	closesocket(sockfd); }

user: user-3
content: 应该是的吧。。。。。

user: user-4
content: 这，没听说socket什么时候支持过域名了。。。毕竟域名解析是DNS服务器干的事儿。。。我只能说这俩差的有点远。。。
user-0 提问: 需要改一段C代码适应x64

回复:
user: user-1
content: 4楼高手。 建议楼主通读include\intrin.h的具体内容。

user: user-2
content: x64专用：  #include <intrin.h>  int has_CPUID() {     unsigned _int64 flg = __readeflags() ^ 0x200000;     __writeeflags(flg);     return __readeflags() ^ flg ? 1 : 0;      }

user: user-3
content: 使用masm64写成一个函数，然后再链接进来。

user: user-4
content: 我见过的 x64 编译器都不支持内联汇编

user: user-5
content: vc x64已经不允许你写inline assembly了。
user-0 提问: 如何返回第一个非空白字符

回复:
user: user-1
content: while(isspace(ch=getchar()))   ;

user: user-0
content: 自己刚研究出一种 还有没有啊 #include<stdio.h> #include<ctype.h> char get_first(void); int main(void) {    char ch;     ch=get_first(); 	putchar(ch); 	 } char get_first(void) { 	int ch; 	int n;       ch=getchar();      while(n=isspace(ch)?1:0)     	ch=getchar();      	   	while(getchar()!='\n') 	continue; 	return ch; 	 }

user: user-2
content: 我功力還不夠阿
user-0 提问: 哪位大哥来帮小弟看看（C 函数原型）

回复:
user: user-1
content: 你要先看一下指針就會明白了

user: user-2
content: 是一种数据类型

user: user-3
content: char是字符类型，char*是字符指针类型。括号中是函数的参数列表。 char *strcpy(char *dst, const char *src); 拷贝src指向的字符串到dst指定的内存处，返回dst。

user: user-4
content: 看二楼
user-0 提问: 这么晚了有没有大神在啊？？帮忙看道题啊~~

回复:
user: user-0
content: 引用 4 楼 gz_qmc 的回复:  感谢感谢~~好人啊！

user: user-1
content: 为毛都是图片

user: user-2

user: user-3
content: 手头没电脑么？ 搞个循环试一下不就知道了？

user: user-4
content: 你先从2维的试试

user: user-0
content: 求赐教~~
user-0 提问: 关于动态库和静态库中同名函数的链接问题

回复:
user: user-1
content: 这个明显应该选A。。。不知道是C程序猿整体水平退化了还是回答的人都不是搞C的

user: user-2
content: 今天维护老项目的bug， 发现了这个问题。 3、5楼的前辈说的是对的,  两个动态库各自实现一个同名c函数，编译没问题。但是c没函数重载的概念,  链接的时候前一个会覆盖后一个。

user: user-3
content: 对于答案c我也不觉得有什么错误，这个问题主要是看链接器对于重名的符号的处理。对于两个静态库包含相同的函数（这里只讨论非static修饰的函数），意味着两个静态库包含了重名的符号，那么在同时链接这两个静态库的时候是可以产生链接错误的。我相信在某些版本的链接器上是会这么做的。

user: user-4
content: 为什么我觉得D是错误的. 理论3楼已经讲了. 两个静态库有同名函数, 链接时会出错, 报函数重复定义, 因此C是对的. 两个动态库有同名函数, 动态加载时先加载的优先. (当然如果这两个同名函数完全不一样, 那么调用后一个会变成调用前一个, 导致逻辑错误). 从功能上是允许的, 因此D是错误.

user: user-5
content: 《程序员的自我修养——链接、装载与库》

user: user-6
content: C是错的，这个我知道。因为公司已有的公共库A中的代码有点问题，然后我把相关代码抽取出来修改后生成B库（接口没变，只是修改了内部的逻辑），然后链接的时候B放在前面，A放在后面，链接器选择的是B中的符号，没出现问题。

user: user-7
content: 以下是在其它地方看到的，你可以参考下       函数可以定义在3个地方1. 程序自身2. 静态库3. 动态库因为静态库是要链进程序的，所以函数定义在程序和静态库可以看成是一样的同名函数出现在程序和静态库中，链接时会报重定义的错误。同名函数出现在动态库中，编译链接都可以通过，但是调用会出问题，会出现覆盖问题。     定义在这3个地方的函数，会调用哪个函数呢？     1. 程序和静态库定义了同名函数，链接报错：重定义     2. 程序或静态库定义的同名函数，会覆盖动态库中定义的函数     3. 动态库中定义的同名函数，先链接覆盖后链接的函数  来源：http://blog.chinaunix.net/uid-26548237-id-3994017.html

user: user-7
content: 就是选c吧!
user-0 提问: 拜托了 各位大大  我想用fputs（c，fp）；在终端上向文本文件中输入换行  坐等啊 各位大大们  我就只是想输入个换行 怎么就这么难啊

回复:
user: user-1
content: Windows:Enter,Ctrl+Z,Enter

user: user-2
content: Windows结束用ctrl-z，Linux结束用ctrl-d  int main() {     int ch;     FILE *fp = fopen("my.txt", "w");     if (NULL == fp) {         fprintf(stderr, "Can't open file\n");         return -1;     }      while (EOF != (ch=fgetc(stdin))) {         fputc(ch, fp);     }     fclose(fp);     return 0; }

user: user-3
content: 标准输入、输出对应终端设备时通常是行缓冲的。  You can use "while, for" read multi-times.

user: user-4
content: 引用 2 楼 jwj070524 的回复:Windows结束用ctrl-z，Linux结束用ctrl-d  int main() {     int ch;     FILE *fp = fopen("my.txt", "w");     if (NULL == fp) {         fprintf(stderr, "Can't open file\n");         return -1;     }      while (EOF != (ch=fgetc(stdin))) {         fputc(ch, fp);     }     fclose(fp);     return 0; } 貌似只有这个方法了

user: user-4
content: 引用 1 楼 misskissC 的回复:标准输入、输出对应终端设备时通常是行缓冲的。  You can use "while, for" read multi-times.+1
user-0 提问: 网络编程中应该有几个接受线程，较为合适？ 

回复:
user: user-1
content: 问题1： iocp就是多个线程在投递io的， 对于sendio，1个socket只由一个线程递交wsasend，不可以多个线程对1个socket去wsasend就可以了，不会乱序 对于recvio，只要保证你wsarecv递交的buf是有序的就可以了，后递交的buf先返回了，需要程序自己控制解包的顺序  问题2： recv，send都是区分socket的，不同的客户端，就是不同的socket，不会出现socket1的recv，收到的却是socket2的数据 但是会出现socket1的recv，先接受到数据的迁移部分，再recv一次接收到后一部分，需要程序自己组装数据

user: user-2
content: 引用 5 楼 u012879806 的回复:[quote=引用 4 楼 lovesmiles 的回复:] 你的问题还是二个客户端的问题，客户端一的数据和客户二的数据本来就没有顺序可言吧？  它们是没有顺序可言  这么说吧， 客户端和服务端都定义了协议。  那么服务端如何保证，完整的收到一个包呢？    2个客户端都发送了数据给服务端，服务端 读取了客户端1的包头，知道 下一次recv 应该收取多少数据，  但是 “下一次recv" 可能收到 客户端2的数据啊。 该怎么办？  我这问题是不是太偏僻，钻牛角尖了吗？  你们平时网络编程，不需要考虑这个问题吗？    [/quote]  你真的连socket编程都没有搞懂。每一个socket都有一个系统缓冲区，每一个recv都要指定从那个socket接收数据。  不同的客户端发送的数据会被系统保存在不同的socket缓冲区里面，根本不会有联系，何来乱序可言？

user: user-0
content: 引用 2 楼 lovesmiles 的回复:同一个socket的数据还是按顺序接收到的，只是接收完之的怎么处理，就要看工作线程怎么同步了。 假如是接收二个socket的数据，乱序有什么关系？本来就是不同的客户端的数据，在那个网络层都没有保证它们的顺序。  问题2：   在堵塞io模型中， 假设有2个客户端发送数据给服务端，服务端只有一个接受线程，  请问; 收到的数据会乱序吗？   比如客户端1 发送了很多数据， 但是服务端某一次只接受了客户端1部分数据， 第2次recv就接受了客户端2的数据。  这种可能性会不会产生？   如果会的话，我如何避免。   求思路解决问题2

user: user-2
content: 同一个socket的数据还是按顺序接收到的，只是接收完之的怎么处理，就要看工作线程怎么同步了。 假如是接收二个socket的数据，乱序有什么关系？本来就是不同的客户端的数据，在那个网络层都没有保证它们的顺序。

user: user-3
content: 推荐你参考下这篇博文http://blog.csdn.net/neicole/article/details/7549497，对IOCP模型不了解。一般嘛创建一个线程池，来一个客户请求就唤醒一个空闲线程去处理

user: user-4
content: 《TCP/IP详解卷一：协议》

user: user-5
content: scoket跟线程有毛关系呢。    引用 5 楼 u012879806 的回复:[quote=引用 4 楼 lovesmiles 的回复:] 你的问题还是二个客户端的问题，客户端一的数据和客户二的数据本来就没有顺序可言吧？  它们是没有顺序可言  这么说吧， 客户端和服务端都定义了协议。  那么服务端如何保证，完整的收到一个包呢？    2个客户端都发送了数据给服务端，服务端 读取了客户端1的包头，知道 下一次recv 应该收取多少数据，  但是 “下一次recv" 可能收到 客户端2的数据啊。 该怎么办？  我这问题是不是太偏僻，钻牛角尖了吗？  你们平时网络编程，不需要考虑这个问题吗？    [/quote]  既然是2个client，你recieve总是要传2个不同的socket吧，2个client又有毛关系呢

user: user-0
content: 引用 4 楼 lovesmiles 的回复:你的问题还是二个客户端的问题，客户端一的数据和客户二的数据本来就没有顺序可言吧？  它们是没有顺序可言  这么说吧， 客户端和服务端都定义了协议。  那么服务端如何保证，完整的收到一个包呢？    2个客户端都发送了数据给服务端，服务端 读取了客户端1的包头，知道 下一次recv 应该收取多少数据，  但是 “下一次recv" 可能收到 客户端2的数据啊。 该怎么办？  我这问题是不是太偏僻，钻牛角尖了吗？  你们平时网络编程，不需要考虑这个问题吗？

user: user-2
content: 你的问题还是二个客户端的问题，客户端一的数据和客户二的数据本来就没有顺序可言吧？
user-0 提问: 数据结构里的行编辑程序，总是有错误不能得到答案

回复:
user: user-0
content: 引用 2 楼 user-1 的回复:输入的字符串都读到ch里面了，可是这个ch后边也没用到啊，到了LineEdit里面又getchar()，就又要等键盘输入了？ 这个思路有点矛盾。或者不要ch，直接到LineEdit里面读键盘；或者就读了ch，然后把ch作为参数传进LineEdit，然后到LineEdit里就不用读键盘了。谢谢你啊 ，内存的问题解决了。 无限循环的问题也找到了，我用变量c来判断字符是什么，结果循环中的getchar没记录，，c就一直是第一个字符。

user: user-1
content: IsEmpty好像也有问题，top为什么要加1？这和EmptyStack、InitStack都不一致呀。

user: user-1
content: 输入的字符串都读到ch里面了，可是这个ch后边也没用到啊，到了LineEdit里面又getchar()，就又要等键盘输入了？ 这个思路有点矛盾。或者不要ch，直接到LineEdit里面读键盘；或者就读了ch，然后把ch作为参数传进LineEdit，然后到LineEdit里就不用读键盘了。

user: user-1
content: 引用 楼主 u011385329 的回复:然后用breakpoint一行行的测试发现getchar第一个读到的就是'\n' 内存错误在gettop函数里，应该是因为是空栈，而且没判断条件的原因。 第一个读到的'\n'，就是输入字符串的时候敲的回车。scanf把字符串读到了ch里面，回车留在了缓冲区里被getchar读到了。 GetTop(*s, m);  这个m没初始化是个野指针。建议改成 char m; GetTop(*s, &m);
user-0 提问: 求哪位大神帮我看一下下面这段代码出错在哪，它可以编译但运行到一半就报内存使用冲突

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

user: user-0
content: 因为如果用字符的话在我做等值判断时，编译器会报错说无法进行比较。

user: user-2
content: 为什么用ascll数值表示+-*/，这可读性多差啊
user-0 提问: 通过指针输出一位数组，求解这是哪里错了，为什么运行不出来

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

user: user-2
content: *(p+1)中，p+1仅仅得到一个临时的指针对象而已，并没有使p指向后移。

user: user-3
content: #include"stdio.h" void zhizhen(int*p,int len) {     int i;     for(i=0;i<len;i++)     {         printf("%d ",*(p+i));     }     printf("\n"); } int main(void) {     int a[5]={12,3,41,231,44};     zhizhen(a,5);     return 0; }

user: user-4
content: printf("%d",*(p+1)); 最后打印有问题，别人都说了

user: user-5
content: void point(int *p,int len) { int i=0; for(i;i<len;i++) printf("%d",*p++); }

user: user-6
content: 你的指针p在每次循环之后没有指下一个元素啊，改成这样就好了： #include"stdio.h" void zhizhen(int*p,int len) {     int i;     for(i=0;i<len;i++)     {         printf("%d ",*(p++));     }     printf("\n"); } int main(void) {     int a[5]={12,3,41,231,44};     zhizhen(a,5);     return 0; }

user: user-7
content: 难道不应该是 printf("%d",*p); 么？
user-0 提问: 求参数 8位数组，4个相加怎么才没有重复的

回复:
user: user-1
content: 8个数组 4个一组的相加  具体是怎么分组的？比如8个元素必须全部使用，还是两个分组中最多允许3个相同的元素？

user: user-2
content: 其实只需要一个奇数，剩下的都是偶数就可以了，这样加和中必然有一个奇数有一个偶数。

user: user-3
content: 任取一个基数x, 这8个数取值1, x, x^2, x^3, ..., x^7, 即可. 特别的x=2时就是1楼的答案

user: user-4
content: 1,2,4,8,16,32,64,128 ?

user: user-5
content: 2楼正解，只要两个数之间相差够大即可
user-0 提问: C语言socket 连接局域网由于目标机器积极拒绝

回复:
user: user-1
content: 目测是多网卡问题造成的，

user: user-2
content: 还有个可能，server所在机器的防火墙是打开的，连接直接被拒绝了

user: user-3
content: gethostname(Server_name, 128);       hp = gethostbyname(Server_name);           //获取本机名   memset(&sa, 0, sizeof(sa)); //初始化         memcpy(&(sa.sin_addr), hp->h_addr, hp->h_length); //设置服务器的IP地址   把这个地址打印出来看看是不是服务器的ip。 这个函数的返回直不一定是你想要的。

user: user-4
content: 问题可能处在server端的这里： memcpy(&(sa.sin_addr), hp->h_addr, hp->h_length); //设置服务器的IP地址    hp->h_addr其实是hp-> h_addr_list[0]，如果服务端有多个ip，那么你只绑定了一个ip，如果不巧这个ip是个公网ip，那么所有局域网数据都会被这个绑定的socket忽略(哪怕port相同)。 既然是服务器，为什么绑定IP不设置成INADDR_ANY? 这样不管哪个网段收到的请求都能够获得。

user: user-0
content: 调用了，我没有粘贴过来	SOCKET sock1=accept(sock,(SOCKADDR*)&addr[k],&nlen);

user: user-5
content: 服务器端还要调用函数accept
user-0 提问: 麻烦各位帮我看看程序，带入数组名和指针的区别

回复:
user: user-1
content: *a="abcdeab"; 会在只读数据区分配8字节的空间, 填写"abcdeab\0" 而a[7]="abcdeab";  分配7字节空间, 填写"abcdeab\0",  其中最后一个字节越界了,写在其他数据内存中.  当初始化其他变量, 例如b[2]="ab";时就会把这个'\0'覆盖掉. b的情况也类似, 因此用数组的结果会是错误的

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

user: user-3
content: 你的a[7]根本放不下"abcdeab"这个字符串啊～它后面还有一个空字符'\0'来表示字符串的结尾，需要a[8]才能放下，不然就不是一个完整的字符串，这样运行起来什么奇葩的事情都有可能发生。

user: user-4
content: 引用 1 楼 bbs2241 的回复:*a="abcdeab"跟a[7]="abcdeab"是不一样的 前面的编译器会自动加个\0,后面的不加 两个都要'\0'。 只有非C风格字符串才会没有'\0'。 比如这种： char s[] = { 'a', 'b', 'c' };

user: user-4
content: 两个定义都有问题。C风格字符串都会在末尾有一个'\0'作为结尾，你7个字符就要申请8个字符的内存。 数组名在有些表达式中会被当作指针来使用，但并不是说它就是一个指针。

user: user-5
content: *a="abcdeab"跟a[7]="abcdeab"是不一样的 前面的编译器会自动加个\0,后面的不加
user-0 提问: ASCII值为0的对应什么字符啊，我用VC6.0试了下怎么得到的是空格，空格那个不是32吗？

回复:
user: user-0
content: 引用 3 楼 u012421456 的回复: 表示‘\0’ 你的程序不妨拿出来看看，建议不要用VC6了 谢谢你的回答，我发现'\0'在VC里输出来就是空格形式表现。。我刚接触C，也不懂用什么，请教下不用VC的话用什么比较好呢？

user: user-1
content: 表示‘\0’ 你的程序不妨拿出来看看，建议不要用VC6了

user: user-0
content: 引用 1 楼 dbzhang800 的回复:你怎么试的，这个才是关键！！  #include <stdio.h> int main() {char a=0; printf("%c",a);}

user: user-2
content: 你怎么试的，这个才是关键！！

user: user-1
content: 有许多人问过这样的问题了——http://bbs.csdn.net/topics/330154077 我个人觉得dev c++、c-free等都不错，我现在就是这个，有时也是用gcc

user: user-3
content: 那只是表象啊，就是NULL

user: user-4
user-0 提问: CRC-CTITT程序求详解  菜鸟跪求

回复:
user: user-1
content: 对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:unsigned short CRC16(unsigned char *buf,int len) {     unsigned short CRC = 0xffffu;     int i,j;      for (i=0;i<len;i++) {         CRC ^= *buf++;         for (j=0;j<8;j++) {             if (CRC & 0x0001u)                 CRC = CRC >> 1^0xA001u;             else                 CRC >>= 1;         }     }      CRC = ((CRC << 8) & 0xFF00u) | ((CRC >> 8) & 0x00FFu);     return CRC; } 介个 赵4老师能讲解下我发的代码不

user: user-1
content: unsigned short CRC16(unsigned char *buf,int len) {     unsigned short CRC = 0xffffu;     int i,j;      for (i=0;i<len;i++) {         CRC ^= *buf++;         for (j=0;j<8;j++) {             if (CRC & 0x0001u)                 CRC = CRC >> 1^0xA001u;             else                 CRC >>= 1;         }     }      CRC = ((CRC << 8) & 0xFF00u) | ((CRC >> 8) & 0x00FFu);     return CRC; }
user-0 提问: 关于C语言中malloc的疑问

回复:
user: user-1
content: 在我们调用时，我们不知道里面是如何分配内存可以去看看malloc的实现  不过，平时自己实现内存池的时候，就有很多方案了，得到的地址不是按分配多少决定就很正常了  不如：在申请内存时，多申请一点，前面表示内存大小，或者其他标记....再或者申请的时候，查看池中是否有空闲合适内存等等...  还想到得到连续的地址....  所以得看malloc的实现，“随机分配”一说....

user: user-2
content: 同意二楼，内存是随机分配的，你让 代码改成如下，其地址间距仍然保持不变  #include<stdio.h> #include<stdlib.h> int main() { 	char* s1 = (char *)malloc(sizeof(char)*4); 	char* s2 = (char *)malloc(sizeof(char)*5); 	char* s3 = (char *)malloc(sizeof(char)*10); 	 	printf("sizeof(char)=%ld\n", sizeof(char)); 	printf("s1 = %p\n", s1); 	printf("s2 = %p\n",s2); 	printf("s3 = %p\n", s3);    return 0; }

user: user-2
content: louzhu ,你实际运行这段代码了吗？

user: user-3
content: malloc 是随意分配内存的吧

user: user-4
content: 这个和malloc的实现有关吧。  一般内存池会维护各种大小的内存队列。比如16，32，64等， 对于小内存的分配，malloc会直接从对应的最小的队列上面取下一块内存。 比如要分配1个字节的内存，最小的队列是16的话，就在这队列上面取一块下来，所以每块内存之间的地址间隔就是16。 等到16的队列用完了，就会在大的队列，比如32的队列上面取下来。当所有的队列都用完了。 malloc会尝试回收内存，如果还是没有内存，就报错。

user: user-5
content: 参考linux源代码中malloc函数的实现。
user-0 提问: 多线程下载软件是如何提高效率的？

回复:
user: user-1
content: 就是同时建立多个连接下载同一个文件的不同部分。 所以没必要一定要多线程（单线程用非阻塞socket也可以达到同样目的，只不过多线程每个线程负责一个socket的传输编写代码方便）。

user: user-0
content: 引用 2 楼 taodm 的回复:那都是猴年马月的事啦。 另外，是多任务下载，不是一定就多线程下载 问题是有点老，不过能给点指点吗

user: user-2

user: user-3
content: 那都是猴年马月的事啦。 另外，是多任务下载，不是一定就多线程下载

user: user-4
content: 帮顶，目前需要了解这块知识
user-0 提问: 用Source Insight 3.5编辑代码，代码中写了注释，突然不知什么原因，注释变成乱码了.

回复:
user: user-1
content: 应该是你编码方式不对 参考http://jingyan.baidu.com/article/ae97a646a5e499bbfc461d54.html

user: user-2
content: 使用Notepad++, 修改成其它字符编码.

user: user-0
content: 可能是二个编辑器同时用,另一个是对比工具，对比工具的编码方式是GB2312, 这个原因造成的.
user-0 提问: NULL和0有什么区别啊

回复:
user: user-0
content: 引用 7 楼 zilaishuichina 的回复:[quote=引用 6 楼 tyuiop1232 的回复:] [quote=引用 5 楼 zilaishuichina 的回复:] 0是数字，是值 NULL是一个宏，这个宏对应的值是多少是人为规定的，一般规定为0，你看也可以重新规定 谢谢你的回答，我还想问下宏对应的这个0是数字0还是字符0，还是都可以的[/quote]  一般对应的是数字0  如果你要对应字符0，从语法上也是可以的，但是意义就不一样的，数字0和字符0，值是不一样的[/quote] 3q

user: user-1
content: 引用 6 楼 tyuiop1232 的回复:[quote=引用 5 楼 zilaishuichina 的回复:] 0是数字，是值 NULL是一个宏，这个宏对应的值是多少是人为规定的，一般规定为0，你看也可以重新规定 谢谢你的回答，我还想问下宏对应的这个0是数字0还是字符0，还是都可以的[/quote]  一般对应的是数字0  如果你要对应字符0，从语法上也是可以的，但是意义就不一样的，数字0和字符0，值是不一样的

user: user-0
content: 引用 5 楼 zilaishuichina 的回复:0是数字，是值 NULL是一个宏，这个宏对应的值是多少是人为规定的，一般规定为0，你看也可以重新规定 谢谢你的回答，我还想问下宏对应的这个0是数字0还是字符0，还是都可以的

user: user-1
content: 0是数字，是值 NULL是一个宏，这个宏对应的值是多少是人为规定的，一般规定为0，你看也可以重新规定

user: user-2
content: 作为一种风格, 很多人不愿意在程序中到处出现未加修饰的0。因此定义了预处理宏NULL,通常是((void *)0).参考：《你必须知道的495个c语言问题》

user: user-3
content: NULL expands to an implementation-defined null pointer constant C 一般是((void *)0)

user: user-4
content: http://bbs.csdn.net/topics/390236434

user: user-5
content: A null-pointer constant is either an integral constant expression that evaluates to zero (such as 0 or 0L), or a value of type nullptr_t (such as nullptr). 0是个整形。NULL是个宏定义，也可能是0L（长整形）,也可能是nullptr（C++11里）
user-0 提问: 为什么在Xcode下运行会出现内存错误

回复:
user: user-0
content: 引用 4 楼 a158337 的回复:两个问题，第一感觉if语句里面的判断条件有问题，不应该是m->buttom==NULL吗你这样写是不是恰恰相反了，第二个感觉不能这么初始化。应该是传递的参数为空，返回值为你现在传递进去的指针类型，然后函数里面重新声明一个所传递的指针类型的变量，来申请内存，如果申请成功，返回这个指针，用这个指针的值给main里面的那个m赋值。  第一个，m->bottom如果为null的话，!m->bottom就是真值了， 第二个，确实要是按你说的写法就不会出我这种错误了，我的m指针还没赋值就直接传进函数了。。 谢谢回答。

user: user-1
content: 函数里的那个m是形参，不能双向传值

user: user-0
content: 引用 2 楼 user-3 的回复:main里面的m是个未经初始化的野指针，不能直接使用。 m=(MazeType)malloc(sizeof(*m)); 啊，谢谢了。 逻辑不严谨，没注意到还犯了这种错误。 多谢指正。

user: user-2
content: 如果你真的要这么写，不该形式也是可以的，不过估计要传递的参数是二阶指针。

user: user-2
content: 两个问题，第一感觉if语句里面的判断条件有问题，不应该是m->buttom==NULL吗你这样写是不是恰恰相反了，第二个感觉不能这么初始化。应该是传递的参数为空，返回值为你现在传递进去的指针类型，然后函数里面重新声明一个所传递的指针类型的变量，来申请内存，如果申请成功，返回这个指针，用这个指针的值给main里面的那个m赋值。

user: user-3
content: 再啰嗦两句： 初始化m必须在main里面，在InitStack里面不行，除非改成InitStack(MazeType *m) 另一个办法是在main里面直接把m定义成结构体变量而不是指针

user: user-3
content: main里面的m是个未经初始化的野指针，不能直接使用。 m=(MazeType)malloc(sizeof(*m));

user: user-3
content: m也需要初始化呀 InitStack函数只是初始化了m->bottom和m->top，但是没初始化m
user-0 提问: 为什么我用c语言编写的贪吃蛇游戏运行时会闪退呢

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

user: user-0
content: #include<stdio.h> #include<time.h> #include<conio.h> #include<stdlib.h> int head=3 ,tail=0; int main() { 	int i,j,k=0;	 	int zuobiao[2][80];	 	long start;	 	int direction=77;	 	int gamespeed;	 	int timeover;	     int change(char qipan[20][80],int zuobiao[2][80],char direction); 	zuobiao[0][tail]=1; 	zuobiao[1][tail]=1; 	zuobiao[0][1]=1; 	zuobiao[1][1]=2; 	zuobiao[0][2]=3; 	zuobiao[0][2]=1; 	zuobiao[1][head]=1; 	zuobiao[1][head]=4; 	char qipan[20][80];//定义棋盘		 	for(i=0;i<20;i++)	     	for(j=0;j<80;j++)			qipan[i][j]=' ';//初始化棋盘		 	for(i=0;i<80;i++)			qipan[0][i]='_';		 	for(i=0;i<20;i++)			qipan[i][0]='|';		 	for(i=0;i<20;i++)			qipan[i][79]='|';		 	for(i=0;i<80;i++)			qipan[19][i]='_';			 	qipan[1][1]=qipan[1][2]=qipan[1][3]='*';//初始化蛇的位置		 	qipan[1][4]='#'; 	printf("This is a game of a SN		AKE.\nGOOD LUCK TO YOU !\n");		 	printf("Input your game speed,please.(e.g.300)\n");			 	scanf("%d",&gamespeed); 	while(direction!='q') 	{ 		system("cls");			 		for(i=0;i<20;i++)//打印出棋盘			 			for(j=0;j<80;j++)		 				printf("%c",qipan[i][j]);		 			timeover=1;		 			start=clock();	 			while(!kbhit()&&(timeover=clock()-start<=gamespeed));	 			if(timeover)	 			{		 				getch();		 				direction=getch();	 			} 			else		 				direction=direction;	 			   if(!(direction==72||direction==80||direction==75||direction==77))		 			   {		 				   return 0;		 				   system("cls");		 				   printf("GAME OVER!\n");	 			   } 			   if(!change(qipan,zuobiao,direction))	 			   {		 				   direction='q';				 				   system("cls");		 				   printf("GAME OVER!\n");	 			   } 	} 	return 0; 	} 	int change(char qipan[20][80],int zuobiao[2][80],char direction) 	{		 		int x,y;	 		if(direction==72)		 			x=zuobiao[0][head]-1;y=zuobiao[1][head];	 		if(direction==80)		 			x=zuobiao[0][head]+1;y=zuobiao[1][head];	 		if(direction==75)		 			x=zuobiao[0][head];y=zuobiao[0][head]-1;		 		if(direction==77)		 			x=zuobiao[0][head];y=zuobiao[1][head]+1;	 		if(x==0||x==18||y==78||y==0)		 			return 0;	 		if(qipan[x][y]!=' ')		 			return 0;	 		qipan[zuobiao[0][tail]][zuobiao[1][tail]]=' ';	 		tail=(tail+1)%80;	 		qipan[zuobiao[0][head]][zuobiao[1][head]]='*';	 		head=(head+1)%80;	 		zuobiao[0][head]=x;		 		zuobiao[1][head]=y;	 		qipan[zuobiao[0][head]][zuobiao[1][head]]='#';	 		return 1; 	}   这是代码，求大牛

user: user-2
content: 你当我们是神啊，代码都没有就问问题

user: user-3
content: 没有程序，谁知道呢。你只能自己调试，一步步，采用注释的办法，比如先注释掉后一半如果还是闪退，问题就在前一半，否则就在后一半找。这样逐渐缩小。闪退原因很多，比如该等待的时候没有等待某个条件完成，初始的时候和结束的时候弄成一样的了不好说
user-0 提问: sscanf 的使用

回复:
user: user-1
content: #include <stdio.h>  int main() {   char ch[100] = "%99.4";   gets(ch);    double d;   sscanf(ch, "%*%%lf", &d);   printf("%lf\n", d); }

user: user-2
content: 用一个l就行了     sscanf(&ch[1],"%lf",&d);     printf("%lf\n",d);
user-0 提问: EOF是什么东西啊

回复:
user: user-1
content: End-of-File  It is a macro definition of type int that expands into a negative integral constant expression (generally, -1).   It is used as the value returned by several functions in header <cstdio> to indicate that the End-of-File has been reached or to signal some other failure conditions.   It is also used as the value to represent an invalid character.   In C++, this macro corresponds to the value of char_traits<char>::eof().

user: user-2
content: 文件里没有EOF这个东西，它不是表示结束的字符。就是一个信号，读取文件的函数发现文件结束了就会返回这么个值
user-0 提问: C语言文件写入乱码

回复:
user: user-1
content: 引用 6 楼 flower31857 的回复:[quote=引用 2 楼 baichi4141 的回复:] 字符串和其他初学者遇到的数据类型最大的不同在于：它只存在于概念中，语言中没有字符串这玩意。你可以称放在一起的一堆字符是一个字符串，并用处理字符串的方式去处理这堆字符，你也可以不这么做。 所以用字符指针来接收一个字符串，和用整型变量来接收一个整数，是完全不同的。一个整型变量是独立的，存在它里面的整数只能通过它来改变。而一个指针指向一块内存，这块内存可能被其他指针指向，可能被其他指针修改，甚至可能根本就不属于你！  简单地说，不要使用指向局部变量的指针，这个变量很可能在进入另一个函数时被改变。 准确的说，你可以使用指向任何地方的指针——只要你真的明白这个指针指向什么地方，其数据由谁修改。嗯  是这样，子函数临时开辟的内存已经被释放货征用了   那我该怎么实现[/quote] 最简单的办法， 返回一个结构体实例。  typedef struct tagBuf {   char buf[32]; }Buf;  Buf log() {   Buf buf;   strncpy(buf,  "hello world", sizeof(buf.buf));  return buf; }

user: user-2
content: 1 在main函数中定义数组，将其指针传给log_in函数 2 在log_in函数中malloc，在main函数中用完后free 3 把数组封在一个结构体里，结构体可以直接=  方法有很多，问之前先自己想想，比直接问到答案对你更有帮助

user: user-0
content: 引用 2 楼 baichi4141 的回复:字符串和其他初学者遇到的数据类型最大的不同在于：它只存在于概念中，语言中没有字符串这玩意。你可以称放在一起的一堆字符是一个字符串，并用处理字符串的方式去处理这堆字符，你也可以不这么做。 所以用字符指针来接收一个字符串，和用整型变量来接收一个整数，是完全不同的。一个整型变量是独立的，存在它里面的整数只能通过它来改变。而一个指针指向一块内存，这块内存可能被其他指针指向，可能被其他指针修改，甚至可能根本就不属于你！  简单地说，不要使用指向局部变量的指针，这个变量很可能在进入另一个函数时被改变。 准确的说，你可以使用指向任何地方的指针——只要你真的明白这个指针指向什么地方，其数据由谁修改。嗯  是这样，子函数临时开辟的内存已经被释放货征用了   那我该怎么实现

user: user-0
content: 引用 1 楼 baichi4141 的回复:我在main函数用了一个字符指针us来接收log_in的返回值 用字符数组 要问原因的话，字符指针指向的十有八九是个局部变量，这个局部变量在log_in函数退出后就不再属于你了，而进入printf函数的时候，这个函数征用了这块内存，结果这块内存的数据就发生了变化——只有属于你的内存的数据由你控制，其他的内存你可以读写，别人也可以 如果你不知道一个指针指向的内存何时属于你何时不属于你，就别用指针我好像明白是什么意思了   那段内存在子函数结束后就被征用了 那我该怎么解决呢？貌似字符数组是不能直接用=赋值

user: user-3
content: 目测是 log_in的返回值 lz返回的是一个局部变量  请不要返回一个局部变量的地址

user: user-1
content: 多半返回了栈上变量的指针。

user: user-2
content: 字符串和其他初学者遇到的数据类型最大的不同在于：它只存在于概念中，语言中没有字符串这玩意。你可以称放在一起的一堆字符是一个字符串，并用处理字符串的方式去处理这堆字符，你也可以不这么做。 所以用字符指针来接收一个字符串，和用整型变量来接收一个整数，是完全不同的。一个整型变量是独立的，存在它里面的整数只能通过它来改变。而一个指针指向一块内存，这块内存可能被其他指针指向，可能被其他指针修改，甚至可能根本就不属于你！  简单地说，不要使用指向局部变量的指针，这个变量很可能在进入另一个函数时被改变。 准确的说，你可以使用指向任何地方的指针——只要你真的明白这个指针指向什么地方，其数据由谁修改。

user: user-2
content: 我在main函数用了一个字符指针us来接收log_in的返回值 用字符数组 要问原因的话，字符指针指向的十有八九是个局部变量，这个局部变量在log_in函数退出后就不再属于你了，而进入printf函数的时候，这个函数征用了这块内存，结果这块内存的数据就发生了变化——只有属于你的内存的数据由你控制，其他的内存你可以读写，别人也可以 如果你不知道一个指针指向的内存何时属于你何时不属于你，就别用指针
user-0 提问: 【求助】求各位帮我看一段代码，找不到问题啊

回复:
user: user-1
content: 如果指针参数不应该被修改，就不要在函数中直接操作指针参数，而是赋值给一个临时指针来完成操作。

user: user-0
content: 引用 1 楼 u010963658 的回复:while(*str!='\0')       {         str++; i++; } 这时候while一出来str已经是空了,   p=str+(i-length);自然不是想要的 应该在while之前 const char* pStr = str; p=pStr+(i-length);对啊   while以后  str已经变了  唉  我居然忘了这个

user: user-2
content: while(*str!='\0')       {         str++; i++; } 这时候while一出来str已经是空了,   p=str+(i-length);自然不是想要的 应该在while之前 const char* pStr = str; p=pStr+(i-length);
user-0 提问: 图的深度优先遍历算法问题

回复:
user: user-1
content: 回车被你当边读进去了

user: user-2
content: scanf("%c",&G->vexs[i]); 把你的换行也读了过去, 在%c前面加个空格就可以过滤换行和空格了 scanf(" %c",&G->vexs[i]);
user-0 提问: 关于argc,argv的，注释后面那一段输出for就不会出错，那一段怎了？

回复:
user: user-0
content: 引用 1 楼 user-3 的回复:因为第15行写错了      for (i=0;envp[i];++i)  谢谢各位，这例子我是看这里弄的。看来是他那里搞错了。http://www.cnblogs.com/avril/archive/2010/03/22/1691477.html

user: user-1
content: http://bbs.csdn.net/topics/390469280

user: user-2
content: for(i=0;envp[i]!='\0';++i)或者for(i=0;*(envp+i)!='\0';++i)

user: user-3
content: 因为第15行写错了      for (i=0;envp[i];++i)