Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求解 为何函数外与函数内运行结果不一样 

回复:
user: user-1
content: 假设你第一次选Y/N时选了N，那么程序不会执行整个while（c=='Y')循环，在这个while循环后第一句处时：p1==p2, n==0; 然后到p=head语句时 p1==p2 && p1==head, 后一个循环可以正常显示内容，程序继续执行free(p1)，然后p1 == p2 && p1 == head && head->已释放内存, 程序退出时返回head.... 也就是说main程序中的p是一个指向已释放内存的指针，你还指望它能正确显示无效内存中的数值吗？
user-0 提问: 考试报名系统    求帮助！！1

回复:
user: user-1
content: 排名参考代码 按学校 班级 成绩三个关键字排降序 http://pan.baidu.com/s/1ntuNH0X

user: user-2
content: 附加一些成绩评判的函数，如低于60分，高于90分，总分排名

user: user-1
content: 注册 登录 删除用户 更改资料 成绩查询 成绩输入等
user-0 提问: 简单但重要，求帮忙！~针对样本大时就运行不了了啊

回复:
user: user-1
content: 大文件读取时你可以采用分块的形式进行读取  以你的个例需求点来说，需要读取每一行的数据，你可以尝试这样做  每次读取32K字节大小的内容，如果读取的32K中不包含换行符‘\n’，那么这32K的内容都在一行，处理这32K的内容； 如果这32K内容中有换行符，那么以换行符为分界点，进行处理，直到在这32K内容里面找不到换行符  对文件进行分块处理，可以提高处理的效率   仅供参考

user: user-2
content: 有两句多余了。。。 #include <stdio.h> #include <stdlib.h> #include <string.h>  int main( ) { 	char ch; 	char str_temp[1000]; 	int i; 	FILE* fp_in; 	FILE* fp_out; 	fp_in=fopen("1.txt","r"); 	if(fp_in==NULL) 	{ 		printf("files can not open!\n"); 		exit(1); 	} 	fp_out=fopen("2.txt","w"); 	if(fp_out==NULL) 	{ 		printf("files can not save!\n"); 		exit(2); 	} 	for(;;) 	{ 		for(i=0;i<46;i++) 		{ 			fgetc(fp_in); 		} 		fscanf(fp_in,"%s",str_temp); 		while((ch=fgetc(fp_in))!='\n'); 		if(ch==EOF)break; 		puts(str_temp); 		fprintf(fp_out,"%s\n",str_temp); 	} 	fclose(fp_in); 	fclose(fp_out); 	return 0; }

user: user-2
content: 这样？ #include <stdio.h> #include <stdlib.h> #include <string.h>  int main( ) { 	char ch; 	char str_temp[1000]; 	int i; 	FILE* fp_in; 	FILE* fp_out; 	fp_in=fopen("1.txt","r"); 	if(fp_in==NULL) 	{ 		printf("files can not open!\n"); 		exit(1); 	} 	fp_out=fopen("2.txt","w"); 	if(fp_out==NULL) 	{ 		printf("files can not save!\n"); 		exit(2); 	} 	for(;;) 	{ 		ch=fgetc(fp_in); 		if(ch==EOF)break; 		for(i=0;i<45;i++) 		{ 			fgetc(fp_in); 		} 		fscanf(fp_in,"%s",str_temp); 		while((ch=fgetc(fp_in))!='\n'); 		if(ch==EOF)break; 		puts(str_temp); 		fprintf(fp_out,"%s\n",str_temp); 	} 	fclose(fp_in); 	fclose(fp_out); 	return 0; }  输出 夜明珠110kV白明线明57开关保护装置通讯故障 五峰GPS对时装置报警 郭家岗2#直流充电柜直流系统故障 郭家岗预告警信号 郭家岗2#直流充电柜直流系统故障 郭家岗预告警信号 麂子河220kV雁麂二回麂226开关PSL602U录波扰动数据在记录 麂子河220kV雁麂二回麂226开关PSL602U录波扰动数据在记录 麂子河220kV麂桑线麂221开关PSL602U录波扰动数据在记录 麂子河220kV麂桑线麂221开关PSL602U录波扰动数据在记录 五峰GPS对时装置报警

user: user-3
content: 看了一半代码，好像你程序只要写超过6000字节就出错了吧（非法内存访问）？ 因为写2.txt 只有 fprintf(fp2,"%s\n",b); 一句，而且是在读取整个1.txt后。 哦哦哦, 在循环中j可能早就超过6000了， 但是你仍然*(b+j)=*(a+i);  *(b+j)='\0' ....  请将fprintf()移到while (fgets(a,sizeof(a),fp1))循环中并重置j=0;这样应该就可以解决问题了。
user-0 提问: 定义了一个指向结构类型的指针，然后在给结构体内的成员赋值时编译出错，求大家帮忙看看，谢谢~~

回复:
user: user-0
content: 引用 3 楼 baichi4141 的回复:从缩进来看，大概楼主以为赋值语句不用放在函数中也可以执行吧 真的是这个原因，谢谢帮助

user: user-1
content: VS IDE中，在符号PIDREG_DEFAULTS上点鼠标右键，选转到定义。

user: user-2
content: 引用 5 楼 Cnwanglin 的回复:[quote=引用 3 楼 baichi4141 的回复:] 从缩进来看，大概楼主以为赋值语句不用放在函数中也可以执行吧  不会吧...超强的纠错能力![/quote] 神人！ 不过错误提示好像是定义指针变量那一句就出错了，不是赋值才出错的

user: user-3
content: 引用 3 楼 baichi4141 的回复:从缩进来看，大概楼主以为赋值语句不用放在函数中也可以执行吧 碉堡了

user: user-4
content: 引用 3 楼 baichi4141 的回复:从缩进来看，大概楼主以为赋值语句不用放在函数中也可以执行吧  不会吧...超强的纠错能力!

user: user-4
content: PIDREG_DEFAULTS怎么定义的

user: user-5
content: 从缩进来看，大概楼主以为赋值语句不用放在函数中也可以执行吧

user: user-6
content: #include <iostream> using namespace std;  typedef struct { 	int index; }Pos;  typedef Pos* pos;  void main() { 	Pos p; 	pos p2=&p; 	p2->index = 2; } 可以正常执行啊，是不是其他地方有影响？

user: user-3
content: 貌似没问题  截什么图，粘帖啊，不能复制去编译

user: user-0
content: 引用 10 楼 user-7123456789 的回复:好像dsp ccs的界面是的

user: user-7
content: 好像dsp ccs的界面
user-0 提问: 说说目前C语言的用途

回复:
user: user-0

user: user-1

user: user-2
content: 毕竟是基础语言，我想大家都是从c语言开始的吧

user: user-3
content: 搞游戏，openGL什么的。。。。

user: user-4
content: 引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 zxh707wk 的回复:] 只要不谈界面，啥都行 Quake3的界面是C写的吧。[/quote]正在玩linux版的，感觉好流畅。。。

user: user-5
content: 主要应用在嵌入式领域

user: user-6
content: 引用 4 楼 zxh707wk 的回复:只要不谈界面，啥都行 Quake3的界面是C写的吧。

user: user-4
content: 只要不谈界面，啥都行

user: user-6
content: Flash是C++开发的吧。

user: user-7
content: 只要不是与网页和Flash界面相关的， C语言都可以开发之。 复杂界面不占优势；后台和底层的实现，C语言大有可为。。

user: user-7
content: C语言是很通用的语言， Linux， Window， 都可以有相应的运行环境， 嵌入式开发更是厉害；

user: user-8

user: user-9
content: 引用 14 楼 zhangleiyigeren 的回复:[quote=引用 12 楼 zhao4zhong1 的回复:] 顺便打个广告，挣点资源分：  Excel最新版竟然也不支持显示超过32767行数据对应的折线图！ 无奈自己编程实现全屏分行显示大于32767行数据对应的折线图功能。 最多7列数据（支持鼠标左键点击折线图时在底部提示行显示对应第几行和对应数值，点击提示行轮换在最上面显示某组折线并以粗体字显示其对应数值） http://download.csdn.net/detail/zhao4zhong1/7610833  为什么 不整个可以32行或者16行，再甚8行的也好啊，，，前段时间刚用上过[/quote] 不是传说中的最多赚100积分而且就算是0资源分也能得到1分吗。

user: user-10
content: 引用 10 楼 zhao4zhong1 的回复:这个旧模板先凑合用： 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

user: user-11
content: 引用 9 楼 u013470052 的回复:引用 8 楼 assembly 的回复:这么经典的问题，赵老师没有模板吗？就是  应该搞个模板

user: user-6
content: 引用 14 楼 zhangleiyigeren 的回复:[quote=引用 12 楼 zhao4zhong1 的回复:] 顺便打个广告，挣点资源分：  Excel最新版竟然也不支持显示超过32767行数据对应的折线图！ 无奈自己编程实现全屏分行显示大于32767行数据对应的折线图功能。 最多7列数据（支持鼠标左键点击折线图时在底部提示行显示对应第几行和对应数值，点击提示行轮换在最上面显示某组折线并以粗体字显示其对应数值） http://download.csdn.net/detail/zhao4zhong1/7610833 为什么 不整个可以32行或者16行，再甚8行的也好啊，，，前段时间刚用上过 反正是源代码，根据自己需要随便你怎么改。

user: user-6
content: 12楼就是目前C语言的用途之一。

user: user-12
content: 引用 12 楼 zhao4zhong1 的回复:顺便打个广告，挣点资源分：  Excel最新版竟然也不支持显示超过32767行数据对应的折线图！ 无奈自己编程实现全屏分行显示大于32767行数据对应的折线图功能。 最多7列数据（支持鼠标左键点击折线图时在底部提示行显示对应第几行和对应数值，点击提示行轮换在最上面显示某组折线并以粗体字显示其对应数值） http://download.csdn.net/detail/zhao4zhong1/7610833  为什么 不整个可以32行或者16行，再甚8行的也好啊，，，前段时间刚用上过

user: user-13

user: user-6
content: 顺便打个广告，挣点资源分：  Excel最新版竟然也不支持显示超过32767行数据对应的折线图！ 无奈自己编程实现全屏分行显示大于32767行数据对应的折线图功能。 最多7列数据（支持鼠标左键点击折线图时在底部提示行显示对应第几行和对应数值，点击提示行轮换在最上面显示某组折线并以粗体字显示其对应数值） http://download.csdn.net/detail/zhao4zhong1/7610833
user-0 提问: 优先队列 之 包裹分拣 的两个细节问题

回复:
user: user-1
content: 这两个指针指向的内容是都是存放在栈空间的，当执行完对应的函数后这个指针指向的内容就被释放了，为了将内容保存下来，才创建一个堆空间，要找到调用这些函数是什么时候，传递参数的时候，这个指针所指向的内容是在堆还是栈  以上纯属猜测，如有雷同，纯属扯淡~

user: user-0
content: 楼上的大哥,都凌晨2点半了你怎么还不睡觉?

user: user-2
content: 因为get_parcel传入的第2个参数是Parcel*而不是Parcel**, 也就是说需要获取的数据需要充填到调用者分配的内存中而不是PQueue中本来使用的内存。另外pqueue_extract明显返回了一个指针，指向PQueue中原本Parcel使用的内部内存，因为是内部使用的内存，所有需要复制内容到调用者所分配的内存内然后释放这块内部内存。 而put_parcel不使用用户传递的Parcel*作为PQueue内部内存是因为用户传递的可能是一个局部变量（即在栈上），可能一会就失效了。程序必须保证Parcel使用的内存处于堆上，所以需要自己malloc一块然后复制数据  至于get_parcel第二个参数不使用Parcel**是为了保证作为库函数有相似的行为，比如插入和取出时用户分配的内存都必须由用户释放，插入和取出时都可以使用局部变量。 同时可以防止函数处于dll中而调用者处于exe中并且两者使用不同的内存管理器时dll中分配的内存在exe中无法释放。
user-0 提问: C

回复:
user: user-1
content: 跨地区传输（非局域网),你要知道你另一台机的公网ip和端口.........种种层层的路由器交换机的关联.......你没办法搞定的..除非你用一台公网的机子接收这两台电脑发来的信息，你就知道他们各自的路径了，之后就可以用这些路径互传.. 有本事买到一个公网IP,你就可以跨了.

user: user-2
content: 百度 DNAT SNAT

user: user-2
content: 可以建个讨论群

user: user-0
content: 能不能加个QQ好友啊，有问题可以请教你们啊，qq：345917505，希望各位大哥今后多多指教啊。我还有很多都不懂啊。

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

user: user-0
content: 十分感谢啊.虽然,无以回报

user: user-4
content: 需要在 路由器配置一个 内外网ip端口映射表， 才能跨局域网连接  google 一下 NAT
user-0 提问: C语言关于局域网的问题

回复:
user: user-1
content: 引用 楼主 chenxu1223537114 的回复:做了一个C/S程序，在局域网中，服务器处于监听状态，客户端怎么寻找服务器所在的IP地址？就好像CS里一个玩家创建了一个房间，其他的玩家可以刷新看到"服务器"创建的房间，这是怎么做到的？ 发个广播不就ok了

user: user-2
content: for(ip = startip; ip <= endip; ip++) {     for(port = startport; port <= endport; port++)     {         connect(ip, port)         recv(对方返回信息)         if(对方返回信息表明对方是CS房间)             显示房间信息         else //对方的返回信息无法识别，或者超时没有返回信息             对方不是CS房间，关闭该链接     } }
user-0 提问: 求好心人帮忙下一个codeproject的代码

回复:
user: user-0
content: 不好意思，之后研究代码去了，然后各种事情，上个月后来我找了个github上面的，codeproject好像还是上不去，不过无所谓了，谢谢大家。

user: user-1
content: 为什么我点了下载之后接没反应了。。。

user: user-1
content: 对于这种刚发的帖子，我总是毫不犹豫的顶了。如果火了就是个前排，可以混个脸熟，说不定谁好心就给粉了…稳赚不赔；如果沉了就感觉是我弄沉的，很有成就感，还能捞经验。

user: user-2
content: 哥帮你下了，http://download.csdn.net/detail/lovesmiles/7620941 哈哈，给点资源分吧。

user: user-3
content: 再注册个啊，这个网站的很多资源都不错

user: user-4
content: 下了，怎么给你？
user-0 提问: 请问printf的返回值格式?

回复:
user: user-0
content: 引用 1 楼 user-6 的回复:printf返回输出的字符个数，比如 printf("abcde"); 返回5 自己写几行代码就可以验证  我看到有实例,可以返回值,所以查看VS的源码,发现不一样.所以上来问. 测试我肯定先测了...

user: user-0
content: 引用 10 楼 zxh707wk 的回复:引用 5 楼 mymtom 的回复:坑爹的货多了，比如老谭的 void main()+1  有买老谭的书,不过比较经典的 <Pointers On C>, 等还没搞好...不懂有没有机会看老谭的...

user: user-1
content: 引用 5 楼 mymtom 的回复:坑爹的货多了，比如老谭的 void main()+1

user: user-2
content: 参考 C:\Microsoft SDK\src\crt\printf.c C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\src\crt\printf.c C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\PRINTF.C C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\printf.c C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\printf.c C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\printf.c

user: user-0
content: 引用 3 楼 Automation_dmu 的回复:不知道你这个“速查”是个啥， C11中： 7.21.6.3 The printf function Synopsis 1 #include <stdio.h> int printf(const char * restrict format, ...); Description 2 The printf function is equivalent to fprintf with the argument stdout interposed before the arguments to printf. Returns 3 The printf function returns the number of characters transmitted, or a negative value if an output or encoding error occurred.  是"Knocker 2004.7.7 版本 0.5' 网上搜的,  我主要是想方便找函数用的, 而且如果是 chm格式的更好. 那懂是这样. 误导人.

user: user-0
content: 引用 5 楼 mymtom 的回复:坑爹的货多了，比如老谭的 void main() void main() 貌似没有错, 应该涉及到C++了,在C++可以这样用. 因为在VS,貌似只能支持C++,没有纯脆针对C的...所以这个还好.

user: user-0
content: 引用 2 楼 user-6 的回复:不过楼主也不用纠结，printf的返回值很少用到。 这个我不是担心, ,会误导人而已.

user: user-3
content: 坑爹的货多了，比如老谭的 void main()

user: user-4
content: printf函数会返回一个整型数值，这个值是输出字符串的字符数，不过这个很少会用到

user: user-5
content: 不知道你这个“速查”是个啥， C11中： 7.21.6.3 The printf function Synopsis 1 #include <stdio.h> int printf(const char * restrict format, ...); Description 2 The printf function is equivalent to fprintf with the argument stdout interposed before the arguments to printf. Returns 3 The printf function returns the number of characters transmitted, or a negative value if an output or encoding error occurred.

user: user-6
content: 不过楼主也不用纠结，printf的返回值很少用到。

user: user-6
content: printf返回输出的字符个数，比如 printf("abcde"); 返回5 自己写几行代码就可以验证
user-0 提问: VC 6.0 atof("123.567")

回复:
user: user-1
content: printf("%.3f\n",atof("123.567"));

user: user-2
content: 引用 楼主 li905663280 的回复:printf("%f\n",atof("123.567")); 结果为什么那么长，不知道出错在那， 因为小数并不精确。 即使手动赋值也是一样的。
user-0 提问: 使用C语言实现bcd码转十六进制数。

回复:
user: user-1
content: uchar bcd_hex(uchar bcd)			//bcdÂë×ª»»³É16½øÖÆÊý { 	uchar temp = bcd & 0x0f; 	bcd = bcd >> 4; 	bcd %= 0xf;  	return bcd *10 + temp; }

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

user: user-2
content: 仅供参考#include <stdio.h> #include <stdlib.h> #include <conio.h> unsigned int iv,i; unsigned char BCD[5];//定长10位BCD码 unsigned char sv[11]; void main() {     iv=123456789;//最大10位无符号正整数     //INT2BCD     sprintf(sv,"%010u",iv);     for (i=0;i<10;i+=2) {         BCD[i/2]=(sv[i]<<4)|(sv[i+1]&0x0F);     }     printf("BCD=%02x%02x%02x%02x%02x\n",BCD[0],BCD[1],BCD[2],BCD[3],BCD[4]);     //BCD2INT     for (i=0;i<10;i+=2) {         sv[i]='0'|(BCD[i/2]>>4);         sv[i+1]='0'|(BCD[i/2]&0x0F);     }     sscanf(sv,"%010u",&iv);     printf("iv=%010u\n",iv);     getch(); }

user: user-3
content: char *strBCD = "000100100111"; 	int num = 0; 	for (int i = 4; i <= strlen(strBCD); i = i + 4)//长度不足4的部分将被舍去 	{ 		num = num * 10 + 			(strBCD[i - 4] - '0') * 8 +  			(strBCD[i - 3] - '0') * 4 +  			(strBCD[i - 2] - '0') * 2 +  			(strBCD[i - 1] - '0'); 	}

user: user-4
content: 引用 1 楼 zjq9931 的回复:问题比较简单。 0101是内存中的二进制码，并不是字符型的“0101”吧？ 第一步：把BCD码输出成10进制字符串，0101，输出成“5”，printf就可以做到。 然后用sscanf函数，可以将字符串型的“5”,转换成16进制的。 sprintf

user: user-4
content: 问题比较简单。 0101是内存中的二进制码，并不是字符型的“0101”吧？ 第一步：把BCD码输出成10进制字符串，0101，输出成“5”，printf就可以做到。 然后用sscanf函数，可以将字符串型的“5”,转换成16进制的。
user-0 提问: 求解

回复:
user: user-1
content: 自古二楼出正解。

user: user-2
content: 这样的话是不是只能自己查错了？

user: user-3
content: char a[6]="bacao"; char b[] ="bbd"; strncat(a,b,3)     这里 a,b 是以地址传给它的，它不会检查你a具体有多少个元素的，所以不会报错,在strncat函数里面接连时应该是以地址++方式连接，也不检测数组大小，编译器一般是连续分配内存  所以b紧接在a后面,   内存内容为   bacao'\0'bbd'\0'  strncat(a,b,3); 会自动把a 字符串的 结束标志'\0'去接，   接上bbd  所以内存内容为  bacaobbd'\0'  printf("%s",a);   是以是a[0]地址开始一直到检测到'\0'才作为结束标志的，所以输出bacaobbd

user: user-4
content: c编译器不会对数组越界进行检查

user: user-5
content: 呵呵，如果你再printf("%s",b); 就会发现b也变了（如果是release版的话），变成空字符串了。 因为a和b都是栈上的变量，a占用8字节栈空间，后面紧接着是b占用的4字节空间，所有当你strncat后b[0]就成了'\0‘了

user: user-6
content: 其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-7
content: 楼上已经解答。

user: user-8
content: 数组越界并不是一定会报出错误，所以这种错误是隐藏最深，最让人头疼和蛋疼的
user-0 提问: 文件指针的设置问题

回复:
user: user-1
content: fs = fopen("E:\\data task\\rfv3\\write.txt","w"); 用wb试一下，默认是文本格式写入，会对换行符做转换 有些会把"\r\n"转换一下

user: user-2
content: fs = fopen("E:\\data task\\rfv3\\write.txt","w"); 这一句 换成“wb”这样试试。 fs = fopen("E:\\data task\\rfv3\\write.txt","wb");
user-0 提问: strcpy和strncpy

回复:
user: user-1
content: 楼主分享，我就接分。

user: user-2
content: strncpy, wcsncpy, _mbsncpy Copy characters of one string to another.  char *strncpy( char *strDest, const char *strSource, size_t count );  wchar_t *wcsncpy( wchar_t *strDest, const wchar_t *strSource, size_t count );  unsigned char *_mbsncpy( unsigned char *strDest, const unsigned char *strSource, size_t count );  Routine Required Header Compatibility  strncpy <string.h> ANSI, Win 95, Win NT  wcsncpy <string.h> or <wchar.h> ANSI, Win 95, Win NT  _mbsncpy <mbstring.h> Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  Each of these functions returns strDest. No return value is reserved to indicate an error.  Parameters  strDest  Destination string  strSource  Source string  count  Number of characters to be copied  Remarks  The strncpy function copies the initial count characters of strSource to strDest and returns strDest. If count is less than or equal to the length of strSource, a null character is not appended automatically to the copied string. If count is greater than the length of strSource, the destination string is padded with null characters up to length count. The behavior of strncpy is undefined if the source and destination strings overlap.  wcsncpy and _mbsncpy are wide-character and multibyte-character versions of strncpy. The arguments and return value of wcsncpy and _mbsncpy vary accordingly. These three functions behave identically otherwise.  Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tcsncpy strncpy _mbsnbcpy  wcsncpy     Example  /* STRNCPY.C */  #include <string.h> #include <stdio.h>  void main( void ) {    char string[100] = "Cats are nice usually";    printf ( "Before: %s\n", string );    strncpy( string, "Dogs", 4 );    strncpy( string + 9, "mean", 4 );    printf ( "After:  %s\n", string ); }   Output  Before: Cats are nice usually After:  Dogs are mean usually   String Manipulation Routines  See Also   _mbsnbcpy, strcat, strcmp, strcpy, strncat, strncmp, _strnicmp, strrchr, _strset, strspn
user-0 提问: 静态的局部变量：当函数执行完毕的时候，静态的局部变量的值在下次执行时，被保留了下来，为什么？

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

user: user-1
content: 静态局部变量保存在全局数据区。

user: user-2
content: 存储位置和普通局部变量不同，相当于全局变量，所以能保留下来

user: user-3
content: 因为C++标准委员会那帮人规定了这样  然后各个编译器的实现人员就不得不遵守委员会的规定，否则老板就要开除他们

user: user-4
content: 存储位置决定了它的生命周期

user: user-5
content: 因为它保存在内存的位置不一样。有些内存会被重复使用分配，有些内存则不会。

user: user-6
content: C/C++就是这样规定和设计的。

user: user-7
content: 因为存储在静态存储区，所以只能初始化一次，而以后再函数调用的过程中其值都维持不变。

user: user-8
content: http://www.geeksforgeeks.org/memory-layout-of-c-program/

user: user-9
content: 静态局部变量是存储在内存中的静态存储区的 随程序执行开始分配内存，直到程序结束进行释放。  对于静态局部变量，在程序开始是分配内存并且初始化。在以后调用函数的时候不再进行重新分配内存。  static int y=1;  对于这条语句，程序只执行一次，在以后使用此函数的过程中不再重新分配变量，相当于这条语句不执行了。
user-0 提问: C要运行很长时间，怎样能占用内存和CPU小些

回复:
user: user-1
content: 可以把进程的优先级调低一点，就少占 CPU 了

user: user-2
content: 好像多线程不行

user: user-3
content: 应设计为每隔比如1小时保存当前状态到磁盘文件中，万一因为各种原因中断运行了，可以通过读取最后保存到磁盘的状态信息让工作继续从那个点继续运行。

user: user-4
content: 引用 3 楼 yangyunzhao 的回复:[quote=引用 1 楼 Intel0011 的回复:] 1. 分配的内存使用完后立即释放 2. 适当使用Sleep函数以减少本程序对CPU的占用  第1种方法不好，应该是启动时申请内存，运行过程中不动态分配内存。占用内存不可怕，可怕的是你不确定你会占用多大内存。 具体还是要贴代码[/quote]  1.用事先申请的内存，在其中做逻辑操作。 2.改进算法 3.用release版本

user: user-5
content: 引用 1 楼 Intel0011 的回复:1. 分配的内存使用完后立即释放 2. 适当使用Sleep函数以减少本程序对CPU的占用  第1种方法不好，应该是启动时申请内存，运行过程中不动态分配内存。占用内存不可怕，可怕的是你不确定你会占用多大内存。 具体还是要贴代码

user: user-6
content: 少占内存的话就是注意动态申请的要及时释放。 少占cpu的话可以放进单独线程执行，以免独占cpu

user: user-2
content: 可以用多线程

user: user-7
content: 1. 分配的内存使用完后立即释放 2. 适当使用Sleep函数以减少本程序对CPU的占用

user: user-8
content: 把所有的变量在执行循环前都定义好，包括栈和堆上。

user: user-9
content: 1、不要死循环 2、每循环一次，不急的话 可以适当的sleep下 3、用内存管理，合理的分配/释放内存，可以保留一些内存，避免每次都是分配->释放 4、etc.
user-0 提问: 一个有点难度的问题：文件缓冲区和标准输入输出的缓冲区的疑问

回复:
user: user-1
content: 参考C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\OPEN.C

user: user-2
content: 再理解深入一点就是操纵系统接口的事了，打开文件fopen内部会调用具体的操纵系统API，windows应该是CreateFile，linux是open函数。windows返回的是句柄，linux返回的是一个整数值，就是区别其它文件的标识。进程进入mian函数之前已经打开了标准输入，输出，错误输出的文件。

user: user-0
content: 引用 3 楼 user-3 的回复:[quote=引用 2 楼 BiologyPianoProgram 的回复:] [quote=引用 1 楼 user-3 的回复:] 有什么问题么？ 那是肯定的~~~因为标准输入输出stdin  stdout是文件指针  fopen也会返回文件指针：这里面通常会包含指向缓存的指针。。。。  反正只要是标准i/o文件指针，就会有缓存~~~ 如果真是这样，倒也没啥问题。 我就是感觉书上在讲述流、缓冲区、文件时，说的高度抽象，使人望而却步，难以理解，所以想用一些具体的示例来把问题简单化。  发此贴的另一个目的就是指望有高人出现，能够针对流、缓冲区、文件操作给出一些通俗易懂的定义、概念和内部机制的解释（虽然目前我自己已经基本全都研究通了，但是无法用通俗易懂的语言组织起来，只能从侧面通过示例来解释一些概念）[/quote] 额~~那你还是看下《unix高级环境编程》吧，具体第几章我也忘了~~~[/quote]  这个暂时没空研究，之前看过机制的，还没到代码这个级别。 关于缓冲区的机制我自己是能够很透彻的理解了 我只是想总结下，写个博文，发出来，让以后不理解的同志都能看到，然后都能够迅速理解。本来就是一挺简单的事，偏偏被书上 说的很深奥很抽象

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:为什么不按Alt+8，F11键单步进fopen函数参考其源代码呢？  老赵，我这不c搁置很久了，最近感觉越来越需要，所以才狠下心抽时间研究的 linux之前一直看的是机制方面的介绍，具体源码没看

user: user-1
content: 为什么不按Alt+8，F11键单步进fopen函数参考其源代码呢？

user: user-3
content: 引用 2 楼 BiologyPianoProgram 的回复:[quote=引用 1 楼 user-3 的回复:] 有什么问题么？ 那是肯定的~~~因为标准输入输出stdin  stdout是文件指针  fopen也会返回文件指针：这里面通常会包含指向缓存的指针。。。。  反正只要是标准i/o文件指针，就会有缓存~~~ 如果真是这样，倒也没啥问题。 我就是感觉书上在讲述流、缓冲区、文件时，说的高度抽象，使人望而却步，难以理解，所以想用一些具体的示例来把问题简单化。  发此贴的另一个目的就是指望有高人出现，能够针对流、缓冲区、文件操作给出一些通俗易懂的定义、概念和内部机制的解释（虽然目前我自己已经基本全都研究通了，但是无法用通俗易懂的语言组织起来，只能从侧面通过示例来解释一些概念）[/quote] 额~~那你还是看下《unix高级环境编程》吧，具体第几章我也忘了~~~

user: user-0
content: 引用 1 楼 user-3 的回复:有什么问题么？ 那是肯定的~~~因为标准输入输出stdin  stdout是文件指针  fopen也会返回文件指针：这里面通常会包含指向缓存的指针。。。。  反正只要是标准i/o文件指针，就会有缓存~~~ 如果真是这样，倒也没啥问题。 我就是感觉书上在讲述流、缓冲区、文件时，说的高度抽象，使人望而却步，难以理解，所以想用一些具体的示例来把问题简单化。  发此贴的另一个目的就是指望有高人出现，能够针对流、缓冲区、文件操作给出一些通俗易懂的定义、概念和内部机制的解释（虽然目前我自己已经基本全都研究通了，但是无法用通俗易懂的语言组织起来，只能从侧面通过示例来解释一些概念）

user: user-3
content: 有什么问题么？ 那是肯定的~~~因为标准输入输出stdin  stdout是文件指针  fopen也会返回文件指针：这里面通常会包含指向缓存的指针。。。。  反正只要是标准i/o文件指针，就会有缓存~~~

user: user-1
content: 引用 10 楼 BiologyPianoProgram 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 参考C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\OPEN.C  原理我都研究透啦，我主要是要让大牛给出一些通俗易懂的定义、概念或解释。[/quote] 源代码＞解释＞定义＞原理＞概念

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:参考C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\OPEN.C  原理我都研究透啦，我主要是要让大牛给出一些通俗易懂的定义、概念或解释。

user: user-0
content: 引用 7 楼 ypzhong 的回复:再理解深入一点就是操纵系统接口的事了，打开文件fopen内部会调用具体的操纵系统API，windows应该是CreateFile，linux是open函数。windows返回的是句柄，linux返回的是一个整数值，就是区别其它文件的标识。进程进入mian函数之前已经打开了标准输入，输出，错误输出的文件。 原理我都研究透啦，我主要是要让大牛给出一些通俗易懂的定义、概念或解释。
user-0 提问: C语言菜鸟：为啥360会把我编的程序当成病毒，阻止运行？求大神指点

回复:
user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:因为360是流氓软件。 那应该用神马安全软件？

user: user-1
content: 不过楼主的代码也被360报毒挺奇怪的，代码中没调用什么函数。

user: user-2
content: 从来不用360  呵呵

user: user-3
content: 360就是做流氓软件出生的,  还记得当年的3721吗 对于现在普通家用电脑, 应该果断卸载360, 你会发现机不卡了, 运行流畅了, 开机更快了.

user: user-4
content: 因为你的程序没有被360记录下来

user: user-5
content: 我不用360很多年。

user: user-6
content: 程序人用360，小朋友你把我惊呆了

user: user-7
content: 很多exe文件360也都会当成木马

user: user-8
content: 因为360是流氓软件，你又沒有交保護費

user: user-9
content: 写程序时先关闭360 这是常识

user: user-10
content: 360正事干不了还净添乱 趁你不注意改点设置 结果vpn挂了。。。找了很久才想到360干的！ 果断卸载流氓软件

user: user-11
content: 引用 6 楼 super_admi 的回复:楼上说的给360钱是一个办法，其实还有另一个办法，就是把你的软件写成一个病毒，360就不会阻止运行了。  求写病毒教程

user: user-12
content: 请把钱打到这个卡上：10010001001001001 建行卡，开户名：360 谢谢！ 请打10000. 打过后保证不阻止。

user: user-13
content: 引用 3 楼 zhao4zhong1 的回复:因为360是流氓软件。 原来是这样。

user: user-14
content: 楼上说的给360钱是一个办法，其实还有另一个办法，就是把你的软件写成一个病毒，360就不会阻止运行了。

user: user-15
content: 因为你没有给360塞钱，所以你没有进入它的白名单

user: user-16
content: 有一次电脑管家也把我写的一个小程序当病毒删了。。。 就是计算1到100的和。。。

user: user-17
content: 远离国产软件，不仅仅是杀毒软件！你见过正则工具都要联网么？我就见过！

user: user-18
content: 因为360是流氓软件。

user: user-19
content: 我觉得不是没塞钱的问题，因为编译成功后直接打开exe文件运行而不是点击IDE里的运行或调试按钮就不会被杀毒软件拦截。 应该是IDE里的调试器或者其他什么的在对正在运行的程序做监控或者调用什么的，导致杀毒软件误以为是恶意程序。 比如说要在IDE里debug,断言，断点这些。
user-0 提问: 关于C的一个小问题

回复:
user: user-0
content: 非常感谢各位！ 知道错误在哪了。！　我自己以后会注意！　　太感谢了

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

user: user-2
content: 以整型格式输出单精度型数据，是要被截断的，这个你可以在C的数据类型中查阅。

user: user-2
content: 遇到此类问题，最好的办法是就在计算完成一步后，立即打印出各变量值，这样便于核对，初学时不要求快。  我调试了一下，改成如下语句便可打印出正确结果了。  printf ("%f", d);  //检查d值是否正确

user: user-3
content: #include "stdio.h"  void main() { int a,b,c,d; scanf("%d%d%d",&a,&b,&c); d=b*b-4*a*c; printf("%d",d); if(b>0) { 	printf("有两个根"); } else if(b=0) { 	printf("有一个根"); } getch();  }实测为1 ，要不 都用％ｆ或％ｄ

user: user-4
content: 楼上正解

user: user-5
content: printf ("%f", d);  //检查d值是否正确
user-0 提问: 关于a++和++a的问题

回复:
user: user-1
content: 引用 3 楼 ricardoAlex 的回复:[quote=引用 1 楼 user-1 的回复:] 去看置顶帖  这代码是错的  涉及未定义行为  结果没有意义  分析结果是在搞笑 请问是这一条吗？[/quote] 对的

user: user-0
content: 引用 1 楼 user-1 的回复:去看置顶帖  这代码是错的  涉及未定义行为  结果没有意义  分析结果是在搞笑 请问是这一条吗？

user: user-1
content: 另外 扯什么从右到左的 都是在误人子弟  楼下的自重

user: user-1
content: 去看置顶帖  这代码是错的  涉及未定义行为  结果没有意义  分析结果是在搞笑
user-0 提问: 定义一个元素为指针的数组类型 typedef  char* (MESG_TYPE)[3] ;

回复:
user: user-1
content: 没什么问题 typedef  char* (MESG_TYPE)[3]; // 可以直接写成 typedef  char* MESG_TYPE[3];  MESG_TYPE *grMesgQue = 0; MESG_TYPE grBufMesgQue2 =   {    "from task4:to eat4\n",    "from task4:to walk4\n",    "from task4:to sleep4\n" };  void func(void) {    grMesgQue = &grBufMesgQue2;    if (grMesgQue != 0)    {       debugs("%s\n", (*grMesgQue)[0]);       debugs("%s\n", (*grMesgQue)[1]);       debugs("%s\n", (*grMesgQue)[2]);       grMesgQue = 0;    } }

user: user-2
content: typedef  char (*MESG_TYPE)[3] ;

user: user-0
content: 忘了说 编译环境是MDK ， arm三星的嵌入式芯片。
user-0 提问: 页式存储管理模拟器

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:《30天自制操作系统》什么意思？看这本书？来不及了

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

user: user-2
content: 楼主是学生吗，你这个问题挺复杂的

user: user-1
content: 引用 2 楼 u012150227 的回复:引用 1 楼 zhao4zhong1 的回复:《30天自制操作系统》什么意思？看这本书？来不及了 不知道这本书有没有随书光盘啥的。
user-0 提问: 学windows编程从汇编开始比较好吗?

回复:
user: user-1
content: 如果你的学习方式是“学完一本书”“再学另一本”，那么你也太不会学习了。  如果你真的爱学习，感兴趣，会找各种书来看。多看书是没有坏处的，知识是网状的，不是线性的。  如果你要学Windows编程，没有必要特别学习汇编，因为Windows本身是C语言为主开发的，所以C语言是Windows和Windows API的第一语言。但是罗的书的确可以让你扩展视野，比如说提到的修改程序入口点，以及线程注入这样的高级话题。

user: user-2
content: 用最适合的语言比较好, win32 api  就是 c/c++ 了, c++ 也只能用简单的封装库.

user: user-3
content: 个人觉得先看<WINDOWS下32位汇编语言程序设计>要好点。。
user-0 提问: 如何用c语言写一个程序 用文件名替换#include 命令

回复:
user: user-1
content: 仅供参考//codegen.c // 输入一组字符串，比如 // aa ss ddd dd 33 dd // 然后自动生成一个函数 int A(const char*); // 实现A("aa")返回0  A("ss")返回1 依次类推 #include <stdio.h> int main(int argc,char **argv) {     int i;     if (argc<2) {         printf("%s p1 [p2 ...] [>result.c]\nGenerate code int A(const char *a); 0==A(\"p1\") 1==A(\"p2\") ...",argv[0]);         return 1;     }     //printf("#include <string.h>\n");     printf("int A(const char *a) {\n");     for (i=0;i<argc-1;i++) {         printf("    if (0==strcmp(a,\"%s\")) return %d;\n",argv[i+1],i);     }     printf("    return -1;\n");     printf("}\n");     return 0; } //C:\test\Debug>codegen.exe //codegen.exe p1 [p2 ...] [>result.c] //Generate code int A(const char *a); 0==A("p1") 1==A("p2") ... //C:\test\Debug>codegen.exe aa ss ddd dd 33 dd //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} // //c:\test\Debug>codegen.exe aa ss ddd dd 33 dd >result.c // //c:\test\Debug>type result.c //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} //

user: user-2
content: 引用 楼主 u013476411 的回复:如何用c语言写一个程序 用文件名替换#include 命令 我只想到了宏。等待别的答案。

user: user-3
content: 预编译？
user-0 提问: 结构体成员是结构体数组指针，如何初始化，如何赋值？

回复:
user: user-1
content: 由于acc_data里面声明的是指向struct_B的指针，所以在赋值之前需要先分配内存才行。 另，struct可以使用typedef声明，代码会更简洁一些。 typedef struct  struct_A{ 	/**/ }; typedef struct  struct_B{ 	char name[11+1];   };  typedef struct acc_data { 	struct_A A_name;  	struct_B *B_name[1024];  };    for (int i = 0; i < 1024; i++) 	{ 		ss.B_name[i] = new struct_B; 		if(NULL != ss.B_name[i]) 			strcpy_s(ss.B_name[i]->name, "***"); 	}

user: user-2
content: for (int i = 0; i < 1024; i++) {     B_name[i] = new struct  struct_B;     if(NULL != B_name[i])         B_name[i]->name = XXX; }

user: user-3
content: 全部初始化为NULL就可以

user: user-0
content: 解决方案基本和楼上的一致！结贴！
user-0 提问: C语言printf问题

回复:
user: user-1
content: // UTF-8 编码字符理论上可以最多到 6个字节长，但目前全世界的所 // 有文字和符号种类加起来也只要编到 4个字节长就够了。 // 　　UTF-8 是以 8位（即 1个字节）为单元对原始码进行编码（注意一 // 点：这里所讲的原始码都是指Unicode码），并规定：多字节码（2个字 // 节以上才称为多字节）以转换后第1个字节起头的连续“1”的数目（这 // 些连续“1”称为标记位），表示转换成几个字节：“110”连续两个 // “1”，表示转换结果为2个字节，“1110”表示3个字节，而“11110” // 则表示4个字节……跟随在标记位之后的“0”，其作用是分隔标记位和 // 字符码位。第2～第4个字节的起头两个位固定设置为“10”，也作为标 // 记，剩下的6个位才做为字符码位使用。 // 　　这样，2字节UTF-8码剩下11个字符码位，可用以转换0080～07FF的 // 原始字符码，3字节剩下16个字符码位，可用以转换0800～FFFF的原始字 // 符码，由此类推。编码方式的模板如下： // // 原始码（16进制）　UTF－8编码（二进制） // -------------------------------------------- // 0000 - 007F       0xxxxxxx // 0080 - 07FF       110xxxxx 10xxxxxx // 0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx // …… // -------------------------------------------- // // 　　模板中的“x”表示字符码。 // 　　Ascii码＜007F，编为1个 // 字节的UTF－8码。汉字的 Unicode编码范围为0800－FFFF，所以被编为 // 3个字节的UTF－8码。 // 　　例如“汉”字的Unicode编码是6C49，6C49在0800-FFFF之间，所以 // 要用3个字节的模板：1110wwww 10xxxxyy 10yyzzzz。  //    6    C    4    9 // 0110 1100 0100 1001 // wwww xxxx yyyy zzzz //     wwww   xxxxyy   yyzzzz // 1110wwww 10xxxxyy 10yyzzzz。 // 11100110 10110001 10001001 //    E   6    B   1    8   9 //“汉”字的UTF-8编码是E6 B1 89

user: user-2
content: 引用 7 楼 zhao4zhong1 的回复:对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A领教了

user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

user: user-3
content: printf("%s") 是不管编码的，只是原样按字符串输出

user: user-0
content: 到此已经理解，我觉得应该是这样的：我用gedit编辑的该程序，该软件默认UTF-8编码，所以以上的几个汉字也是UTF-8编码存入可执行文件。utf8是很聪明的一种表示方式。      1、对于单字节符号，字节第一位为0，后面7位表示字节编码。      2、对于n字节符号，第一字节的前n位都设为1，第n＋1位为0，其余位为编码位置。 所以当putchar读到汉字时，知道汉字以3个字节表示，并能正确读取对应汉字正确的编码，终端就可以以正确的方式解码汉字

user: user-4
content: 引用 4 楼 BensonLaur 的回复:我是男生啊吧ab~#$  sizeof(a) = 30    strlen(a) = 17 我用codeblocks 运行结果是汉字占两个字节耶+1

user: user-5
content: 我是男生啊吧ab~#$  sizeof(a) = 30    strlen(a) = 17 我用codeblocks 运行结果是汉字占两个字节耶

user: user-6
content: 查找utf-8。

user: user-7
content: putchar 也是没有问题的。

user: user-8
content: 多字节编码方案
user-0 提问: 作为一个c菜鸟，我想说赵老师的回复

回复:
user: user-1
content: 赵四老师，肇事的老师

user: user-2
content: 曾经出现的真假赵老师的那两帖子不知道还在否。

user: user-3

user: user-4
content: 引用 22 楼 wangyaninglm 的回复:赵老湿！！！！！！！！！！！！！！  想不到这里有冲田。。。

user: user-5

user: user-6
content: 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！

user: user-7
content: 一般赵4哥（4哥或者四阿哥...，随便了，因为我办公室有个大神级别的赵老师了，所以只能换个称谓了）只是给你指个方向， 怎么走，能不能走到还得靠自己，有时候一个方向就足够了

user: user-6
content: 引用 60 楼 u012006886 的回复:[quote=引用 52 楼 zhao4zhong1 的回复:] [quote=引用 49 楼 garbageam 的回复:] 我来告诉你,赵4能力很强,但他只是个精神领袖.换句话说,也只能在大方向上指点你,具体问题他不正面回答的 正面回答也行。男的email单聊并付费。女的开房单聊我付费！ [/quote]赵老师你这么收费，你家管钱的造吗[/quote]

user: user-8
content: 引用 8 楼 whoho 的回复:说他热心我也认同，不过我相当不认同他的方式 即便是真知灼见，重复贴百遍也就是不论病症乱贴狗皮膏药了

user: user-9
content: 慢慢深入，不要急于求成，重要的是领悟方法。常常你想要的知识就在不远处，赵老师只是督促你自己去找。

user: user-10

user: user-10
content: 感觉赵老师非常强大，好像什么板块的问题都能回答，简直无法直视，而且很有时间回答问题，而且有了新问题能够在几分钟内看到，应该是csdn的工作人员，很多的工作人员用一个帐号，你怎么看

user: user-11
content: 引用 52 楼 zhao4zhong1 的回复:[quote=引用 49 楼 garbageam 的回复:] 我来告诉你,赵4能力很强,但他只是个精神领袖.换句话说,也只能在大方向上指点你,具体问题他不正面回答的 正面回答也行。男的email单聊并付费。女的开房单聊我付费！ [/quote]赵老师你这么收费，你家管钱的造吗

user: user-12
content: 新人居然啥都看不懂  连你们说的话都不懂   感觉一个一个都是油条子

user: user-6
content: 引用 55 楼 kang2618 的回复:看着很蛋疼,大一刚来的时候是那几句话,这马上大三了,说来说去还是那些... 等阁下弥留之际，解决软件问题仍旧需要我说的那些。

user: user-13
content: 呵呵，纸上谈兵

user: user-14
content: 以不变应万变。。。

user: user-15
content: 看着很蛋疼,大一刚来的时候是那几句话,这马上大三了,说来说去还是那些...

user: user-16
content: 好多经典啊~~~

user: user-6
content: 引用 49 楼 garbageam 的回复:我来告诉你,赵4能力很强,但他只是个精神领袖.换句话说,也只能在大方向上指点你,具体问题他不正面回答的 正面回答也行。男的email单聊并付费。女的开房单聊我付费！
user-0 提问: 请教关于struct

回复:
user: user-1
content: 引用 3 楼 melos 的回复:楼主大概问的是这一句：typedef struct AInputEvent AInputEvent; 这是以前使用c语言时遗留的习惯。 因为在c中，要使用结构体，结构体前必须带struct，导致后续的使用书写时很不方便，因此进行一下typedef，于是可以看到第3行代码就能直接AInputEvent* 了，这就是它的作用。 当然在c++下这个问题已经不存在了，但习惯上一直这样写。。。。  记住了。

user: user-2
content: 引用 3 楼 melos 的回复:楼主大概问的是这一句：typedef struct AInputEvent AInputEvent; 这是以前使用c语言时遗留的习惯。 因为在c中，要使用结构体，结构体前必须带struct，导致后续的使用书写时很不方便，因此进行一下typedef，于是可以看到第3行代码就能直接AInputEvent* 了，这就是它的作用。 当然在c++下这个问题已经不存在了，但习惯上一直这样写。。。。+1

user: user-3
content: 空结构或者空类在代码中可以起到stub(桩)的作用。 在代码未成型之前，保证能编译通过的前提下，先写出一个代码架构来，这个时候空结构，空类还有空函数能起到占位的作用。

user: user-0
content: 引用 3 楼 melos 的回复:楼主大概问的是这一句：typedef struct AInputEvent AInputEvent; 这是以前使用c语言时遗留的习惯。 因为在c中，要使用结构体，结构体前必须带struct，导致后续的使用书写时很不方便，因此进行一下typedef，于是可以看到第3行代码就能直接AInputEvent* 了，这就是它的作用。 当然在c++下这个问题已经不存在了，但习惯上一直这样写。。。。  其实问题的关键在第一句，那是一个空的struct。我记得我看过一个老外关于这个问题的解释，不过是好几年前了，现在记不得了。真遗憾。唯一记得的就是他说这是一个hack。绝对不是那么表面。

user: user-4
content: 只是单纯的为了以后使用的时候书写方便，可以用AInputEvent 代替struct AInputEvent。没其他的意思。

user: user-5
content: 3#正解、、

user: user-6
content: 楼主大概问的是这一句：typedef struct AInputEvent AInputEvent; 这是以前使用c语言时遗留的习惯。 因为在c中，要使用结构体，结构体前必须带struct，导致后续的使用书写时很不方便，因此进行一下typedef，于是可以看到第3行代码就能直接AInputEvent* 了，这就是它的作用。 当然在c++下这个问题已经不存在了，但习惯上一直这样写。。。。

user: user-7
content: 引用 楼主 julius1234567 的回复:struct AInputEvent;//这是一个空的stuct typedef struct AInputEvent AInputEvent; void f(AInputEvent* event),这么用有什么目的？或者好处？ 目的是定义一个看类型名就知道是做什么用的类型，增加错误检查提示。windows编程中，这样的东西很多。 比如： PSTR            //相当于char *，但char *不一定是字符串，而PSTR是专门是字符串 LPSTR         //32位的机器上和PSTR没有什么区别 LPCTSTR   //相当于const char*，  AInputEvent *，相当于，void*，但不能随意传void* ，这个时候会报类型不匹配，需要强制转换才会不报错。 这样就减少了编写代码时候的手误。

user: user-8
content: 形参为结构体指针，就是说明在该函数中需要修改该结构体变量数据成员的值。 函数调用分两种形式，传值、传地址。这里就是传地址了。
user-0 提问: EEMD

回复:
user: user-1
content: matlab有工具箱，直接用就可以了，参数自己选择，你发错地方了

user: user-0
content: 就是有没有关于EEMD的程序例题，看到的程序全是EEMD的源程序，没有具体分析的

user: user-2
content: 完全摸不着头脑了

user: user-3
content: c语言编程实现分解你说得信号？

user: user-4
content: 这问题太高端了,高端到问的不知是啥
user-0 提问: 请大家帮忙看下我下面的程序错在哪里？

回复:
user: user-0
content: 怎么结帖后全部显示0分？明明给了分的呀

user: user-1
content: float用f不是d，有警告

user: user-2
content: 引用 8 楼 zxh707wk 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] int m,n; char c; while (1) {     printf("请输入两个整数，并用空格分隔开：");fflush(stdout);     rewind(stdin);     if (3==scanf("%d%d%c",&m,&n,&c)) {         if (c=='\n') {             printf("m/n=%d/%d=%g\n",m,n,(float)m/n);             break;         }     }     printf("错误！输入值中含有非整数！请重新输入！\n"); } 够屌[/quote] ++++++++++++++++++++++++++++++++

user: user-2
content: 明明提示的输入两个整数，输入用的也是%d，变量也是整形的，非要输入小数。你是自己玩自己么？

user: user-3
content: 输入“1 2xxx”试试。

user: user-4
content: 引用 1 楼 zhao4zhong1 的回复:int m,n; char c; while (1) {     printf("请输入两个整数，并用空格分隔开：");fflush(stdout);     rewind(stdin);     if (3==scanf("%d%d%c",&m,&n,&c)) {         if (c=='\n') {             printf("m/n=%d/%d=%g\n",m,n,(float)m/n);             break;         }     }     printf("错误！输入值中含有非整数！请重新输入！\n"); } 够屌

user: user-3
content: break会退出到while外面。

user: user-0
content: 好像不是break的原因，我找到其它原因了 如图，我把mn改成float型，然后把输出变量改成float型就解决了。

user: user-5
content: 引用 1 楼 zhao4zhong1 的回复:int m,n; char c; while (1) {     printf("请输入两个整数，并用空格分隔开：");fflush(stdout);     rewind(stdin);     if (3==scanf("%d%d%c",&m,&n,&c)) {         if (c=='\n') {             printf("m/n=%d/%d=%g\n",m,n,(float)m/n);             break;         }     }     printf("错误！输入值中含有非整数！请重新输入！\n"); } break报错

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

user: user-6
content: #include <stdio.h> void main() {	float m,n;  while(1) {	printf("请输入两个整数，并用空格分隔开：\n"); scanf("%f %f",&m,&n);                                                //如何判断输入的数是整数？                                               if (m==(int)m*10/10&&n==(int)n*10/10) {	printf("m/n=%.5f\n",(float)m/n); break; }  else printf("错误！输入值中含有非整数！请重新输入！\n"); } system("pause"); }  /* m 和 n是 float 形 scanf("%d %d",&m,&n);    中的 %d    改成 %f printf("m/n=%.5d\n",(float)m/n);  看你意思应该要输出float形的吧   把d  也改成 f  // m*10/10 可以把m小数部分变成0  例如 m = 6.9    m*10（69）/10 = 6  （整数除整数结果一定是整数） // 其实可以写成 if (m == (int)m && n == (int)n)    */

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

user: user-3
content: int m,n; char c; while (1) {     printf("请输入两个整数，并用空格分隔开：");fflush(stdout);     rewind(stdin);     if (3==scanf("%d%d%c",&m,&n,&c)) {         if (c=='\n') {             printf("m/n=%d/%d=%g\n",m,n,(float)m/n);             break;         }     }     printf("错误！输入值中含有非整数！请重新输入！\n"); }
user-0 提问: 学C两年多，请大家给点学习建议 ^_^

回复:
user: user-1
content: 就是用c写的图形库嘛多了个去 ，Windows 自带的图形库，API就是C 写的，linux下有GTK,还有一些乱78遭的库。数据处理不就是用C调用数据库嘛，建议先学个sqlite 或 mysql玩玩.

user: user-2
content: 嵌入式平台是C的天下

user: user-3
content: 当然可以啦，只是要造很多轮子

user: user-4
content: 啥叫“平台”？

user: user-5
content: 给你一个平台你看看 图书信息管理平台，平台无处不在，在心里，在代码的世界里 图书信息管理平台

user: user-4
content: 引用 4 楼 sinat_16612001 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 啥叫“平台”？ 就是有界面窗口，可以数据和图形的显示处理的软件[/quote] MSDN98\SAMPLES\VC98\MFC\TUTORIAL\SCRIBBLE\STEP1～7\*.*

user: user-6
content: 引用 5 楼 sinat_16612001 的回复:[quote=引用 2 楼 merlinfang 的回复:] 当然可以啦，只是要造很多轮子 “轮子”类似于什么？[/quote]  别人已经做好的东西！已经存在，已经有的工具，软件，平台，代码等等！

user: user-7
content: 学好C语言， 再学点图形学，推荐玩Linux吧， 那是个很好玩的世界

user: user-0
content: 引用 3 楼 Intel0011 的回复:嵌入式平台是C的天下 嵌入式平台?怎么学?

user: user-0
content: 引用 2 楼 merlinfang 的回复:当然可以啦，只是要造很多轮子 “轮子”类似于什么？

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:啥叫“平台”？ 就是有界面窗口，可以数据和图形的显示处理的软件
user-0 提问: 哥们,c如何全部删除指定元素?

回复:
user: user-0
content: 引用 9 楼 super_admi 的回复:如果不是智商有硬伤，就是语文水平太差了。 我所看到的是人家问你是什么存储结构，而你却以为人家猜中了你的存储结构。 话说，即使你说了“猜对了”三个字，人家也还是没弄明白你到底用的什么方式来存储的吧？  [quote=引用 8 楼 king769147 的回复:] [quote=引用 3 楼 starytx 的回复:] 你想在什么结构上删除？链表？数组？... 版主, 四楼猜对了...[/quote][/quote]  我语文从读书到现在都是班里最差的... 你回答就回答,不回答拉倒.不要在这里语言攻击别人... 我都说我忘记说, 我承认我忘记交代在数组中. 你如果智商高点,可以有点推理能力的...我也不是有意说'猜'.

user: user-0
content: 引用 10 楼 yangyunzhao 的回复:迫切需要提供语言表达能力，否则在项目组里面要吃亏的。  嗯嗯, 谢了,一直都注意着...继续努力...

user: user-1
content: 迫切需要提供语言表达能力，否则在项目组里面要吃亏的。

user: user-0
content: 引用 3 楼 starytx 的回复:你想在什么结构上删除？链表？数组？... 版主, 四楼猜对了...

user: user-0
content: 引用 4 楼 henry3695 的回复:楼主是希望删除一个数组里面的元素吧，删除以后，希望把后面的元素移动到前面吧 对哈. 我没表达清楚,你懂...高人...

user: user-0
content: 引用 1 楼 lovesmiles 的回复:完全不知道你在问什么，自言自语的。 对数组进行操作... 就是比如 {1,3,2,7,3},删除数组中所有值为3的元素. 但是不另外创建数组,也就是说在原有基础上进行操作.

user: user-2
content: 如果不是智商有硬伤，就是语文水平太差了。 我所看到的是人家问你是什么存储结构，而你却以为人家猜中了你的存储结构。 话说，即使你说了“猜对了”三个字，人家也还是没弄明白你到底用的什么方式来存储的吧？  引用 8 楼 king769147 的回复:[quote=引用 3 楼 starytx 的回复:] 你想在什么结构上删除？链表？数组？... 版主, 四楼猜对了...[/quote]

user: user-3
content: #include <stdio.h> int del_node(char ary[],int nlen,char ch_del) {	 	int nPos = 0; 	int i = 0; 	for (;i<nlen;i++) 	{ 		if (ary[i]==ch_del) 		{ 			nPos=i; 			break; 		} 	}	 	for (i=nPos;(i+1)<nlen;i++) 	{ 		ary[i]=ary[i+1]; 	} 	return (nlen-1); }  int main(void) { 	char data[] = {0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10};  	int i =0; 	int nlen = del_node(data,sizeof(data),0x9); 	for (i=0;i<nlen;i++) 	{ 		printf("0x%x,",data[i]); 	} 	printf("\n******************************************************\n");   	nlen = del_node(data,nlen,0x3); 	for (i=0;i<nlen;i++) 	{ 		printf("0x%x,",data[i]); 	} 	printf("\n******************************************************\n");    	return 0; }

user: user-3
content: 楼主是希望删除一个数组里面的元素吧，删除以后，希望把后面的元素移动到前面吧

user: user-4
content: 完全不知道你在问什么，自言自语的。

user: user-5
content: 你想在什么结构上删除？链表？数组？...

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

回复:
user: user-0
content: 引用 4 楼 zjq9931 的回复:[quote=引用 3 楼 cjwcommonuse 的回复:] 编译器错误刚解决，逻辑错误又出来了，哎~~~~ 逻辑错误，跟踪调试。 这种时候最长经验。如果不行我给跟踪一下。[/quote] 说实话，我是那种吃三堑 长一智的人，智商是硬伤

user: user-0
content: 最后算是出来了 //消重函数 //数组名，数组元素个数，单个元素大小 //sample: //int iArray[] = {0, 1,2, 2, 3}; //unsigned count = sizeof(iArray)/sizeof(int); //int iRet = remove_repeat(iArray, &count, sizeof(int)); int remove_repeat(void *array, unsigned *pcount, unsigned ele_sz) { 	int count = *pcount; 	int valid_count = 0; 	if(array==NULL || count==0 || ele_sz==0) 		return -1;  	char *_array = (char*)array; 	char *buf = (char*)malloc(count*ele_sz);	//allocate 	memcpy(buf, _array, count*ele_sz);  	int bRepeat = 0; 	for(int i=0,j=0; i<count; ++i) 	{ 		bRepeat = 0; 		for(j=0; j<valid_count; ++j) 		{ 			//if(buf[i]==buf[j]) 			if(memcmp(buf+i*ele_sz, _array+j*ele_sz, ele_sz)==0)			 			{ 				bRepeat = 1; 				break; 			}		 		} 		if(!bRepeat) 		{ 			//array[i] = buf[i]; 			memcpy(_array+j*ele_sz, buf+i*ele_sz, ele_sz); 			++valid_count; 		} 	}  	*pcount = valid_count; 	free(buf);  	return 0; }

user: user-1
content: 引用 3 楼 cjwcommonuse 的回复:编译器错误刚解决，逻辑错误又出来了，哎~~~~ 逻辑错误，跟踪调试。 这种时候最长经验。如果不行我给跟踪一下。

user: user-0
content: 编译器错误刚解决，逻辑错误又出来了，哎~~~~

user: user-2
content: 因为你用的void *buf,指针步进值不确定，你用buf+i*ele_sz才提示的，buf声明成你需要的指针类型

user: user-1
content: 意思是，不知道指针是什么类型的指针，也就是指针指向的是字符型还是，整型，还是别的类型？ 字符型指针增1，地址移动1，长整型的指针增1，地址移动4，等等，这些区别。所以，一定要指定指针类型。 看你的程序中是，int型的，那就强制转换成int型的。
user-0 提问: 数据存储的问题

回复:
user: user-1
content: 首先要看你每组数据是不是同样的大小， 还是每组数据的大小是不一样的？  如果大小一样， 你可以在8M的Flash上预先分配好每组数据的空间，然后你就挨个往里填就可以了， 就像数组一样  如果大小不一样，那就只能链表了，并且由于你需要删除，可能删掉的节点空出来的空间，不足以放新元素，需要进行内存的合并，所以删除的过程中，可能还存在数据的移动。

user: user-2
content: 如果数据大小固定，在8M空间建个索引怎样呢

user: user-3
content: 以下内容仅供参考： 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。
user-0 提问: 碰到个有意思的编程题，跟大家分享下

回复:
user: user-1
content: 经典的背包问题

user: user-2
content: 动态问题，动态规划，真不懂~

user: user-3
content: 就是0-1背包问题了，一般可以使用动态规划算法跟回溯法

user: user-4
content: 有点小问题，如果主件都是0的话，那怎样确定那个附件是哪个主件的

user: user-5
content: 可以看看贪心算法的介绍，提供个思路

user: user-6
content: 这个是背包问题。这里给一个代码，LZ参考。 #include <stdio.h> #include <stdlib.h> #define N 60 int CountMaxValue( int index, int money, int f  ); struct InputBuf {     int price;     int weight;     int type; };  struct InputBuf inputBuf[N]; int m, n; int main() {     int i;     scanf( "%d%d", &n, &m );     //这里输入默认主物件如果有附件则附件一定紧挨着的主物件后面     for ( i=0; i<m; i++ ) scanf( "%d%d%d", &inputBuf[i].price, &inputBuf[i].weight, &inputBuf[i].type );     printf( "\n" );      printf( "%d ", CountMaxValue(0, n, 1) );      return 0; } /* **index为数物品下标，money剩余的钱， f为1时，附件可购买，为0时附件不可购买 */ int CountMaxValue( int index, int money, int f  ) {     int a = 0, b = 0;      if ( index >= m ) return 0;      if( inputBuf[index].type == 0 )     {          if ( money >= inputBuf[index].price )          {              a = CountMaxValue( index + 1, money - inputBuf[index].price, 1 ) + inputBuf[index].price * inputBuf[index].weight;              b = CountMaxValue( index + 1, money, 0 );              return a > b ? a:b;            }          else return CountMaxValue( index + 1, money, 0 );     }     else if ( (inputBuf[index].type != 0) && ( f == 1 ) )     {         if( money >= inputBuf[index].price ) a = CountMaxValue( index + 1, money - inputBuf[index].price, f ) + inputBuf[index].price * inputBuf[index].weight;         b = CountMaxValue( index + 1, money, f );         return a > b? a:b;     }     else     {         return CountMaxValue( index + 1, money, f );     }      return 0;  }

user: user-7
content: 感觉上肯定是背包算法了，去google “背包9讲”

user: user-8
content: 看着感觉很复杂，感觉很厉害
user-0 提问: 用C宏定义实现累加

回复:
user: user-1
content: 宏定义的是常量，不是变量！

user: user-2
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-3
content: 宏, 归根结底就是像你的   Find And Replace.  查找替换.  也就是编译器对代码进行编译前, 对所有代码做了一次"查找替换",   你觉得这个替换过程能有什么计算吗?

user: user-4
content: 去看看 BOOST_PP

user: user-5
content: 宏定义只是简单的字符串替换，你可别当成变量使用。每次加1，你觉得会保留嘛？

user: user-6
content: #define INDEX_CODE 0  #define TEMP INDEX_CODE #undef INDEX_CODE #define INDEX_CODE (TEMP + 1)  #undef TEMP #define TEMP INDEX_CODE #undef INDEX_CODE #define INDEX_CODE (TEMP + 1)  int a = INDEX_CODE;  TEMP 是用INDEX_CODE 定义的  后面接触了INDEX_CODE 就相当于TEMP没定义，然后又用 报错啦。    可以把TEMP改数字 验证我上面的说法。  至于其它的 表示不懂楼主想要什么。。。。。。
user-0 提问: 求教c语言实现工件表面检测需要的知识

回复:
user: user-1
content: 嗯，你的这个问题，C语言只是工具，你更需要学习的是机器视觉方面的知识。 初期可以看看现成的视觉库，比如OpenCV这个开源视觉库，有C和C++的接口，大部分基础工作这个库已经做好了，你根据需要在进行开发。并且这个库还带了很多例子，估计和你的应用能考上，这样做起来就方便多了。 书籍就去下载一本《学习OpenCV中文版》

user: user-2
content: 引用 楼主 qq_17338763 的回复:我做一个课题——用ccd采集数据，实现对工件表面检测，判断是否合格。我只学了一学期c语言，对这方面不懂，希望知道需要哪些知识，最好详细点，我好去查找资料。 ....感觉有点象这个笑话，我捡了一个鼠标，想配台电脑，请问还缺什么。。。
user-0 提问: 关于VS2012安全警告级别的问题

回复:
user: user-0
content: 直接将某个警告设置为无效可以避免出现类似if(a=2)不提示的情况，好的，谢谢

user: user-1
content: #pragma warning(disable : xxxx)

user: user-2
content: 后果是可能忽略掉了想看到的编译器警告，比如 if(a=2) 这种警告你都看不到
user-0 提问: 单精度浮点型运算问题？？？

回复:
user: user-1
content: 引用 2 楼 user-2 的回复:循环变量张冠李戴了 for (j = 0; j < 3; j++) { 	zongfen += p->score[i]; 	zuigao += p->score[i]; }  显然应改为 for (j = 0; j < 3; j++) { 	zongfen += p->score[j]; 	zuigao += p->score[j]; }  ++++

user: user-2
content: 循环变量张冠李戴了 for (j = 0; j < 3; j++) { 	zongfen += p->score[i]; 	zuigao += p->score[i]; }  显然应改为 for (j = 0; j < 3; j++) { 	zongfen += p->score[j]; 	zuigao += p->score[j]; }

user: user-0
content: 刚试过 double型也是一样的结果！
user-0 提问: realloc函数调用时出现堆错误！

回复:
user: user-0
content: 引用 1 楼 user-3 的回复:L->elem = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType)); 用了malloc就要有free 但是我这个顺序表要一直保存着的，我后面还会对其进行其他的操作的，不能free掉吧

user: user-1
content: 代码的意图看的一头雾水。 不过19行分配了4个字节的空间给(*L)->elem ， 50行给L->elem[L->length] 赋值，从第2个循环起就已经越界了，到后面第10个循环realloc的时候，判断这个指针不是有效的堆指针，然后崩溃了。

user: user-2
content: 37行-47行，看了看，如果没理解错，是有问题的。你增加了LISTINCREMENT * sizeof(ElemType)空间，后面的 L->listsize怎么只加1呢。listsize应该是记录数组大小的，length应该是记录数组实际存在的元素个数的吧         if(L->length >= L->listsize)         {             L->elem = (ElemType *)realloc(L->elem, L->listsize  + LISTINCREMENT * sizeof(ElemType));                                     if(!L->elem)                 return;             else             {                 L->listsize += LISTINCREMENT ;             }         }

user: user-2
content: void CreateList(SqList *L)里，for第二次循环，数组L->elem[L->length]就越界了。初始化的时候，应该(*L)->elem = (ElemType *)malloc(sizeof(ElemType) *LIST_INIT_SIZE )，开辟一个10个整型大小的空间，才符合你的本意

user: user-3
content: 还有个小问题，用rand()之前要先用srand()设种子

user: user-3
content: L->elem = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType)); 用了malloc就要有free
user-0 提问: C语言矩阵行变换排序

回复:
user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了
user-0 提问: 二叉树插入函数的一个细节

回复:
user: user-1
content: 这和swap(int *a, int *b)里面要用指针是一个道理。 要想改变一个变量，就要用它的指针。现在你要改变指针，就得用指针的指针，指针自己其实也就是个变量。

user: user-0
content: 嗯让我想想看

user: user-0
content: 引用 1 楼 user-1 的回复:注意这里： *position = new_node; 根据前面的运行，这个相当于 node->left = new_node 或者 tree->root  = new_node 不用二重指针，做不到这个效果  那为什么不用一维指针做呢? position=new_node不就行了?

user: user-1
content: 如果不用二重指针，比如这么写： BiTreeNode *position; position = tree->root; position = new_node;  // 这里只不过是把position指向了new_node，而 tree->root没有变化。 用了二级指针可以改变tree->root

user: user-1
content: 注意这里： *position = new_node; 根据前面的运行，这个相当于 node->left = new_node 或者 tree->root  = new_node 不用二重指针，做不到这个效果
user-0 提问: 关于队列的数组实现 有一行不太明白 谢谢老师

回复:
user: user-1
content: size是 当前 已经有 的 元素个数  capacity 可以理解为   size 能达到的最大值 ，就是Array数组的长度， 最多能放多少个 元素   rear 是 当前尾指针 的位置 ，就是当前Array数组中最后一个 有效元素 的 下标 ， if(++Value == Q->Capacity)这是一个前置++ 也就是预先算一下，下一个元素的下标应该放在哪个位置  如果 这个 下标达到了capacity ，也就是超过了数组 元素的最大个数，再从头开始放  之所以可以再从头开始放，因为你的代码没有贴全 ，这里猜测是跟front有关的，也就是这个Array是一个循环数组 比如下标为0的位置上的元素已经被删掉了，那么front就会指到1的位置上，这时0位置就空出来了 此时再插入一个元素，如果一直到capacity-1的位置 都已经放满了， 就放到0位置，这样循环使用。   比如说0-9个位置，容量Capacity为10，然后应该是Value=9，也就是rear =9，传给的value， ++value=10，  ++value == Q->Capacity，表示rear =9就是放满了 然后从头开始放  不会出现Value等于10的情况，因为这里始终是rear 传给的 Value， 当rear =9之后，调用Succ，返回时0，也就是rear等于9之后，就是rear等0，不会等于10

user: user-2
content: 第一个问题看这里http://www.tuicool.com/articles/Iniu6r
user-0 提问: 计算链地址法的查找失败ASL

回复:
user: user-1
content: 1*4吧   是不是少写了一个

user: user-0
content: 引用 4 楼 user-2 的回复:这也许是你想要的  我也是这么算的。。和老师的课件就是不一样

user: user-2
content: 这也许是你想要的

user: user-2
content: 上面写的还要除以9，而且楼主不必拘泥于这个问题，这是转牛角尖，基本上不会考不成功的，问的都是成功的

user: user-0
content: 引用 1 楼 user-2 的回复:查找成功asl为下 14,36,23,11,82,55共6个查找1次  1*6                          01,68两个查找2次   2*2                                        19查找3次   1*3 总共为1*6+2*2+1*3=13; 我想问的是查找失败的ASL，不是查找成功的ASL

user: user-2
content: 查找成功asl为下 14,36,23,11,82,55共6个查找1次  1*6                          01,68两个查找2次   2*2                                        19查找3次   1*3 总共为1*6+2*2+1*3=13;
user-0 提问: VS2010 中freopen 总是报错

回复:
user: user-1
content: 引用 2 楼 islandlin0212 的回复:[quote=引用 1 楼 mujiok2003 的回复:] #include <stdio.h>   我没那么二拉，，不是这个问题[/quote] 使用C++编译 /TP,不要使用C编译 /TC  http://msdn.microsoft.com/en-us/library/032xwy55.aspx

user: user-1
content: *.c--> *.cpp

user: user-2
content: 你建立的是C工程，不是C++工程 C不允许在变量声明之前有其他语句，C++中可以 将 freopen("data.out","w",stdout); freopen("data.in","r",stdin); 放在S=0;i=0;之后 即 S=0;i=0; freopen("data.out","w",stdout); freopen("data.in","r",stdin); scanf("%d",&x);  min =x ;max= x;//初值很重要

user: user-0
content: 引用 1 楼 mujiok2003 的回复:#include <stdio.h>   我没那么二拉，，不是这个问题

user: user-1
content: #include <stdio.h>