Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 如何判断数值溢出

回复:
user: user-1
content: long a; long b; long c = a + b; if (c < a)     // overflowed

user: user-2
content: 楼主需要把这些东西转换为二进制然后根据结果判断结果和2个数的符号进行判断，或者通过符号位进位状态标识符CF 和 数值部分的最高位的进位标识符DF同时为1或0时，运算结果没有溢出，否则溢出，就是一个异或的关系；

user: user-3
content: 一种情况是，两正数相加，结果是负数，就溢出了。可以通过符号判断。 其余情况类似

user: user-4
content: 可以用long long

user: user-5
content: 能不能进行预防呢 if ( m>0 && n>0 && ( LONG_MAX - m < n ) ) {  //error handling...  return;  }

user: user-0
content: 这样判断不行，谁知道应该怎么做呢？
user-0 提问: unsigned short 赋值给 unsigned char

回复:
user: user-1
content: 运行下就知道了

user: user-2
content: 理解和讨论之前请先学会如何观察！

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: PackCnt>>5; PackCnt会被提升为int，然后>>5的结果还是int，最后把这个int的结果赋值给uint8
user-0 提问: PAT1009 c语言字符串问题 我写的程序输出时起始位置会多一个空格，如何改正才能没有空格

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

user: user-2
content: 每次得到一行,从行尾反向输出 是不是就可以了

user: user-3
content: 大概思路应该是先写一个字符串反转函数，然后将整个字符串反转，最后再反转每个单词
user-0 提问: 关于 不定长结构体（struct）定义的问题

回复:
user: user-1
content: 这个写法不是c标准定义的，所以有些编译器不支持。 http://blog.csdn.net/ce123_zhouwei/article/details/8973073 http://blog.csdn.net/code_crash/article/details/4854939

user: user-2
content: 好不好不知道，反正微软的API经常这么用。

user: user-3
content: 前段时间貌似看到过这个玩意儿，支持0的时候，可以很方便的进行指针代替，且不会占用内存，突然感觉这个方法好机智有木有。 不过，这种抖机灵的方法，真的好吗？   ----------------------- 个人见解
user-0 提问: 请教一个关于 char *a;char a[];char *a[]的问题

回复:
user: user-1
content: char* a; // 一个指针变量，注意:a的类型是char*,char*  才是表示指针（存放的是地址），那么a就是一个地址。*a表示取a这个地址的值。 char* a[ ]；//这个你一定很熟悉感觉，int main (int argc, char* argv[]).所以不用解释了吧。

user: user-2
content: 再补充一个问题：换行符是“\n”,而不是"/n";因为\才是转义符

user: user-2
content: 补充一点，打印printf 的问题，%c只是打印字符，要打印字符串需要用%s

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

user: user-2
content: 1. char a:就是一个字符 2. char *a:就是一个指针，指针指向的是字符串 3. char a[]:就是一个字符数组 4. char* a[]:就是一个指针，指针指向的是字符串的数组。 针对这个问题： char a[9]="123456"； char *b = "4" ； a[2]=*b; printf("%c/n" , a); 为什么是124456呢？因为a[2]=*b;赋值就只是把a[2]修改了值，*b的值只是一个字符'4'； 后面理解正确。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  xcode 怎么查看内存变化呢。。。我就是没找到

user: user-3
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-4
content: 至少  比如 char b[5] ="1234"; 那 b[0]=1 b[1]=2 b[2]=3 b[3]=4 b[4]=\0 b[0]='1'; b[1]='2'; b[2]='3'; b[3]='4'; b[4]='\0';

user: user-3
content: 引用 5 楼 birdmichael 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  xcode 怎么查看内存变化呢。。。我就是没找到[/quote] 搜“gdb GUI”

user: user-5
content: 《c与指针》。多看书，就少了很多疑问

user: user-6
content: “”双引号的不是字符常量，那是字符串，你应该先好好把C语言字符部分的知识好好看看再来区分这几个定义的区别

user: user-7
content: 我觉得差不多把！

user: user-8
content: 今天，是我在这个论坛第一次发帖，也是第一次回复。。就当是开门红吧。  不知楼主有没有想过 signed char * , unsigned char * , 和 char * 的区别？可以去百度百科一下char .  还有 const * 指针，和数组名有什么联系？
user-0 提问: 关于c语言中指针和函数的一个问题

回复:
user: user-1
content: 修改如下：  #include <stdio.h> void  out1(int *p, int n); void  plus1(int *p, int n); void  cpy1(int *p, int *q, int n); int main() { 	int a[10] = { 15,-12,10,-14,7,2,5,3,27,-6 }, b[10]; 	//out1(a);     	//输出数组a的所有元素 	out1(a, 10); 	//plus1(a);   	//对数组中所有的正整数分别加上??? 	plus1(a, 10); 	//cpy1(b, a);   	//将a数组所有元素复制到b数组中 	cpy1(a, b, 10); 	//out1(b); 		//输出数组b的所有元素 	out1(b, 10); 	system("pause"); 	return 0; } // 输出数组所有元素 //void  out1(int *p) void out1(int *p, int n) { 	int i = 0; 	for (i = 0; i < n; i++) 		printf("%d ", *(p + i)); } // 对数组中所有的正整数分别加上??? //void  plus1(int *p) void plus1(int *p, int n) { 	int i = 0; 	for (i = 0; i < n; i++) 	{ 		if (*(p + i) > 0) 			*(p + i) = *(p + i) + 5; 	} } //数组的复制 //void  cpy1(int *p, int *q) void cpy1(int *p, int *q, int n) { 	int i = 0; 	for (i = 0; i < n; i++) 	{ 		*(q + i) = *(p + i); 	} }

user: user-2
content: 1) *p>0 这里错 2) cpy1(b,a); 其中b和a搞反了,你的实现是b->a, b本身是没初始化的 修改一个函数 void  plus1(int *p) {      for(int *pe=p+10;p<pe;p++)     {     if(*p>0) *p +=5;    } }

user: user-3
content: cpy1的参数顺序反了 另外就是楼上说的了 还有，*(p+i)很难看的，写成p[i]比较好

user: user-4
content: for(i=0;i<10;i++)    {     if(*p>0)     *(p+i)=*(p+i)+5;    }  暂时看到一个 判断*p>0肯定是不对的，应该是if(*(p+i)>0)
user-0 提问: 关于c指针问题求教，为什么输出结果全是1？

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

user: user-2
content: printf("%d\n", *(p+1)); 改成 printf("%d\n", *(p+i));

user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解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

user: user-3
content: 这种错误好恐怖

user: user-4
content: 这个程序就是简单的实现指针的初始化吗，不知道楼主为什么要练习这个程序，不过我也是菜鸟，另外在出错之后应该好好检查的，希望对你有帮助

user: user-5
content: 楼主既然搞定了，就把悬赏分砸给我吧。

user: user-0
content: 我把i打打成了1
user-0 提问: 我想问一个关于C语言的复制操作问题

回复:
user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: vc下，选中size_t 按f12，即可看到 typedef unsigned int     size_t;

user: user-3
content: 你这个一次打开，不会那样的

user: user-4
content: 把经典书籍先看完吧。一切都懂哦了

user: user-0
content: 那个 有OC和C的大神吗？，可以留个联系方式，带一下我这个小菜鸟吗？ 学海无涯 达者为师~
user-0 提问: 求救，程序写好后出了些问题，先是提示有堆问题，后来修改了下，就直接运行不了

回复:
user: user-0
content: 引用 7 楼 qq_28917617 的回复:   这个地方错误，既然已经free（current），那么current=current->next还有什么意义。 谢谢，看到后马上去试了试，确实删掉之后不会有运行错误跳出来，不过这里我是按照书上的来写得，几乎跟书上一样，待会我去试试书上的程序会不会出现同样的错误。另外最后还是没有运行出我想要的结果~直接跳过了hashtab内容的输出~待会我再去调试下~ 谢谢这位朋友能把我打得这么乱的代码都看完，而且我还已经结贴了的情况下

user: user-1
content: 这个地方错误，既然已经free（current），那么current=current->next还有什么意义。

user: user-2
content: 调试才是王道，就算这次别人给你找到了错误，下次你还是不知道怎么解决问题。学学调试吧

user: user-3
content: 楼上正解

user: user-0
content: 哈哈~好的~谢谢各位啦~接下来我再自己一点点去调试看看问题出在哪了吧~基本功不扎实也是我的大问题~毕竟现学现卖~我再去研究下好了~谢谢啦~~

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

user: user-0
content: ~每段和每句代码的意思我倒是清楚的……不过没看出来那里出现了问题，不是语法错误，所以应该是逻辑错误了，我这里有些代码可能写的不合适，或者表达上有问题，或者申请内存时出了问题什么的……不过我是最近自己自学然后一点点写的，因为要交了，所以基本功不是很扎实……有些逻辑问题或者申请内存没成功啥的，我看不太出来，所以才想请教下，至少有个方向的话我也知道该去哪里找相关资料看了，然后补充语句上去，如果是逻辑问题= = 我检查了下……在我的理解中应该就这样写才对啊……结构的部分跟书对了对也没差啊…………   不过我今天还会再去自己先检查下~ 所以才来请教下基础比我扎实很多的各位，谢谢啦~

user: user-5
content: 自己写的每一行代码，自己反而不清楚是什么意思，有些莫名其妙
user-0 提问: 求解：内存泄漏的原理(汇编角度)

回复:
user: user-1
content: Linux下，malloc和free是开源的。

user: user-2
content: 《30天自制操作系统》内存管理

user: user-3
content: 学了操作系统就应该理解起来比较容易

user: user-0
content: 引用 2 楼 zhangxiangDavaid 的回复:未被释放，即是被占用，如何被分配第二次。一个坑，一个萝卜。 所以释放后，才有可能再次被分配。 表面上是这样解释的，我只是想知道本质，物理上内存是不可能消失的， 即“未被释放”、“分配”的本质的是啥意思，

user: user-4
content: 不懂汇编，不会从汇编角度解释

user: user-5
content: 未被释放，即是被占用，如何被分配第二次。一个坑，一个萝卜。 所以释放后，才有可能再次被分配。

user: user-0
content: 上面错别字"请问为什么，为释放的堆内存，我下载再用malloc不" 应该是"请问为什么，未释放的堆内存，我下次再用malloc不"

user: user-6
content: 内存泄漏：进程长期占用不使用的内存 进程结束OS会释放所以内存。

user: user-6
content: 厕所里面有十个坑，但是这十个坑都写着有人在拉屎（其实里面没有一个人，有人故意恶作剧），来一个人看着满了，来一个发现还是满的。阿姨打扫卫生才让他们恢复过来。。。。

user: user-7
content: 跟汇编没有关系，操作系统管理着空闲内存，有登记。入住之后，不退房，别人就不能再用。
user-0 提问: 刚入门C语言，写了个程序。没语法错误，结果不一致

回复:
user: user-0
content: 引用 6 楼 user-1 的回复:引用 5 楼 wdh_88 的回复:[quote=引用 4 楼 user-1 的回复:] [quote=引用 2 楼 wdh_88 的回复:] [quote=引用 1 楼 user-1 的回复:] scanf("%d|%d, &a, &b"); - >scanf("%d|%d", &a, &b);改了之后输入20 跟30 变成了The max between 20 and 0 is 0 你是怎么输入的 你这个要 20|30[/quote]原来如此，谢谢啦。就是跟空格一样，用了空格当做分隔符就要用空格，以此类推咯？[/quote] 是的，格式要对应。[/quote]非常感谢~么么哒~

user: user-1
content: 引用 5 楼 wdh_88 的回复:引用 4 楼 user-1 的回复:[quote=引用 2 楼 wdh_88 的回复:] [quote=引用 1 楼 user-1 的回复:] scanf("%d|%d, &a, &b"); - >scanf("%d|%d", &a, &b);改了之后输入20 跟30 变成了The max between 20 and 0 is 0 你是怎么输入的 你这个要 20|30[/quote]原来如此，谢谢啦。就是跟空格一样，用了空格当做分隔符就要用空格，以此类推咯？[/quote] 是的，格式要对应。

user: user-0
content: 引用 4 楼 user-1 的回复:引用 2 楼 wdh_88 的回复:[quote=引用 1 楼 user-1 的回复:] scanf("%d|%d, &a, &b"); - >scanf("%d|%d", &a, &b);改了之后输入20 跟30 变成了The max between 20 and 0 is 0 你是怎么输入的 你这个要 20|30[/quote]原来如此，谢谢啦。就是跟空格一样，用了空格当做分隔符就要用空格，以此类推咯？

user: user-1
content: 引用 2 楼 wdh_88 的回复:引用 1 楼 user-1 的回复:scanf("%d|%d, &a, &b"); - >scanf("%d|%d", &a, &b);改了之后输入20 跟30 变成了The max between 20 and 0 is 0 你是怎么输入的 你这个要 20|30

user: user-1
content: 你是怎么输入的 你这个要 20|30

user: user-0
content: 引用 1 楼 user-1 的回复:scanf("%d|%d, &a, &b"); - >scanf("%d|%d", &a, &b);改了之后输入20 跟30 变成了The max between 20 and 0 is 0

user: user-1
content: scanf("%d|%d, &a, &b"); - >scanf("%d|%d", &a, &b);
user-0 提问: 关于do{}while;循环以及c中变量定义的疑问。

回复:
user: user-1
content: 问题一的解决： 把int a = 1;提到{ }前。 如：  int a = 1; do { 	//…… } while (a < 1);

user: user-1
content: 问题一： a的作用域仅限于{ } 问题二： int c=a+b;     //使用了未初始化的变量，编译器会提示error
user-0 提问: 问问题：C语言下如何做网络流媒体通信？

回复:
user: user-0
content: 引用 4 楼 FightForProgrammer 的回复:ffmpeg开源库看看能不能满足你需求 恩，谢谢！查了一下，这个主要是对视频的处理，，，我再研究研究看看可不可以移植。。谢谢！

user: user-1
content: ffmpeg开源库看看能不能满足你需求

user: user-0
content: 引用 1 楼 jiqiang01234 的回复:从socket到协议都自己实现？那可不是一般的工作量。建议还是用开源库吧  sorry，可能我没说清楚。Socket不是自己实现的是调用Socket接口的（囧）我就是想问对于流媒体通信有没有什么C语言可以调用的库啊，接口什么的。。。？？

user: user-0
content: sorry，可能我没说清楚。Socket不是自己实现的是调用Socket接口的（囧）我就是想问对于流媒体通信有没有什么C语言可以调用的库啊，接口什么的。。。？？

user: user-2
content: 从socket到协议都自己实现？那可不是一般的工作量。建议还是用开源库吧

user: user-0
content: 引用 6 楼 user-3 的回复:RTSP 是个协议来的. 各种语言实现都有  //// 直接在 csdn 资源中搜索 RTSP 应该有资料/源码 搜了一下，果然看到有C语言的实现，谢谢了

user: user-3
content: RTSP 是个协议来的. 各种语言实现都有  //// 直接在 csdn 资源中搜索 RTSP 应该有资料/源码
user-0 提问: 调试程序中断点设置问题

回复:
user: user-1
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-2
content: 引用 2 楼 xyd396415534 的回复:[quote=引用 1 楼 user-2 的回复:] getchar要有数据输入才会进入while    把断点设置在while循环下面 让数据输入进来。就可以调试了？[/quote]  是啊， 不过getchar这个函数比较特殊，你要先了解一下。

user: user-0
content: 引用 1 楼 user-2 的回复:getchar要有数据输入才会进入while    把断点设置在while循环下面 让数据输入进来。就可以调试了？

user: user-2
content: getchar要有数据输入才会进入while
user-0 提问: 求助c语言课本上的练习题数组元素快速排序，让我用指针而不是用整数来跟踪数组的位置

回复:
user: user-1
content: #include <stdio.h>  #define N 10  void quicksort(int a[], int *low, int *high); int *split(int a[], int *low, int *high);  int main(void) {   int a[N], i;    printf("Enter %d numbers to be sorted: ", N);   for (i = 0; i < N; i++)     scanf("%d", &a[i]);    quicksort(a, a, a+N - 1);    printf("In sorted order: ");   for (i = 0; i < N; i++)     printf("%d ", a[i]);   printf("\n");    return 0; }  void quicksort(int a[], int *low, int *high) {   int *middle;    if (low >= high) return;   middle = split(a, low, high);   quicksort(a, low, middle - 1);   quicksort(a, middle + 1, high); }  int *split(int a[], int *low, int *high) {   int part_element = *low;    for (;;) {     while (low < high && part_element <= *high)       high--;     if (low >= high) break;     *low++ = *high;      while (low < high && *low <= part_element)       low++;     if (low >= high) break;     *high-- = *low;   }    *high = part_element;   return high; }

user: user-2
content: 你没看明白程序的每一步实现什么功能有什么作用，怎么可能对了 ，if (low >= high) return;这一步的原意是如果数组为空或者只有一项直接返回主函数输出数组 这是我改的程序，你可以参考一下，我只是把split（）函数里的数组下标操作改成指针操作了 int split(int a[], int low, int high) {   int part_element = a[low];   int *l,*h;     for (;;) { 	   l=&a[low]; 	   h=&a[high];      while (low < high && part_element <= *h) 	{high--; 	h--;}     if (low >= high) break;     *l++ = *h;       while (low < high && *l <= part_element) 	{low++; 	l++;}     if (low >= high) break;     *h-- = *l;   }     *h = part_element;   return high; }

user: user-3
content: 作为循环、判断条件的关系表达式 *low < *high 改成 low < high 因为这不是比较数的大小，是比较左右指针是否交叉相遇了
user-0 提问: 知道浮点转16进制的 方法  如何转换回去

回复:
user: user-1
content: 用memcpy,非常方便的

user: user-2
content: 引用 10 楼 xixihan3211 的回复:[quote=引用 9 楼 zhao4zhong1 的回复:] char buf[4]={0xcc,0x25,0xb8,0xc1}; float f; f=*((float *)buf);   我原本是这样想的  但实际转换的函数应该是	(*(char*)(&f))=buf[0]; 	(*((char*)(&f)+1))=buf[1]; 	(*((char*)(&f)+2))=buf[2]; 	(*((char*)(&f)+3))=buf[3]; 我通过vs实验 这个代码转换回去的数才是真实的数   老师可以研究一下 [/quote] memcpy或你这个逐字节赋值都是要拷贝一份，我那个是原地不动，仅按照不同方式理解。

user: user-2
content: char buf[4]={0xcc,0x25,0xb8,0xc1}; float f; f=*((float *)buf);

user: user-3
content: float f; *(int *)&f =( b3<<24)|(b2<<16)|(b1<<8)|b0;

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:char buf[4]={0xcc,0x25,0xb8,0xc1}; float f; f=*((float *)buf);   我原本是这样想的  但实际转换的函数应该是	(*(char*)(&f))=buf[0]; 	(*((char*)(&f)+1))=buf[1]; 	(*((char*)(&f)+2))=buf[2]; 	(*((char*)(&f)+3))=buf[3]; 我通过vs实验 这个代码转换回去的数才是真实的数   老师可以研究一下

user: user-0
content: [quote=引用 楼主 xixihan3211 的回复:] #define BYT0(dwTemp)   (*(char*)(&dwTemp)) #define BYT0(dwTemp)   (*((char*)(&dwTemp)+1)) #define BYT0(dwTemp)   (*((char*)(&dwTemp)+2)) #define BYT0(dwTemp)   (*((char*)(&dwTemp)+3))  这个才是原函数     怎么转换回去。

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

user: user-4
content: 习惯于用个联合体 union {     char cData[4];     float fData; }VarTemp;

user: user-0
content: 我自己想的是 	 char buf[5]={0xcc,0x25,0xb8,0xc1,0x6a};         *(&f)=((float)buf[0]); 	*(&f+1)=((float)buf[1]); 	*(&f+2)=((float)buf[2]); 	*(&f+3)=((float)buf[3]);   把buf数据里数据转换成float  感觉不对

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390676437   赵老师 我是新学C语言    转换方式是将float的四个字节分别转换成char型数据   我想问怎么把这四个char型重新组装成float 的数据。

user: user-0
content: 引用 1 楼 user-5 的回复:四个名字一样的宏？  我写错了  #define BYT0(dwTemp)   (*(char*)(&dwTemp)) #define BYT1(dwTemp)   (*(char*)(&dwTemp)+1) #define BYT2(dwTemp)   (*(char*)(&dwTemp)+2) #define BYT3(dwTemp)   (*(char*)(&dwTemp)+3)  这个样子  一个数据分成四分

user: user-5
content: 四个名字一样的宏？
user-0 提问: C语言将一维字符数组两两分割。

回复:
user: user-0
content: 多谢，原因找到了，创建二维字符数组的第二维要比实际字符长度多1，强行把最后一个元素赋值为\0。

user: user-1
content: 内容不全，无法定位错误，自己调试哈

user: user-2
content: 数组越界，你调试一下就知道了

user: user-0
content: 对C语言无语了。
user-0 提问: SDK用双缓冲显示多张位图怎么实现？

回复:
user: user-1
content: 要双缓冲的话，可以使用OpenGL，还有就是不懂什么叫做SDK，我只用过SDL来写C语言图形程序而已。

user: user-0
content: 引用 5 楼 fly_dragon_fly 的回复:双缓冲应该不会闪, WM_ERASEBKGND有没有返回1 没用双缓冲就是不会用双缓冲，试了好多次都不对= =

user: user-2
content: 双缓冲应该不会闪, WM_ERASEBKGND有没有返回1

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:picasa是google出品的图片查看器。应该是用C++编写的。 哦哦 我去看看

user: user-3
content: picasa是google出品的图片查看器。应该是用C++编写的。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:参考Picasa源代码。 可是我是用C语言写的，其他语言看不懂= =

user: user-3
content: 参考Picasa源代码。
user-0 提问: 红黑树与AVL

回复:
user: user-1
content: 引用 1 楼 hzy38324 的回复:AVL插入速度快  反了吧,红黑树插入快,avl查询快

user: user-2
content: 两种树差别应该不大，插入一个新节点后都需要对插入了点后是否会引发“不平衡”状态进行判断，如果发生不平衡状态，进行调整。据说红黑树在实际使用中的统计效果(不知道谁进行的统计)要优于AVL树。所以如STL的map，set都是使用红黑树做为底层支撑。

user: user-3
content: RB-tree 快, 查询 AVL 快.

user: user-4
content: AVL插入速度快
user-0 提问: 求解答关于函数的一些问题~~~

回复:
user: user-1
content: 嗯，本身这个程序就有问题吗？平时能写这样的代码在程序里吗？

user: user-2
content: 引用 10 楼 zhangxiangDavaid 的回复:[quote=引用 4 楼 fly_dragon_fly 的回复:] max的没有返回值, 所以结果无意义, 它返回的其实是printf的返回值 这都能想到[/quote] 不是想到的, 熟悉汇编就知道, 返回值就是eax, 不管有没有return,这个eax始终存在

user: user-3
content: 你为什么把max函数的return语句删了？没有返回值，max函数等于不存在

user: user-4
content: 编译运行一下，有什么问题吗？

user: user-5
content: 引用 5 楼 niguibo2006 的回复:问题是 9这个数是怎么来的？如果从键盘输入两位数就变成10，三位数就变成11,......  两位数最少是10，三位数最少是100了

user: user-6
content: 这编译能过？？？  编译器不得告诉你int max(int x,int y)  需要一个返回值？？

user: user-0
content: 问题是 9这个数是怎么来的？如果从键盘输入两位数就变成10，三位数就变成11,......

user: user-2
content: max的没有返回值, 所以结果无意义, 它返回的其实是printf的返回值

user: user-0
content: 为什么结果不是 8 8，而是8 9？

user: user-5
content: 输出为: max is 8 max is 9

user: user-7
content: 结果是什么，运行一下不就知道了？

user: user-8
content: 引用 4 楼 fly_dragon_fly 的回复:max的没有返回值, 所以结果无意义, 它返回的其实是printf的返回值 这都能想到

user: user-9
content: 理解和讨论之前请先学会如何观察！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！
user-0 提问: 大神们帮我看看为什么FTP客户端代码里，无法使用PORT模式！

回复:
user: user-1
content: 楼上的有点问题, lsn_sock忘记关闭了，要修改一下 conn_sock = accept(lsn_sock, NULL, NULL); close(lsn_sock); return conn_sock;

user: user-1
content: 楼主，port模式需要accept的啊。 create_datasock 函数中 49 行 return lsn_sock; 返回的是listen 的 socket, 而在ftp_list函数中 14 行 d_sock=create_datasock(c_sock); 然后在44行recv len=recv(d_sock,buf,512,0);  发送完port命令之后，要进行accept的。  试试在create_datasock函数中进行accept, 改一下49行 return lsn_sock; ===> return accept(lsn_sock, NULL, NULL);

user: user-2
content: 以前遇到一种情况，也是使用tcp。我建立一个socket，每次只能调用一次send。假设send(command)， send(file)。我的command成功发送到服务器。但是后面的send(file)就没法发送出去。

user: user-2
content: RFC959中对于错误426的解释是，连接已关闭，转输中止。
user-0 提问: 关于break；语句的疑惑

回复:
user: user-1
content: 我认为添加语句是可以的，但是要注意的是，语句后面是用; 还是， 若用; 则break;不属于if子句，变成了for的子句。如果是逗号， 那么跟原型是差不多的还是if的子句。希望可以帮到你！加大括号也是不错的选择。

user: user-2
content: 如果去掉红色部分你这个程序就根本不能实现原本的功能，比如输入20 15两个数，在第一轮循环中就退出了循环，随后退出程序，你自己可以调试一下会很清楚，程序是这样执行的： 首先从键盘接受两个输入的数，之后把较小值赋给n，进入for循环，在循环内判断a、b是否能被m整除，如果a能被b整除或者b能被a整除这个程序去掉红色部分就无所谓，除了这个情况之外都是错的

user: user-0
content: 我怎么这么菜！！！今天下午脑袋都搞晕了。。。多谢各位大牛。小分就平均分了。

user: user-3
content: 初学者最好在所有if,for,while……语句后加{}

user: user-4
content: if条件后带上大括号就行了，表示条件满足后执行大括号里的代码啊

user: user-0
content: 我描述的不够清楚，我的意思是：break；一般需要一个条件来判断是否跳出的是吧？那么在一个循环中， if(a%m==0&&b%m==0)     break; 他们俩之间可不可以插入其他语句？比如说输出语句。

user: user-5
content: break只是退出最近一层的for/while/do while循环的，和if没关系。 if如果不将代码括号括住，那就只会执行if之后的一个有效语句，也就是带分号的语句。
user-0 提问: 求大神帮我看看这为什么没法在VS2013上运行

回复:
user: user-0
content: 我去试试，先谢谢了。

user: user-1
content: 引用 7 楼 viketo 的回复:也就是说MALLOC分配的内存没有用了？ 内存泄露了

user: user-0
content: 也就是说MALLOC分配的内存没有用了？

user: user-1
content: 引用 5 楼 viketo 的回复:那应该怎样修改呢？ 修行靠个人

user: user-0
content: 那应该怎样修改呢？

user: user-1
content: char*string = "abcdeafgh"; char*dup=(char*)malloc(strlen(string)+1); int character; for (; (character = *string) != '\0';) { dup = ++string; if ((dup = strchr(dup, character)) != NULL) continue; strcpy_s(dup, (strlen(dup+1)+1), dup + 1); } dup=++string这行出错，dup已经指向了和string一样的地方，根本不是malloc()开辟的地方

user: user-0
content: 运行时直接停止工作

user: user-1
content: ”没法运行“是什么意思？一运行就崩溃？

user: user-0
content: continue 不是的删掉
user-0 提问: C语言程序关于闭包的求大神解答

回复:
user: user-1
content: 关系集:int R[n][n]; 自反闭包: for (int i = 0; i < n; ++i){    R[i][i] = 1; }  对称闭包: for (int i = 0; i < n; ++i){    for (int j = 0; j < n; ++i){       if (R[i][j]) R[j][i] = 1;    } } 传递闭包: for (int i = 0; i < n; ++i){    for (int j = 0; j < n; ++j){       for (int k = 0; k < n; ++k){          if (R[j][i] && R[i][k]) R[j][k] = 1;       }    } }

user: user-2
content: 把分数散一下
user-0 提问: 关于输入缓冲区的问题

回复:
user: user-1
content: scanf("%s",&name);//这里读取字符串直到遇到一个空白字符也就是你这里的回车 这就意味着空格字符还在缓冲区 scanf("%*c");信号的意义在于读取下一个字符并丢弃。这个字符刚好就是你之前输入字符串留下的回车

user: user-0
content: 请问如果是 printf("请输入学号"); scanf("%d",&id); printf("请输入姓名"); scanf("%s",&name); printf("请输入性别"); scanf("%*c"); scanf("%c",&sex); 这段代码在第二行scanf("%d",&id);下面为什么不需要加scanf("%*c");？谢谢

user: user-0
content: 谢谢！！！！！！！！！！！！

user: user-1
content: 是在缓冲区，而是scanf在遇到%s时，只会读到空白字符的时候停止读入，而fgets遇到换行符的时候 也会停止，但是它会把这个换行符当成一个有效的字符读进去。

user: user-0
content: 我不是很理解。。。举个例子： scanf("%s",buf); printf("%s",buf);和 fgets(buf,20,stdin); printf("%s",buf); 这两种代码的效果是不一样的，scanf这两行代码执行打印后不跳行，但是fgets这两行代码执行打印后跳了一行，也就是说fgets读入了回车，而scanf没有读入回车，也就是说空格字符不在缓冲区，请问是不是这样？
user-0 提问: x-code C语言 结构体问题 求大神

回复:
user: user-1
content: // 错误赋值方式 ST s1, s2, s3; s1 = { "xiaoming", 18, 'a', 55 }; s2 = { "xiaohong", 19, 'b', 59 }; s3 = { "xiaolv",   20, 'c', 66 };  // 正确初始化方式 ST s1 = { "xiaoming", 18, 'a', 55 }; ST s2 = { "xiaohong", 19, 'b', 59 }; ST s3 = { "xiaolv",   20, 'c', 66 };  // 正确赋值方式 ST s1, s2, s3; strcpy(s1.name, "xiaoming"); s1.age = 18; s1.sex = 'a'; s1.score = 55; strcpy(s2.name, "xiaohong"); s2.age = 19; s2.sex = 'b'; s2.score = 59; strcpy(s3.name, "xiaolv"); s3.age = 20; s3.sex = 'c'; s3.score = 66;

user: user-2
content: ST      s1={"xiaoming",18,'a',55},     s2={"xiaohong",19,'b',59},     s3={"xiaolv",20,'c',66};  BTW:请楼主解释一下sex分别为a、b、c的意思。

user: user-2
content: “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

user: user-3
content: 写成这样试试  typedef struct student {     char name[20];     int age;     char sex;     float score; }ST;

user: user-4
content: 上面那位大神写的对。  BTW： 前面还是小明、小红，第三个怎么就成小驴了？？
user-0 提问: 基于udp的socket通信里，当客户端强制退出后如何使服务端也跟着退出

回复:
user: user-1
content: 这种不结贴的人最可气！~~~~人家辛辛苦苦回答你问题~不就为了点可用分么~得了答案就跑~呵呵

user: user-2
content: 我在和她煲电话粥，当我挂断后，她还在blabla，我现在想实现“当我挂断后，她也跟着挂断，不要balbla了。

user: user-3
content: ctrl+c 后，程序会受到一个signal  写个函数，当间听到kill信号的时候，向另一端发送特定的信息，只要另一端收到这个特定的信息，就自己把自己kill掉  这样的话，你既可以ctrl+c关闭两边的程序，也可以在一段有意识地给另一端发送特定信息去关闭另一端   我的方法和楼上说的一样

user: user-1
content: 1 客户端方面 ctrl+c 实际上是发送了一个signal信号给客户端程序,从而结束它 捕获 signal信号 并且自己去处理它 void sig_handler( int sig) {        if(sig == SIGINT){               //  在这里添加处理程序,告知服务器程序哪个客户端退出了,不要发消息了               exit(0);  //然后再跟着执行退出动作        } }  服务器方面:  编写逻辑判断接受的消息是否时客户端退出的消息,如果是就不再发送信息    以上是我自己的思路,望指教

user: user-0
content: 要求客户端强制退出后，服务端不要再发数据了

user: user-4
content: udp是不可靠的，意思就是不知道对方有没有收，不知道对方还在不在，你要实现的功能，只能自己写逻辑控制，比如定时发送一个特定消息，要对方回复，没有回复，就说明对方掉线了，发送方就能感知到。

user: user-5
content: 到底是想实现“服务端不发数据”还是“服务端要退出”？
user-0 提问: 求各位大神帮我看看错在哪里了，我已经崩溃了，实在是找不出问题在哪里

回复:
user: user-1
content: void main() { SqList *L; //... ListInit(&L); }  这里对一个指针没有指向任何SqList 对象，然后在函数ListInit中操作指针指向的对象。导致程序肯定段错误！这就是野指针问题

user: user-2
content: Status ListInit(SqList *L) 然后你在看看你调用的时候传递的参数是不是一致的 SqList *L; int key,len,number,loca; ElemType e; ListInit(&L);

user: user-3
content: 把问题描述一下

user: user-4
content: 断点调试，不可能找不出问题

user: user-5
content: ListInit(L)干嘛用的？
user-0 提问: int转化为char

回复:
user: user-1
content: str[0] = 0导致的。 0-128，很显然在char的表示范围之内，这里强转不强转都一样的。

user: user-2
content: 你难道不知道：字符串结束符'\0'的ascii值是0吗？ str[i] = (char)i;   //完全没必要。 直接 str[i] = i;

user: user-3
content: int类型的0好像对应char类型的＼0 printf遇到＼0就不输出了，而str［0］='＼0'；理解不深，勿喷！

user: user-4
content: 因为字符串输出的时候，遇到0(也就是'\0')停止输出，而i从0开始，也就是说一开始就是0，那么必须没有输出。
user-0 提问: ~0有多少位

回复:
user: user-0
content: 引用 1 楼 user-3 的回复:看编译器把0看成什么类型了。你可以sizeof(0)看看 引用 3 楼 zhao4zhong1 的回复:sizeof(int)*8 位 不好意思，懂了，丢人了。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:sizeof(int)*8 位  赵四老师您好，可以说的具体点么？楼上回答的不一样，不知道谁的对。

user: user-0
content: 引用 1 楼 user-3 的回复:看编译器把0看成什么类型了。你可以sizeof(0)看看  printf("%d" , sizeof(0)); 结果等于4，是这样么？

user: user-1
content: sizeof(int)*8 位

user: user-2
content: 0的整型常量  类型是 int int 多少位  0 就多少位 ~0就多少位

user: user-3
content: 看编译器把0看成什么类型了。你可以sizeof(0)看看
user-0 提问: 关于getchar()函数和scanf()函数的区别及讨论

回复:
user: user-1
content: 建议，以后读取一个字符时。 使用 char s1[2]; char c; scanf("%1s",s1);c=s1[0]; 而不要用 scanf("%c",&c);

user: user-2
content: scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s 下面有一段： 4-6) Same as (1-3), except that %c, %s, and %[ conversion specifiers each expect two arguments (the usual pointer and a value of type rsize_t indicating the size of the receiving array, which may be 1 when reading with a %c into a single char) ……  大概意思是说对于 %c,%s,%[这三种，对应的参数需要两个，一个普通的指针和这个指针指向数组的大小，对于%c,这个大小应该为1,也就是说你的scanf_s最后少个参数1.

user: user-3
content: 效果一样， 你得注意，得这样输入数字，如 2,3
user-0 提问: 关于实参表中参数传递顺序的问题

回复:
user: user-0
content: 引用 3 楼 mymtom 的回复:楼主的问题和参数传递啊的顺序无关， 无论参数传递的顺序如何， value(++i, --i, i++, i--); 的结果都是不确定的。 先传的参数不一定要先计算的。懂了

user: user-1
content: 一般是选择从右向左传参，因为这样就能获知printf的参数个数。方便栈中参数空间的分配。 传参数机制，普通的函数调用都是通过栈传参数；特殊的编译器可以指定寄存器传参

user: user-2
content: 楼主的问题和参数传递啊的顺序无关， 无论参数传递的顺序如何， value(++i, --i, i++, i--); 的结果都是不确定的。 先传的参数不一定要先计算的。

user: user-3
content: 对于这种是依次从右向左压栈，具体结果得看具体编译器的汇编

user: user-4
content: 自己看置顶贴去吧
user-0 提问: pow函数计算结果有误差是为什么

回复:
user: user-1
content: 接楼上，要使用浮点类型。

user: user-2
content: 浮点数是不精确的, 直接转换为整数是直接截断，楼主这里应该用round然后转成int  printf("%d\n",(int)round(pow(10,a)));

user: user-3
content: 引用 3 楼 ghjh555 的回复:[quote=引用 2 楼 fly_dragon_fly 的回复:] 什么编译器??  我用的C-Free 5.0  难道是编译器的问题？[/quote]没用过,换编译器吧

user: user-4
content: 浮点运算是有误差的，你想转换成整形显示，得加个误差修正。

user: user-5
content: pow其实不是很稳定个

user: user-6
content: 十进制用二进制表示总会有误差的...

user: user-7
content: 估计编译器问题，表示没遇到过

user: user-0
content: 引用 1 楼 henuyx 的回复:我运行的都是100，第三个是100.000000  把int a 改成double a 再试试。  试过了，结果跟我之前的一样

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

user: user-0
content: 引用 2 楼 fly_dragon_fly 的回复:什么编译器??  我用的C-Free 5.0  难道是编译器的问题？

user: user-3
content: 什么编译器??

user: user-9
content: 我运行的都是100，第三个是100.000000  把int a 改成double a 再试试。
user-0 提问: 求大牛解决一个内存泄漏的问题

回复:
user: user-1
content: 除了一楼的，再加上  printf("%str2=%s\n", string);  改为：  printf("str2=%s\n", string);

user: user-2
content: 哇塞 居然有人比我快~~~ 我还编译运行~~~

user: user-2
content: #include <stdio.h> #include<stdlib.h> #include<string.h> void upcase(char *inputstring,char **newstring); int main() {  	char *string=NULL; 	upcase("hello",&string); 	printf("str1=%s\n",string); 	upcase("goodbye",&string); 	printf("%str2=%s\n",string); 	free(string); 	return 0; } void upcase(char *inputstring,char **newstring) { 	int counter; 	if(!(*newstring)) 	{ 		if(!(*newstring=(char*)malloc(strlen(inputstring)+1))) 		{ 			printf("error allocating memory!\n"); 			exit(255); 		} 	} 	else 	{ 		if(!(*newstring=(char*)realloc(*newstring,strlen(inputstring)+1))) 		{ 			printf("error reallocating memory!\n"); 			exit(255); 		} 	} 	strcpy(*newstring,inputstring); 	for(counter=0;counter<strlen(*newstring);counter++) 	{ 		if((*newstring)[counter]>=97&&(*newstring) [counter]<=122)   //这里我改了一点，运算符优先级的问题吧 			(*newstring)[counter]-=32; 	} } 修改后运行通过

user: user-3
content: if((*newstring)[counter]>=97&& (*newstring)[counter]<=122)         (*newstring)[counter]-=32;
user-0 提问: 清内存

回复:
user: user-1
content: 这三个  memset((INT8U *)&a[0],0,sizeof(a)) memset(&a[0],0,sizeof(a)) memset(a[0],0,sizeof(a))

user: user-1
content: 这几个写法是不是一样的？？？貌似一样  memset((INT8U *)&a[0],0,sizeof(a))

user: user-2
content: memset, wmemset Sets buffers to a specified character.  --------------------------------------------------------------------------------  dest  Pointer to destination.  c  Character to set.  count  Number of characters.

user: user-3
content: memset((INT8U *)&a[0],0,sizeof(a)) 就是将地址开始位置&a[0] 长度为sizeof(a) 中的值设置为0
user-0 提问: 归并排序中内存释放问题，MSort中

回复:
user: user-0
content: 非常感谢两位！结贴~

user: user-1
content: 修改如下：  namespace ds { 	//	将分别有序的data1[s...m]和data1[m+1...n]归并为有序的data2[s...n] 	void Merge(int data[], int *tmp, int s, int m, int e); 	//	将data1[s...t]归并排序为data2[s...t] 	void MSort(int data[], int *tmp, int s, int e); 	void MergeSort(int data[], int n); 	void trace_vector(int datas[], int s, int e); 	void trace_int(int data); } void ds::Merge(int data[], int *tmp, int s, int m, int e) { 	int i = 0, i1 = s, i2 = m + 1; 	for (; i1 <= m && i2 <= e; i++) 	{ 		if (data[i1] < data[i2]) 		{ 			tmp[i] = data[i1++]; 		} 		else 		{ 			tmp[i] = data[i2++]; 		} 	} 	for (; i1 <= m; i1++) 	{ 		tmp[i++] = data[i1]; 	} 	for (; i2 <= e; i2++) 	{ 		tmp[i++] = data[i2]; 	} 	for (i1 = 0; i1 < i; i1++) 		data[s + i1] = tmp[i1]; 	trace_vector(data, s, e + 1); } void ds::MSort(int data[], int *tmp, int s, int e) { 	if (s < e) 	{ 		int m = s + (e - s) / 2; 		MSort(data, tmp, s, m); 		MSort(data, tmp, m + 1, e); 		Merge(data, tmp, s, m, e); 	} } void ds::MergeSort(int data[], int n) { 	int *tmp = new int[n]; 	MSort(data, tmp, 0, n - 1); 	delete[]tmp; } void ds::trace_vector(int datas[], int m, int n) { 	std::cout << "n:" << n << "("; 	for (int i = m; i<n; i++) 	{ 		std::cout << datas[i] << ","; 	} 	std::cout << ")\n"; } void ds::trace_int(int data) { 	std::cout << data << std::endl; } int main(void) { 	const int n = 7; 	int datas[n]; 	for (int i = 0; i < n; i++) 	{ 		datas[i] = rand() * 3 % 10; 	} 	std::cout << "before merge sort:"; 	ds::trace_vector(datas, 0, n);  	ds::MergeSort(datas, n); 	std::cout << "after merge sort:"; 	ds::trace_vector(datas, 0, n); 	return 0; } //before merge sort : n : 7(3, 1, 2, 0, 7, 2, 4, ) //n : 2(1, 3, ) //n : 4(0, 2, ) //n : 4(0, 1, 2, 3, ) //n : 6(2, 7, ) //n : 7(2, 4, 7, ) //n : 7(0, 1, 2, 2, 3, 4, 7, ) //after merge sort : n : 7(0, 1, 2, 2, 3, 4, 7, )

user: user-2
content: int *temp = new int[t-s+1]; 偏移不对, temp[0]就对应s了, 而在Merge中访问还是tmp[s], 而且没必要在这里分配内存,看代码应该是在MergeSort中分配一个,类似这样 MergeSort(int data1[], int n){     int *tmp =new int[n];     MSort(data1, tmp, 0, n-1);    delete []tmp; }

user: user-0
content: 调用程序 	const int n = 7; 	int datas[n]; 	for(int i=0; i<n; i++) 	{ 		datas[i] = rand() * 3 % 10; 	} 	std::cout << "before merge sort:"; 	ds::trace_vector(datas, 0, n);  	ds::MergeSort(datas, n); 	std::cout << "after merge sort:"; 	ds::trace_vector(datas, 0, n);
user-0 提问: 关于输入缓冲区的问题

回复:
user: user-1
content: 可以尝试每次采集完之后清空缓冲区

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-3
content: 引用 5 楼 赵4老师的回复:建议，以后读取一个字符时。 使用 char s1[2]; char c; scanf("%1s",s1);c=s1[0]; 而不要用 scanf("%c",&c); 这样也行？见识了！

user: user-2
content: 建议，以后读取一个字符时。 使用 char s1[2]; char c; scanf("%1s",s1);c=s1[0]; 而不要用 scanf("%c",&c);

user: user-4
content: scanf("%c",&sex);  printf("请输入年龄");  scanf("%d",&name); 你输入sex的值后用了回车那么 再输入name，这个时候回车是留在缓冲区的，只不过从缓冲区到name的时候这个回车被igore了。

user: user-0
content: 麻烦能不能具体点~scanf(%d)和scanf(%c)之后，难道\n不留在缓冲区吗？

user: user-4
content: %d才不关心你的空白字符呢直接忽略过去

user: user-5
content: 理解%c和%d的区别
user-0 提问: 关于for循环的break问题

回复:
user: user-0
content: 最后是编译器的问题，重新删除中间文件，全部编译之后就好了，谢谢各位

user: user-1
content: lz得学会调试

user: user-2
content: 查看进入for循环前j的值

user: user-3
content: 你代码都没显示出j是多少，你看下是不是j大于等于480，是当然他就执行break啦  楼主可以单步调试下，看程序是怎么走，每走一步变量的值是怎么变化的...

user: user-4
content: 那你需要单步调试，看看执行第十行的时候K的值是多少

user: user-5
content: 单步， 调试...

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

回复:
user: user-1
content: 看起来更像java

user: user-2
content: 出门左转C#区不谢

user: user-3
content: 这是c++代码？

user: user-4
content: "等于" + sum 这里会进行+运算（字符串拼接），编译器会执行String.Concat

user: user-5
content: int num; string str; str.Format("%d",num);
user-0 提问: 数据放置在CPU的高速数据CACHE可以提高访问速度，但是如何定义为数据是Cache中

回复:
user: user-1
content: INVD	 	0000111100001000	80486	Invalidate data cache WBINVD	 	0000111100001001	80486	Write Back and Invalidate Data Cache INVLPG	Mem	0000111100000001oo111mmm	80486	Invalidate TLB entry  分别是 清除，写回，以及更新转换检测缓冲 TLB 具体要让cache利用率高， 数据要按照 Cache 容量对齐 这样每一批cache 读写数据，都恰好取到（写回）所用的数据， 而不会被分割为几个 cache存储，读写。

user: user-1
content: 操作系统有能力控制，Cache 其他程序不成 如果，需要编写操作系统，或者类似的程序，那就去了解cache 的换入换出算法，以及相关要点（和硬件相关） 普通用户程序，就不需要了，甚至驱动程序，也未必需要知道

user: user-2
content: 引用 23 楼 lm_whales 的回复:[quote=引用 22 楼 jack960330 的回复:] [quote=引用 21 楼 lm_whales 的回复:] 操作系统有能力控制，Cache 其他程序不成 如果，需要编写操作系统，或者类似的程序，那就去了解cache 的换入换出算法，以及相关要点（和硬件相关） 普通用户程序，就不需要了，甚至驱动程序，也未必需要知道  是cpu的cache  不是操作系统虚拟页的cache[/quote]Cache 操作系统可以清Cache‘重置Cache’有一定的Cache控制能力[/quote]  CPU没有提供直接的指令控制cache。

user: user-1
content: 引用 22 楼 jack960330 的回复:[quote=引用 21 楼 lm_whales 的回复:] 操作系统有能力控制，Cache 其他程序不成 如果，需要编写操作系统，或者类似的程序，那就去了解cache 的换入换出算法，以及相关要点（和硬件相关） 普通用户程序，就不需要了，甚至驱动程序，也未必需要知道  是cpu的cache  不是操作系统虚拟页的cache[/quote]Cache 操作系统可以清Cache‘重置Cache’有一定的Cache控制能力

user: user-2
content: 引用 21 楼 lm_whales 的回复:操作系统有能力控制，Cache 其他程序不成 如果，需要编写操作系统，或者类似的程序，那就去了解cache 的换入换出算法，以及相关要点（和硬件相关） 普通用户程序，就不需要了，甚至驱动程序，也未必需要知道  是cpu的cache  不是操作系统虚拟页的cache

user: user-2
content: 引用 11 楼 d741963250 的回复:曾经见过一个例子。  memset(ptr,0,size)  把ptr的指向的内存放入cache中。  这是内存清空

user: user-2
content: Cache 是CPU高速缓存，如果你想存储在寄存器，我楼上说了，如果你想存入高速缓存，抱歉，没有直接的指令，但是你内存的数据，在读取之前都要被装入高速缓存的

user: user-3
content: LZ看一下Cache命中率，并不是内存越大越好，内存越大Cache命中率越低，当Cache命中率很低的时候cpu等待从内存读取的时候越来越长，你的机子越来越慢

user: user-4
content: 如果效率要求这么苛刻，不建议使用通用计算机系统

user: user-5
content: 是否有效的使用cache决定于你如何使用你的数据

user: user-6
content: 引用 13 楼 jack960330 的回复:C、C++有个关键字，能请求编译器将变量存入寄存器，但只是请求 register register declarator  The register keyword specifies that the variable is to be stored in a machine register, if possible.  The 32-bit compiler does not honor user requests for register variables. Instead it makes its own register choices when global optimizations are on. However, all other semantics associated with the register keyword are honored by the 32-bit compiler.  For more information, see auto, extern, and static.

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

user: user-2
content: C、C++有个关键字，能请求编译器将变量存入寄存器，但只是请求

user: user-7
content: 很多优化工作，现在的编译工具都已经做好了 而且保证比大多人自行优化来的高效

user: user-8
content: gpu 的 cache 可以控制，cpu 的不行，唯一能利用的就是内存中的临近性。

user: user-9
content: 这么重要的事情,  咋能让你去控制.. 可以用 SSE prefetch 把你即将要访问的数据载入到高速缓存.. 要高性能的时候,  通过检查CPU类型, 仔细选择参数, 使得程序中使用到的热点数据不要超过 CPU L1 Cache 的大小..

user: user-10
content: 曾经见过一个例子。  memset(ptr,0,size)  把ptr的指向的内存放入cache中。

user: user-11
content: 引用 7 楼 u013356755 的回复:那就是说 数据放置在CPU的高速数据CACHE可以提高访问速度 没有意义？ 明显理解有误。数据放在CPU告诉缓冲中当然可以提高访问速度，怎么能无意义？ 只不过是不能编程人为控制哪些数据放置于CPU的高速缓冲中

user: user-0
content: 那就是说 数据放置在CPU的高速数据CACHE可以提高访问速度 没有意义？

user: user-6
content: 《The Intel 64 and IA-32 Architectures Software Developer's Manual》
user-0 提问: linux下如何用c语言实现u盘简单的格式化

回复:
user: user-1
content: 你好，请问你现在有思路吗？  我现在也需要做这个。

user: user-2
content: man mkfs 意思是制作文件系统，其实就是格式化

user: user-3
content: Linux是开源的。
user-0 提问: 急救！多线程调用的函数传入参数以后怎样能在主函数中再次访问这个参数？即DWORD WINAPI time(LPVOID lp)

回复:
user: user-1
content: 用指针就可以, 不同线程对同一地址读写可能需要上锁  引用 4 楼 zhao4zhong1 的回复:[quote=引用 2 楼 fly_dragon_fly 的回复:] 用指针就可以, 不同线程对同一地址读写可能需要上锁 不同线程对同一地址读写必须要上锁！[/quote]  引用 4 楼 zhao4zhong1 的回复:[quote=引用 2 楼 fly_dragon_fly 的回复:] 用指针就可以, 不同线程对同一地址读写可能需要上锁 不同线程对同一地址读写必须要上锁！[/quote] 举个Gui的例子, 主线程显示进度, 辅助线程更新进度, 一个读,一个写,必须要上锁吗?

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:[quote=引用 2 楼 fly_dragon_fly 的回复:] 用指针就可以, 不同线程对同一地址读写可能需要上锁 不同线程对同一地址读写必须要上锁！[/quote] 哦哦，明白了，多谢多谢！！！

user: user-2
content: 引用 2 楼 fly_dragon_fly 的回复:用指针就可以, 不同线程对同一地址读写可能需要上锁 不同线程对同一地址读写必须要上锁！

user: user-3
content: 你只需要保证 传递进去的参数指针所指对象是在主函数里面分配的，或者参数指针本身就是主函数里面一个有效的指针变量即可

user: user-1
content: 用指针就可以, 不同线程对同一地址读写可能需要上锁

user: user-4
content: 是的。但对于传入的指针有要求，也就是在线程中使用传入的指针时，指针指向的地方必须有效。比如：指向的对象不能被销毁或指向的变量不能被销毁
user-0 提问: 求一个算法，获得一批随机数据

回复:
user: user-1
content: md5(当前时间+本机mac地址+输入+随机)

user: user-2
content: 仅供参考：#pragma comment(lib,"ole32") #include <objbase.h> #include <stdio.h> union U {     GUID            guid;     unsigned char   b[16]; } u; int i; char s[33]; void main() {     if (S_OK!=CoCreateGuid(&u.guid)) return;     for (i=0;i<16;i++) sprintf(s+i*2,"%02x",u.b[i]);     printf("GUID=%s\n",s);//每次结果都不一样 } //GUID=f5a44443aa5fb1479bf6741fa213d33c

user: user-0
content: 有点类似MD5等的哈希算法的要求

user: user-0
content: 是那种只含有数字和a-f的guid吗？ 128bit的整数的话，转成成char应该是几位的？

user: user-2
content: CoCreateGuid Creates a GUID, a unique 128-bit integer used for CLSIDs and interface identifiers.  HRESULT CoCreateGuid(   GUID  *pguid  //Pointer to the GUID on return );   Parameter pguid  [out] Pointer to the requested GUID on return.  Return Value S_OK  The GUID was successfully created.  Win32 errors are returned byUuidCreate but wrapped as an HRESULT.  Remarks The CoCreateGuid function calls the RPC function UuidCreate, which creates a GUID, a globally unique 128-bit integer. Use the CoCreateGuid function when you need an absolutely unique number that you will use as a persistent identifier in a distributed environment.To a very high degree of certainty, this function returns a unique value – no other invocation, on the same or any other system (networked or not), should return the same value.  QuickInfo   Windows NT: Use version 3.1 or later.   Windows: Use Windows 95 or later.   Windows CE: Unsupported.   Header: Declared in objbase.h.   Import Library: Included as a resource in ole32.dll.  See Also UuidCreate
user-0 提问: 宏偏移量问题

回复:
user: user-0
content: 引用 1 楼 user-3 的回复:char*保证是以单字节计算偏移量的，因指针如果直接进行减法运算，是和类型相关的谢谢

user: user-1
content: 指针的偏移量是按照对象个数计算的。     When an expression that has integral type is added to or subtracted from a pointer, the integral value is first multiplied by the size of the object pointed to.  这里是需要按字节计算的，所以转换为char *

user: user-2
content: C/C++在对指针进行加减时会自动将偏移量乘上指针指向的数据类型的大小，比如定义一个int *p;那么,p+i的地址实际上为 p+i*sizeof(int);而如果将p转换成char*,(char*)p+i的地址为(char*)p+i*sizeof(char),  sizeof(char)为1,  所以结果为 (char*)p+i. 这里offsetof的结果为实际的偏移量，不应该再去乘上类型大小，所以就通过将__mptr转换为char*来实现这一目的.

user: user-3
content: char*保证是以单字节计算偏移量的，因指针如果直接进行减法运算，是和类型相关的
user-0 提问: 将txt的内数据，存入数组

回复:
user: user-1
content: fgets sscanf

user: user-2
content: 这样可好：  int arr[300][5]; int i, j, r; FILE *f; int main(void) { 	f = fopen("1.txt", "r"); 	i = 0; 	int *pArr = &arr[0][0]; 	while (1) 	{ 		r = fscanf(f, "%d", pArr + i); 		if (EOF == r) break; 		if (++i == 300) break; 	} 	j = 0; 	do 	{ 		printf("%d ", pArr[j]); 		if (0 == ++j % 5) printf("\n"); 	} while (j < i); 	fclose(f); 	return 0; }

user: user-0
content: 引用 1 楼 fly_dragon_fly 的回复:int a[1500]; for(int i=0;i<1500; i++) scanf("%d",a+i); 是从文件中读，并且存入数组，数据格式大概是 632     311     1802     363     1576      365     639     116     65     1062      3991     2057     740     954     1522      1015     1447     1742     963     823      8418     846     1330     2178     938      699     639     663     646     1082      0     0     0     0     0      862     736     4     249     430      这样

user: user-3
content: 楼上方法正确。 编译成可执行文件 exe $ ./exe < file.txt  也可以用fopen打开文件，然后将上面的scanf用fcanf代替，注意FILE * 要加上

user: user-4
content: int a[1500]; for(int i=0;i<1500; i++) scanf("%d",a+i);

user: user-5
content: void Open(istream &Input) {   Input>>Size;   POINT Temp;   for(int i = 0; i < Size; i++)   {     Input>>Temp.x>>Temp.y; //这是我写过的读取N个坐标点的一个函数      MutiPoints.push_back(Temp); //你可以用容器，也可以用数组，很简单的    } }
user-0 提问: 我把10个int型数据存入文件,最后文件指针为什么是41

回复:
user: user-1
content: 你既然是用fwrite写入 那你是用fopen("", "wb")';  打开文件的吗？

user: user-2
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-1
content: 我测试的是40

user: user-3
content: 一个数字不写 指针位置在哪里？写一个在哪里？
user-0 提问: 创建个文件，老是失败额

回复:
user: user-1
content: 引用 4 楼 赵4老师的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。  作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。  乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单，不用格式控制符！ 但是不用格式控制符，输入输出恰好是你期望的格式的时候好说；等到输入输出不是你期望的格式的时候，你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout！ 使用scanf、printf。 赵老师就是赵老师

user: user-1
content: 引用 4 楼 赵4老师的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。  作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。  乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单，不用格式控制符！ 但是不用格式控制符，输入输出恰好是你期望的格式的时候好说；等到输入输出不是你期望的格式的时候，你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout！ 使用scanf、printf。 赵老师就是赵老师

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。  作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。  乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单，不用格式控制符！ 但是不用格式控制符，输入输出恰好是你期望的格式的时候好说；等到输入输出不是你期望的格式的时候，你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout！ 使用scanf、printf。

user: user-0
content: 谢谢大家哈，scanf ，printf          scanf ，printf    scanf ，printf          scanf ，printf    scanf ，printf          scanf ，printf

user: user-2
content: #include <stdio.h> int main() {     int account;     char name[30];     double balance;      FILE *cfPtr;      if ((cfPtr=fopen("d:\\zhang.dat","w"))==NULL) {         printf("File could not be opened\n");     } else {         printf("Enter the account,name,balance.\n");         printf("Enter <Enter><Ctrl Z><Enter> to end input.\n");         printf("? ");fflush(stdout);         rewind(stdin);         scanf("%d%29s%lf",&account,name,&balance);          while(1) {             fprintf(cfPtr,"%d %s %.2lf\n",account,name,balance);             printf("? ");fflush(stdout);             rewind(stdin);             if (EOF==scanf("%d%29s%lf",&account,name,&balance)) break;         }         fclose(cfPtr);     }      return 0; }

user: user-3
content: 建议好好学下scanf的输入，因为很多问题都是它引起的

user: user-4
content: 楼上正解
user-0 提问: 学习C语言，在什么系统下学习比较好？

回复:
user: user-0
content: 非常感谢各位大大！

user: user-1
content: 实际上都差不多，你现在习惯win7系统，换linux系统你最少要在花一个月适应新的系统，浪费时间

user: user-2
content: 用心学在哪个平台都一样，不用心都是白搭～我用的w8，兼容性不好，一样能克服。

user: user-3
content: 搞台比较好点的机器，再装个虚拟机，随便你在哪学习都行。

user: user-4
content: 都是一样的啊，

user: user-5
content: 其实都差不多  不过如果能在linux上搞  更好

user: user-6
content: http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装

user: user-7
content: 都可以，再找个自己顺手的ide
user-0 提问: C语言文件结构体问题

回复:
user: user-1
content: 打开一个文件用于读取，另一个文件用于写。循环读取一个结构体，如果不需要删除，则写入新文件。文件读完写完之后，把读的那个文件删掉，把写的文件改名为读的文件即可

user: user-2
content: 楼上正解

user: user-3
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。

user: user-4
content: 如果输出格式是二进制的就好办了 找到要删除的那个结构体的位置，再找到最后一个位置的结构体，给删除的那个删掉，然后将最后一个清零 当然如果要删除的就是最后一个，那就直接清零就好了

user: user-2
content: 把文件中的内容以结构体对象为单位读出，将非删除的输入到另一个文件。 至此，可实现制定内容删除。
user-0 提问: gcc4.6编译器编译的这段代码死活有问题。运行崩溃，实在找不到有什么

回复:
user: user-1
content: 这个参是不是搞错了.. 这个参应该是  num  多少个字符 str.substr(nposl+strl.length(),npose).c_str()///

user: user-2
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-3
content: 断点调试不就搞定了？
user-0 提问: c传结构体给lua

回复:
user: user-1
content: 一般都是传指针，传结构体比较麻烦

user: user-1
content: lua_pushlightuserdata((L), (void*)(pointer))     lua_topointer((L), i)

user: user-0
content: 引用 1 楼 hnwyllmm 的回复:一般都是传指针，传结构体比较麻烦  请问，传指针大概怎么个用法，多谢。。
user-0 提问: c语言 图书馆 帮忙看一下谢谢！

回复:
user: user-1
content: struct ts *ReadData(void)  中的p2未初始化

user: user-2
content: 这里你用的是do...while，至少执行了一次，用while(){}能更好点

user: user-2
content: void czall() { 	int i; 	struct ts *pt; 	pt = ReadData(); 	do { 		printf("%d %s %s %s %lf %d\n", 			&pt->lx, pt->tsm, pt->bh, pt->zz, &pt->jg, &pt->bs); 		pt = pt->next; 	} while (pt != NULL); 	printf("\n"); 	 } 问题在这里，如果函数执行失败，传回来一个空指针，你对空指针进行操作当然报错

user: user-2
content: 请选择用户类型登陆(管理员请选择1 学生请选择2):1 ================================================================================ |                                                                              | |                            ***图书馆管理***                                  | |                                                                              | |                      1.增加图书         2.查找图书                           | |                      3.修改图书数据     4.删除图书                           | |                      5.退出                                                  | |                                                                              | |                                                                              | ================================================================================ 请输入相应功能的数字：    2 ================================================================================ |                                                                              | |                             ***查找图书***                                   | |                      1.查找全部         2.书名查询                           | |                      3.作者查询         4.模糊查询                           | |                      5.返回菜单                                              | |                                                                              | ================================================================================ 请输入相应功能数字:1 打开文件出错 Press any key to continue

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

回复:
user: user-1
content: 原因很简单，需要考虑是编译为动态库还是静态库的问题。 按照你的写法，如果编译方式一变，就得重写所有接口函数声明方式。 按照define的方式，只需要改动一处即可

user: user-2
content: 你可以搜索一下其它文件里有没有这个宏的不同定义

user: user-3
content: 引用 1 楼 user-4 的回复:动态库和静态库链接名不同, 可以用于不同的编译  动态库和静态库的接口定义不同？ 确实是第一次听说有这样做的

user: user-4
content: 动态库和静态库链接名不同, 可以用于不同的编译
user-0 提问: 为什么运行后可直不需要注册登录就可以运行其他功能，是什么问题？哪位大神可以解决一下

回复:
user: user-1
content: 把注册作为main函数的第一个函数调用 switch(getch());前最好加一句：rewind(stdin);  rewind(stdin); switch(getch()) { ……

user: user-2
content: 因为你没有判断，你应该强制注册后才能执行其他功能