Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 问if（a++！=b++）的意思

回复:
user: user-1
content: #include <stdio.h> char *mat(char *a,char *b); void main() { 	char *test; 	char *_a = "a"; 	char *_b = "b"; 	test = mat(_a, _b); 	printf("%s\n", test); 	 }  char *mat(char *a,char *b) {       	while(*b!='\0')     {           if(*a++!=*b++)  		  return NULL;     }        return b; }   你單步調試就知道為甚麼了吧

user: user-2
content: “ if(*a++!=*b++)”   的意思，，，   首先，我们来看操作符的优先级，++高于* 其次，a,b是指针， 最后，先a++,但这时要注意，*a++表示取指针的内容，但这时取的是*a,,,取完之后a的指针指向+1 同理，b也一样；    判断*a是否等于*b,判断完成之后，不管是相等还是不相等，a,b指针都自加1

user: user-0
content: 引用 1 楼 aa5566f4 的回复:while(*char!='\0') 請問這段程式碼是否有錯???  额 是whie( *b！=‘\0’) 写快了！

user: user-1
content: while(*char!='\0') 請問這段程式碼是否有錯???

user: user-0
content: 引用 5 楼 user-3 的回复:char *mat(char *a,char *b){     while(*a!='\0'){         if(*a++!=*b++)   //*a!=*b? a=a+1,b=b+1             return NULL;     }     return b; }   意思是，，（*a++！=*b++）将两个中短的那个全比完，，只要出现不相同的就返回NULL；不知道理解正确么

user: user-0
content: 引用 3 楼 Evankaka 的回复:“ if(*a++!=*b++)”   的意思，，，   首先，我们来看操作符的优先级，++高于* 其次，a,b是指针， 最后，先a++,但这时要注意，*a++表示取指针的内容，但这时取的是*a,,,取完之后a的指针指向+1 同理，b也一样；    判断*a是否等于*b,判断完成之后，不管是相等还是不相等，a,b指针都自加1  然后是，，各自加完后，再比较，，，只要出现（*a++！=*b++）就返回NULL；；是不是啊。。

user: user-0
content: 引用 4 楼 aa5566f4 的回复: #include <stdio.h> char *mat(char *a,char *b); void main() { 	char *test; 	char *_a = "a"; 	char *_b = "b"; 	test = mat(_a, _b); 	printf("%s\n", test); 	 }  char *mat(char *a,char *b) {       	while(*b!='\0')     {           if(*a++!=*b++)  		  return NULL;     }        return b; }   你單步調試就知道為甚麼了吧  看我理解的有没问题，，，就是只有在if（*a++=*b++）才不会返回NULL，，不知道对不对额

user: user-3
content: char *mat(char *a,char *b){     while(*a!='\0'){         if(*a++!=*b++)   //*a!=*b? a=a+1,b=b+1             return NULL;     }     return b; }

user: user-3
content: 引用 10 楼 lymymk 的回复:[quote=引用 9 楼 user-3 的回复:] [quote=引用 8 楼 lymymk 的回复:] [quote=引用 5 楼 user-3 的回复:] char *mat(char *a,char *b){     while(*a!='\0'){         if(*a++!=*b++)   //*a!=*b? a=a+1,b=b+1             return NULL;     }     return b; } [/quote]不能理解为把短的比较完，while循环只对a进行‘\0’末尾的判断，没有对b的判断，比如a长，b短，那么会一直比较下去，如果前面一直匹配，会和存储b之后的内存进行比较（未定义的结果）。[/quote]  那为什么调试后发现，，a比b长，，然后如果是return a 的话，，实际上是，输出a和b比较之后的 长度，，比如：a=“abcdeef”；b=“abc”。。。运行之后 得到的是：return a；结果是：deef[/quote] 就你说的问题来看一下，如果像你那样，当a指向'd‘的时候，b指向’\0'，已经不同，返回的是NULL，但是你是直接对传入的指针操作，所以你来打印a指向字符串，是从你a现在指向的地方一直到'\0'结束。我觉得你本意是这样调用： char* p=mat(a,b);   //p得到NULL

user: user-0
content: 引用 9 楼 user-3 的回复:[quote=引用 8 楼 lymymk 的回复:] [quote=引用 5 楼 user-3 的回复:] char *mat(char *a,char *b){     while(*a!='\0'){         if(*a++!=*b++)   //*a!=*b? a=a+1,b=b+1             return NULL;     }     return b; } [/quote]不能理解为把短的比较完，while循环只对a进行‘\0’末尾的判断，没有对b的判断，比如a长，b短，那么会一直比较下去，如果前面一直匹配，会和存储b之后的内存进行比较（未定义的结果）。[/quote]  那为什么调试后发现，，a比b长，，然后如果是return a 的话，，实际上是，输出a和b比较之后的 长度，，比如：a=“abcdeef”；b=“abc”。。。运行之后 得到的是：return a；结果是：deef

user: user-3
content: 引用 8 楼 lymymk 的回复:[quote=引用 5 楼 user-3 的回复:] char *mat(char *a,char *b){     while(*a!='\0'){         if(*a++!=*b++)   //*a!=*b? a=a+1,b=b+1             return NULL;     }     return b; } [/quote]不能理解为把短的比较完，while循环只对a进行‘\0’末尾的判断，没有对b的判断，比如a长，b短，那么会一直比较下去，如果前面一直匹配，会和存储b之后的内存进行比较（未定义的结果）。
user-0 提问: calloc 断错误问题

回复:
user: user-1
content: 嵌入式应用的金科玉律： 初始化时，清理上次异常退出或掉电遗留下来的垃圾数据和垃圾资源、分配本次服务需要的所有资源（内存、文件句柄、连接、……）； 开始服务后，杜绝所有动态资源的分配和释放，轮流使用各资源； 不要也无需优雅地结束服务，拔掉电源即可。

user: user-2
content: 个人认为： 你分配的内存对于嵌入式板子来说是否有点大？在PC上，由于内存比较大，可能就不会有问题，但嵌入式板子的内存应该比较小，即使是堆上的内存也比较少，你连续分配，再释放……可能就会有很多碎片，而这些碎片可能没有来得及及时整合成一大块，不一定就有一整块那么大的堆内存……所以导致内存分配失败……

user: user-3
content: 是不是多线程? 可能是多个线程同时调用内存管理函数了.  造成内存管理数据结构损坏.

user: user-0
content: 补充一点： 如果我放在linux虚拟机中运行就不会出现，放在嵌入式板子上运行过一段时间就会出现。

user: user-1
content: 引用 9 楼 zxhuser-5 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 嵌入式应用的金科玉律： 初始化时，清理上次异常退出或掉电遗留下来的垃圾数据和垃圾资源、分配本次服务需要的所有资源（内存、文件句柄、连接、……）； 开始服务后，杜绝所有动态资源的分配和释放，轮流使用各资源； 不要也无需优雅地结束服务，拔掉电源即可。噗，拔掉电源即可。。。[/quote] http://bbs.csdn.net/topics/390787357

user: user-4
content: gcc 的 libc 的 malloc 是支持多线程, 问题在于楼主编译的时候是否指示编译器使用多线程，如果用的是gcc/g++编译多线程程序，需要加上-pthread 参数

user: user-5
content: 引用 4 楼 zhao4zhong1 的回复:嵌入式应用的金科玉律： 初始化时，清理上次异常退出或掉电遗留下来的垃圾数据和垃圾资源、分配本次服务需要的所有资源（内存、文件句柄、连接、……）； 开始服务后，杜绝所有动态资源的分配和释放，轮流使用各资源； 不要也无需优雅地结束服务，拔掉电源即可。噗，拔掉电源即可。。。

user: user-3
content: 引用 7 楼 whiskylife 的回复:[quote=引用 2 楼 wanght99 的回复:] 是不是多线程? 可能是多个线程同时调用内存管理函数了.  造成内存管理数据结构损坏.       是多线程的，内存管理数据结构损坏如何判断与避免呢？可以说说方法吗[/quote]  感觉在malloc和free里莫名其妙地出问题基本上都是这个原因, 有的环境下会出现类似 "double link corrupted"类似的提示. 以我有限了解, 想杜绝这种情况只能避免发生两个线程同时做堆内存操作.因为内存管理函数本身是不可重入的.

user: user-0
content: 引用 2 楼 wanght99 的回复:是不是多线程? 可能是多个线程同时调用内存管理函数了.  造成内存管理数据结构损坏.       是多线程的，内存管理数据结构损坏如何判断与避免呢？可以说说方法吗

user: user-0
content: 引用 3 楼 u010030181 的回复:个人认为： 你分配的内存对于嵌入式板子来说是否有点大？在PC上，由于内存比较大，可能就不会有问题，但嵌入式板子的内存应该比较小，即使是堆上的内存也比较少，你连续分配，再释放……可能就会有很多碎片，而这些碎片可能没有来得及及时整合成一大块，不一定就有一整块那么大的堆内存……所以导致内存分配失败……       确实有点大，但是内存分配失败，表现出来是断错误吗？可不可以从排查的手段入手，说说该如何排查？ 我可以试一下，把内存申请大小变小，看一下效果。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:嵌入式应用的金科玉律： 初始化时，清理上次异常退出或掉电遗留下来的垃圾数据和垃圾资源、分配本次服务需要的所有资源（内存、文件句柄、连接、……）； 开始服务后，杜绝所有动态资源的分配和释放，轮流使用各资源； 不要也无需优雅地结束服务，拔掉电源即可。           确实要杜绝出现这种频繁动态的操作内存，但是项目中已经是这样了。要改就要从整个方面来改了。暂时先略过这个。          我想问下，初始化时，清理上次异常退出或掉电遗留下来的垃圾数据和垃圾资源, 这个是如何做到的？
user-0 提问: 小弟刚学c，哪个大神帮我看看我这个程序哪错了

回复:
user: user-1
content: scanf("%d" "地址");

user: user-0
content: 引用 2 楼 brookmill 的回复:scanf("%d",&stu[i].chinese); scanf("%d",&stu[i].math); scanf("%d",&stu[i].english); 谢谢，这样弄后就正常了

user: user-2
content: #include <stdlib.h> #include <stdio.h> #include <conio.h>  #define N 5 struct student { 	char no[9]; 	char name[10]; 	int chinese,math,english;  }stu[N];  int main( ) { 	FILE *fp; 	int i;  	if( ( fp = fopen( "test.txt", "w" ) ) == NULL ) 	{ 		printf( "error\n" ); 		getch( ); 		exit( 1 ); 	} 	for( i = 0; i < N; i++ ) 	{ 		printf( "\n学号 : " ); 		scanf( "%s", stu[i].no ); 		printf( "\n语文 : " ); 		scanf( "%d", stu[i].chinese ); 	printf( "\n姓名 : " ); 	scanf( "%s", stu[i].name ); 	printf( "\n数学 : " ); 	scanf( "%d", stu[i].math ); 	printf( "\n英语:" ); 	scanf( "%d", stu[i].english ); 	fprintf( fp, "%s %s %d %d %d\n", stu[i].no,stu[i].name, stu[i].chinese, stu[i].math, stu[i].english ); 	} 	fclose( fp ); 	return 0; } 两个问题: 1.使用了exit(1),需引入头文件 #include<stdlib.h> 2.main函数需要 return 0

user: user-3
content: 引用 2 楼 brookmill 的回复:scanf("%d",&stu[i].chinese); scanf("%d",&stu[i].math); scanf("%d",&stu[i].english);

user: user-4
content: conio.h没用，删掉吧。 main既然是int就该有返回值，最后加上return 0;

user: user-4
content: scanf("%d",&stu[i].chinese); scanf("%d",&stu[i].math); scanf("%d",&stu[i].english);

user: user-5
content: 先说说怎么个错法呀，不然人家怎么帮你？
user-0 提问: 用C语言实现函数

回复:
user: user-1
content: 复位的话，只要往该寄存器地址相应的位写值，延时1ms就行。*(volatile unsigned int *)0x6000000 &= ~(1 << 2);delay(1);大概就是这样的。 后面一题的话，自己写了一个，只测了几个简单的案例，仅做参考。思路是这样的：N/M*n(n=0...M)的整数部分刚好是下标号，小数部分是对应下标号的偏移，代码如下： void change_pixel(int old,int new) { 	int i;  	for(i = 0;i <= new;i++) 	{ 		int x = old*i/new; 		float offset = (float)old * i/ new - x;  		printf("Y%d, X%d, %f\n",i,x,offset); 	} }

user: user-2
content: 引用 1 楼 cyd54454 的回复:复位的话，只要往该寄存器地址相应的位写值，延时1ms就行。*(volatile unsigned int *)0x6000000 &= ~(1 << 2);delay(1);大概就是这样的。 后面一题的话，自己写了一个，只测了几个简单的案例，仅做参考。思路是这样的：N/M*n(n=0...M)的整数部分刚好是下标号，小数部分是对应下标号的偏移，代码如下： void change_pixel(int old,int new) { 	int i;  	for(i = 0;i <= new;i++) 	{ 		int x = old*i/new; 		float offset = (float)old * i/ new - x;  		printf("Y%d, X%d, %f\n",i,x,offset); 	} }+1，我真不知道
user-0 提问: 关于数据结构中的线性表

回复:
user: user-1
content: 第一个函数应该是 void initList(List **l){    *l=(List *)malloc(sizeof(List));    (*l)->len=0;  }   第二个函数  l->a[j+1]=l->a[j]; 应该是  l->a[m+1]=l->a[m];
user-0 提问: 在Windows8命令行下bison: m4: Invalid argument

回复:
user: user-1
content: 我也有这个问题。

user: user-2
content: 引用 2 楼 singlett 的回复:这个说的应该是使用默认安装方式的目录安装的会有空格吧，我使用手动指定安装地址，应该不存在有空格的问题吧。谢谢 你参照哪个链接里说明的方式执行下，看看实际使用的路径是什么。那个问题定位也挺匪夷所思的。

user: user-0
content: 引用 1 楼 truelance 的回复:据说是因为安装时自动加了个快捷方式，实际运行的路径是 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\GnuWin32\Bison 这个路径中有空格  建议的解决方法是 So, if you’re the same way, then this should work for you:  1.Copy C:\GnuWin32 (and subdirs) to a safe location  2.Run the bison uninstall (to remove the entry from the registry)  3.Ensure current C:\GnuWin32 does not exist  4.Ensure C:\ProgramData\Microsoft\Windows\Start Menu\Programs\GnuWin32 does not exist (those true docs will already be saved in the copy we made anyway, that will be restored to C:\GnuWin32)  5.Re-boot computer (because stale registry values will remain and thus a restart is necessary – this I also detected with Procmon)  6.Copy the saved GnuWin32 (and subdirs) back to C:\.  7.Ensure C:\GnuWin32\bin is in the $PATH for Windows.   出处:http://www.chriscalender.com/resolving-the-bison-exe-m4-invalid-argument-error-when-building-mysqlmariadbxtradb-on-windows/  这个说的应该是使用默认安装方式的目录安装的会有空格吧，我使用手动指定安装地址，应该不存在有空格的问题吧。谢谢

user: user-2
content: 据说是因为安装时自动加了个快捷方式，实际运行的路径是 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\GnuWin32\Bison 这个路径中有空格  建议的解决方法是 So, if you’re the same way, then this should work for you:  1.Copy C:\GnuWin32 (and subdirs) to a safe location  2.Run the bison uninstall (to remove the entry from the registry)  3.Ensure current C:\GnuWin32 does not exist  4.Ensure C:\ProgramData\Microsoft\Windows\Start Menu\Programs\GnuWin32 does not exist (those true docs will already be saved in the copy we made anyway, that will be restored to C:\GnuWin32)  5.Re-boot computer (because stale registry values will remain and thus a restart is necessary – this I also detected with Procmon)  6.Copy the saved GnuWin32 (and subdirs) back to C:\.  7.Ensure C:\GnuWin32\bin is in the $PATH for Windows.   出处:http://www.chriscalender.com/resolving-the-bison-exe-m4-invalid-argument-error-when-building-mysqlmariadbxtradb-on-windows/
user-0 提问: 关于C语句显示的问题，请指教

回复:
user: user-1
content: *(ptr++)&=0xff; 相当于：  *ptr = *ptr & 0xff;   // 按位与 ptr++;   // 地址加1

user: user-2
content: 还可以试试把ptr改成int类型： int i; ptr=(int*)data; for(i=0; i<5; i++) { *(ptr++)&=0xff;  // 把4字节int的高24位清0，保留最低8位 } 结果，data里面每4个字节会有3个变成0

user: user-2
content: 每次ptr++，向前移动一个short int的大小。因为short int的大小是两个字节，所以每次ptr++就向前移动2字节。 循环之后，就把data里面原来的20个字节，作为10个short int，每个都把高8位清0，结果就是20个字节里面交错的有一半变成0了

user: user-3
content: &运算是按位与, 0xff是255, 表示只取最低的8位

user: user-2
content: *(ptr++)&=0xff;    这句语如何理解 一个2字节的短整数，把它的高8位清0，保留低8位不变。 比如，如果short int s = 0x1234，那么 s &= 0xff 之后 s变成0x34
user-0 提问: 请问整数显式比较(x>y)和隐式比较(x-y)的区别

回复:
user: user-1
content: 课后习题的是对unsigned类型比较的 对signed类型比较不能用减法

user: user-0
content: 感谢大家，在这说明一点，由于是第一次发帖子所以原码本身就有点问题，这点很抱歉，这里提供作者的原码 int cmpint(const void *x, const void *y) { 	if (**(int **)x < **(int **)y) 		return -1; 	else if (**(int **)x > **(int **)y) 		return +1; 	else 		return 0; } 至于为什么是 **(int **) 是因为cmpint主要用于 qsort中, 而需要做排序的是 int *a[]， 所以需要做这种转换

user: user-2
content: 引用 10 楼 FancyMouse 的回复:[quote=引用 1 楼 u010030181 的回复:] [quote=引用 楼主 xccph2410 的回复:] 在c语言接口与实现中，作者的整数比较函数为 int cmpint( const void *x, const void *) 少了个y吧？你这样比较就少了一种相等的情况，你应该加上那就和下面的基本差不多了，下面这种就包含了相等的情况，返回值 <0得出*x < *y, =0得出*x = *y，>0得出*x > *y，当然下面的判断还是存在漏洞的，假如*x是一个很大的正整数,而*y是一个很大的负整数，这样一相减，就会超出int所能表示的范围，但貌似即使超出范围，也不会改变符号位，所以问题也不大，但一般我们也不会去考虑这种问题。[/quote] 为什么你连反例都想到了结论却是错的……溢出以后第一个改变的就是符号位啊。除非保证不会溢出，否则问题非常大。[/quote] 好吧，因为昨天简单测试了一下，发现符号位没有改变，但结果有点奇怪，就没多想……现在想想应该是位数没有达到溢出……

user: user-3
content: 引用 11 楼 Zidane_2014 的回复:第一个没有考虑相等的情况。 第二个可能会产生溢出。  ++

user: user-4
content: 第一个没有考虑相等的情况。 第二个可能会产生溢出。

user: user-5
content: 引用 1 楼 u010030181 的回复:[quote=引用 楼主 xccph2410 的回复:] 在c语言接口与实现中，作者的整数比较函数为 int cmpint( const void *x, const void *) 少了个y吧？你这样比较就少了一种相等的情况，你应该加上那就和下面的基本差不多了，下面这种就包含了相等的情况，返回值 <0得出*x < *y, =0得出*x = *y，>0得出*x > *y，当然下面的判断还是存在漏洞的，假如*x是一个很大的正整数,而*y是一个很大的负整数，这样一相减，就会超出int所能表示的范围，但貌似即使超出范围，也不会改变符号位，所以问题也不大，但一般我们也不会去考虑这种问题。[/quote] 为什么你连反例都想到了结论却是错的……溢出以后第一个改变的就是符号位啊。除非保证不会溢出，否则问题非常大。

user: user-6
content: C中的compare一般要求：  a == b: 0 a < b : 负数  a  > b: 正数  第一个代码没有处理相等的情况

user: user-7
content: 好精致的代码

user: user-8
content: 引用 1 楼 u010030181 的回复:[quote=引用 楼主 xccph2410 的回复:] 在c语言接口与实现中，作者的整数比较函数为 int cmpint( const void *x, const void *) 少了个y吧？你这样比较就少了一种相等的情况，你应该加上那就和下面的基本差不多了，下面这种就包含了相等的情况，返回值 <0得出*x < *y, =0得出*x = *y，>0得出*x > *y，当然下面的判断还是存在漏洞的，假如*x是一个很大的正整数,而*y是一个很大的负整数，这样一相减，就会超出int所能表示的范围，但貌似即使超出范围，也不会改变符号位，所以问题也不大，但一般我们也不会去考虑这种问题。[/quote]+1，第二种有溢出的可能

user: user-9
content: 引用 3 楼 lovesmiles 的回复:我倒是有个问题，指针变量x做二次**运行是什么意思？  且不说后者的返回值无法是+-1，还可能存在溢出的问题。 根本完成不了函数的作用，谈何效率 返回值什么时候要求只能是 +-1

user: user-10
content: 第一个函数也没有考虑相等的情况，着实蛋疼

user: user-9
content: 你的做法是错的 你没考虑 如果相等 返回多少

user: user-10
content: 我倒是有个问题，指针变量x做二次**运行是什么意思？  且不说后者的返回值无法是+-1，还可能存在溢出的问题。 根本完成不了函数的作用，谈何效率

user: user-11
content: 个人认为后者效率要高一点。 前者>比较，返回一个整形（其实>就是做个减法)，如果>成立，就返回1。然后还要对这个得到的整形判断，得到判断结果，然后将1返回。如果要执行到else if的语句，还有步骤。 后者直接将相减的结果返回。很有效率。

user: user-2
content: 引用 楼主 xccph2410 的回复:在c语言接口与实现中，作者的整数比较函数为 int cmpint( const void *x, const void *) 少了个y吧？你这样比较就少了一种相等的情况，你应该加上那就和下面的基本差不多了，下面这种就包含了相等的情况，返回值 <0得出*x < *y, =0得出*x = *y，>0得出*x > *y，当然下面的判断还是存在漏洞的，假如*x是一个很大的正整数,而*y是一个很大的负整数，这样一相减，就会超出int所能表示的范围，但貌似即使超出范围，也不会改变符号位，所以问题也不大，但一般我们也不会去考虑这种问题。
user-0 提问: C语言中长整型的输出格式是否必须是%ld?

回复:
user: user-1
content: 數字要再給大一點吧 = =

user: user-0
content: 我把b值赋予35000  这个值应该超过了 int 范围了吧     但是 还是输出的c值没有问题

user: user-2
content: 只是你赋值太小了，

user: user-3
content: 你输个大于int最大值但小于long最大值的数看看

user: user-0
content: 顶顶顶顶顶顶
user-0 提问: 什么是数据溢出

回复:
user: user-1
content: 溢出就是，你申请了一块地盖房子，但是盖着盖着你侵占了地块之外的空间 别人难道不会对你有意见？

user: user-2
content: 数据类型都有其可以表示的最大值，给这个类型的变量超过他最大值的值，就产生了溢出，对于溢出的处理不同的编译器处理不同，所以其结果一般是未知的，要防止这种情况发生

user: user-3
content: 每一個變量都有範圍不可超出

user: user-4
content: 推荐你看下《深入理解计算机系统》这本书有相关部分深刻描述了计算机的数据溢出和数据存储的关系，看完后你什么都明白了。

user: user-5
content: 楼上都说完了》》》》》》》》》》

user: user-6
content: //有符号整形a和b,如何判断a+b是否溢出 #pragma warning(disable:4035) #include <stdio.h> int ifo_add(int a,int b) {     __asm {         mov eax,a         add eax,b         jo  overflowed         xor eax,eax         jmp no_overflowed overflowed:         mov eax,1 no_overflowed:     } } int main() {     int a,b;      a=          1;b= 2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));     a=         -1;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));     a= 2147483647;b= 1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));     a=-2147483647;b=-1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));     a=-2147483647;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b)); } //          1+( 2) 0 //         -1+(-2) 0 // 2147483647+( 1) 1 //-2147483647+(-1) 0 //-2147483647+(-2) 1

user: user-7
content: 比如你平时吃一碗饭就吃饱了，但再让你吃一碗就吃不完，那剩下的饭就是溢出的数据

user: user-8
content: 就是用1L的杯子装大于1L的水，就会溢出

user: user-9
content: unsigned short usv = 9000000;

user: user-10
content: 是数值溢出还是数据（区）溢出？ 数值溢出是指计算机中表示数据的格式限制了数值的表示范围，如十六位无符号整型数据的表示范围是从0到2的16次方减1，如果用这种数据格式表示2的16次方，结果就要溢出，它比能所表示的最大数值还大。  数据区溢出是指把比存储区域尺寸更长的数据存入数据区，如存储字符串的区域为10个字节，操作时将10个以上的字符存入这个区域。
user-0 提问: 一个关于c#的编程

回复:
user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:请楼主移驾C#论坛。+1，来着来错版块了

user: user-2
content: .NET技术板块—>C#技术区

user: user-3
content: 请楼主移驾C#论坛。
user-0 提问: C语言考试题，烦请各位大大赐教，不胜感激！

回复:
user: user-0
content: 另外，多谢那位大大，有空的时候帮忙多给一点答案吧

user: user-0
content: 木有办法啊，干工程的，没有太多时间，报了个本科函授，想提升一下呗

user: user-1
content: 既然不懂，为什么要报这个函授？

user: user-2
content: 14.c 15.b 16.d 17.c 18.d 19.d 20.a 21.d 22.b 23.a 24.b 25.b

user: user-2
content: 答案仅供参考。。。。。。。。 1.D 2.D 3.B 4.C 5.c 6.A 7.C 8.D 9.D 10.C 11.D 12.D 13.B
user-0 提问: 关于setitimer定时器的问题

回复:
user: user-0
content: 求大神帮帮忙额

user: user-0
content: [quote=引用 2 楼 zhao4zhong1 的回复:] 参考crontab命令。   ...............没用额..........

user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:参考crontab命令。+1，我真不知道

user: user-2
content: 参考crontab命令。

user: user-0
content: 我一直在想是不是我发送的时间冲突造成的，但是我的服务器只是简单的打印出接收到的数据，我就是从接收到的时间来确认的第二个定时器延迟了多久发送的，而且延迟的时间长短不等。关于时间的算法我都是写在客户端那边的，数据统一由客户端发送....所以也许不是服务器的问题...............哎..........新手很纠结，求大神帮忙呀
user-0 提问: 【求助】用弗洛伊德算法求最短路径时 程序运行出错 VC++6.0

回复:
user: user-1
content: mg=malloc(sizeof(Mgraph *)); 改成 mg=(Mgraph *)malloc(sizeof(Mgraph));

user: user-0
content: 我用有向图存储城市信息，但是在将城市名称输入完成之后，输入路径及权值信息就会出错，求大神解决一下。目前程序没写完。只能输入数字。
user-0 提问: 小白请教一个关于define 计算的问题

回复:
user: user-1
content: 关于define,定义函数的时候最好加括号,像2楼说的,我觉得这个可能更重要,其次,关于define,我觉得应该再深入了解下,打字累,个人理解,可能有些时错的,如果错了,求指导....   define在程序的预处理的时候就应该做处理了,所以"优先级"算是比较高的,再者,编译器会有一张define表，由上述指令写到“DEBUG”一项，以后可能用到ifdef指令的时候可能会用到或用于defined运算符的条件什么的,(这个忘记在哪看到的,暂时打上去吧)   define的函数有可以减少变量(- -)   define函数定义的应该算是字符串,在预处理的时候代进取.   define可以用于避免重复编译   可以做特定标识符    可以做为编译选项(eg,在makefile中)  不知道还有哪些,希望大神们来留意下这个帖子吧

user: user-2
content: 引用 1 楼 user-4 的回复:uiA = MUL(ADD(9, 2), SUB(6, 3)); 展开以后是 uiA = 9 +2*6 -3;  #define ADD(x, y) ((x)+(y)) #define SUB(x, y) ((x)-(y)) #define MUL(x, y) ((x)*(y))   学习了！！！

user: user-0
content: 太感谢了， 我纠结好久了

user: user-3
content: #define 使用时一定要加括号  #define ADD(x, y) ((x)+(y)) #define SUB(x, y) ((x)-(y)) #define MUL(x, y) ((x)*(y))

user: user-4
content: uiA = MUL(ADD(9, 2), SUB(6, 3)); 展开以后是 uiA = 9 +2*6 -3;  #define ADD(x, y) ((x)+(y)) #define SUB(x, y) ((x)-(y)) #define MUL(x, y) ((x)*(y))
user-0 提问: 关于extern char *arr[];编译报错

回复:
user: user-1
content: 引用 楼主 lishangzcq 的回复: #include <errno.h> #include <stdio.h> #include <stdlib.h> extern char *arr[];  //编译时这行报错 int main(){ 	int i=0; 	while(arr[i++]) 		printf("%s\n",arr[i]); 	system ("pause"); 	return 0; }  用C写的一段代码在VS2010编译时报错： IntelliSense: 不允许使用返回数组的函数 你是怎么知道是这一行报错的？ 要是报错也是报连接的错。  还有没有其它的代码文件？错应该不在这里

user: user-2
content: 引用 楼主 lishangzcq 的回复: #include <errno.h> #include <stdio.h> #include <stdlib.h> extern char *arr[];  //编译时这行报错 int main(){ 	int i=0; 	while(arr[i++]) 		printf("%s\n",arr[i]); 	system ("pause"); 	return 0; }  用C写的一段代码在VS2010编译时报错： IntelliSense: 不允许使用返回数组的函数 1.首先arr是个数组，元素是指向字符或字符串的指针－－－对应printf()那行看，应该是字符串 2.extern是外部声明，要对应的arr定义，代码中没有 3.arr数组内容要初始化，代码中也没有

user: user-0
content: 引用 1 楼 huangxi_hans 的回复:extern char *arr[];  //编译时这行报错 arr[]中括号里加上size再试一下。 引用 2 楼 Heaydeny 的回复:同一楼，加个常量  extern char *arr[80];   //改成这样依然报错  错误	1	error C2090: 函数返回数组 	2	IntelliSense: 不允许使用返回数组的函数

user: user-3
content: 同一楼，加个常量

user: user-4
content: extern char *arr[];  //编译时这行报错 arr[]中括号里加上size再试一下。

user: user-0
content: 引用 6 楼 user-5 的回复:用extern声明，那么就要在另一个文件定义啊； BTW while 循环有问题啊，i++应该放在后面滴！  /**  * @file    foo.c  * @brief     */ #include <errno.h> #include <stdio.h> #include <stdlib.h>  extern char *arr[];  //编译时这行报错  int main() {     int i=0;     while(arr[i])         printf("%s\n",arr[i++]);     return 0; }    /**  * @file    bar.c  * @brief     */  #include <stddef.h>  char *arr[4] = {     "1",     "2",     "3",     NULL };  参照斑竹大大的修改了下，不再报错~ 感谢大家的帮忙了~ 我觉得我还是要狠狠的补充一些有关extern，数组和指针的知识

user: user-0
content: 引用 5 楼 lovesmiles 的回复:你是怎么知道是这一行报错的？ 要是报错也是报连接的错。  还有没有其它的代码文件？错应该不在这里 按ctrl+f5编译的时候生成失败，然后在错误列表显示这行有错~网上查了一些有关extern的资料，确实有说是在连接的时候报错，不过我是初学者，很多东西无法领会，所以来论坛求助了~ 这段代码是一个C教程书上的，在此不得不吐槽一些国内的C教程，真是一大堆错误，一点都不严谨

user: user-0
content: 引用 4 楼 cao_julians 的回复:1.首先arr是个数组，元素是指向字符或字符串的指针－－－对应printf()那行看，应该是字符串 2.extern是外部声明，要对应的arr定义，代码中没有 3.arr数组内容要初始化，代码中也没有 感谢你的分析了，应该就是后两个问题，参照6楼斑竹大大的回复修改了一下，编译时不再报错

user: user-5
content: 用extern声明，那么就要在另一个文件定义啊； BTW while 循环有问题啊，i++应该放在后面滴！  /**  * @file    foo.c  * @brief     */ #include <errno.h> #include <stdio.h> #include <stdlib.h>  extern char *arr[];  //编译时这行报错  int main() {     int i=0;     while(arr[i])         printf("%s\n",arr[i++]);     return 0; }    /**  * @file    bar.c  * @brief     */  #include <stddef.h>  char *arr[4] = {     "1",     "2",     "3",     NULL };
user-0 提问: 函数的返回值可以是指向结构体的指针么

回复:
user: user-0
content: 引用 5 楼 user-1 的回复:[quote=引用 3 楼 oTacksharp 的回复:] struct carport_information carport[192];/*这个是全局结构体变量数组*/ carport是个全局结构体变量数组的头地址； 那就放心吧，没问题。 一个小建议，最好把192做一个宏定义，如果编译器允许，定义成一个const也可以。这样可读性、可维护性都好很多。[/quote]   真的很感谢。很好的建议！有你们热心的大神，我们菜鸟会茁壮成长的。

user: user-1
content: 引用 3 楼 oTacksharp 的回复:struct carport_information carport[192];/*这个是全局结构体变量数组*/ carport是个全局结构体变量数组的头地址； 那就放心吧，没问题。 一个小建议，最好把192做一个宏定义，如果编译器允许，定义成一个const也可以。这样可读性、可维护性都好很多。

user: user-0
content: 引用 2 楼 user-1 的回复:返回指向结构体的指针，是可以的，但是有个前提，该指针指向的内存必须是有效的。 典型的错误是返回一个指向局部变量的指针，该变量在函数返回之后就可能失效。 楼主的代码是否可以，取决于carport是什么。全局变量、堆内存，都是可以的。就从这个函数本身来看，应该问题不大。  多谢！！  struct carport_information carport[192];/*这个是全局结构体变量数组*/  carport是个全局结构体变量数组的头地址；

user: user-0
content: 引用 1 楼 user-1 的回复:如果你的carport是全局变量，那就应该没问题。  struct carport_information carport[192];/*这个是全局结构体变量数组*/  carport是个全局结构体变量数组的头地址；

user: user-1
content: 返回指向结构体的指针，是可以的，但是有个前提，该指针指向的内存必须是有效的。 典型的错误是返回一个指向局部变量的指针，该变量在函数返回之后就可能失效。 楼主的代码是否可以，取决于carport是什么。全局变量、堆内存，都是可以的。就从这个函数本身来看，应该问题不大。

user: user-1
content: 如果你的carport是全局变量，那就应该没问题。
user-0 提问: 怎样用51单片机控制5050RGB灯带配色

回复:
user: user-1
content: http://blog.csdn.net/tangxing1212/article/details/42964417

user: user-2
content: 用3路PWM分别控制RGB的亮度级别  引用 楼主 fyhx9999 的回复:怎样用51单片机控制5050RGB灯带配色？实现各种彩灯效果。求程序

user: user-3
content: 发错版块了吧，

user: user-4
content: 邀请错人了吧！我不做这个啊！
user-0 提问: c 联网

回复:
user: user-1
content: 百度，但网上很多代码都是linux的

user: user-2
content: 简单的话，直接用mfc里面自带的socket就可以用了，一个server,一个client.测试一下。

user: user-3
content: 请问是什么平台的网络编程呢，比如windows下，直接搜索 windows socket编程，应该会有很多教程的

user: user-4
content: 《TCP/IP协议详解：协议》看完后，想不懂网络编程都难。

user: user-5
content: curl库也凑合使。

user: user-6
content: 简单的话搜一下socket编程

user: user-7
content: 高级环境编程， TCP/UDP协议
user-0 提问: C语言动态分配内存

回复:
user: user-1
content: 給你一個動態分配內存的例子  #include <stdio.h> #include <stdlib.h>  int main() { 	char *str; 	int num, i; 	printf("要準備幾個a?\n"); 	scanf("%d", &num); 	str = malloc(sizeof(char)*(num+1));//根據你要輸入的字元個數分配內存 	if(!str) 	{ 		printf("無法配置記憶體\n"); 		return(1); 	}  	for(i = 0; i<num; i++) 	{ 		str[i] = 'a'; 	} 	*(str+num) = '\0';					//字尾加上'\0'     printf("準備了%s\n%d個a\n", str, num); 	return(0); }  str = malloc(sizeof(char)*(num+1)); 就可以看我們輸入幾個字元來動態分配大小了， 不用像str[80]這樣最多只能輸入80個a把她寫死。

user: user-2
content: 引用 3 楼 OrthocenterChocolate 的回复:这里的动态是指你可以在运行时来指定分配多少内存，而不是写死在代码里像 char buffe[100]

user: user-3
content: malloc,realloc,free

user: user-4
content: 动态内存分配，肯定是和静态内存分配是相对的，3L说的很对

user: user-5
content: 这里的动态是指你可以在运行时来指定分配多少内存，而不是写死在代码里像 char buffe[100]

user: user-6
content: 菜鸟我理解的是想分多少内存就能分配多少就可以算做动态了，当然这动态级别有点低。

user: user-7
content: 动态改变内存大小事realloc，malloc是动态分配内存……
user-0 提问: 论坛新人，请教一个数据结构的问题，求大家解惑，谢谢。

回复:
user: user-1
content: 对的，二级指针。

user: user-0
content: 引用 2 楼 truelance 的回复:方案一 void DelFrist(Link *h,Link s), 调用时传入 DelFirst(&h, s), 在DelFisrt中修改*h 方案二 Link DelFirst(Link h, Link s), 调用时 h = DelFirst(h, s) 第二种方案会给程序带来麻烦和繁琐。只能用二级指针了哈。

user: user-2
content: 引用 2 楼 truelance 的回复:方案一 void DelFrist(Link *h,Link s), 调用时传入 DelFirst(&h, s), 在DelFisrt中修改*h 方案二 Link DelFirst(Link h, Link s), 调用时 h = DelFirst(h, s)+1

user: user-3
content: 方案一 void DelFrist(Link *h,Link s), 调用时传入 DelFirst(&h, s), 在DelFisrt中修改*h 方案二 Link DelFirst(Link h, Link s), 调用时 h = DelFirst(h, s)

user: user-4
content: 传入指针的指针……
user-0 提问: 求助关于网络编程中的字节序问题

回复:
user: user-0
content: 谢谢各位~！

user: user-1
content: 显然是需要转换的，  ACTION_MSG复制到ptrBuf的时候，需要转换之后再复制进去

user: user-2
content: 超过二个字节的类型就要转换。

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

user: user-4
content: 需要转换。只要是双方都要理解的内容就必须转换。 以下情况无需转换 1. 单个字节的字段 2. 某个字段接受方可以不理解是什么含义，原样在应答消息里回填（当然这种情况最好也转换，否则容易混乱）

user: user-5
content: 需要
user-0 提问: 采用结构体类型计算选票结果设有三个候选人每次输入一个得票人的名字要求最后输出得票结果，谢谢拉

回复:
user: user-1
content: 我題目不是很懂? 可以再說清楚一點嗎?

user: user-0
content: sorry 各位大大，我这是帮别人问的。。。。

user: user-2
content: 百度，这问题。。。

user: user-3
content: 设计一个链表吧 先往表里面插入候选人节点 然后设计一个功能函数来打印投票结果 功能函数的功能为输入名字(char name[20]，然后遍历链表中的所有节点，看是否存在，存在则打印节点的票数(int),否则打印提示信息，具体情况看需求。

user: user-4
content: 引用 1 楼 u010030181 的回复:问题描述的不是特别清楚，再说了，这个拿来主义还是少用吧，别人帮你写好了的，也是别人写的，你根本就不会怎么看，也就是完成一下任务……我觉得还是自己先写写，写不出来或者在哪里卡住了，再贴出代码来问，我相信还是很多人会前来帮助的……本人比较鄙视拿来主义……纯属个人观点，不喜勿喷！ 比较同意。楼主关键是把不明白的地方说出来，代码别人贴给你你不理解没什么帮助

user: user-5
content: 问题描述的不是特别清楚，再说了，这个拿来主义还是少用吧，别人帮你写好了的，也是别人写的，你根本就不会怎么看，也就是完成一下任务……我觉得还是自己先写写，写不出来或者在哪里卡住了，再贴出代码来问，我相信还是很多人会前来帮助的……本人比较鄙视拿来主义……纯属个人观点，不喜勿喷！
user-0 提问: 这个金字塔怎么打印出来额。。。试了好几次都不是那样。。。谢谢拉

回复:
user: user-1
content: 引用 4 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390881872+1，看见这个我就习惯性+1了

user: user-2
content: #include <stdio.h>  void main( ) { 	int i, j, n = 4; 	for( i = 1; i <= n; i++ ) 	{ 		for( j = 1; j <= 2 * ( n - i ); j++ ) 			printf( " " ); 		for( j = 1; j <= 2 * i - 1; j++ ) 			printf( "*" ); 		printf( "\n" ); 	} }

user: user-3
content: #include <iostream> using namespace std;  void main() { 	int k = 6,m = 1,l = 0; 	for (int i = 1;i <= 4; i++) 	{ 		for (int j = 1;j<=k;j++) 		{ 			cout<<" "; 		} 		for (l = 1;l<= m;l++) 		{ 			cout<<"*"; 		} 		cout<<endl; 		k = k-2; 		m +=2; 	} 	cout<<endl; }

user: user-4

user: user-4
content: # include <stdio.h>  int main() { 	int i, j; 	for (i = 0; i < 4; i++) 	{ 		for (j = 0; j < 8; j++) 		{ 			if ((j >= 6 - 2 * i) && (j < 7)) 			{ 				printf("*"); 			} 			else if (j == 7) 			{ 				printf("\n"); 			} 			else 			{ 				printf(" "); 			} 		} 	} 	return 0; }

user: user-5
content: 引用 4 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390881872

user: user-6
content: http://bbs.csdn.net/topics/390881872

user: user-7
content: #include <iostream> using namespace std;  int main() { 	for(int i=0;i<4;i++) 	{ 		for(int j=0;j<6-2*i;j++) 			cout<<" "; 		for(int j=0;j<i*2+1;j++) 			cout<<"*"; 		cout<<endl; 	} 	cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! 	return 0; }

user: user-8
content: int cnt,i,j,k; 	cnt=7;  	for(i=0;i<cnt;i++) 	{ 		if(i%2==0) 		{ 			for(j=0;j<cnt-i;j++) 				printf(" "); 			for(k=0;k<i+1;k++) 				printf("*"); 		} 		printf("\n"); 	} 	system("pause");

user: user-9
content: 代码贴出来才知道你问题出哪里……
user-0 提问: 一个简单的C语言问题

回复:
user: user-1
content: c语言不是没有true和false吗，只有0和1

user: user-2
content: 引用 1 楼 user-4 的回复:逻辑完全不同  支持！！！

user: user-0
content: 明白了，谢谢各位！

user: user-3
content: 引用 4 楼 user-4 的回复:temp[0]==temp[1] 结果要么是true，要么是false  而后  你将其与 0xff 这个数比较? 是的，我脑热了

user: user-4
content: temp[0]==temp[1] 结果要么是true，要么是false  而后  你将其与 0xff 这个数比较?

user: user-3
content: 引用 1 楼 user-4 的回复:逻辑完全不同 有何不同？

user: user-3
content: 两者效果一样

user: user-4
content: 逻辑完全不同
user-0 提问: windeos下的“struct timeval"...

回复:
user: user-1
content: CryptGenRandom

user: user-2
content: GUID guid; CoCreateGuid(&guid); int Seed=*(int *)&guid;

user: user-3
content: 那两行代码的意思是：用 t.tv_sec * t.tv_usec作用种子值吧。 可在Windows中实现gettimeofday函数的功能。  #include<sys/types.h> #include<sys/timeb.h>  void windows_gettimeofday(struct timeval *tv, struct timezone *tz) { 	struct _timeb tb; 	if (tv == NULL) 		return ;  	_ftime(&tb); 	tv->tv_sec = tb.time; 	tv->tv_usec = tb.millitm * 1000; }

user: user-0
content: 找到了。。，在objbase.h里，但这里的seed是int型的，guid好像是有许多段组合成的，无法直接类型转换

user: user-0
content: GUID类型 需要包含哪个头文件呢？vs2013上显示未定义标示符。。。

user: user-2
content: GUID guid; CoCreateGuid(&guid); Seed=(Seed的类型)guid;
user-0 提问: 这道c语言题怎么做

回复:
user: user-1
content: 这么简单的题目，LZ你应该自己先试试，遇到有什么问题再问。

user: user-2
content: //仅供参考： #include<stdio.h>  int main(){     int N;     int a,b;     int win=0,lose=0,draw=0;     scanf("%d",&N);     while(N--){         scanf("%d%d",&a,&b);         switch(a-b){             case -1:++win;break;             case 2:++win;break;             case -2:++lose;break;             case 1:++lose;break;             case 0:++draw;break;             default:break;         }     }     printf("%d\n%d\n%d\n",win,draw,lose); }

user: user-3
content: #include <stdio.h> #include <stdlib.h>  int main() { 	int n,i,j; 	int win = 0, fall = 0, flat = 0; 	printf("please input the num of the games: "); 	scanf("%d", &n); 	if( !(n >= 0 && n <= 1000) ) 	{ 		printf("please input the num 0 to 1000\n"); 		exit(1); 	} 	 	while(n--) 	{ 		printf("please input what the bingbing show: "); 		scanf("%d", &i); 		if( !(i >= 0 && i <= 2) ) 		{ 			printf("please input the num 0 to 2\n"); 			exit(1); 		} 		 		printf("please input what the others show: "); 		scanf("%d", &j); 		if( !(j >= 0 && j <= 2) ) 		{ 			printf("please input the num 0 to 2\n"); 			exit(1); 		}  		if(0 == i) 		{ 			if(0 == j) 				flat++; 			else if (1 == j) 				win++; 			else 				fall++; 		}	 		else if(1 == i) 		{ 			if(0 == j) 				fall++; 			else if (1 == j) 				flat++; 			else 				win++; 		}	 		else if(2 == i) 		{ 			if(0 == j) 				win++; 			else if (1 == j) 				fall++; 			else 				flat++; 		}	 	} 	printf("The num of the win are  %d\n", win); 	printf("The num of the fall are  %d\n", fall); 	printf("The num of the flat are  %d\n", flat); 	 }    还可以把exit换成goto

user: user-4
content: 楼主刚学C语言没多久？建议好好想想其中的逻辑，自己试试吧
user-0 提问: C语言的函数指针问题

回复:
user: user-1
content: 引用 8 楼 VincentZhouCVL 的回复:p=&&foo这个形式还真的不可以，&foo是可以的 我可能记错了，《C和指针》中提到这个问题

user: user-0
content: p=&&foo这个形式还真的不可以，&foo是可以的

user: user-1
content: 引用 6 楼 VincentZhouCVL 的回复:@cao_julians 你好，我想请问下对于(*p)()这个去调用的方式我的理解对吗（p是函数指针，*p转换到函数类型，再转到到函数指针对调用） 建议你看《C和指针》一书。在函数指针这个领域，*操作符不起转换作用，p(),(*p)(),(**p)(),......,不论用多少个*，效果是一样的  而使用(*p)()的理由可能只有一个，比照其它指针，引用形式与定义形式一致的原则（如int *p是定义，*p在表达戒就表示对所指向int类型的变量的引用）＝＝〉int (*p)();是对函数指针的定义，则(*p)()在表达式就是对指向的函数引用（调用）  同一问题，对函数指针p的赋值也一样， p=foo; p=&foo;     //参照其它指变量的赋值形式 p=&&foo;...也同样可以

user: user-0
content: @cao_julians 你好，我想请问下对于(*p)()这个去调用的方式我的理解对吗（p是函数指针，*p转换到函数类型，再转到到函数指针对调用）

user: user-1
content: "p()与foo()形式上完全等价"  这句话不准确， p()的构成是------“指向函数的指针变量”+“函数调用符” foo()的构成是------“指向函数的指针常量”+“函数调用符” ================= 只能说“形式上相近、效果上相同”  p()与(*p)()问题，请LZ看《C与指针》一书

user: user-2
content: 函数指针可操作同类型的多个函数。

user: user-3
content: 更正下  1. 定义一个函数 int foo(void); foo()这个函数会保存在内存中，foo就代表保存函数代码的内存起始地址。注意:foo是一个常量，因此这里仅有一个地址。 2. 定义一个函数指针 int (*p)(void); p = foo; 对应指针型变量p，就有了2个地址。一个是变量p本身的地址(&p)，另一个是这个地址中保存的值p, 这个值本身也是一个地址也就是foo 3. 函数指针的使用 p()与foo()形式上完全等价  (*p)(), 编译器知道p是一个指向函数的指针，因此会做出与p()完全相同的处理.

user: user-3
content: 1. 定义一个函数 int foo(void); foo()这个函数会保存在内存中，foo就代表保存函数代码的内存起始地址。注意:foo是一个常量，因此这里仅有一个地址。 2. 定义一个函数指针 int (*p)(void); p = foo; 对应指针型变量p，就有了2个地址。一个是变量p本身的地址，另一个是这个地址中保存的值*p, 这个值本身也是一个地址也就是foo 3. 函数指针的使用 (*p)()与foo()完全等价， p(), 编译器知道p是一个指向函数的指针，因此会做出与(*p)()完全相同的处理.

user: user-4
content: 我觉得刚好相反 其实 对于编译器来说 p() 已经够了， 因为本身就是去找函数代码所在的地址  之所以(*p)()也可以， 是要跟其他指针变量统一起来， 既然其他指针变量可以取值，  那函数指针也应该有一个比较好而已。
user-0 提问: 买袜子

回复:
user: user-1
content: 我也看成妹子!!!

user: user-2
content: 百度   背包九讲

user: user-3
content: 我怎么看成买妹子了呢

user: user-4
content: >怎么保证买3双比2双合适，2双比1双合适； 这个不是你保证出来的，是输入数据保证这样，你写程序的时候可以假设这个成立。

user: user-5
content: if((2*b)<(c+a)&&x>=4&&o1>=1&&o3>=1)    很明显的意思 (2*b)<(c+a) 这个意思是说 假如买4双的时候，买2个2双比买1个1双+一个3双更划算时 &&x>=4 并且确实是买了4双以上的袜子 &&o1>=1&&o3>=1 而又并且确实有1个1双，1个3双在里面。 那还不如直接换成2个2双好了。  o1--;  //不要一个1双  o3--;  //不要一个3双  o2=o2+2//换成2个2双
user-0 提问: 如何求一个结构体的变量长度

回复:
user: user-1
content: 我怎么记得sizeof就可以直接给出结构长度...

user: user-2
content: 引用strcpy(A.a,"11"); 越界的代码， 就不要期待正确的可预存的行为。

user: user-2
content: strcpy(A.b,"222\0")越界了。

user: user-3
content: 确实如此~~

user: user-4
content: 你的代码除了strcpy(A.c,"3333");都越界拷贝了。还有为什么字符串常量要写成"3333\0"这个样子呢，“3333”占用的空间是4个字节，编译器自动在最后加'\0'，画蛇添足啊。

user: user-5
content: #include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //
user-0 提问: 求解？

回复:
user: user-1
content: #include<stdio.h> #include<conio.h> void main() { 	char a='a'; 	for(;a!='E';) 	{ 		scanf("%c",&a); 		while(getchar()!='\n') 			continue; 		printf("%c\n",a^0x20); 	} }

user: user-2
content: 加一个getchar()试一试。 #include <stdio.h> #include <conio.h>  void main( ) { 	char a = 'a'; 	for( ; a != 'E'; ) 	{ 		scanf( "%c", &a ); 		printf( "%c\n", a^0x20 ); 		getchar( ); 	} }

user: user-3
content: 应该是把第一次的回车符填充了a的内存单元；

user: user-0
content: 引用 3 楼 user-4 的回复:那不你就有答案了：输入了两个字符 q 和 回车，你的for执行了两次，分别读取这两个字符，并处理后输出新的字符。 你是说我所按的回车键存在于输入流里，当一次循环执行完之后，进入第二次循环，此时输入流里的回车键成了输入，于是执行了两次输出。

user: user-4
content: 那不你就有答案了：输入了两个字符 q 和 回车，你的for执行了两次，分别读取这两个字符，并处理后输出新的字符。

user: user-0
content: 引用 1 楼 user-4 的回复:你输入回车了吧 scanf()函数在确认输入时按了回车啊？

user: user-4
content: 你输入回车了吧
user-0 提问: 这个程序哪错了呢

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

user: user-2
content: 好长啊~~~~

user: user-3
content: 错误提示都不贴出来还能玩么

user: user-4
content: if((fp1=fopen("D:\\oil_base.txt","w"))==NULL);     多了分号。

user: user-5
content: 引用 1 楼 jiangqr1991 的回复:if((fp1=fopen("D:\\oil_base.txt","w"))==NULL);     多了分号。

user: user-6
content: 楼主，你的代码的缩进格式不好，论文有贴代码功能，这样做让想给你回答的大神对你的帖子信心加分！
user-0 提问: 求大神  怎么做  ,没思路

回复:
user: user-1
content: 代码的小错误太多了，这么一个简单程序，也有这么多小问题，真晕这个提交ok了：  #include<stdio.h> #include<string.h> int check(int money) { 	if (money<150) 		return money; 	int mod_num =money %50; 	int div_num= money /50; 	if (div_num==5) 		return mod_num+50; 	else 		return mod_num; }  int main()  {      int N;      int T;      scanf("%d",&T);      while(T--)      {          scanf("%d",&N); 		 int value = check(N); 		printf("%d\n",value);	        }      return 0;  }

user: user-1
content: 输入错了，if (div_num=5)应该是if (div_num==5)

user: user-1
content: 先/50,变成347，给定一个数，如何最接近 <3的时候，只能全给 3  4 5 ，要给1 6 3，3 7 8 4，4 9，3，3，3 10：37 11：47 12：4，4，4 13及以上：直接按照-7的办法给即可 可以看出，只有5需要另外给1，其他都不需要  int check(int money) { 	if (money<150) 		return 150; 	int mod_num =money %50; 	int div_num= money /50; 	if (div_num=5) 		return mod_num+150; 	else 		return mod_num; }

user: user-2
content: int fee(int total, int price[], int n) {     if (total < 0) return total+price[n-1];     if (n<=0) return total;     return min(fee(total, price, n-1), fee(total-price[n-1], price, n); }

user: user-3
content: 这是背包问题，自己百度背包问题的解法。
user-0 提问: 这c语言题目怎做 求大神

回复:
user: user-1
content: 没有看明白你算法的核心是什么想法。。。 我改了一下。比较容易看明白。  #include<stdio.h> #include<math.h> int main() { 	int n,a[10000],i,u,sum=0; 	scanf("%d",&n); 	for(i=0;i<n;i++) 	{ 		scanf("%d",&a[i]); 		if(a[i]==1)//输入完后就判断，累计。 		{ 			sum++; 		} 	} 	u=n-sum;//不是1的就是0 	/*这一段算法没有看明白你想做什么，感觉到并没有效率上的优势。。。 	if(a[0]==1)//为什么等于1的时候才计算？ 	{ 		for(i=2;i<=n;i=i+2)	//计算了等于0的个数？为什么+2？ 		{ 			if(a[i]==0) 				sum++; 		} 		for(i=1;i<=n;i=i+2)	//为什么又从1开始计算1的个数？ 		{ 			if(a[i]==1) 				sum++; 		} 	}  	u=pow(2,n)-sum; 	*/ 	if(sum<u) 		printf("%d\n",sum); 	else 		printf("%d\n",u); 	return 0; }

user: user-2
content: 算法错了，其实很简单，直接按照第1个1，第2个0这样看有多少匹配的，如果小于n/2则用n减就可以了
user-0 提问: fputs保存的数据怎么文件头多5个字节的乱码

回复:
user: user-1
content: 楼主的情况和我一样。。 我在 win7 下用 fputs 输出没问题， 但在 xp下用 fputs 输出就多了一个 5开头的乱码

user: user-2
content: 因該是二進置讀寫檔問題 "r" 開啟以讀取。 如果檔案不存在或找不到，fopen 呼叫就會失敗。 "w" 開啟空白檔案以寫入。 如果指定的檔案已存在，其內容將被終結。 "a" 開啟以供在檔案結尾寫入 (附加)，並且在將新資料寫入檔案之前，不會移除檔案結尾 (EOF) 標記。 如果檔案不存在時，建立檔案。 "r+" 開啟以進行讀取和寫入。 檔案必須存在。 "w+" 開啟空白檔案以進行讀取和寫入。 如果檔案存在，其內容會遭到銷毀。 "a+" 開啟以進行讀取和附加。 附加作業包括在將新資料寫入檔案之前移除 EOF 標記。 寫入完成後，不會還原 EOF 標記。 如果檔案不存在時，建立檔案。

user: user-3
content: 用fopen(...,"...b")二进制模式打开。

user: user-0
content: 虽然不知确切的原因，最终我还是按你说的重新定位了下文件头再写入的

user: user-4
content: 引用 3 楼 wdyichen3 的回复:那怎么避免啊，这保存个文件还得判断文件编码？ linux文本默认是UTF-8，windows的默认貌似是GB2312还是啥的来着，找个文本编辑器转换一下编码就行了

user: user-5
content: 读写变换之间，重新定位一下...

user: user-0
content: 引用 2 楼 zxh707wk 的回复:编码问题？  那怎么避免啊，这保存个文件还得判断文件编码？

user: user-4
content: 编码问题？

user: user-0
content: 顶起来，看有没人知道原因
user-0 提问:  线程常见的耗时操作有哪些？

回复:
user: user-1
content: 引用 3 楼 u012879806 的回复:[quote=引用 1 楼 user-5 的回复:]  iocp回调历程，在线程内部，IO执行结束后，立即执行，所以不需要切换线程。  今天翻看了 核心编程，还是无法理解， windows为什么做不到 不切换线程上下文。  如： 2个cpu的机子， 机子有很多程序， windows不可能只运行你的程序吧，  还可以运行其他程序好不？  还有，你的程序也可能多个线程。  也得切换上下文啊。  这是无法避免的。  既然无法避免，那么从其他线程切换到 iocp用到的2*cpu个线程里， 也得耗时间啊。  [/quote] 有两个iocp线程： A在等待任务， B在执行任务。若干时间以后，新任务到达，于此同时， B完成当前任务， 新任务将由B去执行, 而不是A,减少一次context switch.

user: user-1
content: 最耗时的操作：死锁。IO也比较耗时。

user: user-1
content: 引用不管你用什么牛X技术，这个是无法避免的吧。  为了减少。 单核上多线程编程最终执行还是抢占式串行执行的， 对性能提高没有帮助。

user: user-2
content: 《30天自制操作系统》

user: user-3
content: 有高手不？  帮忙解答一下吧

user: user-3
content: 引用 4 楼 lovesmiles 的回复:[quote=引用 3 楼 u012879806 的回复:] [quote=引用 1 楼 user-5 的回复:]  iocp回调历程，在线程内部，IO执行结束后，立即执行，所以不需要切换线程。  今天翻看了 核心编程，还是无法理解， windows为什么做不到 不切换线程上下文。  如： 2个cpu的机子， 机子有很多程序， windows不可能只运行你的程序吧，  还可以运行其他程序好不？  还有，你的程序也可能多个线程。  也得切换上下文啊。  这是无法避免的。  既然无法避免，那么从其他线程切换到 iocp用到的2*cpu个线程里， 也得耗时间啊。  [/quote]  第一个问题，机子可能运行其它的程序，切换到其它的程序，那叫做进程切换，是另外一个概念。机子要换到另外一个进程当然会耗时间了。IOCP所说的避免线程切换时间是指进程已经完全获得cpu的控制权的情况下所做的线程切换。如果进程已经被系统挂起不能运行了，那还有什么好讨论的？  第二个问题，IOCP是将IO工作线程和主逻辑工作线程独立开来避免主逻辑线程既做逻辑运算又做IO读写导致的线程经常因为IO未完成造成线程被阻塞的情况。   其实IOCP最关键的地方应该是摆脱select的遍历轮询的低效吧。 [/quote]  翻看过前辈的帖子， 感觉你对windows编程比较熟悉。  iocp是windows的专利，  讨论这个话题，是无法避免windows的。  windows调度的单位是线程，不是进程。  不像linux一类的系统。  =======》  所以，没有“进程已经完全获取到了cpu的控制权”的这个说法。  好了，既然没有这个说法，那么，回到 线程上下文切换这个话题来。  iocp的出现就是为了 解决成百上千的io请求的并发编程而出现的。  避免one thread one clinet 。  所以，iocp必须解决线程上下文切换这个问题。  刚才又看了一些文章，还是无法理解，它到底是怎样解决的。  可能我基础太差了。

user: user-4
content: 引用 3 楼 u012879806 的回复:[quote=引用 1 楼 user-5 的回复:]  iocp回调历程，在线程内部，IO执行结束后，立即执行，所以不需要切换线程。  今天翻看了 核心编程，还是无法理解， windows为什么做不到 不切换线程上下文。  如： 2个cpu的机子， 机子有很多程序， windows不可能只运行你的程序吧，  还可以运行其他程序好不？  还有，你的程序也可能多个线程。  也得切换上下文啊。  这是无法避免的。  既然无法避免，那么从其他线程切换到 iocp用到的2*cpu个线程里， 也得耗时间啊。  [/quote]  第一个问题，机子可能运行其它的程序，切换到其它的程序，那叫做进程切换，是另外一个概念。机子要换到另外一个进程当然会耗时间了。IOCP所说的避免线程切换时间是指进程已经完全获得cpu的控制权的情况下所做的线程切换。如果进程已经被系统挂起不能运行了，那还有什么好讨论的？  第二个问题，IOCP是将IO工作线程和主逻辑工作线程独立开来避免主逻辑线程既做逻辑运算又做IO读写导致的线程经常因为IO未完成造成线程被阻塞的情况。   其实IOCP最关键的地方应该是摆脱select的遍历轮询的低效吧。

user: user-0
content: 引用 1 楼 user-5 的回复:iocp回调历程，在线程内部，IO执行结束后，立即执行，所以不需要切换线程。  今天翻看了 核心编程，还是无法理解， windows为什么做不到 不切换线程上下文。  如： 2个cpu的机子， 机子有很多程序， windows不可能只运行你的程序吧，  还可以运行其他程序好不？  还有，你的程序也可能多个线程。  也得切换上下文啊。  这是无法避免的。  既然无法避免，那么从其他线程切换到 iocp用到的2*cpu个线程里， 也得耗时间啊。

user: user-5
content: IO本身就是耗时的操作 读写文件 输出到屏幕 等等都是耗时的操作 这些比线程切换，要慢得多

user: user-5
content: iocp回调历程，在线程内部，IO执行结束后，立即执行，所以不需要切换线程。
user-0 提问: 取模的周期性

回复:
user: user-1
content: 事件分几步用乘法原理。

user: user-2
content: HDU 1005里的递推公式里有两处调用函数f(n-1)和f(n-2), f(n)模7有7中可能，f(n-1)模7和f(n-2)模7的组合有7*7=49种可能
user-0 提问: 函数指针的typedefine，不解，求教。

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

user: user-2
content: 引用 3 楼 cyd54454 的回复:typedef的用法我是这么理解，你把typedef盖掉，把后面的式子的声明分析一下。比如typedef int (*PipeProcessor)(void* args, int val);这里我们只看int (*PipeProcessor)(void* args, int val)，那么我们可以知道PipeProcessor是一个函数指针，该指针指向的函数是一个返回值为int，参数为void *和int。然后我们就知道typedef是把PipeProcessor定义成了一个指向有两个参数(void *,int)返回值是int的函数指针类型。关键就是分析c语言的声明，这方法很多书里都有。 再比如typdef int (*P)[10]; P是一个指针，指向一个含有10个int元素的数组，加上typedef之后P就是成了新类型。P a;a就是一个指向含有10个int元素的数组的指针。

user: user-2
content: typedef的用法我是这么理解，你把typedef盖掉，把后面的式子的声明分析一下。比如typedef int (*PipeProcessor)(void* args, int val);这里我们只看int (*PipeProcessor)(void* args, int val)，那么我们可以知道PipeProcessor是一个函数指针，该指针指向的函数是一个返回值为int，参数为void *和int。然后我们就知道typedef是把PipeProcessor定义成了一个指向有两个参数(void *,int)返回值是int的函数指针类型。关键就是分析c语言的声明，这方法很多书里都有。

user: user-3
content: 你就当这是typedef的另外一和睦用法好了。 这是一种语法糖。 用惯了就行

user: user-4
content: 一个函数的类型是用它的返回值来表示的，所以typedef定义函数类型时，就是 typedef int (*PipeProcessor)(void* args, int val); 这里int, 就是你说的a, *PipeProcessor就是你说的b, 因为是函数类型，所以后面有函数的参数类型定义  你可以和用typedef定义数组类型对比看，就容易明白了 typedef int A[5];  PipeProcessor前面的*, 你可以参考 typedef struct { int a; intb; } STRU, *pSTRU; pSTRU前面的*
user-0 提问: c语言程序使用钩子拦截键盘消息的问题

回复:
user: user-1
content: MessageBox不适合输出调试信息。

user: user-2
content: 你没有消息循环么？ GetMessage TranslateMessage DispatchMessage ? 输出消息不要输出MessageBox ，这个很容易卡死。OutputDebutString 输出，文件输出也可以。程序是自己调试出来的，不是写出来的。写得再好，遇到问题不会解决也废。你什么功能都没有写，只是调用了CallNextHookEx按道理不应该有问题，如果再有问题，最好帖出全部代码。

user: user-0
content: 引用 3 楼 justin_bkdrong 的回复:使用你的代码：此处省略 使用了你的代码调用后，能拦截到按键信息，但是拦截后，无法实现输入的问题，而且程序也是未响应。 我猜测应该是return CallNextHookEx(hHook,nCode,wParam,lParam); 。。就是说拦截消息后我们处理后，没有传给下一个应该该 消息的函数 。。还有就是这应该和c语言程序 有关，毕竟c语言程序我们无法看到它的窗口生成，及消息处理函数 。 如果有消息处理函数这样就好办多了。 谁有空看到了，知道的点点吧，你说下相关关键词，我自己去查找相关资料。

user: user-2
content: 使用你的代码： HHOOK g_hook = NULL; HMODULE g_hDllModule = NULL; BOOLEAN  WINAPI  DllMain(     IN HINSTANCE hDllHandle,      IN DWORD     nReason,         IN LPVOID    Reserved     ) { g_hDllModule = hDllHandle; return TRUE; } __declspec(dllexport) BOOL Hook() {  g_hook=SetWindowsHookEx(WH_KEYBOARD,      KeyboardProc,      g_hDllModule,      0);  return g_hook?TRUE:FALSE; } __declspec(dllexport) BOOL Unhook() { 	return UnhookWindowsHookEx(g_hook); }  exe调用： typedef BOOL (*LPHOOK)(); typedef BOOL (*LPUNHOOK)(); LPHOOK g_hookFun = NULL; LPUNHOOK g_unhookFun = NULL; BOOL APIENTRY DllMain( HANDLE hModule,                         DWORD  ul_reason_for_call,                         LPVOID lpReserved                      ) {  	HMODULE h = LoadLibrary("keyBoard.dll");//路径要设置正确啊 	if(h) 	{ 		g_hookFun = (LPHOOK)GetProcAddress(h,"Hook"); 		g_unhookFun = (LPUNHOOK)GetProcAddress(h,"Unhook"); 	} 	...     return TRUE; }

user: user-0
content: 引用 1 楼 justin_bkdrong 的回复:凭空判断是不好判断。在SetWindowsHookEx返回值给hHook ,而此值是在 CallNextHookEx时候用到，是否有可能hHook没有赋值就被 CallNextHookEx调用了。 一般的做法是在dll中封装一个 HookFun一个UnHookFun ，调用这些导出函数就不用导出hHook 了，这样就没有问题，你的程序中最好多打印些日志或者trace信息，好能准确判断程序运行的位置。 求楼主给你示例代码，我是个新手。第一次，dll中封装一个 HookFun一个UnHookFun 相关。谢谢了。

user: user-2
content: 凭空判断是不好判断。在SetWindowsHookEx返回值给hHook ,而此值是在 CallNextHookEx时候用到，是否有可能hHook没有赋值就被 CallNextHookEx调用了。 一般的做法是在dll中封装一个 HookFun一个UnHookFun ，调用这些导出函数就不用导出hHook 了，这样就没有问题，你的程序中最好多打印些日志或者trace信息，好能准确判断程序运行的位置。
user-0 提问: 51单片机   编程问题

回复:
user: user-0
content: 引用 2 楼 luoxuechengbing 的回复:     大家也不要回答了，明显是来找人做作业的啊。。    不上图，你至少要仿真把？ 仿真了 画了图 要截图给我们看看走线吧？    这几行代码的事？     我那时候每天上课睡觉，老师随便一说都知道写。。  麻烦你看懂别人说的话，我的归类是c语言编程，不是要代码，我只是想要那个编程的大概方法，而且仿不仿真这是我的事情，别说我不用别人帮我写作业，就是用，我也不懂理解能力差还随便乱说话的人！麻烦你了，谢谢！

user: user-0
content: @u013171165 : 我不是要代码，是想要一段用c语言编写的程序，不过在几天前这个问题我已经解决了！ @luoxuechengbing： 麻烦你看懂别人说的话，我的归类是c语言编程，不是要代码，我只是想要那个编程的大概方法，而且仿不仿真这是我的事情，别说我不用别人帮我写作业，就是用，我也不懂理解能力差还随便乱说话的人！麻烦你了，谢谢！

user: user-1
content: jin gong can  kao: 51 线反转法 实现矩阵键盘检测 LCD 1602字符菜单界面实现

user: user-2
content: 大家也不要回答了，明显是来找人做作业的啊。。    不上图，你至少要仿真把？ 仿真了 画了图 要截图给我们看看走线吧？    这几行代码的事？     我那时候每天上课睡觉，老师随便一说都知道写。。

user: user-3
content: 这特么开玩笑，也不说线是怎么接的，还直接要代码。这个不难吧？我的U盘倒是有这些代码，但是在家里，几年不碰单片机了。

user: user-4
content: 引用 4 楼 user-5 的回复:[quote=引用 3 楼 lm_whales 的回复:] 键盘扫描程序，一般都有示例代码的 先纵向确定列，后横向确定行，反过来也一样 然后根据行列查表求出，按键代码 由于人手是不稳定的 所以要去除抖动 一般就是多扫描几次，取连续若干次（比如10次）， 或者超过某个比例作为一次扫描结果。  具体根据硬件布局，布线确定如何扫描 会发生抖动的原因不是因为手抖，而是有弹性的导体发生接触的物理性质。你用个什么机械装置去模拟按键，只要按键速度差不多的话，一样会出现抖动的。[/quote]谢谢指正，不然还真的误导大家了

user: user-5
content: 引用 3 楼 lm_whales 的回复:键盘扫描程序，一般都有示例代码的 先纵向确定列，后横向确定行，反过来也一样 然后根据行列查表求出，按键代码 由于人手是不稳定的 所以要去除抖动 一般就是多扫描几次，取连续若干次（比如10次）， 或者超过某个比例作为一次扫描结果。  具体根据硬件布局，布线确定如何扫描 会发生抖动的原因不是因为手抖，而是有弹性的导体发生接触的物理性质。你用个什么机械装置去模拟按键，只要按键速度差不多的话，一样会出现抖动的。

user: user-4
content: 键盘扫描程序，一般都有示例代码的 先纵向确定列，后横向确定行，反过来也一样 然后根据行列查表求出，按键代码 由于人手是不稳定的 所以要去除抖动 一般就是多扫描几次，取连续若干次（比如10次）， 或者超过某个比例作为一次扫描结果。  具体根据硬件布局，布线确定如何扫描
user-0 提问: select模型和重叠i/o 模型的优点、缺点

回复:
user: user-1
content: select的有点看起来只有一个，那就是标准，这是伯克利的实现。重叠io是微软在WinSock上的实现。除了不够标准这一缺点之外，其他都完爆select模型

user: user-2
content: 引用 4 楼 bsnry 的回复:select 也是一种通知 套接字可读，可写，机制吧  本质不是异步  overlapped 是一种异步i/o的完成通知机制。  其二： 可以收到i/o完成通知后，不需要调用recv等函数去再次从系统缓冲区里拷贝到用户缓冲区里。  所以效率很高。  其三：  重叠结构体 不仅仅可以用在网络上，还可以用于很多上面，比如文件， 管道，等等。  其四： i/o异步的请求，但驱动程序不一定把i/o请求放到 队列中， 比如高速缓冲力有你要的数据， 那么驱动就采用同步的方式处理。  其五： 重叠结构体，还可以用于apc的方式，所以更加灵活  select  最糟糕的 地方select函数每次检测所有套接字，也就是轮训.

user: user-2
content: select 也是一种通知 套接字可读，可写，机制吧  本质不是异步  overlapped 是一种异步i/o的完成通知机制。  其二： 可以收到i/o完成通知后，不需要调用recv等函数去再次从系统缓冲区里拷贝到用户缓冲区里。  所以效率很高。  其三：  重叠结构体 不仅仅可以用在网络上，还可以用于很多上面，比如文件， 管道，等等。  其四： i/o异步的请求，但驱动程序不一定把i/o请求放到 队列中， 比如高速缓冲力有你要的数据， 那么驱动就采用同步的方式处理。  其五： 重叠结构体，还可以用于apc的方式，所以更加灵活

user: user-0
content: 引用 1 楼 lovesmiles 的回复:建议百度搜一些blog来看更好一些。  看了，我是想对2者做一个比较优缺点呢

user: user-3
content: 建议百度搜一些blog来看更好一些。
user-0 提问: 求找错！

回复:
user: user-1
content: 没有遇到'\0'这个标志结束的符号。 因此会继续读写， 当然， 读到什么东西是不可预知的。 因此会出现一些不能理解的字符。

user: user-2
content: 你输出s【】却没有结尾的\0

user: user-3
content: 引用 1 楼 truelance 的回复:因为你把s[]当做一个字符串输出，但是又没有添加'\0'做结尾。 需要改成 char s[5]={'d','t','3','B', '\0'};+1

user: user-0
content: 楼上两位正解，我之后又试着检查了一下，终于找出了问题。谢谢两位。

user: user-4
content: 楼上正解，因为在C语言中，是以一个特殊字符'\0'来表示一个字符串的结尾，因为你的字符串中没有的'\0'，那么在向文件中输出字符串时，就遇不到'\0'，于是认为你的字符串没结束，就继续输出，其实已经超过了你的字符串的内存范围，跑到了一些其它地方的内存里，由于这些内存里什么值都有可能，所以出现了乱码，你要输出4个字符的话，那你的s数组大小应该是5，最后一个元素放'\0'

user: user-5
content: 因为你把s[]当做一个字符串输出，但是又没有添加'\0'做结尾。 需要改成 char s[5]={'d','t','3','B', '\0'};
user-0 提问: c数据结构中队列结构体问题求帮忙

回复:
user: user-1
content: if (3!=scanf("%14[^,],%11[^,],%d",p->name,p->phnoe,&p->age)) {printf("Format error!\n");exit(1);}

user: user-0
content: 上两位说的倒是没错，但scanf用%s输入不接受空格符号，且第一位的用“scanf("%s,%s,%d",p->name,p->phnoe,&p->age);”输入时我的运行结果就不对了，结果。我想知道一下 gets（name);gets(phone);scanf("%d",age)为什么酒出错呢？用scanf一项一项的输入正确，也帮我解决scanf("%s,%s,%d",p->name,p->phnoe,&p->age);输入出错的原因。

user: user-2
content: 能问一下LZ是在哪儿学的么? 可以去扇你们老师的耳光。 gets()是c中臭名昭著的函数，任何一个编程规范中都会说明禁止使用这个函数。 事实上，在2011年最新版的c标准中，已经将这个函数删除了。

user: user-3
content: 将所有有gets删除 直接用这一句 canf("%s,%s,%d",p->name,p->phnoe,&p->age);  输入时用逗号隔开。
user-0 提问: C++ 从txt文件中读取数据，在开头插入一行，表示每一列名称

回复:
user: user-1
content: 请问一下        5^3 1  2  3 2  1  2 3  2  2 4  2  2 5  2  2 类似这样的表格很多，怎么先定位到5^3，然后按行列读取出来

user: user-0
content: 引用 5 楼 dcxy0 的回复:[quote=引用 3 楼 OrthocenterChocolate 的回复:] 好的，我给你写了一个，我把x1，y1，x2，y2，th这些列名用制表符分隔，具体细节你可以根据自己的需要修改~代码如下： #include <iostream> #include <fstream> using namespace std; int main() {     ifstream ifs("input.txt");     ofstream ofs("output.txt");     ofs<<"x1\ty1\tx2\ty2\tth"<<endl;     char str[1024];     while(ifs.getline(str, 1024)){         ofs<<str<<endl;     }     ifs.close();     ofs.close();     return 0; } 输入文件是input.txt，加了列名后的文件是output.txt 写的好简洁，学习了[/quote]   谢谢了！！！

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

user: user-3
content: 引用 3 楼 OrthocenterChocolate 的回复:好的，我给你写了一个，我把x1，y1，x2，y2，th这些列名用制表符分隔，具体细节你可以根据自己的需要修改~代码如下： #include <iostream> #include <fstream> using namespace std; int main() {     ifstream ifs("input.txt");     ofstream ofs("output.txt");     ofs<<"x1\ty1\tx2\ty2\tth"<<endl;     char str[1024];     while(ifs.getline(str, 1024)){         ofs<<str<<endl;     }     ifs.close();     ofs.close();     return 0; } 输入文件是input.txt，加了列名后的文件是output.txt 写的好简洁，学习了

user: user-3
content: 引用 3 楼 OrthocenterChocolate 的回复:好的，我给你写了一个，我把x1，y1，x2，y2，th这些列名用制表符分隔，具体细节你可以根据自己的需要修改~代码如下： #include <iostream> #include <fstream> using namespace std; int main() {     ifstream ifs("input.txt");     ofstream ofs("output.txt");     ofs<<"x1\ty1\tx2\ty2\tth"<<endl;     char str[1024];     while(ifs.getline(str, 1024)){         ofs<<str<<endl;     }     ifs.close();     ofs.close();     return 0; } 输入文件是input.txt，加了列名后的文件是output.txt  ++。

user: user-4
content: 好的，我给你写了一个，我把x1，y1，x2，y2，th这些列名用制表符分隔，具体细节你可以根据自己的需要修改~代码如下： #include <iostream> #include <fstream> using namespace std; int main() {     ifstream ifs("input.txt");     ofstream ofs("output.txt");     ofs<<"x1\ty1\tx2\ty2\tth"<<endl;     char str[1024];     while(ifs.getline(str, 1024)){         ofs<<str<<endl;     }     ifs.close();     ofs.close();     return 0; } 输入文件是input.txt，加了列名后的文件是output.txt

user: user-0
content: 引用 1 楼 OrthocenterChocolate 的回复:那只能先把文件读出来，然后先写入列名，再写入文件内容了，不能直接往文件的前面插入的。 可以给一下具体代码吗

user: user-4
content: 那只能先把文件读出来，然后先写入列名，再写入文件内容了，不能直接往文件的前面插入的。