Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问:  C 语言 malloc问题

回复:
user: user-1
content: 你想申请几个int 就写几个  #include <stdio.h> #include <stdlib.h>  int main() { int *a; a = malloc(sizeof(int)*3); a[0] = 1; a[1] = 2; a[2] = 3; printf("%d\n%d\n%d\n",a[0],a[1],a[2]);  return 0; }

user: user-2
content: 引用 5 楼 visp 的回复:你想申请几个int 就写几个  #include <stdio.h> #include <stdlib.h>  int main() { int *a; a = malloc(sizeof(int)*3); a[0] = 1; a[1] = 2; a[2] = 3; printf("%d\n%d\n%d\n",a[0],a[1],a[2]);  return 0; }  j是这样1用的~~~~ 对你的代码，可能会有未知的错误发生。但是不一定会发生，因为你的越界使用，数据不一定正确，且内存操作的地址不是每次都正确

user: user-3
content: 引用 7 楼 yaojuntong77 的回复:哦，44行忘了个惊叹号。。。 应该改成：if  (!(array = (int *) malloc (arrsize * sizeof(int))))

user: user-3
content: 哦，44行忘了个惊叹号。。。

user: user-3
content: 楼主，你的代码用法不安全，我写个给你，看是不是你想表达的意思：  #include <stdio.h> #include <stdlib.h>  int *getmemory(int * restrict array, const int arrsize); void freememory(int * restrict array);  int main(void) { 	int  *array = NULL,  arrsize = 0,  i; 	 	printf("请输入你需要的数组元素个数（大于0的int型整数）: "); 	fflush(NULL); 	scanf("%d", &arrsize); 	if (NULL == getmemory(array, arrsize)) 	{ 		printf("内存元素个数指定错误：%d\n", arrsize); 		exit 1; 	}  	// 尝试给数组存入测试的值，然后打印输出： 	for(i=0; i<arrsize; i++) 	{ 		array[i] = i * 520 + 1; 	} 	printf("数组的当前值如下：\n"); 	for(i=0; i<arrsize; i++) 	{ 		printf("\tarray[%-2d] = %d\n", i, array[i]); 	}  	// 测试完以后，程序结束前，释放申请的动态内存 	freememory(array);  	return 0; }  int *getmemory(int * restrict array, const int arrsize) { 	if (0 >= arrsize) 	{ 		return NULL; 	}  	if (array = (int *) malloc (arrsize * sizeof(int))) 	{ 		return NULL; 	}  	return array; }  void freememory(int * restrict array) { 	if (array) 	{ 		free(array); 		array = NULL; 	} }

user: user-4
content: The malloc() and calloc() functions return a pointer to  the  allocated        memory  that  is  suitably aligned for any kind of variable.  On error,        these functions return NULL.  NULL may also be returned by a successful        call  to  malloc() with a size of zero, or by a successful call to cal‐        loc() with nmemb or size equal to zero.

user: user-5
content: 这与系统底层实现有关，不同的系统可能会有不同结果。  malloc分配的内存并不完全等同于是你指定的大小（要考虑字节对齐的方式，以及保存一些信息使得调用free（）可以正确释放这个内存块）。  引用If size is 0, then malloc() returns either NULL, or a unique pointer value that can        later be successfully passed to free().  malloc(0)的结果可能为NULL，也可能是一个可以安全传递给free()的指针。  在后一种情况下，malloc(0)也会分配一定的空间（比如24字节或32字节）。  可以调用 size = malloc_usable_size(a)；看一下实际分配了多少字节。

user: user-6
content: 越界了， 指针a指向malloc分配的有一定大小的空间 然后后面使用（初始化、赋值等）指针a指向的空间时，不能超过分配的空间 个人理解

user: user-7
content: 你已经越界了，free(a)或许就出错了！ 不要总是天真以为没出错做法就是对的
user-0 提问: linux下C语言实现excel文件导入到数据库 动态库libxl.so用法

回复:
user: user-0
content: 感谢楼上提示： [app_usr@jstest16 lib64]$ ldd -r libxl.so ldd: warning: you do not have execution permission for `./libxl.so' ./libxl.so: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./libxl.so) ./libxl.so: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./libxl.so)         libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002aee5f7eb000)  [app_usr@jstest16 ~]$ cd /settle/oracle_bak/11.2/client_1/lib/stubs/ [app_usr@jstest16 stubs]$ strings libstdc++.so.6 | grep "GLIBC" GLIBCXX_3.4 GLIBCXX_3.4.1 GLIBCXX_3.4.2 [app_usr@jstest16 stubs]$  解决方案 下载最新lib。 ps 现在思路是改一下功能实现的方式。

user: user-1
content: libxl-3.6.5.0库中有未定义符号 ldd -r libname
user-0 提问: 关于循环的问题

回复:
user: user-1
content: 引用 4 楼 visp 的回复:如果你输入的就是3个字符，因为字符串会自动加一个\0，结果这个\0就加到num的地址上了，相当于把num设置成0了。 所以你看到的循环就只执行了一次。    #include<stdio.h> #include<stdlib.h> int main() {    	int num=0;    	scanf("%d",&num);    	getchar(); 	char arr[3]={0}; 	//num和arr的内存地址在一起，过了arr就是num的地址。  	printf("arr:%p\n",arr); 	printf("1_num:%p--%d\n",&num,num); 	while(num--) // 1: 循环 输入 ,问题是循环一次就结了, num的值被修改了.. 	{    		printf("2_num:%p--%d\n",&num,num); 		scanf("%s",arr); //问题出在这里吧。如果你输入的就是3个字符，因为字符串会自动加一个\0，结果这个\0就加到num的地址上了，相当于把num设置成0了。所以你看到的循环就只执行了一次。 		  		printf("3_num:%p--%d\n",&num,num);       		for(int j = 0;j < 3; j++) 			printf("%c ",arr[j]); 		printf("\n");    	} }    ++ 在编译器没做特殊安排的时候 变量是按照定义顺序编址的 自动变量顺序存储的话，由于堆栈是向下扩展的，先定义的在高地址处，后定义的在低地址处 当然，编译器未必这么安排 但很多时候都是这样的，尤其是发布版。

user: user-2
content: 如果你输入的就是3个字符，因为字符串会自动加一个\0，结果这个\0就加到num的地址上了，相当于把num设置成0了。 所以你看到的循环就只执行了一次。    #include<stdio.h> #include<stdlib.h> int main() {    	int num=0;    	scanf("%d",&num);    	getchar(); 	char arr[3]={0}; 	//num和arr的内存地址在一起，过了arr就是num的地址。  	printf("arr:%p\n",arr); 	printf("1_num:%p--%d\n",&num,num); 	while(num--) // 1: 循环 输入 ,问题是循环一次就结了, num的值被修改了.. 	{    		printf("2_num:%p--%d\n",&num,num); 		scanf("%s",arr); //问题出在这里吧。如果你输入的就是3个字符，因为字符串会自动加一个\0，结果这个\0就加到num的地址上了，相当于把num设置成0了。所以你看到的循环就只执行了一次。 		  		printf("3_num:%p--%d\n",&num,num);       		for(int j = 0;j < 3; j++) 			printf("%c ",arr[j]); 		printf("\n");    	} }

user: user-3
content: 二楼说的对啊。你输入的长度很轻易的超过你的定义的字符串长度。第一次肯定能读取，但是越界，占用了字符串后面的内存。所以你第二次循环时，scanf函数对一个越界字符串有问题，所以循环终止。

user: user-4
content: scanf("%s",arr);  的时候出界了。  改成 scanf("%2s", arr) 吧。

user: user-5
content: arr先初始化为0   #include<stdio.h> #include<stdlib.h> int main() {    	int num;    	scanf("%d",&num);    	getchar(); 	char arr[3]={0}; 	while(num--) // 1: 循环 输入 ,问题是循环一次就结了, num的值被修改了.. 	{        		scanf("%s",arr);        		for(int j = 0;j < 3; j++) 			printf("%c ",arr[j]); 		printf("\n");    	} }
user-0 提问: 不用任何编程工具，只用text文本的情况下怎么手动编译执行C语言?

回复:
user: user-1
content: 楼主估计是想问怎么用命令行编译执行c程序。

user: user-2
content: 也许可以    引用 25 楼 u010165006 的回复:[quote=引用 24 楼 lm_whales 的回复:] .com 至少一些简单代码是不需要的重定位的 .com 一般是tiny 模式，不需要设置CS,DS,ES,SS 可以直接从第一个指令执行。 如果采用相对寻址指令，寄存器寻址指令，完全不需要考虑重定位。 我的意思是重定向： C:\>debug <p1.asm [/quote]

user: user-3
content: 引用 24 楼 lm_whales 的回复:.com 至少一些简单代码是不需要的重定位的 .com 一般是tiny 模式，不需要设置CS,DS,ES,SS 可以直接从第一个指令执行。 如果采用相对寻址指令，寄存器寻址指令，完全不需要考虑重定位。 我的意思是重定向： C:\>debug <p1.asm

user: user-2
content: .com 至少一些简单代码是不需要的重定位的 .com 一般是tiny 模式，不需要设置CS,DS,ES,SS 可以直接从第一个指令执行。 如果采用相对寻址指令，寄存器寻址指令，完全不需要考虑重定位。

user: user-3
content: 引用 19 楼 lm_whales 的回复:dos下的.com 比较适合手动编辑 不过，一般不用ed,notepad 等文本文件编辑器 可以用 debug 程序，编写 CCDOS 中文操作系统，是对英文DOS系统的扩展，其中许多程序，据说就是利用debug 编写的 编辑好以后重定向到debug，不是不容易出错和丢失

user: user-4
content: 拿钱请人做事, 不要说text, 一句话就搞定

user: user-5
content: 围观！

user: user-6
content: 引用 17 楼 布拉格曼的回复:[quote=引用 6 楼 lm_whales 的回复:] 1）先把C语言手动变成汇编 2）把汇编变成二进制代码 3）根据目标平台的可执行文件格式，设定某些内容。如堆栈，数据段，代码段，启动地址，甚至中断，重定位表等等     其实就是设定一些数据结构，以便目标平台可以执行。  楼主可以把自己当成CPU、内存、总线、外设和硬盘，然后考虑你的每行代码需要在底层如何执行，接着把每句C写成汇编指令（不含伪指令），然后找到汇编指令转二进制指令译码表，把所有汇编语句改写成二进制01的文件，重写入txt文本（需要考虑系统平台类型和存储格式、CPU类型、核心数和支持的指令集、系统支持的文件系统格式、字节对齐格式、系统堆栈调用格式等等），然后改成.exe后缀（Windows平台）或者复制为无后缀名的副本（Linux平台），就变成可执行程序了，当然在linux下还有一步，需要修改可执行权限，使其能够执行[/quote]

user: user-2
content: dos下的.com 比较适合手动编辑 不过，一般不用ed,notepad 等文本文件编辑器 可以用 debug 程序，编写 CCDOS 中文操作系统，是对英文DOS系统的扩展，其中许多程序，据说就是利用debug 编写的

user: user-7
content: 可是等你完成这一系列过程，终于翻译完成一个小程序后，一个可爱的疯子就诞生了

user: user-7
content: 引用 6 楼 lm_whales 的回复:1）先把C语言手动变成汇编 2）把汇编变成二进制代码 3）根据目标平台的可执行文件格式，设定某些内容。如堆栈，数据段，代码段，启动地址，甚至中断，重定位表等等     其实就是设定一些数据结构，以便目标平台可以执行。  楼主可以把自己当成CPU、内存、总线、外设和硬盘，然后考虑你的每行代码需要在底层如何执行，接着把每句C写成汇编指令（不含伪指令），然后找到汇编指令转二进制指令译码表，把所有汇编语句改写成二进制01的文件，重写入txt文本（需要考虑系统平台类型和存储格式、CPU类型、核心数和支持的指令集、系统支持的文件系统格式、字节对齐格式、系统堆栈调用格式等等），然后改成.exe后缀（Windows平台）或者复制为无后缀名的副本（Linux平台），就变成可执行程序了，当然在linux下还有一步，需要修改可执行权限，使其能够执行

user: user-8
content: 在第一台计算机被制造出来之前，图灵机就已经存在了。

user: user-9
content: 用记事本写好代码，文件后缀用.c，再使用gcc编译。如果不使用任何编译器不可能的。

user: user-10
content: 这么神奇的事情一定要看看

user: user-11
content: 牛！任何工具都不用也能写代码。

user: user-12
content: 使用tcc用命令行方式就可以编译呀

user: user-13
content: 楼主估计描述错了，应该是不用ide的情况下

user: user-14
content: 如果连编译器都不用的话，问题就比较难了，起码我不会 如果可以用编译器的话，通过命令行，网上都能查到

user: user-15
content: 。。。你为什么要这样

user: user-2
content: 另外ALT+小键盘可以输入二进制代码的，虽然看不见，盲输入吧
user-0 提问: 求助，我做的课程设计，主要是最后几个链表的函数，拿出来单独跑的时候没问题， 放在整体里跑的时候说函数定义非法。并没有少大括号。求大神指点迷津。代码和错误如下

回复:
user: user-1
content: 最前面加一句 void zhu();

user: user-2
content: 提供完整的代码

user: user-0
content: 这是有问题的那一部分，单独跑没问题。前面的函数段也没问题 。但只要放在一起就会报错 。。这错误实在看不懂为什么。
user-0 提问: 大神看下这个二维数组   想求每一行中的最大值  输出来总是第一个数

回复:
user: user-1
content: for( k=0 ;k<3 ; k++)      printf("%d",a[k][0]);   这里a[k][0] 肯定就输出第一个数啊，[0][0],[1][0],[2][0]    二维数组 输出也得用2重循环输出！

user: user-2
content: printf("%d",a[k][0]);  你代码中不是每次都只输出第0个元素，也就是最前面那个啊

user: user-0
content: 输出来总是每一行的第一个数。为什么啊？？

user: user-0
content: int& max = a[i][0];   这句话是什么意思  ，能不能告诉我一下   是不是就是把a[i][0]的地址值赋值给 max ,但是数组的形参可以改变实参的吗？

user: user-3
content: void max ( int a[3][4] ) {    int i , j , t ,k;      for( i=0 ; i<3 ; i++ )     {              int& max = a[i][0];         for( j=1 ;j<4 ; j++)          {    if( a[i][j]>max )               {                 t=max;                max=a[i][j];                a[i][j]=t;               }          }   printf("%d",a[i][0]);     }  } 改成这样就可以了。。。不然了解不了你到底要表达啥

user: user-4
content: 不需要交换，重新命名一个数组来接每行最大的数组。输出地就是新数组啦。
user-0 提问: 编写一个餐饮系统。各位大神，请支招

回复:
user: user-1
content: 一步一步来，先把语法打好了一切都简单

user: user-2
content: 不要用C语言，那就什么思路都有。

user: user-0
content: 引用 4 楼 paschen的回复:一步一步来，先把语法打好了一切都简单 嗯嗯，明白了，就是感觉总有一些地方的思路打不通，怎么想都想不明白！

user: user-0
content: 引用 1 楼 Gdreamlend的回复:思路最好还是先自己找找，遇到具体问题再问会比较好 嗯。好的，谢谢！现在正在思考中！

user: user-0
content: 引用 3 楼 sdewenking的回复:不要用C语言，那就什么思路都有。 现在才刚刚学习C语言，其他的语言还没有学。所以只好求助咯！

user: user-3
content: 先写一下你的思路吧，你需要什么功能，每个功能有哪些规则和需求，你自己先列出起来， 把你需要的数据什么的都先设计好，然后开始一步步开始慢慢开发吧， 你的餐饮系统是自己单机用，还是店内小范围，或者大范围的连锁用， 如果是店内用，服务员需不需要用点餐器帮助顾客点餐，还是只需要前台的电脑可以实用就行  比如，用户管理，菜单管理，进货什么的，好多的，看你需要什么

user: user-3
content: 另外别拿c语言编啊，累死你了能

user: user-4
content: 时间 时间 会给你答案。 你的餐饮系统时尚时尚最时尚

user: user-5
content: 思路最好还是先自己找找，遇到具体问题再问会比较好
user-0 提问: b按表达式计算应该是11，为什么在c语言里会变成12了呢？

回复:
user: user-1
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-2
content: 这种表达式具体运行结果，取决你的编译器，别纠结！

user: user-3
content: [C/C 板块推荐阅读] 关于C,C 表达式求值顺序.

user: user-4
content: 未定义行为，+操作符两边的操作数哪个先执行由编译器决定，若先执行左操作数++a，则a变为6，再加a，则为12 若先执行右操作数，则读入a为5，再执行++a，左边为6，和为11

user: user-5
content: 这涉及到顺序点问题  不要写这种表达式  具体搜索 《裘宗燕：C/C++ 语言中的表达式求值》 这篇文章看
user-0 提问: 新人小白求助……纠结一个问题整整一个晚上了。

回复:
user: user-1
content: ld是链接的程序，要把.o或者.obj链接起来成为一个程序，一般找不到需要的链接库会报这样的错误

user: user-2
content: 具体不知道，楼主可以看下https://www.baidu.com/s?wd=Id+returned+1+exit+status&rsv_spt=1&rsv_iqid=0xbd980adb0002ab29&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=monline_3_dg

user: user-3
content: 链接问题, 前面还有什么提示
user-0 提问: 求大神看下有关递归的问题，thanks！

回复:
user: user-1
content: 引用 7 楼 fly_dragon_fly 的回复:直接select int part(int *a,int l,int r){     int x=a[r];     int i =l-1;     for(int j=l;j<r;j++){         if(a[j]<=x) swap(a[++i],a[j]);     }     swap(a[++i],a[r]);     return i; }  int select(int *a,int l,int r,int k){     if(l==r) return a[l];     int piv =part(a,l,r),pos=piv-l+1;     if(pos==k) return a[piv];     if(k<pos) return select(a,l,piv-1,k);     return select(a,piv+1,r,k-pos); }++ 快速选择，和快速排序思路是一样的

user: user-2
content: 直接select int part(int *a,int l,int r){     int x=a[r];     int i =l-1;     for(int j=l;j<r;j++){         if(a[j]<=x) swap(a[++i],a[j]);     }     swap(a[++i],a[r]);     return i; }  int select(int *a,int l,int r,int k){     if(l==r) return a[l];     int piv =part(a,l,r),pos=piv-l+1;     if(pos==k) return a[piv];     if(k<pos) return select(a,l,piv-1,k);     return select(a,piv+1,r,k-pos); }

user: user-3
content: // 伪代码，改良版算法，不用返回结构体，直接返回要求的值 Elem_t f(Sequence T, int k) { 	if (k == 1) 	{ 		return min(T); 	} 	else 	{ 		T.delete(min(T)); 		--k; 		return f(T, k); 	} }

user: user-3
content: 引用 4 楼 ipqtjmqj 的回复: // 伪代码 // 思路：若k为1，其实就是求最小值，若k为2，则先把最小的删除，从剩下的数据里面求最小值 struct S { 	Sequence T; 	Elem_t elem; }; S f(S s, k) { 	if (k == 1) 	{ 		min_elem = min(T); 		s.T.delete(min_elem); 		return S(s, min_elem); 	} 	else return f(f(s, k - 1), 1); }   写错了，return S(s, min_elem)改成return S(s.T, min_elem);

user: user-3
content: // 伪代码 // 思路：若k为1，其实就是求最小值，若k为2，则先把最小的删除，从剩下的数据里面求最小值 struct S { 	Sequence T; 	Elem_t elem; }; S f(S s, k) { 	if (k == 1) 	{ 		min_elem = min(T); 		s.T.delete(min_elem); 		return S(s, min_elem); 	} 	else return f(f(s, k - 1), 1); }

user: user-4
content: 引用 2 楼 u012990628 的回复:如果只是用排序，当然可以找到第k小元素，只是现在题目要求用递归的方法来解决。  归并排序可以用递归实现

user: user-0
content: 如果只是用排序，当然可以找到第k小元素，只是现在题目要求用递归的方法来解决。

user: user-5
content: 排序用递归，难道是要用快排？ 恕我孤陋寡闻
user-0 提问: 大神们帮忙看看是怎么回事啊！c语言，大数据的相乘，（大数据的加法）和（大数据和一位数相乘）的函数是对的，但是最后老是不能够运行

回复:
user: user-0

user: user-0
content: 就是无法运行
user-0 提问: C语言简单的文件操作问题！

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

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

user: user-0
content: 不好意思！各位 打错了  怪不得！

user: user-2
content: while ((ch = getchar())!= '\n')   你那个语句是什么鬼？

user: user-3
content: getchar不是读文件的

user: user-4
content: getchar();函数不是从文件里去数据吧。fgetc()函数吧。
user-0 提问: 大神看过来：问一个有关指向指针的指针的问题

回复:
user: user-1
content: 引用 13 楼 lm_whales 的回复:int a[100]={....}; int *p[100]={a,a+1,a+2,a+3,...,a+99}; sort(p,100);  **(p+i),,,,,  要这么做噢 只要 *（p+i）

user: user-1
content: int a[100]={....}; int *p[100]={a,a+1,a+2,a+3,...,a+99}; sort(p,100);  **(p+i),,,,,  要这么做

user: user-2
content: 改成：printf("%d",**(p+i));  注意细节问题

user: user-0
content: 不是我是想比较数值，不是字符串，可以用关系运算符比较吧。 把&加上了以后还是不行，输出的是一串奇怪的数字... 求解答

user: user-0
content: ...都改了还不行 问一下if那里是不是也要两个*才能比较值呢

user: user-0
content: 不对，要加**（p+i)才能输出.................. 我一直以为指向指针的指针加两个**就是值，加一个*就是地址 原来指向数组的指针也要加两个*，才能输出值

user: user-3
content: 你在字符串比较使用的是＜，要用函数str的。

user: user-0
content: 不好意思啊...我好像没说明白...我现在懂了那个要交换地址而不是交换字符串了，我想问的是第二个程序错在哪了...那个scanf("%d",&a[i]);我已经改了还是不行，第二个程序比较的不是字符串，是数值.....还有zhao4zhong1大神说的很有道理...以后有时间我会去学汇编语言的...还有paschen说的**（p+i），那个p是在main函数里的，它指向一维数组，输出时加一个*就可以了吧。

user: user-2
content: 除楼上说的，还有把 scanf("%d",a[i]);  要改成  scanf("%d",&a[i]);

user: user-4
content: scanf("%d",a[i]); 加引用，一般初学者必犯的错误

user: user-5
content: 1) 交换指针,内容不一定能交换, 象你这个 定义 char*string[5], string的内容是const char *, 不能更改的 2) 字符比较不能用<

user: user-0
content: 另外问一下如何调试一个程序，就是断点啊什么的，编译器是vc++6.0

user: user-6
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-1
content: 当然用字符串比较了， 你比较字符串地址有何意义， 你不需要按照地址排序。 很少有需要比较地址（指针）的时候， 除非你是做内存管理 等等。  交换地址有两个原因， 1）是 常量不可以修改 2）是 修改字符串本身，比修改指针慢多了
user-0 提问: 请教一个小白问题。

回复:
user: user-1
content: 引用 5 楼 qq_30881357 的回复:还是不懂。。。。。。。。  你想懂要看书啊。。一下说不清的

user: user-2
content: 仅供参考：#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {     PAINTSTRUCT ps;     HDC hdc;     HFONT hfont,ohfont;     RECT r;     COLORREF oc;      switch(message) {     case WM_CLOSE://按Alt+F4退出         PostQuitMessage(0);         break;     case WM_PAINT:         BeginPaint(hWnd, &ps);         hdc = ps.hdc; // the device context to draw in         GetClientRect(hWnd, &r); // Obtain the window's client rectangle         hfont = CreateFont(200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");         ohfont=(HFONT)SelectObject(hdc,hfont);         oc=SetTextColor(hdc,0x00C080FF);         SetBkMode(hdc, TRANSPARENT);         TextOut(hdc,r.left+r.right/2-600, r.top+r.bottom/2-100,"最短画图程序",12);         SelectObject(hdc,ohfont);         SetTextColor(hdc,oc);         DeleteObject(hfont);         EndPaint(hWnd, &ps);         break;     default:         return DefWindowProc(hWnd, message, wParam, lParam);     }     return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {     MSG msg             = {0};     WNDCLASS wc         = {0};     HBRUSH hbrh;     hbrh=CreateSolidBrush(0x00000000);     wc.lpfnWndProc      = WndProc;     wc.hInstance        = hInstance;     wc.hbrBackground    = hbrh;     wc.lpszClassName    = "minwindowsapp";     wc.hCursor          = LoadCursor(NULL,IDC_ARROW);     if( FAILED(RegisterClass(&wc)) ) return 1;      if(FAILED(CreateWindow(wc.lpszClassName,                         "Minimal Windows Application",                         WS_POPUP|WS_VISIBLE,                         0,                         0,                         GetSystemMetrics(SM_CXSCREEN),                         GetSystemMetrics(SM_CYSCREEN),                         0,                         0,                         hInstance,                         NULL)))         return 2;      while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {         DispatchMessage( &msg );     }     DeleteObject(hbrh);     return 0; }

user: user-0
content: 还是不懂。。。。。。。。

user: user-1
content: 引用 1 楼 paschen 的回复:直接用SDK包里的API，所以VB属于快速开发语言啊  操作系统会提供一些标准通用控件  他建一个窗口需要注册窗口类，需要考虑消息循环等，不像VB那么方便

user: user-0
content: 引用 1 楼 paschen的回复:直接用SDK包里的API，所以VB属于快速开发语言啊

user: user-3
content: 应该是有可用的开发包

user: user-1
content: 直接用SDK包里的API，所以VB属于快速开发语言啊

user: user-4
content: windows编程 win32项目 EasyX
user-0 提问: 求大神看一下两个查找出现了什么问题，我完全看不懂编译错误

回复:
user: user-1
content: 估计是link错误吧…增量链接出错之类的问题

user: user-2
content: 什么编译错误，给出错误信息

user: user-3
content: 试了一下代码,没编译错误?
user-0 提问: 求大神~哈夫曼编码，那里错了

回复:
user: user-0
content: 别沉啊………求大神呀

user: user-0
content: 引用 1 楼 user-1 的回复:大括号不匹配，main前少了 }  有吗？没发现····求明示

user: user-1
content: 大括号不匹配，main前少了 }
user-0 提问: 实在没发现哪里错了。。。

回复:
user: user-0
content: 引用 3 楼 myownroc 的回复:另外你这算法有点瑕疵，当n<=1时没有跳出循环谢谢，我也发现这个问题了

user: user-0
content: 引用 2 楼 user-2 的回复:sum没有初始化为0谢谢

user: user-1
content: 另外你这算法有点瑕疵，当n<=1时没有跳出循环

user: user-2
content: sum没有初始化为0

user: user-1
content: 前面加一句sum = 0; 因为你的sum并不是0……
user-0 提问: C语言自动变量问题

回复:
user: user-1
content: 这个要看系统内核对于栈上临时数据是否有清除操作而言了。 首先：局部自动变量一般是在栈上分配内存； 其次：有的系统使用完栈上数据后不做清除，所以值能留存，直到下一次覆写该内存地址的值，有的直接删掉，所以可能出现随机值。

user: user-2
content: 引用 6 楼 paschen 的回复:编译当然不会出错，但你p指向的内存已被回收，之所以结果也是1是因为上面的值还没被其他内容覆盖，这是一种不确定行为++

user: user-3
content: 编译当然不会出错，但你p指向的内存已被回收，之所以结果也是1是因为上面的值还没被其他内容覆盖，这是一种不确定行为

user: user-4
content: 这是局部变量，放在函数堆栈中，因为你现在是用指针访问的，而且这个堆栈还没有被释放（被重写），所以里面的内容还是1。但是，如果你用i来引用的话，编译器应该保错。这个现象，是由于编译器是无法对指针进行检查导致的。

user: user-5
content: 从语言来说, i已经无效,, 所以p指向地址也应该无效,但编译器才不管这些, 运行了再说

user: user-6
content: 应该是作用域的问题吧， p的作用域包含了if代码块里的i的作用域， 书上认为存储类不同可能， 我也不太确定，欢迎指正

user: user-7
content: int *p = NULL; if (1) { int i = 1;  // &i = 0x7fff5fbffa6c p = &i;  // p = 0x7fff5fbffa6c } printf("\n"); //加这一行再试试 printf("%d", *p);  // p =0x7fff5fbffa6c, p = 1

user: user-8
content: 错误的程序可能得到任何结果，包括期望得到的结果。
user-0 提问: 大神们 求帮助！！

回复:
user: user-1
content: 这个很基础，建议楼主自己动手试下，遇到问题可以来论坛讨论，可以把代码附上，会有很多人帮你解答的

user: user-2
content: 简单,找大二的要

user: user-3
content: 比我还懒

user: user-4
content: 有在这等，还不如去网上搜呢，这个概率更大，这题网上都能搜到的，你还注册帐号来提问。

user: user-5
content: 顶楼上的！ 说明你上课没认真听！ 说真的这样的问题很简单的！ 既然老师让你写着 说明最少也是教到数组指针那里了， 都学到这了！还写不出这样的程序 ，只能说明你没认真学，也没认真做 我是实话实说 ！

user: user-6
content: 你得自己写个大概，然后到这里来问具体问题。 这么上来让别人给编程序，有回复的可能性不大。也显得你自己一点都没付出。   当然，你赌这个概率就另说了。
user-0 提问: hack.c怎么通过注入msg.dll的方式使得messageBox标题从"message"变成“hacked”

回复:
user: user-1
content: WinAPIOverridehttp://jacquelin.potier.free.fr/winapioverride32/

user: user-0
content: 我使用ollydbg看到message地址是0x6E721000 这样可以完成任务 但是由于dll每次基地址不一样 每次都要变换一次代码中message的地址才可以得到正确的输出 用LoadLibrary函数可以得到dll入口地址 messa偏移量也是固定的 哪问题是：怎么才能通过偏移量+基地址得到message的地址呢？    #include <windows.h> #include<stdio.h>  int main(int argc, char *argv[]) {     int pid = 0;     HANDLE hproc = 0;     char *s = "Hacked";      // YOU MAY NEED MORE LOCAL VARIABLES     // PLEASE ADD THEM HERE 	int address_i=0x6e721000; 	DWORD storage=0x00; 	HMODULE hDllLib = LoadLibrary("msg.dll"); 	FARPROC fpFun = GetProcAddress(hDllLib,"ShowMsg"); 	printf("%x\n",fpFun);      //shouMsg地址 	storage=(DWORD)fpFun; 	 	PBYTE   pCodeRemote = NULL; 	HANDLE hChange=0; 	hChange=(HANDLE)fpFun; 	printf("%x\n",hChange); 	DWORD   dwNumBytesXferred = 0; 	PBYTE   pCode      = NULL;     DWORD   dwSizeOfCode = 0;          HANDLE  hThread	   = 0;     DWORD   dwThreadId = 0;     int	    exitcode   = 0; 	//sprintf(address_i,"%x",fpFun); 	/*  __asm{ 		lea eax,s 		push eax 		call fpFun 		mov storage,eax 	}  */      if (argc < 2) {         printf("Usage: %s pid\n", argv[0]);         return -1;     }     pid = atoi(argv[1]);     if (pid <= 0) {         printf("[E]: pid must be positive (pid>0)!\n");          return -2;     }  	pCode = (PBYTE)code;     dwSizeOfCode = sizeof(code); 	     hproc = OpenProcess(PROCESS_CREATE_THREAD          | PROCESS_QUERY_INFORMATION         | PROCESS_VM_OPERATION          | PROCESS_VM_WRITE          | PROCESS_VM_READ,         FALSE, pid);   // FILL YOUR CODE HERE 	WriteProcessMemory(hproc,(LPVOID)address_i, s, 11,  NULL); 	 		 		     return 0; }

user: user-0
content: (1) 请按照下列要求生成msg.dll:   > cl /c msg.c   > link /DLL /DYNAMICBASE msg.obj (2) 请按照下列要求编译链接生成hellow.exe文件:   > cl /c hellow.c   > link /DYNAMICBASE:no /BASE:0x00400000 hellow.obj msg.lib
user-0 提问: 求大神帮我看看这个程序错在哪

回复:
user: user-1
content: 引用 1 楼 ChWeshun的回复:c这个变量都没有用到啊，simple里面最后一个can't应该是can吧，没看到题目我也不清楚，题目应该有多空格的测试数据吧，没说单词之间只能有一个空格吧，你再试试，我也是新手。 打错了，sample

user: user-1
content: c这个变量都没有用到啊，simple里面最后一个can't应该是can吧，没看到题目我也不清楚，题目应该有多空格的测试数据吧，没说单词之间只能有一个空格吧，你再试试，我也是新手。

user: user-2
content: 例子有没有问题, 为什么?都在后面
user-0 提问: C语言小白问一个关于指针的问题~~~~~

回复:
user: user-1
content: #include <stdio.h> int strcmp(char *p1,char *p2); int main() { char s1[99],s2[99];//定义字符串 必须加长度 char *p1,*p2; p1=s1; p2=s2; printf("Please enter 2 strings:\n"); scanf("%s%s",s1,s2); printf("the result is %d",strcmp(p1,p2)); return 0; }   int strcmp(char *p1,char *p2) {   int m;  while(*p1!='\0'&&*p2!='\0')  { 	p1++; 	p2++; 	if( (*(p1)>*(p2))||(*(p1)<*(p2)))   	{  		m=*p1-*p2;   		break;   	}  	if(*(p1)==*(p2))    	m=0;  } return m; }   根据个人习惯改了下，经测试可以达到你的要求。

user: user-1
content: #include <stdio.h> int strcmp(char *p1,char *p2); int main() { char s1[99],s2[99];//定义字符串 必须加长度 char *p1,*p2; p1=s1; p2=s2; printf("Please enter 2 strings:\n"); scanf("%s%s",s1,s2); printf("the result is %d",strcmp(p1,p2)); return 0; }   int strcmp(char *p1,char *p2) {   int m;  while(*p1!='\0'&&*p2!='\0')  { 	p1++; 	p2++; 	if( (*(p1)>*(p2))||(*(p1)<*(p2)))   	{  		m=*p1-*p2;   		break;   	}  	if(*(p1)==*(p2))    	m=0;  } return m; }  根据个人习惯改了下，经测试，达到你的要求。

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

user: user-0
content: 感谢各位大神啊，高激动这么多人回复

user: user-3
content: 小细节没仔细看了，只看大方向上的。 while((flag=0)&&(*p1!='\0')) { if( (*(p1++)>*(p2++))||(*(p1++)<*(p2++))) { m=*p1-*p2; flag=1; }  else if((*(p1++)==*(p2++))) m=0; 你这里想法是测试两个字符大于或小于怎么样做，然后如果相等怎么样做。但是你上下两个字符都不一样，因为你上面执行后++了，两个不一样结果肯定不对

user: user-4
content: 有一些问题，可能还有其他，你先改了这些看一下，可能还有其他问题：  首先你没检查p2是否到\0 其次，如果p1为空，将不会进入循环，返回的m将是一个不确定的值 另外，可以不用定义flag，当满足条件时break即可

user: user-5
content: 第一个：是的。系统自动将字符看做是一个ASCII数值进行运算。 第二个：可以的，他们都是字符指针，字符数组当右值运算时，自动看做是首元素的指针。 你的strcmp函数里不应该是“flag=0”而是“flag==0”

user: user-6
content: while(*p1!='\0'||*p2!='\0')   这样就都可以了   你测试一下

user: user-6
content: #include <stdio.h> int strcmp(char *p1,char *p2); int main() { char s1[99],s2[99];//定义字符串 必须加长度 char *p1,*p2;  printf("Please enter 2 strings:\n"); scanf("%s%s",s1,s2); p1=s1; p2=s2; printf("the result is %d",strcmp(p1,p2)); return 0; }   int strcmp(char *p1,char *p2) {   int m=0;  while(*p1!='\0'&&*p2!='\0')  { 	if( (*(p1)>*(p2))||(*(p1)<*(p2)))   	{  		m=m+*p1-*p2;   	}  	else     		m=0;    	p1++; 	p2++;  } return m; }

user: user-7
content: 跑一下单步就知道问题在哪了 while((flag=0)&&(*p1!='\0'))中(flag=0)&&(*p1!='\0') <--> 0&&(*p1!='\0') <--> 0  实际运行的是  int strcmp(char *p1,char *p2) { int m,flag=0;  return m; } 由于m未赋值，VC的初值是0xcccccccc，即-858993460

user: user-8
content: printf("Please enter 2 strings:"); scanf("%s %s",&s1,&s2);       //s1,s2已经是首地址了,不用加&       因此改为scanf("%s %s",s1,s2);

user: user-0
content: 有两个问题不太明白 第一个 对于字符的比较 系统自动认为是比较ASCII码吗，对于字符相减，系统就自动转为ASCII码相减吗 第二个 char *p1,*p2; p1=s1; p2=s2; printf("the result is %d",strcmp(p1,p2)); 这四行中可不可以去掉前三行，直接让s1，s2 作实参呀  十分感谢
user-0 提问: 数组的地址加4是多少？

回复:
user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-2
content: 不同的系统，int类型所占字节不一样。数组名就是首地址，为何&

user: user-3
content: int类型是四个字节，假如数组首元素的地址是100，那么加四个int应该是116才对。

user: user-4
content: int *ip=ints+3; 等价  int *ip=&ints[3];

user: user-5
content: 假如指针类型是T （T不是void*）， 指针+n  移动的距离是   n*sizeof(T) 也就 是说int*指针加1就已经移动了4了

user: user-6
content: 你试试ints+4是不是104，不要看&ints+4，因为ints本来就是首元素地址，如果再取地址就很难说是什么值。

user: user-7
content: ints本身就是数组起始地址啊

user: user-8
content: 引用 8 楼 user-10 的回复:ints的类型是int [20] 那么&ints的类型是int (*)[20]，指向一个有20个int元素的数组的指针 因此，&ints+4的值是ints向后4*20*sizeof(int)  在32位环境，sizeof(int) = 4的情况下 假定ints数组在内存中的起始位置是100， &ints+4的值是420  ++

user: user-9
content: 引用 8 楼 user-10 的回复:ints的类型是int [20] 那么&ints的类型是int (*)[20]，指向一个有20个int元素的数组的指针 因此，&ints+4的值是ints向后4*20*sizeof(int)  在32位环境，sizeof(int) = 4的情况下 假定ints数组在内存中的起始位置是100， &ints+4的值是420 正解。 ints类型是Int* &ints类型是Int(*)[20]

user: user-10
content: ints的类型是int [20] 那么&ints的类型是int (*)[20]，指向一个有20个int元素的数组的指针 因此，&ints+4的值是ints向后4*20*sizeof(int)  在32位环境，sizeof(int) = 4的情况下 假定ints数组在内存中的起始位置是100， &ints+4的值是420
user-0 提问: 关于if后面的return

回复:
user: user-1
content: 引用 3 楼 fefe82 的回复:引用 2 楼 sinat_32955693 的回复:[quote=引用 1楼user-3 的回复:]你的isPrime不是所有路径都有返回值，如果不满足if，你也需要指定一个返回值我在第一个if后再加个返回0它是可以正常输出，就是说只有这一个if的话无论满不满足都会返回n么？  一个有返回值的函数没有遇到 return 就结束是一个未定义行为，也就是说，什么都可能发生。[/quote] 最可能发生的就是寄存器eax（Win32）或寄存器rax（Win64）的值被当作函数返回值返回了。

user: user-0
content: 引用 3楼fefe82 的回复:引用 2 楼 sinat_32955693 的回复:[quote=引用 1楼user-3 的回复:]你的isPrime不是所有路径都有返回值，如果不满足if，你也需要指定一个返回值我在第一个if后再加个返回0它是可以正常输出，就是说只有这一个if的话无论满不满足都会返回n么？  一个有返回值的函数没有遇到 return 就结束是一个未定义行为，也就是说，什么都可能发生。[/quote]这样啊，谢谢

user: user-2
content: 引用 2 楼 sinat_32955693 的回复:引用 1楼user-3 的回复:你的isPrime不是所有路径都有返回值，如果不满足if，你也需要指定一个返回值我在第一个if后再加个返回0它是可以正常输出，就是说只有这一个if的话无论满不满足都会返回n么？  一个有返回值的函数没有遇到 return 就结束是一个未定义行为，也就是说，什么都可能发生。

user: user-0
content: 引用 1楼user-3 的回复:你的isPrime不是所有路径都有返回值，如果不满足if，你也需要指定一个返回值我在第一个if后再加个返回0它是可以正常输出，就是说只有这一个if的话无论满不满足都会返回n么？

user: user-3
content: 你的isPrime不是所有路径都有返回值，如果不满足if，你也需要指定一个返回值
user-0 提问: cgi处理上传的文件，图片

回复:
user: user-1
content: 有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行！ 写日志到文件参考下面： #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-78行添加到你带main的.c或.cpp的那个文件的最前面 //81-85行添加到你的main函数开头 //89-93行添加到你的main函数结束前 //在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中
user-0 提问: 顺序表主函数里，往顺序表中存数据，然后打印出来怎么和预期效果不一样啊，是没存进去数据吗，求指导

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

user: user-0
content: 引用 1 楼 user-2 的回复:InitList_sq中设置L.length 为0，Length一直为0 charu函数中执行完了第一句就返回了明白了  谢谢  调试好了

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:main里面最后的for应改为     for(i=0;i<L.length;i++)调试好了谢谢您 原来有很多注意不到的地方

user: user-1
content: main里面最后的for应改为     for(i=0;i<L.length;i++)

user: user-1
content: charu的第一句     if(i<1||i>L.length) return 0; 应改为     if(i<1||i>L.length+1) return 0;

user: user-1
content: charu里面return 0;之前加一句++L.length;

user: user-2
content: InitList_sq中设置L.length 为0，Length一直为0 charu函数中执行完了第一句就返回了
user-0 提问: 关于(临时变量)栈区的释放问题(疑惑)

回复:
user: user-0
content: 引用 4 楼 qldsrx 的回复:按照你的意思，销毁必须是要写入其它内容，但是这个写入也有开销，是没任何必要的。你访问的是不确定数据，而不是非法数据，也许会被其它地方给改写，但你的这个逻辑里面只执行了一个函数，没有改写的机会。 我明白了 ,感谢两位大神@qldsrx @赵4老师

user: user-1
content: int *a ;野指针 a;局部自动变量不会自动初始化 *a = 100  向一个不能确定是什么位置的内存单元，写入整型数据100,恰巧没出问题。 p=a;用野指针 给全局变量指针p赋值，结果p还是一个野指针 return a；返回一个野指针。  如此而已 你的程序和你的问题无关。

user: user-2
content: 按照你的意思，销毁必须是要写入其它内容，但是这个写入也有开销，是没任何必要的。你访问的是不确定数据，而不是非法数据，也许会被其它地方给改写，但你的这个逻辑里面只执行了一个函数，没有改写的机会。

user: user-3
content: #include <stdio.h>  int *p;  int * fuc() {     int b;     int *a=&b;     *a = 100;     printf("a=%p,*a=%d\n",a,*a);     p=a;     return a;  }  int * fuc2() {     int b;     int *a=&b;     *a = 222;     printf("a=%p,*a=%d\n",a,*a);     p=a;     return a;  }  int * fuc3() {     char b[4]={'\x12','\x34','\x56','\x78'};     int *a=(int *)&b[0];     return a; }  int main(int argc,const char *argv[] ) {      fuc();     printf("after fun  p=%p,*p=%d\n",p,*p);     fuc2();     printf("after fun2 p=%p,*p=%d\n",p,*p);     fuc3();     printf("after fun3 p=%p,*p=%d\n",p,*p);      return 0; }  //a=0012FF44,*a=100 //after fun  p=0012FF44,*p=100 //a=0012FF38,*a=222 //after fun2 p=0012FF38,*p=222 //after fun3 p=0012FF38,*p=1244984 //

user: user-4
content: 再另外，你程序中的a是个野指针，你应该写成int a = 100; p = &a;

user: user-4
content: 内存不在有效，但该内存的值保留了之前留下的，但当其他函数/变量等使用时就会将其覆盖了
user-0 提问: 大伙看看这段代码

回复:
user: user-1
content: 都是大神啊 ,受教了.

user: user-2
content: sizeof(i) 得到的是unsigned int 类型   在比较时会将long类型的-1转换成unsigned int ， 导致比较结果不地  可以写成：if (i < (long)sizeof(i))

user: user-3
content: #include <stdio.h> int main(int argc, char** argv) {      long i = -1;        if (i < (signed)sizeof(i)) { printf("OK\n"); } else { printf("error\n"); } return 0;  }
user-0 提问: error C2143: syntax error : missing ';' before '*'错误求大神！

回复:
user: user-0
content: 我终于把这个问题弄出来了······心力交猝····· 首先，谢谢各位大神 以下献给也许某一天犯了一样错误的正在百度的和我一样的小白：  死在了互相包含上 //A.h文件 #include B.h class a {   B::b(); ```` } //B.h文件 #include A.h class B {   A::a() } 就是这个意思。 改： 加前向声明 //A.h文件 #include B.h class B; class a {   B::b(); ```` } //B.h文件 #include A.h//这货还是要写上啊，不写还是会错····· class A; class B {   A::a() } 完了。

user: user-1
content: 引用 4 楼 baidu_27994971 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。 好吧·····同一个.h,在类的外面定义一个结构体，然后在类里面使用这个结构体，是直接用吗？用不用声明什么的？[/quote] 需要前置声明

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。 好吧·····同一个.h,在类的外面定义一个结构体，然后在类里面使用这个结构体，是直接用吗？用不用声明什么的？

user: user-2
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-3
content: 错误定位在哪行  你给的文件不全，不好帮你调试，你检查括号是否对称，还有语句是否完整，有没用分号结束
user-0 提问: 编译用c语言编写的应用程序时链接库编译和用库源码直接编译占用内存有没有区别，主要是.bss段的占用区别

回复:
user: user-1
content: 静态链接的话，.a 实际就是一堆 .o 放一起了，应该和全用源码是一样的。

user: user-2
content: 引用 2 楼 fangqingwang 的回复:我用批处理的方式编译，只是链接库的时候编译不能通过，同时链接库和加入库的源码才能编译通过，应该不是那么简单 静态库编译选项要和 可执行程序的一样。

user: user-0
content: 我用批处理的方式编译，只是链接库的时候编译不能通过，同时链接库和加入库的源码才能编译通过，应该不是那么简单
user-0 提问: 小白求问C语言问题——如何实现如果在一定时间内没有输入就跳过一段代码，继续执行下面的？

回复:
user: user-1
content: #include <windows.h> #include <conio.h>  int main() { 	printf("如果你三秒钟之内什么也不输入，我就输出-1。\n"); 	Sleep(3000); 	if(!_kbhit()) 		printf("-1\n"); 	else 		printf("输入了%c", getchar()); 	return 0; }

user: user-1
content: 另可这样改进：把判断放在一个循环里，同时在循环中检查时间是否超出，这样在用户有输入的情况下不用等3秒后才往后执行

user: user-2
content: 第18行 if (k==0 || k==0xe0) k=(k<<8)|_getch(); 应改为 if (k==0 || k==0xe0) k|=_getch()<<8;

user: user-2
content: 继承楼上： #include <windows.h> #include <conio.h> #include <stdio.h> #include <locale.h> int main() {     int k;      setlocale(LC_ALL,"chs");     printf("如果你三秒钟之内什么也不输入，我就输出-1。\n");     Sleep(3000);     if(!_kbhit())         printf("-1\n");     else {         printf("输入了");         while (1) {             if (_kbhit()) {                 k=_getch();                 if (k==0 || k==0xe0) k=(k<<8)|_getch();                 if (0x21<=k && k<=0x7E) printf("%c",k);                 else printf("<%04x>",(unsigned)k);             } else break;         }         printf("\n");     }     return 0; }

user: user-0
content: 多谢大神们了 真的很有帮助
user-0 提问: 已有C源文件和头文件，用什么编译器，如何,生成DOS下.exe

回复:
user: user-1
content: bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028

user: user-2
content: BC,TC 都可以 MS也是有DOS下的C的 也是两个版本 MSC，quick C 直到VC

user: user-2
content: 还可以用 Watcom C 号称最快

user: user-3
content: DOS？ 那就是 Turbo C

user: user-4
content: MASM ？

user: user-5
content: 【C/C++程序设计学习与实验系统】 自带Turbo C、VC6 编译器，自带DOSBox，TC生成的exe可以直接在DOSBox下运行。
user-0 提问: 数组按指针间接取值怎么出错了，为什么？

回复:
user: user-1
content: 抱歉，误导大家了。改成mp=&matrix  或者mp=matrix   都可以的！

user: user-2
content: 引用 4 楼 u012237109 的回复:mp=&matrix[3][4]; &这个表示取数组的所以指针  改为mp=matrix[3][4];   别乱回复好吗

user: user-1
content: mp=&matrix[3][4]; &这个表示取数组的所以指针  改为mp=matrix[3][4];

user: user-2
content: 改成这样：mp=&matrix[0][0];

user: user-2
content: mp=&matrix[3][4]; 越界了

user: user-3
content: 注意这一句mp=&matrix[3][4]; matrix[3][4]是什么？这表示二维数组的第3行第4列，然而。。。你的matrix根本就没这么大。。。
user-0 提问: id=6d9a926cf49846f286a37a8af7cab7f8 =后面是加了什么进制怎么还原

回复:
user: user-1
content: 引用 8 楼 qq_33068399 的回复:[quote=引用 7 楼 paschen 的回复:] [quote=引用 6 楼 qq_33068399 的回复:] [quote=引用 5 楼 DelphiGuy 的回复:] id=6d9a926cf49846f286a37a8af7cab7f8 16个字节，估计就是md5做的hash。  恩。都说是这样的  那如果ID=123456  我加密成id=959d4976ef1144b086f423fe8c103f7b    我可以用ID=123456 打开网页吗[/quote]   那你加密了干嘛[/quote]   别人加的[/quote]   具体看他程序怎么处理加密与解密

user: user-0
content: 引用 7 楼 paschen 的回复:[quote=引用 6 楼 qq_33068399 的回复:] [quote=引用 5 楼 DelphiGuy 的回复:] id=6d9a926cf49846f286a37a8af7cab7f8 16个字节，估计就是md5做的hash。  恩。都说是这样的  那如果ID=123456  我加密成id=959d4976ef1144b086f423fe8c103f7b    我可以用ID=123456 打开网页吗[/quote]   那你加密了干嘛[/quote]   别人加的

user: user-1
content: 引用 6 楼 qq_33068399 的回复:[quote=引用 5 楼 DelphiGuy 的回复:] id=6d9a926cf49846f286a37a8af7cab7f8 16个字节，估计就是md5做的hash。  恩。都说是这样的  那如果ID=123456  我加密成id=959d4976ef1144b086f423fe8c103f7b    我可以用ID=123456 打开网页吗[/quote]   那你加密了干嘛

user: user-0
content: 引用 5 楼 DelphiGuy 的回复:id=6d9a926cf49846f286a37a8af7cab7f8 16个字节，估计就是md5做的hash。  恩。都说是这样的  那如果ID=123456  我加密成id=959d4976ef1144b086f423fe8c103f7b    我可以用ID=123456 打开网页吗

user: user-2
content: id=6d9a926cf49846f286a37a8af7cab7f8 16个字节，估计就是md5做的hash。

user: user-0
content: 引用 2 楼 paschen 的回复:你是用什么方法加密的，而且有些加密方式是不可逆的，就是逆推不回去的 那如果ID=123456  我加密成id=959d4976ef1144b086f423fe8c103f7b    我可以用ID=123456 打开网页吗

user: user-0
content: 那如果ID=123456  我加密成id=959d4976ef1144b086f423fe8c103f7b    我可以用ID=123456 打开网页吗

user: user-1
content: 你是用什么方法加密的，而且有些加密方式是不可逆的，就是逆推不回去的

user: user-0
content: 加密说错了
user-0 提问: [算法求助] 谁是最懒的老鼠？

回复:
user: user-0
content: #include <stdio.h> #include <math.h>  #define N 20 #define K 10  typedef struct node{     int position;     int distance; }data;  data pos[N][K];  int main() {     int n, k;     int i, j, m;     int minPositon;         //logic order          while (scanf("%d%d", &n, &k) != EOF) {         for(i=0; i<n; ++i)             for(j=0; j<k; ++j)                 scanf("%d", &pos[i][j].position);         if(n==1) {             printf("0\n");             continue;         }         for (i=1; i<n; ++i)             for(j=0; j<k; ++j) {                 pos[i][j].distance = abs(pos[i][j].position - pos[i-1][0].position) + pos[i-1][0].distance;                                  for(m=1; m<k; ++m)                     if (pos[i][j].distance > (abs(pos[i][j].position                                                   - pos[i-1][m].position) + pos[i-1][m].distance))                         pos[i][j].distance = abs(pos[i][j].position                                                  - pos[i-1][m].position) + pos[i-1][m].distance;             }         minPositon = 0;         for(i=1; i<k; ++i)             if (pos[n-1][minPositon].distance > pos[n-1][i].distance) {                 minPositon = i;             }         printf("%d\n", pos[n-1][minPositon].distance);     }     return 0; }

user: user-0
content: 上面是解答这道题的代码，用的是动态规划

user: user-0
content: 引用 6 楼 lm_whales 的回复:对每次的食物序列 排序 把 1000个位置 分成10等分或M等分处则相等 如果有三个序列的点处在同一个等分处则最短必在此范围内 ，如果有三序列的点聚集在每一个等分两侧 最短也可能在此处 没有扩大范围再找，有缩小范围再找 当点数小于 6个时候可以直接比较了。 抱歉，我对图这一块不太熟悉，能麻烦你在给个代码实现吗？

user: user-1
content: 对每次的食物序列 排序 把 1000个位置 分成10等分或M等分处则相等 如果有三个序列的点处在同一个等分处则最短必在此范围内 ，如果有三序列的点聚集在每一个等分两侧 最短也可能在此处 没有扩大范围再找，有缩小范围再找 当点数小于 6个时候可以直接比较了。

user: user-0
content: 引用 3 楼 lm_whales 的回复:这不是随机，已经不是随机了 而是 每次出现一个食物位置序列 这样就是三次的位置之间最短即可。 能给个算法吗？

user: user-2
content: 动态规划 就可以了

user: user-1
content: 这不是随机，已经不是随机了 而是 每次出现一个食物位置序列 这样就是三次的位置之间最短即可。

user: user-0
content: 麻烦大神帮忙一下

user: user-0
content: 帮这道题想了一个好玩的背景，不知道是不是画蛇添足了，要是描述不到位，请不要骂我 这道题，是关于“最短路径的问题”。用数学语言讲：在x轴上，移动k次，如何使得移动的距离最短（其中，每次只能移动到指定几个点中的一个）。 请大神，帮忙解一下
user-0 提问: 来个牛人吧！！！！

回复:
user: user-0
content: 引用 4 楼 paschen的回复:自己动手，丰衣足食，有细节的问题可来论坛讨论 串口一直发零是怎么回事？？？

user: user-1
content: 问问题都不会，还好意思叫牛人进来。虽然我不是

user: user-2
content: 问问题都不会，还好意思叫牛人进来。虽然我不是

user: user-0
content: 引用 1 楼 user-4的回复:神呐，没有平台要求吗？引脚怎么接都不管？ Tring 和echo随便接吧

user: user-0
content: 引用 4 楼 paschen的回复:自己动手，丰衣足食，有细节的问题可来论坛讨论 为什么我的串口接收不到距离？

user: user-3
content: 自己动手，丰衣足食，有细节的问题可来论坛讨论

user: user-0
content: 没有人吗？？？

user: user-4
content: 神呐，没有平台要求吗？引脚怎么接都不管？
user-0 提问: 求大神 改好这个源程序  ...发现了好多错误··本人新手 谢谢··

回复:
user: user-1
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-2
content: 引用 2 楼 qq_33065723 的回复:本来就是没有分号 但是出来后 报错 我加上后就没报错了··大括号那里错了 我在文本文档上输入的=  = 括号 自己都没找出来   你先把程序格式改好了，用代码框发代码，我帮你看下

user: user-0
content: 本来就是没有分号 但是出来后 报错 我加上后就没报错了··大括号那里错了 我在文本文档上输入的=  = 括号 自己都没找出来

user: user-2
content: 大括号不对称，还有void main() 后面怎么有个分号
user-0 提问: 高手在哪里？？？？？

回复:
user: user-1
content: 引用 2 楼 DwwwT 的回复:引用 1 楼 cyfcsd 的回复:已发，注意查收 已收到  如满意请结贴给分，ok？

user: user-0
content: 引用 1 楼 cyfcsd 的回复:已发，注意查收 已收到

user: user-1
content: 已发，注意查收
user-0 提问: 如何拷贝结构体指针

回复:
user: user-0
content: 引用 5 楼 paschen 的回复:[quote=引用 4 楼 yangsong235 的回复:] [quote=引用 1 楼 paschen 的回复:] *p2 = *p1;  这种方法，p1和p2不是指向的同一块内存吗[/quote]  指向同一块内存是  p2 = p1;   补基础啊。。[/quote]  谢谢，的确是这样的

user: user-1
content: 引用 1 楼 paschen 的回复:*p2 = *p1;  恩，相当简洁

user: user-2
content: 引用 4 楼 yangsong235 的回复:[quote=引用 1 楼 paschen 的回复:] *p2 = *p1;  这种方法，p1和p2不是指向的同一块内存吗[/quote]  指向同一块内存是  p2 = p1;   补基础啊。。

user: user-0
content: 引用 1 楼 paschen 的回复:*p2 = *p1;  这种方法，p1和p2不是指向的同一块内存吗

user: user-0
content: 引用 2 楼 liganglester 的回复:需要新申请一块该结构体内存，内容copy过去，内存地址给p2。  貌似没有别的一步到位的方法。  能否直接给出代码呢

user: user-2
content: *p2 = *p1;

user: user-3
content: 需要新申请一块该结构体内存，内容copy过去，内存地址给p2。  貌似没有别的一步到位的方法。
user-0 提问: 预编译宏问题

回复:
user: user-1
content: VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

user: user-0
content: 能否提供这方面知识的书名，哪本书，我们可以看。看

user: user-2
content: 引用 5 楼 weixin_30563001 的回复:[quote=引用 1 楼 fefe82的回复:]展开 z=Y 的时候，Y 的定义是 "X*2"，X 的定义是 "2" 。  所以： z=Y   -->    z=X*2 --> z=2*2  ===========  宏定义里的 token 是不会进行宏替换的。 你说的token是什么意思…本人是小白[/quote]  在预编的时候，源文件会被处理成一个 preprocessing token 序列，preprocessing token包括: 头文件名，标识符，预处理数字，字符常量，字符串常量，运算符及标点，其它。

user: user-3
content: 把#undef放到后面，结果(http://codepad.org/8EVmnXls)就为6了  #define X 3 #define Y X*2 int z = Y; #undef X #define X 2 #include <stdio.h> int main() { 	printf("%d", z); 	return 0; }

user: user-2
content: 展开 z=Y 的时候，Y 的定义是 "X*2"，X 的定义是 "2" 。  所以： z=Y   -->    z=X*2 --> z=2*2  ===========  宏定义里的 token 是不会进行宏替换的。

user: user-4
content: 引用 1 楼 fefe82的回复:展开 z=Y 的时候，Y 的定义是 "X*2"，X 的定义是 "2" 。  所以： z=Y   -->    z=X*2 --> z=2*2  ===========  宏定义里的 token 是不会进行宏替换的。 你说的token是什么意思…本人是小白

user: user-5
content: #define X 3 #undef X  这两句相当于没有用

user: user-5
content: z 的值为4
user-0 提问: 【算法求助】计算概率

回复:
user: user-1
content: 不知道楼主说的什么算法 思路不都是先列公式再编程对公式求解吗 公式好像是全概率公式，这个真心愧对概率论老师惹

user: user-2
content: 《概率论与数理统计》

user: user-3
content: 用排列方法,令a(n)为n个人随机抽取不上台的次数, 那么概率就是p(n) =a(n)/n! 这里a(n)=(n-1)*(a(n-1)+a(n-2)) a(1)=0,a(2)=1,数字比较大, 直接用double运算就可以了 double a[31]={0},p[31]={0};     a[2]=1;     p[2]=0.5;     for(int i=3;i<=30;i++){         a[i] =(i-1)*(a[i-1]+a[i-2]);         p[i] =a[i]/a[i-1]*p[i-1]/i;     }

user: user-4
content: 这个问题等同于 N个不同的字母的N序列，第N位置不是序号为N字母的概率.

user: user-0
content: 我记得可以用“二项展开”来求，但是忘记了。额额

user: user-0
content: 引用 2 楼 user-5 的回复:这是数学问题，另你也没说清楚抽了之后放不放回 哈哈，写程序不就是解决数学问题嘛 每个人正好抽一张，不放回去

user: user-5
content: 这是数学问题，另你也没说清楚抽了之后放不放回
user-0 提问: 刚学C的新手求教，以下C程序输出不正确。请指点。

回复:
user: user-1
content: 引用 4 楼 Victor0757 的回复:[quote=引用 2 楼 paschen 的回复:] 输入时不用限制精度，算完输出的结果按需要精度输出即可  谢谢版主。我按照一楼的方法改了程序，输出结果正常。  请问怎么把分给1楼呢？[/quote]  结帖可以给分

user: user-0
content: 引用 2 楼 paschen 的回复:输入时不用限制精度，算完输出的结果按需要精度输出即可  谢谢版主。我按照一楼的方法改了程序，输出结果正常。  请问怎么把分给1楼呢？

user: user-0
content: 引用 1 楼 qq_31772373 的回复:scanf() 并没有能控制输入精度的吧 只能对输入数据的最大字段宽度进行控制的吧  scanf("%f", &inches);  谢谢，按你的方法在scan();中把.2删除掉之后输出结果正常。但是不知道为什么编译器没有出错提示？

user: user-1
content: 输入时不用限制精度，算完输出的结果按需要精度输出即可

user: user-2
content: scanf() 并没有能控制输入精度的吧 只能对输入数据的最大字段宽度进行控制的吧  scanf("%f", &inches);
user-0 提问: 求大神帮忙简化程序

回复:
user: user-1
content: 考虑了一下，第一感是用堆栈或是队列法消除递归，不过涉及的递归调用太复杂，比较难转换。  仔细看了一下这一段代码，  int gx1(int x1) { 	int min,temp,i; 	if(x1==0 || x1==1)	 		min = x1;	 	else 	{ 	   min=(gx1(0)+1)%n; 	   for (i=1;i<=x1-1;i++) 	   { 		   temp=(gx1(i)+1)%n; 		   if (temp<min) 			min=temp; 		}	    	} 	return min; }   发现可以逆向思维一下：gx1()这个函数被反复调用了若干次，可以考虑先写一个初始化过程，把所有的gx(x1) 【0 < x1< m】的结果都依次计算出来并保存至一个数组，然后直接从数组中读取结果。    int * gx1_data = NULL;  /***************************  * int calc_gx1()  * return value: 0 == success; 1 = error  * **************************/ int calc_gx1() { 	if(NULL == gx1_data) gx1_data = (int *)malloc(m * sizeof(int)); 	if(NULL == gx1_data) return 1; 	int x1, i, min, temp; 	gx1_data[0] = 0; gx1_data[1] = 1;  	for(x1 = 2; x1 < m; x1++) 	{ 		min = (0 + 1) % n; // gx1(0) == 0 		for(i = 1; i < x1; i++) 		{ 			temp = (gx1_data[i] + 1) % n; 			if(temp < min) min = temp; 		} 		gx1_data[x1] = min; 	} 	return 0; }   gx2、gx3、gx4也可以用同样的方法，先直接计算出所有的结果并保存至gx2_data[m * m], gx3_data[m * m * m]和gx4_data[m * m * m * m]，这样就将gx4(x1,x3,x3,x4)这种复杂的递归调用转化为数组的写入和读取的简单问题。  如果内存不够，可以考虑使用外部存储，在文件中读写。

user: user-2
content: 动态分配内存，用循环代替递归

user: user-3
content: 看了下代码，逻辑明白，也觉得这样写太罗嗦，但一时自己又想不到怎么改进，所以也比较关注你这个问题的各种解，所以拿你的代码在stackoverflow也贴了下，有个人给的答案如下： #include <stdio.h>  #define m 8  int main() {    int min;    int min1;    int min2;    int min3;    int min4;     FILE* fp = stdout;    for(int x1=1;x1<m;x1++)    {       min1 = x1;       for(int x2=1;x2<m;x2++)       {          min2 = min1;          if ( min2 > x2 )             min2 = x2;           for(int x3=1;x3<m;x3++)          {             min3 = min2;             if ( min3 > x3 )                min3 = x3;              for(int x4=1;x4<m;x4++)             {                min4 = min3;                if (min4 > x4 )                   min4 = x4;                 min=min4;                fprintf(fp, "g(%d,%d,%d,%d)=%d\n",x1,x2,x3,x4,min);             }             fprintf(fp,"\n");          }          fprintf(fp,"\n");       }       fprintf(fp,"\n");    }    fclose(fp);    return 0; }  不过这样时间复杂度并不会减少，随着m的增大还是会消耗 O(N^4)   原始链接：http://stackoverflow.com/questions/33863407/how-to-optimize-the-c-code-when-m-is-too-big-it-cannt-opration/33863570#33863570

user: user-4
content: 加大默认的堆栈大小。 VC6： 工程、设置、连接、分类：输出、堆栈分配、保留：64000000 VS20XX： 项目、属性、配置属性、链接器、系统、堆栈保留大小：64000000

user: user-4
content: http://www.codeproject.com/Articles/418776/How-to-replace-recursive-functions-using-stack-and

user: user-0
content: @赵4老师,修改默认的堆栈后还是运行不出来

user: user-0
content: @Gdreamlend，程序修改后变量n是不是不能修改了

user: user-2
content: 通常程序默认栈大小是1M，可以对默认栈大小进行设置，但如果要使用很大的数组，一般都考虑在堆上分配

user: user-0
content: 是更改程序设置中默认的参数吗
user-0 提问: 求大神用C语言设计一个简单的计算器，进行加减乘除，可带括号，不限定运算式的输入长度

回复:
user: user-1
content: 在现实世界中，除时间和空间可能是无限的以外，其它任何事物都是有限的。

user: user-0
content: 引用 1楼user-2 的回复:去网上搜，一箩筐一箩筐的  http://blog.csdn.net/pdcxs007/article/details/40158437好的，谢谢。

user: user-2
content: 去网上搜，一箩筐一箩筐的  http://blog.csdn.net/pdcxs007/article/details/40158437
user-0 提问: C语言问题

回复:
user: user-1
content: 去掉 # include <string.h> 这行也行。

user: user-2
content: 引用 3 楼 dsq2753919456 的回复:啊，太机智了。果然是因为和库函数名重复了。顺便问一下版主是软件工程 师吗？  不是啊，业余的，我专业和计算机没关系

user: user-0
content: 啊，太机智了。果然是因为和库函数名重复了。顺便问一下版主是软件工程 师吗？

user: user-2
content: 没发现问题，给出错误提示

user: user-3
content: 没有错，只是strcat与标准库函数名字冲突了，换一个名字吧。
user-0 提问: C语言打印A形图案。在线等，急！！！

回复:
user: user-1
content: void output(int cnt,char ch){     while(cnt--) putchar(ch); } int main() {     int n;    while(~scanf("%d",&n) && n>2){         for(int i=1;i<=n;i++){             output(n-i,' ');             putchar('*');             if(i==(n+1)/2){                 for(int j=1;j<=2*i-2;j++) putchar('*');             }else if(i>=2) {                 output(2*(i-2)+1,' ');                 putchar('*');             }             puts("");         }    } }