Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 小弟新学C，有问题请教

回复:
user: user-1
content: C语言我一节课都没去过，都是自学的，重要的是掌握基本的规则，然后多运用这些规则写程序。所谓编程，就是遵守现有的种种语法规则，实现任何要实现的效果。

user: user-0
content: 引用 7 楼 Falleyes 的回复:[quote=引用 5 楼 x000000xd 的回复:] [quote=引用 4 楼 Falleyes 的回复:] #include<stdio.h>  void main() { 	void daozhi(char a[], char b[]); 	char a[10], b[10]; 	int i;  	for (i = 0; i <= 9; i++) 		scanf("%c", &a[i]); 	daozhi(a, b); 	for (i = 0; i <= 9; i++) 		printf("%c", b[i]); }  void daozhi(char a[], char b[]) { 	int x, y = 9; 	for (x = 0; x <= 9; x++) 	{ 		b[y] = a[x]; 		y--; 	} } 我明白了！ 感谢前辈！[/quote]哈哈哈，前辈谈不上，我今年秋天才大三！[/quote] 我就比你小一年级，能力跟你差这么多，您能说说你对学c语言的心得体会吗？  启发小学弟

user: user-1
content: 引用 5 楼 x000000xd 的回复:[quote=引用 4 楼 Falleyes 的回复:] #include<stdio.h>  void main() { 	void daozhi(char a[], char b[]); 	char a[10], b[10]; 	int i;  	for (i = 0; i <= 9; i++) 		scanf("%c", &a[i]); 	daozhi(a, b); 	for (i = 0; i <= 9; i++) 		printf("%c", b[i]); }  void daozhi(char a[], char b[]) { 	int x, y = 9; 	for (x = 0; x <= 9; x++) 	{ 		b[y] = a[x]; 		y--; 	} } 我明白了！ 感谢前辈！[/quote]哈哈哈，前辈谈不上，我今年秋天才大三！

user: user-2
content: 单步调试，看内存。自己掌握的比别人说的强一万倍。

user: user-0
content: 引用 4 楼 Falleyes 的回复:#include<stdio.h>  void main() { 	void daozhi(char a[], char b[]); 	char a[10], b[10]; 	int i;  	for (i = 0; i <= 9; i++) 		scanf("%c", &a[i]); 	daozhi(a, b); 	for (i = 0; i <= 9; i++) 		printf("%c", b[i]); }  void daozhi(char a[], char b[]) { 	int x, y = 9; 	for (x = 0; x <= 9; x++) 	{ 		b[y] = a[x]; 		y--; 	} } 我明白了！ 感谢前辈！

user: user-1
content: #include<stdio.h>  void main() { 	void daozhi(char a[], char b[]); 	char a[10], b[10]; 	int i;  	for (i = 0; i <= 9; i++) 		scanf("%c", &a[i]); 	daozhi(a, b); 	for (i = 0; i <= 9; i++) 		printf("%c", b[i]); }  void daozhi(char a[], char b[]) { 	int x, y = 9; 	for (x = 0; x <= 9; x++) 	{ 		b[y] = a[x]; 		y--; 	} }

user: user-3
content: 对数组进行初始化 char a[10] = {'\0'}; char b[10] = {'\0'};

user: user-1
content: 引用 1 楼 Falleyes 的回复:字符串数组是以'\0'作为结束的，那么你倒置复制就会把b的第一个字符赋值为'\0'抱歉，看错了，你在主函数中并没有执行daozhi函数啊

user: user-1
content: 字符串数组是以'\0'作为结束的，那么你倒置复制就会把b的第一个字符赋值为'\0'
user-0 提问: c语言写的程序，关于printf和时间函数问题

回复:
user: user-0
content: 引用 3 楼 jerry_dqh 的回复:程序关闭后，重新打开，开始还是一样吗？     是一样的。  全部重新编译也是一样的。  我用的是dev-c

user: user-1
content: 程序关闭后，重新打开，开始还是一样吗？

user: user-0
content: 唔，完整的太长了，我贴其中一个循环			                                              			case(IDLE):                        //空闲状态  			while(ele->headp->nextPtr->theReq==Zero){ 				cache(ele,fp); 				timeCount=clock(); 				if((timeCount-starttime)%(CLOCKS_PER_SEC/2)==0&& (timeCountstarttime)/(0.5*CLOCKS_PER_SEC)>num){ 					printf("%10d,%10d,%10.2f\n",timeCount-starttime,ele->theST,ele->theFloor); 					num+=1; 					}  				}  //timeCount和starttime是clock_t类型的全局变量。 其中cache函数是用来判断是否读入新请求并排序的。新请求是从文件中读取的。 void cache(struct ElevatorRec *ele,FILE *fp){  	static struct LIST Req; 	static int g=0; 		if(g==0){ 			fscanf(fp,"%10d,%10d,%10d",&Req.eventTime,&Req.theReq,&Req.reqFloor); 			getc(fp); 			g++; 			} 		 timeCount=clock(); 		 if(( timeCount-starttime)>=Req.eventTime){ 			buildnewReq(ele,Req); 			if(!feof(fp)) {      				fscanf(fp,"%10d,%10d,%10d",&Req.eventTime,&Req.theReq,&Req.reqFloor); 				getc(fp); 				} 			else return; 			} 		return;	 } 我在同学电脑上运行也是同样的，刚开机的时候正常。。。。

user: user-2
content: 帖代码...
user-0 提问: fseek(fp, -1, SEEK_CUR); 遇到一个问题。

回复:
user: user-0
content: 额~，原来我在后面的代码中写错了，把SEEK_CUR 写成SEEK_SET 了，所以跑到前面去了。 多谢3楼的提示，才让我想到用FTELL 去调试。

user: user-1
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  // szStringReaded 是已经从fp 中读取出来的一个字符串，chFind 是查找szStringReaded 中是否有该字符。 // 该函数的意思是：查找读取出来的字符中是否有字符chFind ，如果有则将文件指针移动回该字符位置。 void MOVE_BACK(FILE *fp, char *szStringReaded, char chFind) {         char *pPosition = strchr(szStringReaded, chFind);         if (pPosition != NULL)         {                 long nOffset = -abs((long)(strlen(szStringReaded) - (pPosition - szStringReaded)));                 printf("before fseek: nOffset==%d,ftell(fp)==%d\n",nOffset,ftell(fp)):                 fseek(fp, nOffset, SEEK_CUR);                 printf("after fseek: ftell(fp)==%d\n",ftell(fp)):         } }

user: user-0
content: 引用 1 楼 user-2 的回复:文件映射，操作映射出来的指针 没明白。

user: user-2
content: 文件映射，操作映射出来的指针
user-0 提问: Makefile交叉编译问题

回复:
user: user-1
content: CC=arm-linux-gcc 然后把Makefile 中的gcc GCC神马的都换成$(CC)

user: user-0
content: 什么是automake啊

user: user-2
content: 要cross compiling，最好使用automake, configure来自动生成makefile  ./configure --prefix=/ CC=my-cross-compiler

user: user-0
content: 能再说的具体点儿吗？

user: user-2
content: prefix
user-0 提问: strcpy怎么啦

回复:
user: user-1
content: ++，不理解的人容易钻牛角尖。  引用 2 楼 lin5161678 的回复:数组越界 未定义行为  什么结果都有可能   数组越界是可能会出错 不是一定会出错  之所以不允许数组越界是对错误零容忍 不许可能出错的情况  开车闯红灯是可能会撞到人  不是开车闯红灯 一定会撞到人 这么简单的道理 为什么会有人一直不理解  难以置信

user: user-2
content: 数组越界 未定义行为  什么结果都有可能   数组越界是可能会出错 不是一定会出错  之所以不允许数组越界是对错误零容忍 不许可能出错的情况  开车闯红灯是可能会撞到人  不是开车闯红灯 一定会撞到人 这么简单的道理 为什么会有人一直不理解  难以置信

user: user-3
content: str长度太短了。。。
user-0 提问: 在Linux下用C语言写打砖块

回复:
user: user-1
content: 不做图形界面吗？

user: user-2
content: 用控制台实现还是要自绘界面？ 如果自绘界面的话我记得好像有一个C的库可以实现名字好像是Allegro

user: user-0
content: 引用 3 楼 FENGQIYUNRAN 的回复:Lua由标准C编写而成，代码简洁优美，几乎在所有操作系统和平台上都可以编译，运行。 This is ~我不是说了要用C写吗。。。

user: user-3
content: http://download.csdn.net/detail/u010093149/5634861

user: user-3
content: Lua由标准C编写而成，代码简洁优美，几乎在所有操作系统和平台上都可以编译，运行。 This is ~

user: user-0
content: 引用 1 楼 user-4 的回复:Linux下面，QT?用Qt不是C++吗？我们这里是C

user: user-4
content: Linux下面，QT?
user-0 提问: 再次向大家请教全局变量的问题

回复:
user: user-1
content: 定义成类吧. 对修改的函数设置保护以上的权限 而读取函数则是公有函数.  这样的话, 只需要把你指定的模块设置成 友元类,  (友元类是可以访问保护或者私有类型的)  这样就可以达到指定类可读写,   其它类只读

user: user-0
content: 回复于： 2014-05-09 22:55:27  其他模块通过函数接口读取，不允许直接访问。    我也试过用函数接口的形式来读取，可是其他地方用的实在太多，都用函数的话会很繁琐

user: user-2
content: 当然是封装读写函数啊。 可以说，永远别搞出非static的全局变量啊。

user: user-3
content: 其他模块通过函数接口读取，不允许直接访问。

user: user-4
content: 除非重新设计，没有必要这么做

user: user-5
content: 引用 2 楼 zhao4zhong1 的回复:只要多用grep或findstr管理源代码即可。  Windows下的grep http://download.csdn.net/detail/zhao4zhong1/4381913  C:\>findstr /? 在文件中寻找字符串。  FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file]         [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]         strings [[drive:][path]filename[ ...]]    /B         在一行的开始配对模式。   /E         在一行的结尾配对模式。   /L         按字使用搜索字符串。   /R         将搜索字符串作为一般表达式使用。   /S         在当前目录和所有子目录中搜索匹配文件。   /I         指定搜索不分大小写。   /X         打印完全匹配的行。   /V         只打印不包含匹配的行。   /N         在匹配的每行前打印行数。   /M         如果文件含有匹配项，只打印其文件名。   /O         在每个匹配行前打印字符偏移量。   /P         忽略有不可打印字符的文件。   /OFF[LINE] 不跳过带有脱机属性集的文件。   /A:attr    指定有十六进位数字的颜色属性。请见 "color /?"   /F:file    从指定文件读文件列表 (/ 代表控制台)。   /C:string  使用指定字符串作为文字搜索字符串。   /G:file    从指定的文件获得搜索字符串。 (/ 代表控制台)。   /D:dir     查找以分号为分隔符的目录列表   strings    要查找的文字。   [drive:][path]filename              指定要查找的文件。  除非参数有 /C 前缀，请使用空格隔开搜索字符串。 例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或 "there"。'FINDSTR /C:"hello there" x.y' 文件 x.y  寻找 "hello there"。  一般表达式的快速参考:   .        通配符: 任何字符   *        重复: 以前字符或类别出现零或零以上次数   ^        行位置: 行的开始   $        行位置: 行的终点   [class]  字符类别: 任何在字符集中的字符   [^class] 补字符类别: 任何不在字符集中的字符   [x-y]    范围: 在指定范围内的任何字符   \x       Escape: 元字符 x 的文字用法   \<xyz    字位置: 字的开始   xyz\>    字位置: 字的结束  有关 FINDSTR 常见表达法的详细情况，请见联机命令参考。  请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。

user: user-6
content: 说明设计有问题。

user: user-7
content: C++似乎没这种语法

user: user-5
content: 只要多用grep或findstr管理源代码即可。

user: user-8
content: 读写锁可以试试
user-0 提问: 菜鸟求助

回复:
user: user-1
content: 赋值前内存： 0x003EF77C  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 0x003EF78C  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 0x003EF79C  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 0x003EF7AC  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 0x003EF7BC  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 0x003EF7CC  cc cc cc cc 7f ee 0f 80 20 f8 3e 00 cb d0 0f 01  ????.?.€ ?>.??..  复制后内存： 0x003EF77C  31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31  1111111111111111 0x003EF78C  31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31  1111111111111111 0x003EF79C  31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31  1111111111111111 0x003EF7AC  31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31  1111111111111111 0x003EF7BC  31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31  1111111111111111 0x003EF7CC  00 cc cc cc 7f ee 0f 80 20 f8 3e 00 cb d0 0f 01  .???.?.€ ?>.??..  越界将0x003EF7CC修改了，而0x003EF7CC不属于data的内存

user: user-1
content: 首先我调试时，如下图  已经跳出循环  其次，你这段代码越界了 如： memset时 0x0036FB24  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................................ 0x0036FB44  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................................ 0x0036FB64  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 cc cc cc cc 05 5b e8 e8 c8 fb 36 00 cb d0 20 01  ................????.[????6.?? .

user: user-0
content: 原来是这样！脑子糊涂了。 谢谢！  引用 1 楼 turingo 的回复:原因在于字符串需要多存储一个结束符'\0'，所以5位数字的话，实际上需要6个字符空间，应该改为： char data[16][6];  [quote=引用 楼主 u013892219 的回复:]  main() {     char data[16][5];     memset(data,0,sizeof(data));     int a = 11111,i;     for(i=0;i<16;i++)         sprintf(data[i],"%d",a);     printf("%s\n",data); }  这段代码为什么跳不出循环，求高手帮助！[/quote]

user: user-2
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-2
content: char data[16][5+1];

user: user-3
content: 原因在于字符串需要多存储一个结束符'\0'，所以5位数字的话，实际上需要6个字符空间，应该改为： char data[16][6];  引用 楼主 u013892219 的回复: main() {     char data[16][5];     memset(data,0,sizeof(data));     int a = 11111,i;     for(i=0;i<16;i++)         sprintf(data[i],"%d",a);     printf("%s\n",data); }  这段代码为什么跳不出循环，求高手帮助！
user-0 提问: 请问为何声明数组后，函数调用时未初始化的变量为0，而不是一个不确定数了

回复:
user: user-0
content: 我再更正一下，我认为定义一个大的数组，是为了把局部变量给分配到更后面的空间，应该说是挤到，我猜测后面空间里都被默认成了0，于是乎变量i就被不确定成0了。

user: user-0
content: 我更换了一台笔记本 debian7的系统，上面两个源程序测试的结果有点儿差别，第一个程序的第一个i仍然是不确定数，只不过无论执行多少次，这个数不变，说明每次执行都在读取一个块；第二个加入数组的程序，数组的长度要加大，我测试了一下test[100]的时候，i就等于0了，所以我认为i仍然是不确定数，但是由于它每次运行的时候都划定了一个相对固定的范围，且这个范围在数组的区间里，而定义数组的结果就是将一个大范围都给初始成0了，导致i成为了一个“确定数”。  上面的兄弟提供的源码我测试了一下，两次i的结果相同，故判断，第一个函数释放以后，第二个函数重新占用了这个空间的相同位置，导致两次结果相同，不知以上这些想法对不对，大家拍砖！！

user: user-1
content: 同意7楼，赶巧的事。你换台机器试试  你再试试下面的代码  void func1() {     int i = 0;     printf("%d",i); } void func2() {     int i;     printf("%d",i); } int main() {     func1();     func2();     return 0; }

user: user-2
content: 赶巧的事情，遇到一块值为0的内存块

user: user-3
content: 原因就是没初始化 值是不确定 而不是 没初始化 值确定不为0  这区别能分清楚吗?

user: user-0
content: [quote=引用 4 楼 turingo 的回复:] 对局部数组没有初始化的元素的值,多数编译器都将其设置为0.但是如果不对数组进行初始化,即在定义的同时没有用列表初始化,那么局部数组的值就取决于编译器而对程序员来说就是不可预料的了.所以对局部数组的初始化要特别小心.但是全局的数组和静态数组还是会被正确的赋于0值的.  实际上我的确也只是仅仅定义了一个数组而已，结果函数中的变量变成了一个确定的0；而不是像您说的还要初始化数组才行；而如果源代码中没有数组，则函数中未初始化的变量又变成了不确定的值。 我使用的是gcc编译

user: user-4
content: 对局部数组没有初始化的元素的值,多数编译器都将其设置为0.但是如果不对数组进行初始化,即在定义的同时没有用列表初始化,那么局部数组的值就取决于编译器而对程序员来说就是不可预料的了.所以对局部数组的初始化要特别小心.但是全局的数组和静态数组还是会被正确的赋于0值的.  引用 3 楼 wtwhs1985 的回复:[quote=引用 2 楼 turingo 的回复:] 初始化值不能寄希望于编译器，最好自己手动去初始化。  上面的兄弟可能不知道我问这个的目的，我想问的是C规定未初始化的变量会赋予一个不确定的值。但是为什么定义了一个数组后，那个不确定的值却恒定为0了，这个才是我疑惑的问题。

user: user-0
content: [quote=引用 2 楼 turingo 的回复:] 初始化值不能寄希望于编译器，最好自己手动去初始化。  上面的兄弟可能不知道我问这个的目的，我想问的是C规定未初始化的变量会赋予一个不确定的值。但是为什么定义了一个数组后，那个不确定的值却恒定为0了，这个才是我疑惑的问题。

user: user-4
content: 初始化值不能寄希望于编译器，最好自己手动去初始化。  引用 楼主 wtwhs1985 的回复:为了测试，我自己单独写了一段，结果发现i 的确是一个不确定的值,这个我能理解因为变量没有初始化。 1 #include <stdio.h> 2  3 void print_i(void) 4 { 5 int i; 6 printf("i = %d\n", i); 7 i = 777; 8 } 9  10 int main(void) 11 { 12 print_i(); 13 print_i(); 14  15 return 0; 16 }  但是修改加入了数组的声明后，却没有初始化的变量却为0了： 修改后的源码： 1 #include <stdio.h> 2  3 void print_i(void) 4 { 5 int i; 6 printf("i = %d\n", i); 7 i = 777; 8 } 9  10 int main(void) 11 { 12 int test[9]; 13 print_i(); 14 print_i(); 15  16 return 0; 17 }   运行后的结果 [root@studylinux studyC]# ./a.out  i = 0 i = 777 如果没有定义数组，或者定义的数组长度小于9，那么第一个i将是一个不确定数。

user: user-5
content: 生成Release版再试试。
user-0 提问: C语言新手，时间显示问题

回复:
user: user-1
content: 楼上的全是一家的吧，统一的头像！不闹了...

user: user-2
content: 楼主 完全自high啊 打印格式自己定嘛

user: user-0
content: 全角－可以上一点，但是比半角的要长了点，还是不行

user: user-3
content: 引用 2 楼 aa573915483 的回复:还有个问题怎么把 - 显示上一点  我的怎么显示下面了 这还要美观？那用图片吧

user: user-0
content: 还有个问题怎么把 - 显示上一点  我的怎么显示下面了

user: user-0
content: {"%04d-%02d-%02d  %02d:%02d","系 统 时 间"},  网上找了一下，OK 搞定

user: user-4
content: 楼主这是在自娱自乐么。。。。

user: user-5
content: #include <stdio.h> #include <string.h> #include <time.h> #include <sys/timeb.h>  struct tm st; time_t tt; char mon[4]; char mn[12][4]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; int i; char timstr[27]; char tmpbuf[128]; struct _timeb tb; int tz; char c;  void main() {     strcpy(timstr,"08/Dec/2011:15:25:03 +0800");     sscanf(timstr,"%2d/%3s/%4d:%2d:%2d:%2d",&st.tm_mday,mon,&st.tm_year,&st.tm_hour,&st.tm_min,&st.tm_sec);     for (i=0;i<12;i++) if (0==stricmp(mn[i],mon)) {st.tm_mon=i; break;}     st.tm_year-=1900;     tt=mktime(&st);     if (-1!=tt) {         strftime(tmpbuf,128,"%Y-%m-%d %H:%M:%S\n",localtime(&tt));         printf(tmpbuf);//2011-12-08 15:25:03     } else {         printf("[%s] is Invalid time string!\n",timstr);     }      _ftime(&tb);     strftime(tmpbuf,128,"%m/%b/%Y:%H:%M:%S",localtime(&tb.time));     tz=-tb.timezone;     c=(tz>0)?'+':'-';     tz=(tz>0)?tz:-tz;     sprintf(tmpbuf,"%s %c%02d%02d\n",tmpbuf,c,tz/60,tz%60);     printf(tmpbuf);//12/Dec/2011:17:36:41 +0800 }
user-0 提问: 字符串查找，在某字符串中查找指定字符串。如：有字符串:this is c program!  查找is。找到与否给出相应提示。至少使用一个自定义函数来实现。

回复:
user: user-1
content: C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strstr.c /*** *strstr.c - search for one string inside another * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines strstr() - search for one string inside another * *******************************************************************************/  #include <cruntime.h> #include <string.h>  /*** *char *strstr(string1, string2) - search for string2 in string1 * *Purpose: *       finds the first occurrence of string2 in string1 * *Entry: *       char *string1 - string to search in *       char *string2 - string to search for * *Exit: *       returns a pointer to the first occurrence of string2 in *       string1, or NULL if string2 does not occur in string1 * *Uses: * *Exceptions: * *******************************************************************************/  char * __cdecl strstr (         const char * str1,         const char * str2         ) {         char *cp = (char *) str1;         char *s1, *s2;          if ( !*str2 )             return((char *)str1);          while (*cp)         {                 s1 = cp;                 s2 = (char *) str2;                  while ( *s1 && *s2 && !(*s1-*s2) )                         s1++, s2++;                  if (!*s2)                         return(cp);                  cp++;         }          return(NULL);  }

user: user-2
content: 函数返回类型换成 char *

user: user-2
content: 方法1  int search(char str1[],char str2[]) {      return strstr(str1, str2); }  方法2  int search(char str1[],char str2[]) {     int i;     for(i=0; i<strlen(str1); i++)     {         if(0==memcmp(&str1[i], str2, strlen(str2)))         {                 break;         }     }     return &str1[i]; }
user-0 提问: #define问题

回复:
user: user-0
content: 问题解决了，谢谢大家！ 参考：http://www.cnblogs.com/morewindows/archive/2011/08/18/2144112.html 重点：宏遇#和##不会展开嵌套的宏，嵌套使用需中间转换。 fun.h文件 #define _fun1(name) fun1_##name #define _fun2(name) fun2_##name #define _fun3(name) fun3_##name #define fun1(name) _fun1(name) #define fun2(name) _fun2(name) #define fun3(name) _fun3(name) a.c文件 #define name a void fun1(name)() {}   =>   void fun1_a() {} void fun2(name)() {}   =>   void fun1_a() {} void fun3(name)() {}   =>   void fun1_a() {} b.c文件 #define name b void fun1(name)() {}   =>   void fun1_b() {} void fun2(name)() {}   =>   void fun1_b() {} void fun3(name)() {}   =>   void fun1_b() {}  当你的工程中有多个形同以上的文件，如此定义，增加类似文件时只需修改 #define name xxx 显然很方便简洁，而且不容易出错。

user: user-0
content: 引用 12 楼 jerry_dqh 的回复:在一个头文件中 pre.h中定义好 #define fun1 fun_pre##_fun1 #define fun2 fun_pre##_fun2 #define fun3 fun_pre##_fun3  =============== main.cpp中如下使用  #define fun_pre  a  #include "pre.h"  void fun1() {} void fun2() {} void fun3() {}  这个是我要的想法，可惜依然行不通，fun_pre##_fun1的fun_pre并未作替换，所以 void fun1() {} void fun2() {} 展开是： void fun_pre_fun1() {} void fun_pre_fun1() {} 而非： void a_fun1() {} void a_fun1() {}

user: user-1
content: 之前没见过这样定义的

user: user-2
content: 进来学习学习~

user: user-2

user: user-3
content: 定义常变量 如： int const a = 10;

user: user-4
content: #include <stdio.h> #define A1 \ enum {a1 = 1};  #define A2 \ enum {\ 	a1 = 1,\ 	a2 = 2\ };  #define A3 \ enum {\ 	a1 = 1,\ 	a2 = 2,\ 	a3 = 3\ };    #define A4 \ enum {\ 	a1 = 1,\ 	a2 = 2,\ 	a3 = 3,\ 	a4 = 4\ };  #define A5 \ enum {\ 	a1 = 1,\ 	a2 = 2,\ 	a3 = 3,\ 	a4 = 4,\ 	a5 = 5\ }; //.... 直到AXXX， 你满意为止  A4; int main(void) { 	printf("%u %u %u %u\n", a1, a2, a3, a4); 	return 0; }

user: user-4
content: 代码生成器？试试Visual Assistant的定制功能。

user: user-5
content: 可以使用##运算符，但比较少 # define a(n) i##n  int a(1), a(2), a(3); //相当于int i1, i2, i3;  # define fun(n) a_fun##n fun(1)();	//调用a_fun1 fun(2)();	//调用a_fun2 fun(3)();	//调用a_fun3 但你两个c文件都用同样的函数名，放一起会有问题的吧

user: user-6
content: 在一个头文件中 pre.h中定义好 #define fun1 fun_pre##_fun1 #define fun2 fun_pre##_fun2 #define fun3 fun_pre##_fun3  =============== main.cpp中如下使用  #define fun_pre  a  #include "pre.h"  void fun1() {} void fun2() {} void fun3() {}

user: user-7
content: 进来学习学习~

user: user-8
content: 可以用 ## 预编译运算符  不过重复定义，确实比较难、不如直接生成代码

user: user-9
content: 引用 8 楼 bEst_02 的回复:void fun1() {     printf("2222222"); } #define AA(X) fun##X  void _tmain(int argc, _TCHAR* argv[]) {     AA(1)(); }   打印2222222 ++

user: user-10
content: void fun1() {     printf("2222222"); } #define AA(X) fun##X  void _tmain(int argc, _TCHAR* argv[]) {     AA(1)(); }   打印2222222

user: user-11
content: 头文件里加个ifdef不就行了
user-0 提问: 新手求指教，为什么编写的红外避障程序只有一侧的轮子转，二另一侧不动。

回复:
user: user-1
content: 万一插头或焊点接触不良或步进电机坏了呢？

user: user-2
content: 程序这么长，没人愿意一句一句看啊。自己单步调试看看，用外用表量IO口是否输出，一个模块一个模块的找下去，最后才能发现，有时候但看程序是看不出来的，硬件也有可能有问题啊。

user: user-3
content: 这个我以前玩过类似的。你先一个一个模块的测试。确定的最简单的功能正常
user-0 提问: fscanf(fp, "%*[^\"]%*c");   为什么读不走一个字符呢？

回复:
user: user-0
content: 引用 3 楼 FancyMouse 的回复:%*[\"]需要至少匹配1个字符，然后才能继续。如果本身就已经没有[\"]的话scanf就直接失败退出了。换句话说这个是正则的+而不是* scanf毕竟是个简易正则，也别期待太多。 额，原来这样，3Q

user: user-1
content: %*[\"]需要至少匹配1个字符，然后才能继续。如果本身就已经没有[\"]的话scanf就直接失败退出了。换句话说这个是正则的+而不是* scanf毕竟是个简易正则，也别期待太多。

user: user-2
content: #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-0
content: 引用 1 楼 user-3 的回复:[quote=引用 楼主 su_787910081 的回复:] fscanf(fp, "%*[^\"]%*c");   为什么读不走一个字符呢？  只能把两个分开，这是为什么呢？ 请大牛赐教！！！！int   fscanf(FILE*stream,  constchar*format,[argument...]); 不是需要3个参数吗？ fscanf(fp,"%d",&a);[/quote] %* 的意思是读取了丢弃。 所以就没有必要给第三个参数的意义了。

user: user-3
content: 引用 楼主 su_787910081 的回复:fscanf(fp, "%*[^\"]%*c");   为什么读不走一个字符呢？  只能把两个分开，这是为什么呢？ 请大牛赐教！！！！int   fscanf(FILE*stream,  constchar*format,[argument...]); 不是需要3个参数吗？ fscanf(fp,"%d",&a);
user-0 提问: 求助一道C语言题目

回复:
user: user-1
content: 用结构体实现 代码： #include <stdio.h> #define NUM 5  typedef struct node { 	char name[100]; 	int far; }DATA;  int main() { 	DATA head[NUM]; 	int i; 	for(i=0;i<NUM;i++) 	{ 		scanf("%s %d",head[i].name,&head[i].far); 	} 	for(i=0;i<NUM;i++) 	{ 		if(head[i].far<100) 		{ 			printf("%s\t%d\n",head[i].name,head[i].far); 		} 	} 	return 0; }

user: user-2
content: 这个比较简单，楼主多试试总会成功的。

user: user-3
content: LZ还是自己多动手写代码啊，像这种简单的，LZ自己肯定可以完成的

user: user-4
content: lz还的好好的锻炼一下思维能力，这样的问题应该是没有任何难度的

user: user-5
content: #include <stdio.h> #include <string.h> void main(void) { 	char city[5][20]; 	int i,distance,j=0; 	char name[20]; 	for(i=0;i<5;i++) 	{ 		scanf("%d,%s",&distance,name); 		if(distance < 100) 		{ 			strcpy(city[j],name); 			j++; 		} 	} 	for(i=0;i<j;i++) 	{ 		printf("%s\n",city[i]); 	}  }
user-0 提问: LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

回复:
user: user-0
content: 对哦，貌似没有main函数了，我在改改，这个是在网上找的一个程序

user: user-1
content: 你的main函数在哪里？

user: user-2
content: 你应该建立console项目，不是win32
user-0 提问: 函数指针问题

回复:
user: user-1
content: #include <stdio.h> #include <string.h> #include <stdlib.h>  int add(int, int); int red(int, int); int mult(int, int); int divi(int, int); void linecut(void);   int usefunc(int (*ops)(int,int), int, int);  //声明调用函数指针的主调函数  int main(void) { 	int a, b, res; 	char ch; 	int (* ops)(int, int);   //声明函数指针，包括类型，参数 	 	puts("Enter one of the following:"); 	printf("%4c%4c%4c%4c%4c\n", '+', '-', '*', '/', 'q'); 	while((ch = getchar()) != 'q') 	{ 		switch(ch) 		{ 			case '+': 				ops = add;         //将函数地址（函数名代表其地址）赋给函数指针 				break; 			case '-': 				ops = red; 				break; 			case '*': 				ops = mult; 				break; 			case '/': 				ops = divi; 				break; 			default: 				puts("No such operation. Enter again:"); 				linecut(); 				continue; 		} 		linecut(); 		puts("Now enter two integers:"); 		scanf("%d%d", &a, &b); 		res = usefunc(ops, a, b); 		printf("The result of %d %c %d is %d\n",                  a, ch, b, res); 		puts("Enter one of the following:"); 		printf("%4c%4c%4c%4c%4c\n", '+', '-', '*', '/', 'q'); 		linecut(); 	} }  void linecut(void) { 	while(getchar() != '\n')   //去除getchar()和scanf()所留下的回车换行 		continue; }  int add(int x, int y) { 	return (x + y); }  int red(int x, int y) { 	return (x - y); }  int mult(int x, int y) { 	return x * y; }  int divi(int x, int y) { 	if(0 == y) 	{ 		puts("Error: dividing by zero."); 		exit(EXIT_FAILURE); 	} 	else 		return x/y; }  int usefunc(int (*ops)(int, int), int a, int b)   //主调函数定义 { 	return  ops(a, b); }
user-0 提问: 大家帮帮忙!!!

回复:
user: user-0
content: 谢谢大家,一个是数组字符串赋值问题 一个是大数组问题 都解决了 感谢大家结

user: user-1
content: strcpy ...

user: user-0
content: 谢谢以上三位大侠,,问题又来了:编译通过了,运行出错,内存不足? #include <stdio.h> #include <string.h> int main() { char a[1000001][7]; int i;   FILE *fp1;      fp1=fopen("c:\\Documents and Settings\\Administrator\\桌面\\ltm_tdx9.txt","w"); //winxp;    for(i=1;i<1000000;i++) {	sprintf(&a[i][0], "%06d", i); 	sprintf(&a[i][6], "%06s", "\0");        fprintf(fp1,"a[%d]=%s\n",i,a[i]);	 }  fclose(fp1); }

user: user-2
content: int sprintf( char *str, const char * format,.........); sprintf()会根据参数format字符串来转换并格式化数据，然后将结果复制到参数str所指的字符串数组，直到出现字符串结束(\0)为止 	char s[6]; 	int a = 12345; 	sprintf(s, "%d", a);   //s="12345"

user: user-3
content: 1、字符串还需要一个结束符'\0'，因此需要char a[1000000][7]多一个空间； 2、用sprintf(&a[i][0], "%06d", i)进行字符串赋值。  引用 楼主 litaiming 的回复:我想用循环语句给一个数组作为字符串赋值,怎样做?各大侠帮帮忙! char a[1000000][6]; 得到: char a[1][]=000001 char a[2][]=000002 .... char a[999999][]=999999 程序: #include <stdio.h> #include <string.h>  main() {char a[1000000][6]; int i;  for(i=1;i<1000000;i++) { ...	 }  }

user: user-4
content: sprintf(a[i], "%06d", i);
user-0 提问: Borland C++ 31linker error： bad object file record in module C:\bc\lib\cs.lib  

回复:
user: user-0
content: 没有办法，DOS下用的。。。

user: user-0
content: 求助各位大神，看下什么问题

user: user-1
content: 楼主能不能换个岁数比自己年轻一点的编译器？

user: user-0
content: 求助  怎么回事。。。
user-0 提问: 有关数据结构问题【c语言】

回复:
user: user-0
content: 求大神回复！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！
user-0 提问: 新人求教。

回复:
user: user-0
content: 哦，可以了! 谢谢

user: user-1
content: n前面应该是逗号而不是句号： printf ("n = %d, n2 = %d, n3 = %d \n", n, n2, n3);  引用 楼主 huiaizhilin 的回复:我新学的C语言！ liunx  系统  进入终端 打 vi aaaa.c  #include <stdio.h> int main (void) {    int n, n2, n3;      n = 2;   n2 = n * n;   n3 = n2 * n2; printf ("n = %d, n2 = %d, n3 = %d \n". n, n2, n3); return 0; }  gcc aaaa.c aaaa.c:在函数‘main’中： aaaa.c:8:36:错误：在非结构或联合中请求成员'n'  怎么回事 以前不会这样的，
user-0 提问: 关于编程所用的编程软件

回复:
user: user-1
content: 编程分多种： 1. 命令行式编程 2. GUI编程, 如Windows, Linux, Android, iOS,  3. 脚本式编程，如 perl, python 4. 汇编编程  你想搞哪种？

user: user-2
content: linux gcc

user: user-3
content: 看你想做什么事而定

user: user-4
content: 最新的VS。

user: user-5
content: 由于有VS2010+，VC6不得不说是过时了。 gcc忠实的陪着大家的，从Windows到嵌入式。

user: user-6
content: C++ Builder

user: user-7
content: vim qtcreator codeblock .....

user: user-8
content: VC6 用筷子吃饭啥时候过时呀？

user: user-9
content: 肯动手，哪个编译器都是趁手的兵器。

user: user-10
content: Turbo C 2.01

user: user-11
content: 那就用：习语言 吧。

user: user-12
content: Objective-C和JAVA  引用 楼主 Minghao_Best 的回复:众所周知，VC++已经过时了。。。那用什么编程软件好呢？求推荐~~~
user-0 提问: 求思路

回复:
user: user-1
content: 关键是表示方法：二元组选择较多，array，vector都可以，三元组及以上就用结构体。

user: user-0
content: 谢谢了，暂时我找到办法解决了，非常感谢！

user: user-2
content: x'表示什么意思？ X*表示什么意思？  不是所有的人都明白线性代数。  所有的循环都是一样的：条件为真，执行循环体。 问题在于：如何描述条件？循环体是什么？
user-0 提问: 给变量赋一个超出表示范围的值，有没有可能影响其相邻的其他内存？

回复:
user: user-1
content: 不过输出的时候需要注意  char a =128; 16 进制输出,可能是 FF80，FFFFFF80 而不是 80  char a =129;  16 进制输出,可能是 FF81，FFFFFF81 而不是 81

user: user-1
content: 看你的方式， 如果强制转换地址为  指向更长数据的指针，通过指针解引用赋值，那是一定会的越界的。  如果赋值号左边的数据，是该变量本身（包括通过同一类型引用方式），用超长类型数据赋值， 或者会截断数据，或者转换为某个定值，或者产生一个异常， 或者因为不能转换,而产生编译错误---数据类型不能匹配。 这些时候，都不会越界。  //例如  unsigned char a =10000; unsigned char &b =a; b = 10000; //或者  b =100.12; //这些都不会越界  //如果这么做  int *pa = (int *)&a; *pa=1000;  //这么做会越界 //其实即使  *pa =0;  //也会越界的

user: user-2
content: 不会的，变量本身的内存大小是固定的，系统不会让它越界存储的

user: user-3
content: 无符号整形肯定不会，赋值中会被截断的。数组倒是经常越界

user: user-4
content: 引用 楼主 skdjfsk 的回复:比如当一个8位的无符号数为0xFF时，再加1. 个人觉得不可能影响。 不会的，数据首先是通过寄存器，然后再送到内存的。

user: user-5
content: 不会，只是表示的值出现了问题
user-0 提问: 过支付宝安全控件输入密码的方法，有知道的吗？

回复:
user: user-1
content: 引用 4 楼 yimarong 的回复:[quote=引用 2 楼 yiyefangzhou24 的回复:] 当支付宝勾选安全控件输入的时候就不是一般的webbrowser了，是通过支付宝的安全平台在客户端做好加密之后的传输，不可能使用post直接发送，当然不使用安全控件的话应该可以，通过抓包看看发送的密码流程，通过post直接替换密码就行  具体的思路我也是了解的！ 就是如何去实现 比较困扰！  不知道从哪里下手！[/quote]思路我也说了啊，在非控件的情况下抓包->改包->发包

user: user-2
content: WinExec("autoinput.ahk",SW_HIDE);

user: user-2
content: 引用 6 楼 yimarong 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] http://www.autohotkey.com  你的意思是说 我下载这个软件，然后利用这个软件来自动输入支付宝密码吗？  有办法添加进软件内吗？[/quote] WinExec("autoinput.ahk",SH_HIDE);

user: user-0
content: 引用 7 楼 user-4 的回复:[quote=引用 楼主 yimarong 的回复:] 我现在用的webbrowser控件，是焦点获取（模拟键盘输入）自动输入支付宝密码的！ 但是如果软件最小化之后 在聊qq或者写文本什么的时候，焦点就不在软件内了，支付宝密码会自动自动敲到当前的窗口去！  好几次qq和人聊天 发消息的时候 没注意 结果连支付密码都发出去了！  唉~郁闷！  我当前希望解决的难题： 1：我软件运行的时候，就算是最小化了，也可以自动完成支付流程！ 不会出现密码出现在外面（例如文本 qq聊天窗口等）的状况！ 2：希望实现支付宝支付全后台运行，目前好像是要post模式，不知道是不是还有别的什么好办法！  希望各位大牛可以指点一下！ 不胜感激！  你真敢用这个软件？[/quote]   这是什么意思？

user: user-2
content: http://www.autohotkey.com

user: user-0
content: 引用 2 楼 yiyefangzhou24 的回复:当支付宝勾选安全控件输入的时候就不是一般的webbrowser了，是通过支付宝的安全平台在客户端做好加密之后的传输，不可能使用post直接发送，当然不使用安全控件的话应该可以，通过抓包看看发送的密码流程，通过post直接替换密码就行  具体的思路我也是了解的！ 就是如何去实现 比较困扰！  不知道从哪里下手！

user: user-3
content: 不会的路过，接分

user: user-4
content: 引用 楼主 yimarong 的回复:我现在用的webbrowser控件，是焦点获取（模拟键盘输入）自动输入支付宝密码的！ 但是如果软件最小化之后 在聊qq或者写文本什么的时候，焦点就不在软件内了，支付宝密码会自动自动敲到当前的窗口去！  好几次qq和人聊天 发消息的时候 没注意 结果连支付密码都发出去了！  唉~郁闷！  我当前希望解决的难题： 1：我软件运行的时候，就算是最小化了，也可以自动完成支付流程！ 不会出现密码出现在外面（例如文本 qq聊天窗口等）的状况！ 2：希望实现支付宝支付全后台运行，目前好像是要post模式，不知道是不是还有别的什么好办法！  希望各位大牛可以指点一下！ 不胜感激！  你真敢用这个软件？

user: user-1
content: 当支付宝勾选安全控件输入的时候就不是一般的webbrowser了，是通过支付宝的安全平台在客户端做好加密之后的传输，不可能使用post直接发送，当然不使用安全控件的话应该可以，通过抓包看看发送的密码流程，通过post直接替换密码就行

user: user-0
content: 有人可以指点一下吗？

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:http://www.autohotkey.com  你的意思是说 我下载这个软件，然后利用这个软件来自动输入支付宝密码吗？  有办法添加进软件内吗？
user-0 提问: 这题输出结果是什么

回复:
user: user-1
content: 编译错误。

user: user-2
content: # include <stdio.h>  int main() ////////////// main { 	int x, y;////////// 	x = 2, y = 1; 	while(x-- != -1) 	{ 		do{ 		y *= x; 		 y++; /////////// 		} while(x--); 	}////////////////////////// 	printf("%d，%d/n",y,x);///////////// 	 	return 0; } 问题太多 关于自加自减，可以看置顶帖——http://bbs.csdn.net/topics/370153775

user: user-3
content: x=0,y=1

user: user-4
content: 真是搞不懂哪来的这么多人为i++,++i的问题纠结，搞不清楚别这样写啊，折磨自己，更折磨别人 不知道什么叫代码风格吗？？？

user: user-5
content: 引用 4 楼 starytx 的回复:没进来前就猜到是自增自减的问题（这个看看那个裘老的解释的置顶帖）。主函数名称也写错了这个置顶帖帮不了楼主  这代码 没涉及置顶帖讨论的问题

user: user-6
content: 没进来前就猜到是自增自减的问题（这个看看那个裘老的解释的置顶帖）。主函数名称也写错了

user: user-7
content: 谁写的代码，丑的一比。错误百出

user: user-8
content: void main

user: user-9
content: 编译出错，找不到函数入口。

user: user-10
content: x                y 1              2 0              1 -1 -2 所以最后的答案是 1， -2，考的是后--的运算，后--先比较再自减
user-0 提问: 大神 求帮助看以个程序，为何报错是死循环

回复:
user: user-1
content: 引用 6 楼 ForestDB 的回复:LZ以截图而不是文本的方式给出代码，那么就失去了一次机会：“别人将代码存成文件并编译执行”。 方便了LZ自己，但是没有任何好处。  当然不乏热心人士将代码手动输入一遍，但这时的我，显然并不热心。 +1

user: user-2
content: LZ以截图而不是文本的方式给出代码，那么就失去了一次机会：“别人将代码存成文件并编译执行”。 方便了LZ自己，但是没有任何好处。  当然不乏热心人士将代码手动输入一遍，但这时的我，显然并不热心。

user: user-3
content: LZ 的代码应该好好缩进下！

user: user-4
content: 估计第二个循环  考试系统没有检查m-1的能力 所以认为m<=1的时候是死循环把

user: user-0
content: 是一个考试的系统报的错误，运行出来是正确的

user: user-5
content: 没看出问题，你执行了么

user: user-6
content: 从一个名为 data.in 的文件中读取一个整数，将其值保存到变量 n 中。如果此值不在10到100之间(不含两个端点)，返回失败。 然后从1开始，计算出所有能整除此数的整数(包含此数本身)，并将这些数保存到一个数组 a 里面。 最后，将数组 a 里面的数都输出。

user: user-7
content: 谁报的错？怎么报的？

user: user-8
content: 用眼扫了一遍，感觉不存在使程序死循环的条件。
user-0 提问: 求大家帮帮忙！

回复:
user: user-1
content: #include “stdio.h"  int c;  //这里全局变量，初值为0  int jiafa(int a,int b,int c)  //这里的参数int c拷贝了main()传给它的全局变量c， {                    //所以无法改变main()传给它的那个c的值     c=a+b;     printf("%d\n",c);      return 0; //函数其实不需要返回数值，所以这个return 0没有必要 }  int main() {     int a,b;     jiafa(3,5,c);  //这个c是全局变量的那个c，jiafa()里的参数int c参数将这个c拷贝了一份     printf("%d\n",c);//所以无法改变，你需要将c的地址传给jiafa()，不过这也要改变jiafa()      return 0; }  这样改就ok了： #include <stdio.h>  int c;  void jiafa(int a,int b,int * c) {     *c = a+b;      printf("%d\n", *c); }  int main() {     int a,b;      jiafa(3, 5, &c);  //这里传c的地址给jiafa()，就可以改变c的值了     printf("%d\n", c);       return 0; }

user: user-2
content: int add(int a, int b) {     return a + b; }  int main() {     printf("%d\n", add(3, 5));      return 0; }

user: user-3
content: #include <stdio.h>  void jiafa(int a,int b,int c) { 	c=a+b;     printf("%d\n",c);     return ; }  int main(void) { 	int c;     jiafa(3,5,c); //printf("%d\n",c);//为什么没输出8，那么要输出8需要怎样改啊！     return 0; }

user: user-4
content: 在主函数中定义一个c，然后写成c=jiafa（3,5，c）试试行不

user: user-5
content: jiafa(3,5,c);这行改成c = jiafa(3,5,c);看看这个.

user: user-0
content: 我是需要在外面输出！引用可以吗？int &c

user: user-6
content: 你都return 0了还要输出8？你直接return c也行啊。。
user-0 提问: Libevent下evhttp_set_cb和evhttp_set_gencb的区别是什么？

回复:
user: user-1
content: 应该还是有很多人对此有疑问吧， 根据官方说明如下： 那么基本上就是对应特定的URI使用evhttp_set_cb注册回调那么就会流程会走到这里， 那么没有注册过的URI将会走到evhttp_set_gencb注册流程。   To use this capability, you need to include the <evhttp.h> header in your    program.  You create the server by calling evhttp_new(). Add addresses and    ports to listen on with evhttp_bind_socket(). You then register one or more    callbacks to handle incoming requests.  Each URI can be assigned a callback    via the evhttp_set_cb() function.  A generic callback function can also be    registered via evhttp_set_gencb(); this callback will be invoked if no other    callbacks have been registered for a given URI.         为了获得 HTTP 处理能力，需要包含头文件 <evhttp.h> 在你的应用程序中。你需要通过调用 evhttp_new() 来创建服务器，通过 evhttp_bind_socket() 来添加监听地址和端口号。然后你可以注册一个或者多个回调函数来处理收到的请求。 可以通过函数 evhttp_set_cb() 为每一个 URI 指定一个回调函数。 你同样可以使用函数 evhttp_set_gencb() 注册一个通用回调处理函数，在没有为指定 URI 注册回调函数的情况下，该回调函数会被调用。
user-0 提问: 【C语言】解压文件！

回复:
user: user-1
content: Content-Encoding: gzip  zlib可以处理gzip没错，但是得用gz系列的函数； 而compress/uncompress是用来处理.Z格式的文件的。

user: user-1
content: LZ还能搜索下？gzopen，……

user: user-0
content: 引用 5 楼 ForestDB 的回复:Content-Encoding: gzip  zlib可以处理gzip没错，但是得用gz系列的函数； 而compress/uncompress是用来处理.Z格式的文件的。具体的GZ系列函数能告诉下吗？

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:用 WinExec("命令行调用解压软件解压指定文件",SW_HIDE); 解压。 不要迷信API，有时WinExec更靠谱，更容易调试。不会用这个啊  我想用ZILB    这个UNCOMPRESS函数解压文件！

user: user-0
content: 引用 1 楼 user-3 的回复:使用gzip压缩的，请搜索gzip相关函数不是用zilb吗？完事用uncomperss()函数

user: user-2
content: 用 WinExec("命令行调用解压软件解压指定文件",SW_HIDE); 解压。 不要迷信API，有时WinExec更靠谱，更容易调试。

user: user-3
content: 使用gzip压缩的，请搜索gzip相关函数
user-0 提问: collect2: ld returned 1 exit status

回复:
user: user-0
content: E:/FUdx_Android  我这里根本就没有这个文件夹

user: user-1
content: ios里成功调用了？？？ 理论上.a文件没问题

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:undefined reference to 'CreateFastUdx()' 使用objdump或nm查看.a或.so中是否导出了名字CreateFastUdx  搜“Name Mangling in C++”  导出了  因为ios里就成功调用了

user: user-0
content: 编译器 Cygwin

user: user-0
content: 引用 3 楼 linux_hsylar 的回复:这个很可能是你的生成第三方静态库.a的编译器和你写的代码的编译器编译方式不同所导致，你可以把你的代码和是用的编译器发上来。  void IUdxMediaClientSink2::OnConnect(int erro)//与流媒体服务器联接成功或失败 { 	LOGE("OnConnect"); }  void IUdxMediaClientSink2::OnRecvData(BYTE* pData,int len)//回调接收数据 { 	LOGE("OnRecvData"); }  void IUdxMediaClientSink2::OnOperatorErro(int erro)//操作出错返回码 { 	LOGE("OnOperatorErro"); }  extern "C" jboolean Java_com_example_test_IUdxMediaClient_Bind (JNIEnv * env, jclass, jstring ip, jlong port) { LOGE("Bind");  	IUdxMediaClientSink2 iudS; 	IUdxMediaClient *iudc= CreateUdxMediaClient(); 	iudc->SetCB(&iudS); 	BOOL b = iudc->Bind(0, 0); 	return b; }

user: user-1
content: 应该是编译选项

user: user-2
content: 这个很可能是你的生成第三方静态库.a的编译器和你写的代码的编译器编译方式不同所导致，你可以把你的代码和是用的编译器发上来。

user: user-3
content: undefined reference to 'CreateFastUdx()' 使用objdump或nm查看.a或.so中是否导出了名字CreateFastUdx  搜“Name Mangling in C++”

user: user-0
content: 我编译时需要连接 使用第三方.a静态库文件 在编译的时候过不去
user-0 提问: 关于锁的问题---cpu对同一硬件接口寄存器访问

回复:
user: user-1
content: 这相当于是一个原子操作，加锁或者是进入临界区，操作完成后，再解锁或者是退出临界区。  引用 楼主 nadleeh123 的回复:很多人可能都遇到过这样的情景: 1个设备,有一个按键，一个灯，一个外部io口，他们都是接到同一gpio组的不同位上的。 然后按键处于中断模式，可能随时被按下，需要cpu需要清除gpio的对应位。 灯一直按照遇到的频率闪烁，一般不会被改变。 外部io接口会在特定的情况切换gpio对应位的io模式。 3个线程独立控制3个设备。  好吧，问题来了，他们都属于同一组gpio，也就是说对cpu来说，3个设备在io空间内部这3个设备都是在同一个io空间，也就是说属于共享资源，但是属于该io空间的不同位上。每次操作都是各设各的位，互不影响。 这种情况下，多核cpu是否需要加锁，单核cpu是否需要禁抢占？

user: user-2

user: user-0
content: 哦靠，难道赵老师要独吞200分了  来人啊！！！！！！！！

user: user-3
content: 要加锁或临时关闭中断
user-0 提问: 关于const的问题求大神解答

回复:
user: user-1
content: 这个应该是c++编译器自动优化的结果！在编译时将num替换为10再编译。如果用c编译，应该两个都是100

user: user-2
content: 最近怎么这么多同样的问题，常量折叠

user: user-3
content: 如果上帝当初编写的DNA永远正确的话，试问能进化出人类吗？

user: user-3
content: 引用 6 楼 zyaiwx 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！ 赵老师的话很没意思。不纠结怎么搞懂？不搞懂咋保证写出正确的[/quote] 你知道不？根本就不存在正确的代码。 SSH不是很正确吗？咋HeartBleed了呢？  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-4
content: 引用 4 楼 zhao4zhong1 的回复:不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！ 赵老师的话很没意思。不纠结怎么搞懂？不搞懂咋保证写出正确的

user: user-5
content: 借一楼的话哦

user: user-3
content: 不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！

user: user-6
content: 0x400b14	push   rbp 0x400b15	mov    rbp,rsp 0x400b18	sub    rsp,0x10 0x400b1c	mov    DWORD PTR [rbp-0xc],0xa 0x400b23	lea    rax,[rbp-0xc] 0x400b27	mov    rsi,rax 0x400b2a	mov    edi,0x602080 0x400b2f	call   0x400960 <_ZNSolsEPKv@plt> 0x400b34	mov    esi,0x400980 0x400b39	mov    rdi,rax 0x400b3c	call   0x400970 <_ZNSolsEPFRSoS_E@plt> 0x400b41	lea    rax,[rbp-0xc] 0x400b45	mov    QWORD PTR [rbp-0x8],rax 0x400b49	mov    rax,QWORD PTR [rbp-0x8] 0x400b4d	mov    DWORD PTR [rax],0x64 0x400b53	mov    esi,0xa 0x400b58	mov    edi,0x602080 0x400b5d	call   0x4008d0 <_ZNSolsEi@plt> 0x400b62	mov    esi,0x40101d 0x400b67	mov    rdi,rax 0x400b6a	call   0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt> 0x400b6f	lea    rdx,[rbp-0xc] 0x400b73	mov    rsi,rdx 0x400b76	mov    rdi,rax 0x400b79	call   0x400960 <_ZNSolsEPKv@plt> 0x400b7e	mov    esi,0x400980 0x400b83	mov    rdi,rax 0x400b86	call   0x400970 <_ZNSolsEPFRSoS_E@plt> 0x400b8b	mov    rax,QWORD PTR [rbp-0x8] 0x400b8f	mov    eax,DWORD PTR [rax] 0x400b91	mov    esi,eax 0x400b93	mov    edi,0x602080 0x400b98	call   0x4008d0 <_ZNSolsEi@plt> 0x400b9d	mov    esi,0x40101d 0x400ba2	mov    rdi,rax 0x400ba5	call   0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt> 0x400baa	mov    rdx,QWORD PTR [rbp-0x8] 0x400bae	mov    rsi,rdx 0x400bb1	mov    rdi,rax 0x400bb4	call   0x400960 <_ZNSolsEPKv@plt> 0x400bb9	mov    esi,0x400980 0x400bbe	mov    rdi,rax 0x400bc1	call   0x400970 <_ZNSolsEPFRSoS_E@plt> 0x400bc6	mov    eax,0x0 0x400bcb	jmp    0x400bd5 <main()+193> 0x400bcd	mov    rdi,rax 0x400bd0	call   0x4009a0 <_Unwind_Resume@plt> 0x400bd5	leave 0x400bd6	ret  http://blog.csdn.net/yby4769250/article/details/7359278
user-0 提问: 寻找采样数据处理程序（计算频率，振幅，等）

回复:
user: user-0
content: 你级别这么高了，这点分算隔靴搔痒。本来希望送新手的

user: user-1
content: LZ可以送分了。

user: user-0
content: 没有就算了，怎么也来个人应一声，我好送分啊

user: user-0
content: 顶起。肯定有人用过，比如数字示波器的处理程序
user-0 提问: 用ffmpeg-20140503-git-719e72c-win32-dev + eclipse + mingw 搭建开发环境

回复:
user: user-1
content: 以为自己走错地方了，再重新看一下，原来楼主发错地方了

user: user-2
content: 引用 楼主 dongms_7 的回复:我想做一套封装了ffmpeg的api，供自己的项目中使用，首先我是做java的，网上也有类似的api和开源项目，发现效率一般，所以想jni自己写一套。  碰到的第一个问题就是如何搭建标题所示环境，请各位帮忙啊。  你先把开源的你说“效率一般”的代码看懂再说。
user-0 提问: 在自定义的函数中加输出代码，结果才正确，否则最终结果错误！！求解

回复:
user: user-0
content: 我知道原因了，不是s被释放的原因，是str1被释放的原因。返回的指针找不到内容了。不过还是谢谢你！！

user: user-1
content: 你的s是函数里的局部变量，出了函数体，s就被释放了，s的内容就不能保证还是原来那些了。
user-0 提问: 如何将FB 中的内容，按屏幕旋转的方向进行显示. ( 0 90 180 270 度进行显示

回复:
user: user-1
content: 换一个思路吧.

user: user-0
content: GUI_BitString_8bppDrawEx(FB* fb,int x0, int y0)  函数可将 FB 中的字符 正确显示到 LCD 屏幕上, 现在需要将 LCD 屏幕旋转90度 或 180度， GUI_BitString_8bppDrawEx函数应要修改，请提示一下. 谢谢

user: user-0
content: int  GUI_BitString_8bppDrawEx(FB* fb,int x0, int y0) {     int Ret         = 0;     int Height      = fb->size.height;     int Width       = fb->size.width;     int  y, BytesPerLine , tmp_y;     int LCDXSize = 0; 	int LCDYSize = 0;     U8 *pDest = NULL; 	const U8 * pSrc = (const U8 *)fb->addr[0];  	 	GUI_LOCK();     if((Screen_Context.LCDDirection[GUI_Context.SelLayer] == GUI_SCNDIR_ROTATE90)        ||(Screen_Context.LCDDirection[GUI_Context.SelLayer] == GUI_SCNDIR_ROTATE270))     {         LCDXSize = Screen_Context.LCDYSize[GUI_Context.SelLayer]; 		LCDYSize = Screen_Context.LCDXSize[GUI_Context.SelLayer];     }     else     {         LCDXSize = Screen_Context.LCDXSize[GUI_Context.SelLayer]; 		LCDYSize = Screen_Context.LCDYSize[GUI_Context.SelLayer];     }  	if(x0 >= LCDXSize) 	{ 		GUI_UNLOCK(); 		return EPDK_FAIL; 	}	 	tmp_y = y0 + Height; 	if(tmp_y > LCDYSize) 	{ 		Height =  LCDYSize - y0; 	}	 	     pDest = (unsigned char *)(orange.fbaddr[GUI_Context.SelLayer]) + (y0 *LCDXSize) + (x0);     BytesPerLine = Width;     for (y=0; y < Height; y++)      {         memcpy(pDest, pSrc, Width);         pSrc += BytesPerLine;         pDest = (U8*)(pDest +LCDXSize); 	     } 	 	GUI_UNLOCK(); 	return Ret; }
user-0 提问: (m => m.answercount > 0)代表什么？

回复:
user: user-1
content: LINQ TO SQL 么？啊？ 你发错栏目了吧？

user: user-2
content: 不是LINQ？

user: user-3
content: Lambda表达式，这是C#，不是C/C++

user: user-4
content: 不明觉厉
user-0 提问: 求助 将unsign char数组中的字符转化为16进制

回复:
user: user-1
content: void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-1
content: unsign char aes_128_cbc_plain_text[AES_128_CBC_LEN]={'a','b','c','d','a','b','c','d','a','b','c','d','a','b','c','d'}; unsign char  aes_128_cbc_plain_text1[AES_128_CBC_LEN]; memcpy((void *)aes_128_cbc_plain_text1,(void *)aes_128_cbc_plain_text,AES_128_CBC_LEN);

user: user-0
content: 引用 1 楼 user-2 的回复:引用unsign char aes_128_cbc_plain_text[AES_128_CBC_LEN]={'a','b','c','d','a','b','c','d','a','b','c','d','a','b','c','d'}; 怎样才能把上面的数组转为unsign char  aes_128_cbc_plain_text1[AES_128_CBC_LEN]={0x61,0x62,0x63,0x64,0x61,0x62,0x63,0x64,0x61,0x62,0x63,0x64,0x61,0x62,0x63,0x64} 这两个是一样的，不需要转。   我知道是一样的，但是在运行的时候，我如果按照unsign char aes_128_cbc_plain_text[AES_128_CBC_LEN]={'a','b','c','d','a','b','c','d','a','b','c','d','a','b','c','d'};就会出错误。 转化成unsign char  aes_128_cbc_plain_text1[AES_128_CBC_LEN]={0x61,0x62,0x63,0x64,0x61,0x62,0x63,0x64,0x61,0x62,0x63,0x64,0x61,0x62,0x63,0x64}就不会出错了。

user: user-0
content: 但是我运行的时候会有错误，我这个利用openssl加密的例子里明文就是： unsigned char aes_128_cbc_plain_text[AES_128_CBC_LEN] = \ 									{0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,\ 									 0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a}; 所以我想转化一下

user: user-2
content: 你要'a'-->"61"？

user: user-2
content: 引用unsign char aes_128_cbc_plain_text[AES_128_CBC_LEN]={'a','b','c','d','a','b','c','d','a','b','c','d','a','b','c','d'}; 怎样才能把上面的数组转为unsign char  aes_128_cbc_plain_text1[AES_128_CBC_LEN]={0x61,0x62,0x63,0x64,0x61,0x62,0x63,0x64,0x61,0x62,0x63,0x64,0x61,0x62,0x63,0x64} 这两个是一样的，不需要转。
user-0 提问: 现在的ANSI C指C89还是c99还是c11？

回复:
user: user-0
content: 把有限的生命浪费在品尝/品鉴无穷多种的新鲜、靓丽、添加很多香精的语法糖中，我认为不值当也不健康。  这是人生哲学

user: user-1
content: 引用 2 楼 incident_a 的回复:现在都2014年了，C编译器不说支持C11，也应该都自动支持C99了吧，为什么我现在看到的还是支持ANSI C的编译器呢？ 因为现在很多比如银行、航空、税务、通讯……系统的源代码仍是C89 我猜。  把有限的生命浪费在品尝/品鉴无穷多种的新鲜、靓丽、添加很多香精的语法糖中，我认为不值当也不健康。

user: user-0
content: 引用 4 楼 mujiok2003 的回复:[quote=引用 2 楼 incident_a 的回复:] 现在都2014年了，C编译器不说支持C11，也应该都自动支持C99了吧，为什么我现在看到的还是支持ANSI C的编译器呢？  不要以为自动支持。 看看你自己的编译器是否支持。[/quote] 那现在大家编程序用到的什么标准比较多？是c89还是c99还是c11？

user: user-2
content: 引用 2 楼 incident_a 的回复:现在都2014年了，C编译器不说支持C11，也应该都自动支持C99了吧，为什么我现在看到的还是支持ANSI C的编译器呢？  不要以为自动支持。 看看你自己的编译器是否支持。

user: user-2
content: ANSI C指C89， 之后的版本应该是ISO C

user: user-0
content: 现在都2014年了，C编译器不说支持C11，也应该都自动支持C99了吧，为什么我现在看到的还是支持ANSI C的编译器呢？

user: user-3
content: ANSI C指的是C89，GCC要看版本号。  引用 楼主 incident_a 的回复:我认为应该是c11，但我记得去年我用VS2010的时候，C语言不支持布尔类型，（可能是我没包含头文件吧），那照这样看来vs2010用的甚至是c89，到底怎么回事？ 还有第二个问题，现在的GCC用的是C11吗？
user-0 提问: 结构体内部申请的空间会随着结构体空间而释放吗？

回复:
user: user-1
content: 不会，应先释放st_a->s，再释放st_a  引用 楼主 u013354393 的回复:typedef struct AAA {   char *s; } A;  void main() {   A *st_a = NULL;   st_a = (A *)malloc(sizeof(A));   st_a->s = (char *)malloc(20);   free(st_a); }  st_a->s的空间会相应的释放掉吗？

user: user-2
content: 不会。。。。。
user-0 提问: WINDOWS控制台下,使用什么来避免类似fgets函数的阻塞，急！！

回复:
user: user-0
content: Windows 下以非阻塞方式读取标准输入一般采取什么方式，只能用通过多线程实现吗？

user: user-1
content: windows select不支持non-socket 引用10038: 在一个非套接字上尝试了一个操作

user: user-0
content: 除了多线线程还有没有其他方式；能确定window下select不能用于stdin吗？

user: user-2
content: 用多线程？
user-0 提问: c++ 关于try catch

回复:
user: user-1
content: 工程里设置启用捕获SEH异常就啥都能抓到了

user: user-2
content: if (scanf("%d",&a[i]) == 1) { //ok }else{ //ng }

user: user-3
content: 得先throw， cache才有效。 没抛出异常，还cache啥。 scanf本身没有抛出异常。

user: user-4
content: throw try  catch

user: user-0
content: 引用 7 楼 mujiok2003 的回复:if (scanf("%d",&a[i]) == 1) { //ok }else{ //ng } 这输入是输入了 可是数组越界没办法判断 这个要怎么做

user: user-5
content: scanf也许会“出错”，但是它又不“触发异常”，这个不是一码事。

user: user-0
content: 为什么 try catch捕捉不到错误

user: user-6
content: 数据类型错误，  catch什么也不填就是捕获所有错误数据类型

user: user-7
content: 接收所有类型的错误 catch (...) { }
user-0 提问: 哪个好心人能帮我详细解释下，这个R树的源代码。万分感激！

回复:
user: user-1
content: http://blog.csdn.net/n_sev7/article/details/19364757  以前写的R-Tree的总结

user: user-2
content: 代码这么多这么乱没注释没说明怎么看？

user: user-0
content: 谢谢，就是没有注释，看不懂啊，所以才求助的。求大神，求高手。
user-0 提问: [SWU]数组越界???

回复:
user: user-1
content: strlen所作的仅仅是一个计数器的工作，它从内存的某个位置（可以是字符串开头，中间某个位置，甚至是某个不确定的内存区域）开始扫描，直到碰到第一个字符串结束符'\0'为止，然后返回计数器值。

user: user-2
content: 引用 楼主 u012789847 的回复:1 #include <stdio.h>   2 #include <stdlib.h>   3 #include <string.h>   4   5 void randchar(char str1[100])   6 {   7         int i, j;   8         srand((int)time(0));   9  10         for(i=0; i<100; i++){  11                 j       = 1+(int)(62.0*rand()/(RAND_MAX+1.0));  12                 if(j<=26&&j>=1){  13                         str1[i]='a'+j-1;  14                 }else if(j>26&&j<=52){  15                         str1[i]='A'+j-27;  16                 }else if(j>52&&j<=62){  17                         str1[i]='0'+j-53;  18                 }  19         }  20 }  21 void main()  22 {  23         char str[100];  24         randchar(str);  25         int i, num;  26         num     = strlen(str);  27         printf("%d\n", num);  28         for(i=0; i<100; i++){  29                 printf("%c", str[i]);  30         }  31         printf("\n");  32 }  33 为何输出的结果是 112 8DuuS4toM9MZyMjf5kv5NLOIcxyx41Z3vjodeHsQH4F6GPbB0xxD8cbazAyurnnMxCQC98jH2PDzuF1k2oO0qQ1QgpayDob0QRsQ 112？是怎么回事？？？  num = = 112

user: user-3
content: 字符串都需要\0结尾. 比较好的习惯是; char str[100] = {0};  定义时即初始化为全0

user: user-4
content: 函数用错了///

user: user-5
content: 令str[99] = '\0'； strlen返回的是字符串的长度，不是字符数组的长度。
user-0 提问: C语言急需要一种“子函数”

回复:
user: user-1
content: 发明新东西之前请先了解、学习已有的东西。

user: user-2
content: 引用 楼主 screen12 的回复:我们知道，Ｃ语言现在不存在“子函数”，各个函数尽管代码多少可能不同，但地位是平等的。  但是实际上，Ｃ语言急需要一种“子函数”，就是在一个函数内部定义，内部使用，在外部无效的函数。这种”子函数“可以继承父函数的局部变量。  因为在工作中，我经常在一个函数内部，有好几个地方需要用到同一段代码，如果复制过去，不仅代码量大，而且修改起来还得把所有地方一起修改，太麻烦。但是如果定义一个函数吧，也不好办。因为这段代码需要用到函数中的局部变量，如果把这些局部变量用参数传递过去，可以是可以，但是参数多的时候极为麻烦。  迫切需要一种”子函数“，在函数内部定义，仅限于内部使用，可以自动继续父函数的局部变量。  static inline

user: user-3
content: 参数多，能把参数弄成一个结构体，然后传指针么？

user: user-4
content: 楼主可以考虑一下全局静态变量和函数，它们的作用域仅限于本文件内。

user: user-5
content: 闭包不是什么语言都有的。

user: user-6
content: 虽然你描述的好像C++能解决，但是C++是无解的。C++也不能在函数内部再定义函数。你为什么不尝试使用宏？参数多的时候，你为什么不抽象成对象？

user: user-7
content: 楼主的想法实现起来稍微有点麻烦，因为局部变量是用堆栈指针相对引用的，子函数内部的变量要用堆栈基址，子函数外部的局部变量要参考不同的堆栈基址，这样嵌套层级多的时候，实现有点麻烦， 这个问题的处理上PASCAL编译器实现有讲解，C通常用的入栈和出栈方法和PASCAL还不同。 理论上来说，应该也能实现，可能也会增加一些限制，编译器也会复杂不少。  函数参数传递的问题建议多用结构体，用结构指针传递， 你只需要一个变量即可。

user: user-8
content: 换C++试试

user: user-9
content: 宏定义 + 指针

user: user-10
content: GCC对标准C有所扩展，允许在函数中定义函数----在CSDN中找一下GCC扩展吧

user: user-11
content: 就用参数传递啊，有什么麻烦？copy+paste, 看着有三四行参数就不爽？ 不行就定义类。

user: user-1
content: 如果宏不能满足楼主所需，请结合google protobuf学习研究代码生成（code generation）技术。

user: user-1
content: 为什么不用宏呢？

user: user-12
content: 2楼正解。 要么换种语言。

user: user-13
content: 楼主需要的只是一个 #define而已

user: user-14
content: 内联函数从源代码层看，有函数的结构，而在编译后，却不具备函数的性质。内联函数不是在调用时发生控制转移，而是在编译时将函数体嵌入在每一个调用处。编译时，类似宏替换，使用函数体替换调用处的函数名。一般在代码中用inline修饰，但是能否形成内联函数，需要看编译器对该函数定义的具体处理。 http://baike.baidu.com/link?url=QhIPmgOarhWYlCBLztV3XQF55ABcD5j8CZiH9BO_3NH3wnAdj69m-saFPN2Qncf5

user: user-15
content: C++11，lambda表达式。C语言估计是不会有了

user: user-14
content: 你说的应当是，内联函数。
user-0 提问: 一个程序编译改名字复制一份，为什么两个在gdb中输出一样实际运行结果不一样？输出一个变量的地址

回复:
user: user-1
content: 9楼真正达人一枚啊！

user: user-2
content: linux从2.6.12开始支持Address space layout randomization ，ASLR 进程用户空间的栈起始于STACK_TOP， 每个体系结构都必须定义STACK_TOP, 大多数都设置为TASK_SIZE, 即用户地址空间中最高的可用地址，在x86_32上该值为0XC0000000。如果内核设置了PF_RANDOMIZE，则起始点会减少一个小的随机量，使得栈的起始地址成为一个随机值，这样的话使用缓冲区溢出进行攻击就更加困难。  所以在内核开启了ALSR的情况下，你的程序别说换个名字，就是同一个程序连续运行两遍，其结果也不一样。  而gdb在运行时，fork之后，exec之前，会使用personality(orig_personality|ADDR_NO_RANDOMIZE)系统调用来关闭进程的ASLR，所以在gdb里运行输出值是一样的。

user: user-3
content: 这不一样很正常啊，打印的是变量在栈上的地址，不同的进程栈是不一样的啊。

user: user-4
content: 就像在饭店，你点两份相同的菜，并不能保证在后厨是同一个厨师在同一个煤具上做的一样。 你的程序运行在存储器的哪个区域、数组具体分配的地址，是由操作系统+编译系统等动态完成的，输出的地址相同也好、不同也好你没有必要去深究----有限的精力用在真正有用的地方吧

user: user-1
content: 研究Linux加载可执行文件相关源代码。

user: user-5
content: debug 和released版本是不一样的

user: user-6
content: 输出的是a的地址，这得看运行的时候是怎么分配的。不一样很正常吧。

user: user-0
content: 比如我gdb中看到输出都是-6916，而不是gdb运行test 和test01不一样。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:研究Linux加载可执行文件相关源代码。 好的，谢谢

user: user-0
content: 引用 2 楼 u012061345 的回复:输出的是a的地址，这得看运行的时候是怎么分配的。不一样很正常吧。 不加g编译的时候输出的地址是虚拟地址吗？ 加g后的了？
user-0 提问: 有关自动售糖机的问题，包括了编译原理部分的有穷自动机 有编译错误，自己思路捋不出来错误

回复:
user: user-1
content: step by step debug.

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-0
content: 编译没错，是内容写的不对。。自己顺自己思路看不出来

user: user-1
content: 编译错误，一般都告诉你是哪行
user-0 提问: 几句难懂的C语句，求解释

回复:
user: user-1
content: 地址减地址，没意义的，null；

user: user-0
content: 谢谢

user: user-2
content: 是的，地址减地址

user: user-3
content: 是啊是啊 应该等于0吧 因为数组地址就是数组首元素的地址啊