Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 请问main()函数之前的代码怎么调用啊请给出完整程序。谢谢！

回复:
user: user-1
content: 引用 楼主 developerof 的回复:#include<stdio.h>#define MAXSIZE 20typedef struct{ int data[20]; int length;}sqlist;int Get_element(sqlist l,int i,int *e){  if(l.length==0||i<1||i>l.length){     return 0;   }  else{  *e=l.data[i-1];   return 1;  } return 1;}int main(){ return 0;}   #include<stdio.h> #define MAXSIZE 20 typedef struct{  	int data[20];  	int length; }sqlist; int Get_element(sqlist l,int i,int *e) { 	if(l.length==0||i<1||i>l.length) 	{      		return 0;    	}   	else 	{   		*e=l.data[i-1];    		return 1;   	}  	return 1; } int main() { 	sqlist sAbc; 	int ix; 	int e; 	printf("请输入列表中元素的数量:"); 	scanf("%d", &sAbc.length); 	 	for(ix=0; ix<sAbc.length; ix++) 	{ 		scanf("%d", &sAbc.data[ix]); 	} 	 	printf("请输入要取到列表中的哪个元素的:"); 	scanf("%d", &ix); 	 	if( Get_element(sAbc, ix, &e)) 	{ 		printf("列表中的 %d 个元素是 %d\n", ix, e); 	} 	else 	{ 		printf("取出元素失败！\n"); 	} 	return 0; }

user: user-2
content: #include<stdio.h>  #define MAXSIZE 20 typedef struct{  int data[20];  int length; }sqlist;  int Get_element(sqlist l,int i,int *e) {   if(l.length==0||i<1||i>l.length) {      return 0;    }   else {       *e=l.data[i-1];    return 1;   }  return 1; }  int main() { sqlist sq; sq.data = {1,2,3}; sq.length = 3;  int v = 0; Get_element(sq, 2, &v);  printf("value = %d\n", v);   return 0; }
user-0 提问: sizeof 一个奇葩的问题 你又了解多少？

回复:
user: user-1
content: 这也能称做奇葩问题？ 只怪你自己懂得少而已

user: user-2
content: sizeof是无符号的，无符号和有符号的运算都会扩展为无符号运算

user: user-3
content: 大部分程序员coding的思路或者说习惯不应该是 if (sizeof x > y) 这样的吗

user: user-4
content: sizeof 表达式求值结果是size_t  而size_t是无符号类型   这点细节注意到就好了

user: user-5
content: 恭喜,问题KO了

user: user-6
content: 前面该说的都说了，我是来拿分的。

user: user-7
content: 改成这样，if ((int)(iLen - sizeof(sTmp)) >= 0)，就正常了。  跟lz分享下我的过程吧(个人感觉过程重干结果)  ------------万能的分割线-----------------  一开始我也很好奇，怎么会这样，于是我就打开我的debian系统，亲自把代码输入，结果跟你的结果一样。 我就开始考虑，会不会编译器把前面那个负数当成一个很大的正数呢？(有点c++基础的应该都知道，不用解释了吧) 我就把两边同时强转成int 如：if ((int)(iLen - sizeof(sTmp)) >= (int)0) 发现结果正常了。。。  我又在想编译器，为什么把0也当成unsigned int 处理？是不是只要保留(int)0就可以了？ 试了下，结果是错误的， 我就保留前面一个强转成int，结果正常了。。（终于得出正常结果了）  我又在想着，为什么编译器把前面一个数当成unsigned int处理呢？ 突然灵光一闪，发现typedef unsinged int  sizeof.... 编译器中的sizeof返回的就是unsinged int .,  int - unsinged int = unsinged int  这就完善解释了为什么会出现这么奇怪的问题。。哈哈  看样子c++还得继续修炼呀！！！细节很重要。。。

user: user-8
content: 菜鸟 对于这问题  学习了

user: user-9
content: sizeof返回的是size_t类型，平台上一般定义为unsigned integer  iLen - sizeof(sTmp) 的结果为unsigned integer，所以一个负数解释为unsigned integer时是一个很大的数 iLen - sizeof(sTmp) >= 0显然成立  要符合你的逻辑，可以这样强制转换一下 if (iLen - (int)sizeof(sTmp) >= 0)

user: user-10
content: sizeof 返回 unsigned 类型 iLen - sizeof(sTmp) 的结果也是unsigned

user: user-0
content: 自己先顶一下，作为一名菜鸟，还没有查到类似的资料。 期待大神~~~

user: user-11
content: 引用 10 楼 gfchen1989 的回复:无符号和有符号的运算都会扩展为无符号运算 别乱讲。

user: user-0
content: 多谢大家跟帖，让我受益匪浅

user: user-12
content: 程序 有 警告，可你却 忽视 了 它  问题不奇葩 只是你没去理会
user-0 提问: 刚刚开始自学C 好多奇怪的问题啊 先来一个

回复:
user: user-1
content: 运行了楼主的代码，没有问题。 #include<stdio.h> int main() { 	int i=5; 	int m=20; 	int k;  	m=(8>5)&&(k=5); 	printf("m=%d,k=%d\n",m,k); 	return 0; }  应该是楼主标点符号的问题。

user: user-2
content: 你把你的代码传上来看看，像23楼那样的代码格式，不要直接上图！

user: user-3
content: K=5属于真吧。因为非0

user: user-4
content: #include <stdio.h>  int main(void) {     int i = 5;     int m = 20;     int k;      m = (8 > 5) && (k =5);     printf("m = %d,k = %d\n",m,k);     return 0; }   你拿过去试试

user: user-5
content: 换行符是\n。。。。

user: user-6
content: 中文标点绝对禁止的，除非当作字符串。

user: user-7
content: 你是不是使用了中文字符啊,,还有那个i没有用到,,会显示警告..... 其它的应该没问题

user: user-8
content: k,只定义了没有初始化,所以才有k = 5

user: user-9
content: 逻辑与运算：当前面为假时，后面不会执行，前面为真时才会执行后面

user: user-10
content: 改成k==5 可以让编译器判断k是否等于5 然后返回真假值吗？ ----> Yes

user: user-11
content: 引用 1 楼 zjq9931 的回复:有全角符号。 就是有的标点符号是全角的，中文的标点符号。 报错的有行号，你那块没有截图下来，所以不知道是那一行错了。 根据你的截图，似乎是printf那一行的问题。 根据报错的行号看一下吧。

user: user-11
content: 引用 2 楼 qq_16712389 的回复:[quote=引用 1 楼 zjq9931 的回复:] 有全角符号。 就是有的标点符号是全角的，中文的标点符号。 我用的是半角符号啊[/quote] 报错的有行号，你那块没有截图下来，所以不知道是那一行错了。

user: user-12
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-0
content: 引用 3 楼 Intel0011 的回复:你可能是直接copy的代码 一般出现unknown character '0xa3' 表示出现了非法不可视字符，源代码文本是纯文本，不能有格式的 #include <stdio.h>  int main(void) {    int i = 5;    int m = 20;    int k;     m = (8 > 5) && (k = 5);    printf("m = %d, k = %d\n", m, k);     return 0; } k = 5这个是表达式，其值就是5，副作用是k被赋值为5 恩你说的我明白啦，但是我代码是写的啊 没有COPY啊。而且 我奇怪的是&&这个逻辑运算符，我想到了数学上的且命题，数学上且命题就是对两个命题进行判断，然后出真假结果，类推到C中，&&后面的k=5 是个赋值语句，改成k==5 可以让编译器判断k是否等于5 然后返回真假值吗？

user: user-13
content: 结构-〉结果

user: user-13
content: 1、代码里面有中文标点 中文的半角分号是；英文的标点是; 两个分号是不一样的  2、&&是必须左右都为真，才为真，否则为假，运算顺序是从左向右 现在&&的左边已经为假了，不管右边是真是假，这个式子的结构都为假，所以右边已经不需要再算了

user: user-10
content: 你可能是直接copy的代码 一般出现unknown character '0xa3' 表示出现了非法不可视字符，源代码文本是纯文本，不能有格式的 #include <stdio.h>  int main(void) {    int i = 5;    int m = 20;    int k;     m = (8 > 5) && (k = 5);    printf("m = %d, k = %d\n", m, k);     return 0; } k = 5这个是表达式，其值就是5，副作用是k被赋值为5

user: user-0
content: 引用 1 楼 zjq9931 的回复:有全角符号。 就是有的标点符号是全角的，中文的标点符号。 我用的是半角符号啊

user: user-11
content: 有全角符号。 就是有的标点符号是全角的，中文的标点符号。

user: user-14
content: 引用 18 楼 zhao4zhong1 的回复:[quote=引用 17 楼 zxhuser-14 的回复:] [quote=引用 16 楼 zhao4zhong1 的回复:] [quote=引用 14 楼 zxhuser-14 的回复:] 为什么你们都喜欢截图而不是直接贴代码呢？你这代码量还算小的，幸好不是大量代码 截图还是轻的，我还遇到过手机拍的呢！ [/quote]愿闻其详[/quote] 就是有人拿手机对着试卷拍了照片发帖子上求答案啊。[/quote] 哦，是那个帖子，我记起来了
user-0 提问: 如何找到文本中的某些行，并删除这些行的子字符串

回复:
user: user-1
content: 内存映射文件

user: user-1
content: 引用 3 楼 zilaishuichina 的回复:将 1.txt  读入内存  在内存中替换/删除你指定的字符串  将更新后的内存中数据写回 1.txt

user: user-0
content: 唉，跟各位相比，自己真是太水了。

user: user-0
content: 唉，我是新手，还不会这个。

user: user-2
content: 引用 2 楼 zhao4zhong1 的回复:提醒：使用wchar_t，别用char 二次提醒。

user: user-3
content: 引用 5 楼 yl1235 的回复:我这样写是不是效率很低啊 效率不能说低。 fopen的"r" “w”，最好用"rb","wb"，否则有可能会出现丢内容的情况。 逻辑错误，f9设置断点，F5跟踪，10单步执行，学会跟踪，很有帮助。

user: user-0
content: 我这样写是不是效率很低啊

user: user-0
content: 我的程序是这样的，不知道是哪里出现的问题，运行结果不对。 #include <conio.h> #include<stdio.h> #include<string.h> #include <windows.h>  int main( ) { FILE *fp1,*fp11;  char a[300],b[300];  char gj1[300]="郭家岗";      int A1[4]={1,2,3,7}; int i,j,h1;      if ((fp1=fopen("1.txt","r"))==NULL)     {  printf("cannot open file4/n"); }  if((fp11=fopen("11.txt","w"))==NULL)     {   printf("cannot open file\n");}   int i1;   for(i=0;i<4;i++) { i1=0;fp11=fopen("11.txt","w");fp1=fopen("1.txt","r"); 	while (fgets(a,sizeof(a),fp1)) 	   {i1++; 		if(A1[i]==i1) 			{for(i=strlen(gj1),j=0;a[i]!='\0';i++) 				{ 					b[j++]=a[i]; 										} 				b[j]='\0'; 				fputs(b,fp11); 				i++; 			} else fputs(a,fp11);}  fclose(fp1); fclose(fp11);    fp11=fopen("11.txt","r");  fp1=fopen("1.txt","w");  while (fgets(a,sizeof(a),fp11))  {fputs(a,fp1);  }  fclose(fp11); fclose(fp1); } }   运行结果是  预告警信号 郭家岗2#直流充电柜直流系统故障 郭家岗预告警信号 西陵:10kV1#消弧线圈自动调谐控制装置网络状态 西陵:10kV2#消弧线圈自动调谐控制装置网络状态 五峰GPS对时装置报警 郭家岗2#直流充电柜直流系统故障

user: user-4
content: 将 1.txt  读入内存  在内存中替换/删除你指定的字符串  将更新后的内存中数据写回 1.txt

user: user-2
content: 提醒：使用wchar_t，别用char

user: user-3
content: 三种方法。看看哪个需要的技术你不会。这是思路： 1.逐行读取，写入另一个文件，遇到指定的行后跳过，然后删除原来的文件。对新写的文件改名。 2.逐行读取，记录进内存，遇到指定的行后不记录进内存，然后写回原来的文件中。 3.整个文件读入内存，往回写的过程中，遇到指定的行后，跳过。

user: user-5
content: 引用 10 楼 WUYUAN2011WOAINI 的回复:[quote=引用 3 楼 zilaishuichina 的回复:] 将 1.txt  读入内存  在内存中替换/删除你指定的字符串  将更新后的内存中数据写回 1.txt [/quote]如果有足够内存的话可以全部读入内存
user-0 提问: 用c语言编程呢读取游戏操纵杆数据(DirectX 9.0 Summer 2004 SDK+VC++6.0)

回复:
user: user-1
content: 你看清楚红色的，没有个8字。即使报错也不会是这个错

user: user-0
content: 我改过了，但还是报这个错误~~~~~~~~~~~

user: user-1
content: //创建DirectInput设备,    hresult=lpdi->CreateDevice(GUID_Joystick,&Joystick,NULL); 改成:    hresult=((LPDIRECTINPUT)lpdi)->CreateDevice(GUID_Joystick,&Joystick,NULL);
user-0 提问: 请问类似*(type **)(ptrdiff_t)container的是什么意思啊

回复:
user: user-1
content: 要不要把宏定义都展开来再看比较好？

user: user-0
content: 引用 2 楼 lovesmiles 的回复:记得有一more effective stl这本书有说过关于迭代器的情况。迭代器iterator.你可以将它当作指针来使用，因为它重载了*，对它做*运算，它将返回内部实际的type。但iterator事实上并非真的就一个指针，它只重是载了*使它看起来像指针而已。，要得到实际类型指针就要&（*iterator）.先取址再引用。  同样的，我觉得你应该结合你用到的container是什么东西，它的*，->运算符的重载情况才能搞清楚这个宏。  container就是一个简单的ops组合,里面定义了一个add指针指向一个函数 struct type { ... void (*add)(void *container, void *node); ... }

user: user-2
content: 二楼说得也很有道理。定义一个map<map<type，type>*，type> *p。这个p指向一map指针.这个map的元素又是一个指针类型，现在要向这个容器添加元素，所以要多次调用*

user: user-2
content: 记得有一more effective stl这本书有说过关于迭代器的情况。迭代器iterator.你可以将它当作指针来使用，因为它重载了*，对它做*运算，它将返回内部实际的type。但iterator事实上并非真的就一个指针，它只重是载了*使它看起来像指针而已。，要得到实际类型指针就要&（*iterator）.先取址再引用。  同样的，我觉得你应该结合你用到的container是什么东西，它的*，->运算符的重载情况才能搞清楚这个宏。

user: user-3
content: 不是解除，而是将container视作(type **)（数组的数组）再取它的数组的地址。  container是调用宏的人传进来的。
user-0 提问: c语言新手 字符统计问题

回复:
user: user-1
content: 这个EOF用起来不顺手~

user: user-2
content: 使用下面的程序就可以了，C语言回车键是用\n来表示的。 #include<stdio.h> #include<stdlib.h> main() {    long nc;    int c;    nc = 0;    while((c=getchar()) != '\n')        ++nc;    printf("nc=%ld,c=%d\n",nc,c);    system("pause");    return 0; } 运行结果如下： clear nc=5

user: user-3
content: Linux：Ctrl+D Windows：Enter，Ctrl+Z，Enter

user: user-4
content: 引用 楼主 xiaot555 的回复:#include<stdio.h> main() {    long nc;     nc = 0;    while(getchar() != EOF)        ++nc;    printf("%ld\n",nc); } 来着c程序设计语言一书 为统计字符数 运行后只能不断的输入，无法统计（）  求大神教。。。 键盘输入EOF的办法是按CTRL+Z键。

user: user-5
content: Windows Ctrl-Z表示EOF，似乎你按enter是没用的吧。

user: user-6
content: 需要从终端输入EOF, Windows下应该是 Ctrl-Z 吧

user: user-0
content: 谢谢各位了，已经明白了
user-0 提问: 母函数问题求解

回复:
user: user-1
content: 系数都是1这还要写代码来算吗？

user: user-2
content: 代码调下格式啊

user: user-3
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对应的汇编并单步执行观察相应内存和寄存器变化。）  made from 赵老师

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

回复:
user: user-1
content: 经纬度必须结合球面坐标计算 因为不同纬度的纬线，同一角度差，长度是不同的。 同样不同高度的，相同的经纬度差距，代表不同的长度。  如果可能，还需要把结果，改化到旋转椭球面上去。  根据你所说，改化到旋转椭球面上去，这一步可以不做。 但是经纬度和距离（长度）， 根本就不是同一个东西，一个是角度概念，一个是长度概念， 必须做一个坐标转换才能表示出来。  不想直接计算的话，看看可不可以查表。

user: user-2
content: 不是说散分么，有这么散的吗

user: user-3
content: 看来lz舍不得散分了，我也不奢求得分了。呵呵。 我的解法说一下，看一看对不对？ 以球心为原点，纬度为0的剖面，南北极为y轴的平面，求出x，y的值，然后再求出z的值。

user: user-0
content: 引用 34 楼 ForestDB 的回复:纯粹接分，是不是要先讲清楚什么坐标系比较好？  就是不确定构建3D模型的时候，根据平面个顶点坐标和平面的每个顶点的高度值直接构建出3D模型么？  比如在一个平面有四个点，现在又给出了这四个点的高度值，这样是不是就能直接构建3D 模型了

user: user-4
content: 接分

user: user-5
content: 纯粹接分，是不是要先讲清楚什么坐标系比较好？

user: user-6
content: x,y 转成 x,y,h不就成了3d了。。

user: user-0
content: 引用 25 楼 u012564309 的回复:加我一个 谢谢哥哥 OK   引用 26 楼 u010211892 的回复:不懂，强力接分 OK  引用 30 楼 u013697891 的回复:我知道分数与我无缘  相识即有缘  引用 27 楼 u012421456 的回复:可以是中心点 二维笛卡尔坐标系加个高度变成三维笛卡尔坐标系，现在只能这么简单的认为了...   引用 29 楼 u012184298 的回复:围观大神

user: user-7
content: 不懂，强力接分

user: user-8
content: 加我一个 谢谢哥哥

user: user-0
content: 引用 22 楼 u014689964 的回复:可以直接接分吗。。感觉好难。。  围观既有分

user: user-0
content: 引用 21 楼 zjq9931 的回复:[quote=引用 20 楼 N_sev7 的回复:] [quote=引用 3 楼 lovesmiles 的回复:] 这是球形地图还是平面地图？  取某个点为原点，坐标为(0,0，0),将这点的经，纬，高度(x,y,0)转成这个原点的坐标系。  这就是可以得得到3D模型啦。  哈哈，给分吧  怎么转呢？经纬度与高度单位都不一样的，而且转换后的坐标系的单位呢？解析几何我是小白型的....  引用 11 楼 u012421456 的回复:找一个原点  中心点么？  引用 5 楼 zjq9931 的回复:好吧，我觉得可以直接画，需要转换吗？ 我也觉得可以直接画，但是貌似不行。。。  引用 6 楼 zxh707wk 的回复:如果计算量大的话，先把三角函数的值全部算出来  有些不懂啊！！！[/quote] 画高度的比例尺是多少？ 然后画球面的比例尺也用那个，根据地球的半径，和经纬，比例尺，画出球面。[/quote] 我感觉没有那么复杂吧，不用考虑球面的问题，因为我说的那个面试比较小的面，比如一幢楼的楼顶面等等，应该可以看做一个平面了吧，我感觉大家可能想的有些复杂了吧  是么？

user: user-9
content: 可以直接接分吗。。感觉好难。。

user: user-10
content: 引用 20 楼 N_sev7 的回复:[quote=引用 3 楼 lovesmiles 的回复:] 这是球形地图还是平面地图？  取某个点为原点，坐标为(0,0，0),将这点的经，纬，高度(x,y,0)转成这个原点的坐标系。  这就是可以得得到3D模型啦。  哈哈，给分吧  怎么转呢？经纬度与高度单位都不一样的，而且转换后的坐标系的单位呢？解析几何我是小白型的....  引用 11 楼 u012421456 的回复:找一个原点  中心点么？  引用 5 楼 zjq9931 的回复:好吧，我觉得可以直接画，需要转换吗？ 我也觉得可以直接画，但是貌似不行。。。  引用 6 楼 zxh707wk 的回复:如果计算量大的话，先把三角函数的值全部算出来  有些不懂啊！！！[/quote] 画高度的比例尺是多少？ 然后画球面的比例尺也用那个，根据地球的半径，和经纬，比例尺，画出球面。

user: user-11
content: 我知道分数与我无缘

user: user-0
content: 引用 3 楼 lovesmiles 的回复:这是球形地图还是平面地图？  取某个点为原点，坐标为(0,0，0),将这点的经，纬，高度(x,y,0)转成这个原点的坐标系。  这就是可以得得到3D模型啦。  哈哈，给分吧  怎么转呢？经纬度与高度单位都不一样的，而且转换后的坐标系的单位呢？解析几何我是小白型的....  引用 11 楼 u012421456 的回复:找一个原点  中心点么？  引用 5 楼 zjq9931 的回复:好吧，我觉得可以直接画，需要转换吗？ 我也觉得可以直接画，但是貌似不行。。。  引用 6 楼 zxh707wk 的回复:如果计算量大的话，先把三角函数的值全部算出来  有些不懂啊！！！

user: user-0
content: 引用 15 楼 c090869 的回复:太简单了，一定要给分呀, Y=(R+M)* SIN(纬度）， Z=(R+M)*COS(纬度）*sin(经度）， x=(R+M)*COS(WUDU)*COS(JINGDU)', 引用 16 楼 xiaot555 的回复:Y=(R+M)* SIN(纬度）， Z=(R+M)*COS(纬度）*sin(经度）， x=(R+M)*COS(WUDU)*COS(JINGDU)',  来个名词解释呗

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:《算法精解（C语言描述）》中有一段计算给出经纬度的两点之间的弧长的代码。 不知楼主能不能拿来作参考。 引用 2 楼 zhao4zhong1 的回复:《球面几何》  就是不知道坐标系的单位是什么，原点又在哪里啊，中心点作为原点么，其实经纬度之间的单位长可以忽略，因为这些面是一些比较小的面。  PS：还是赵老师（别人都这么叫，也不知道您是不是真的姓赵）速度啊

user: user-12
content: 围观大神

user: user-13
content: 引用 18 楼 N_sev7 的回复:PS：还是赵老师（别人都这么叫，也不知道您是不是真的姓赵）速度啊 你看赵老师哪天不是论坛标兵
user-0 提问: 求帮忙解答？

回复:
user: user-1
content: 要把scanf写在循环里面。

user: user-2
content: 你的程序执行时，输入y，接着按Enter键 y被scanf读取放入c中，完成一次循环 第二次循环时，Enter键值被scanf读取放入c中，按你程序的逻辑，for循环结束后，while(c == 'y');中的判断不成立，main正常结束 scanf("%c", &c);   //标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着fflush on input stream is an extension to the C standard（fflush 操作输入流是对 C 标准的扩充）。当然，如果你毫不在乎程序的移植性，用 fflush(stdin) 也没什么大问题。          //fflush(stdin);      {             int a;                 /* 通过 while 循环把输入流中的余留数据“吃”掉 */                 while ( (a = getchar()) != '\n' && a != EOF ) ;                       }        for(i=1; i<12; ++i)       {          if(c == 'Y'||'y')             break;          else if(c == 'N'||'n')             return 0;          else;       }

user: user-3
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
user-0 提问: C语言数组的问题

回复:
user: user-1
content: 引用 5 楼 what_can_I_say 的回复:引用 1 楼 modyaj 的回复:length = strlen(word)-1好吧但最后为什么是空格，不是其他的东西？ 你可以考虑不给数组赋值就输出看看   或者是只赋值第一个  把剩下的输出看看！

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

user: user-2
content: 因为'\0'是不可见字符。

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

user: user-0
content: 引用 4 楼 anshiny 的回复:for(length = strlen(word); length >= 0; length--) 应为 for(length = strlen(word)-1; length >= 0; length--) 因为单词里的最后一个字符的下标是 strlen(word)-1。但最后为什么是空格，不是其他的东西？

user: user-0
content: 引用 1 楼 modyaj 的回复:length = strlen(word)-1好吧但最后为什么是空格，不是其他的东西？

user: user-3
content: for(length = strlen(word); length >= 0; length--) 应为 for(length = strlen(word)-1; length >= 0; length--) 因为单词里的最后一个字符的下标是 strlen(word)-1。

user: user-0
content: 引用 1 楼 modyaj 的回复:length = strlen(word)-1好吧我傻逼了=。=

user: user-4
content: 下标是0---length-1 呵呵~~

user: user-1
content: length = strlen(word)-1好吧
user-0 提问: 一个被声明为静态的函数只可被这一模块内的其它函数调用

回复:
user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:我非我。 +1

user: user-2
content: 只是强调不能被其它模块调用罢了。

user: user-3
content: 这个，你确实有点道理。看看英文的原文是怎么写的。

user: user-4
content: 因为一个完整的程序可能含有多个.c文件构成,,因此此静态函数只能在当前的一个.c文件中被使用...

user: user-5
content: 昨天，我接到村里通知，一个被声明为静态的函数只可被这一模块内的其它函数调用。

user: user-6
content: 我非我。

user: user-7
content: 那就去掉其他二个字，自己调用自己当然没问题 一个被声明为静态的函数只可被这一模块内的其它函数调用 －－－》本意强调的是其他模块的函数不能调用
user-0 提问: 有个错误  不理解，有谁能帮我解释一下

回复:
user: user-1
content: 格式化输出printf() 中int 类型对应了%d ，float 对应了%f，所以不能用%f 来输出%d 的变量

user: user-2
content: 存储分配的字节都不一样，出栈会造成读取错误的。

user: user-3
content: 引用 3 楼 yclsdju 的回复:float格式是谭浩强C语言上面的例子   我在学习时候发现输出不对，各位同仁可以自己复制两个程序，运行后看看结果  这个问题以前也有不少人问过，估计回复你的人都回答过不少了。你仔细看看别人的回复再自己思考一下。

user: user-4
content: 一切还是看图说话。。。。。。。

user: user-5
content: 楼主分别测试下这两段代码就能理解了： #include<stdio.h> int main() { 	int a=5; 	printf("%f",a); 	return 0; } #include<stdio.h> int main() { 	float a=5; 	printf("%f",a); 	return 0; }

user: user-6
content: 类型不同，输出错误啊。

user: user-7
content: 按int类型存储，结果按float类型提取，肯定错了。浮点数和整型数存储格式完全两样的

user: user-8
content: 书上不是有吗？在讲输入输出的那章

user: user-9
content: 前面定义的r类型和后面输出的r类型不一致

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

user: user-11
content: printf中，d对应int，f对应float和double d不能对应float，因为int和float的存储格式是不一样的，解码起来也不一样

user: user-0
content: float格式是谭浩强C语言上面的例子   我在学习时候发现输出不对，各位同仁可以自己复制两个程序，运行后看看结果

user: user-10
content: 那么楼主希望下面这句输出啥呢？ printf("%按照大熊猫的格式输出",CSDN的yclsdju);//

user: user-12
content: int和float的存储方式不同
user-0 提问: 如何修改exe文件版本号和文件信息

回复:
user: user-1
content: 你那应该是控制台程序吧，控制台程序也可以添加版本信息，项目右键 添加->资源...  选择Version 通过界面操作编辑好后，再重新编译一下。

user: user-1
content: 请看我博客http://blog.csdn.net/func7/article/details/50556667#t9

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复: 引用 2 楼 Intel0011 的回复: 求教9楼的问题

user: user-0
content: 我有一下几个问题： 1.我写了一个HelloWorld程序，为什么目录里没有rc后缀的文件？ 2.用ResHacker或eXeScope修改，可软件里能显示的只有这些？应该怎么修改？

user: user-2
content: 一时半会还真没找到vs提供什么工具可以更改这些信息。

user: user-0
content: 引用 6 楼 Intel0011 的回复:[quote=引用 4 楼 u013491662 的回复:] vs没有提供什么工具可以更改这些信息吗？ 如果你有源代码的话，在文件后缀为rc的资源文件中修改 没有的话，只能用ResHacker等工具，VS没提供[/quote]  我写了个HelloWorld!程序 发现目录下并没有后缀名为rc的文件！？？

user: user-3
content: 引用 4 楼 u013491662 的回复:vs没有提供什么工具可以更改这些信息吗？ 如果你有源代码的话，在文件后缀为rc的资源文件中修改 没有的话，只能用ResHacker等工具，VS没提供

user: user-4
content: 引用 4 楼 u013491662 的回复:vs没有提供什么工具可以更改这些信息吗？  [quote=引用 1 楼 zhao4zhong1 的回复:] 引用 2 楼 Intel0011 的回复: 引用 3 楼 zxhuser-4 的回复:[/quote] 只用过vc6.0，但老早就忘了怎么用了。。。

user: user-0
content: vs没有提供什么工具可以更改这些信息吗？  引用 1 楼 zhao4zhong1 的回复: 引用 2 楼 Intel0011 的回复: 引用 3 楼 zxhuser-4 的回复:

user: user-4
content: 引用 2 楼 Intel0011 的回复:版本号和文件信息放在EXE文件的资源节中，可以使用资源查看、修改工具ResHacker或eXeScope软件+1

user: user-3
content: 版本号和文件信息放在EXE文件的资源节中，可以使用资源查看、修改工具ResHacker或eXeScope软件

user: user-2
content: 使用eXeScope软件？
user-0 提问: 来拿分吧，

回复:
user: user-1
content: 因为表达式非零

user: user-2
content: 打印的时候既然用了“||”，就表示要逻辑值喽。

user: user-3
content: http://ideone.com/IOCFWg

user: user-4
content: 逻辑表达式 或  一真全真，前面真就不不用再看后面

user: user-5
content: ||截断运算，第一个非零就结束运算，结果为1

user: user-6
content: 引用 楼主 li905663280 的回复: #include <stdio.h> int main(void) { int a,b=10,c=15; float x=12.345,y=0.1234;  printf("%d\n",x+y||a+b||c); getch();    }  结果为什么是1 因为这是逻辑“或”运算有非零，结果就是1

user: user-7
content: ||操作符的结果只有0和1。你上面的操作结果刚好是1

user: user-8
content: 程序判断真假是判断0和非0的，输出真假是输出0和1的 0为假 非0为真 x+y||a+b||c 第一个x+y因为是非0值 所以程序判断为真 此时整个表达式不再进行判断 x+y||a+b||c 的值为1

user: user-9
content: 没想到这儿也有个优先级的问题

user: user-10
content: float x=12.345,y=0.1234;  printf("%d\n",x+y||a+b||c);  x+y  --->  1 a+b --->  1 c--->  1 1 || 1 || 1  --->  1

user: user-11
content: 我来那分了..

user: user-12
content: 老赵又在复制粘贴啦……

user: user-13
content: 该说的都说了，我就打一下酱油算了

user: user-14
content: 简单点说就是优先级问题 +的优先级大于|| 上面等式等价于printf("%d\n",(x+y)||(a+b)||c);  一目了然吧

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

user: user-16
content: x+y||a+b||c  整个做为一个表达式  x+y 或上 a+ b 或上 c  x+y   a+b  c  中间有一个为1  ,或的结果就是1
user-0 提问: 关于Makefile的一点问题

回复:
user: user-1
content: http://www.cnblogs.com/liyanwei/archive/2010/04/29/1723931.html

user: user-1
content: 首先明白makefile干嘛的，再去写~ makefile定义了一系列的规则来指定，哪些文件需要先编译，哪些文件需要后编译，哪些文件需要重新编译，甚至于进行更复杂的功能操作，因为 makefile就像一个Shell脚本一样，其中也可以执行操作系统的命令。

user: user-2
content: 可以用makefile生成工具啊

user: user-3
content: 注意：makefile中的Tab必须是真Tab字符而不能用4个或8个或若干个空格代替。

user: user-4
content: 试试这个 -I不行的话改成-L试试  CC=gcc main:main.o 	$(CC) -I /usr/mongo-c-driver-0.98.0 -o main /usr/mongo-c-driver-0.98.0/src/*.o main.o: 	$(CC) -c /usr/mongo-c-driver-0.98.0/src/*.c

user: user-3
content: 搜“跟我一起写makefile”
user-0 提问: 自己写的程序在别人的电脑上运行不了?

回复:
user: user-1
content: 用depends.exe查看exe依赖的dll，看缺哪些dll 将缺的dll放在exe相同目录下。

user: user-2
content: 引用 14 楼 u013491662 的回复:感谢各位 我明白release版本是什么了 [quote=引用 7 楼 zjq9931 的回复:] 1.发布成release 2.使用静态库。 是发布成release的 同时 使用静态库才可以？ 还是发布成release 或者 使用静态库 选二者其一就可以了？[/quote] 两者都选。

user: user-0
content: 感谢各位 我明白release版本是什么了 引用 7 楼 zjq9931 的回复:1.发布成release 2.使用静态库。 是发布成release的 同时 使用静态库才可以？ 还是发布成release 或者 使用静态库 选二者其一就可以了？

user: user-3
content: Release是程序的发布版本，如果你需要别人机器运行你的程序，应该使用这个版本，而不是Debug调试版。而且别人机器还需要2013的.net framework。

user: user-0
content: 引用 7 楼 zjq9931 的回复:1.发布成release 2.使用静态库。 请问release是什么？干什么用的？有什么用？

user: user-0
content: 引用 10 楼 zxh707wk 的回复:release 请问release是什么？干什么用的？有什么用？

user: user-4
content: release

user: user-5
content: 平台工具集那个地方下拉一下，有个xp。。。（具体是什么忘记了）选项的，选择之 ,如果没有的话，应该是需要加装一些东西 然后选择在静态库中使用MFC静态库   vc6,vs2003相对来说耗资源少很多，2008以后就感觉太大了，跑起来慢

user: user-6
content: 第一个选则： 静态连接CRT库: /MT(release),  /MTd(debug) 第二个选则： 在ta的电脑上安装vc++ 2013 redistributable packages(运行时库，CRT）

user: user-2
content: 1.发布成release 2.使用静态库。

user: user-4
content: 引用 12 楼 u013491662 的回复:[quote=引用 7 楼 zjq9931 的回复:] 1.发布成release 2.使用静态库。 请问release是什么？干什么用的？有什么用？[/quote] Debug通常称为调试版本，它包含调试信息，并且不作任何优化，便于程序员调试程序。Release称为发布版本，它往往是进行了各种优化，使得程序在代码大小和运行速度上都是最优的，以便用户很好地使用。

user: user-7
content: 使用静态库。。

user: user-8
content: 1，在“标准”工具栏中把“解决方案配置”改为release 2，下载msvcp120.dll复制到*/Windows/SYSTEM32下，即可解决问题。

user: user-0
content: 引用 2 楼 lcy_888 的回复:使用Release方式，并这样设置：解决方案->属性->常规->MFC的使用->在静态库中使用MFC->确定。 编译后就可以在别的机子上正常运行了。 是这样吗？

user: user-0
content: 引用 1 楼 u012421456 的回复:看有帮助没——http://zhidao.baidu.com/link?url=yckmLecaJ2OABlWl2NA_1axacHxhMi3u4zSkDyrW9ubZzigi5yCr4RPC901sHvlEgkbTWooOl_pyUvcjkO6IZHNIqgWlJUfdqyRxFZmU64K 我是新手 没接触过这类情况，能说的详细点吗？具体怎么操作？

user: user-9
content: 使用Release方式，并这样设置：解决方案->属性->常规->MFC的使用->在静态库中使用MFC->确定。 编译后就可以在别的机子上正常运行了。

user: user-10
content: 看有帮助没——http://zhidao.baidu.com/link?url=yckmLecaJ2OABlWl2NA_1axacHxhMi3u4zSkDyrW9ubZzigi5yCr4RPC901sHvlEgkbTWooOl_pyUvcjkO6IZHNIqgWlJUfdqyRxFZmU64K
user-0 提问: 指针指向的字符串是否可以进行数组的操作？

回复:
user: user-0
content: char *p = "ubantu"; 中，p是否可以利用p++操作获得每一个字符？ 可以！ char *p = "ubantu"; 中，申请的内存存放方式是如何的？ p存储在栈。 ”ubantu“存储在只读数据段中。

user: user-1
content: 可读不可写。。。。

user: user-2
content: char *p = "ubantu"; 中，p是否可以利用p++操作获得每一个字符？ 可以，不过你要判断是否到了字符结束符‘\0’,防止越界 while（*p!='\0'） { 。。。*p。。。。           p++  } char *p = "ubantu"; 中，申请的内存存放方式是如何的？ 如果你是定义为局部变量的话，就是在栈上开辟一片连续的内存空间，依次存放'u' ,'b','a','n','t','u','\0'.

user: user-3
content: 引用 9 楼 xhw88398569 的回复:可读不可写。。。。+1

user: user-4
content: 引用 5 楼 robertbo 的回复:1、可以用p++，但注意内存越界。 2、p是临时变量，存储在栈区。"ubantu"存储在常量去，可以使用但不能修改。  +20

user: user-5
content: VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

user: user-5
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！  不在调试时按Alt+6打开内存窗口看具体内存值，就想彻底弄明白内存存放方式？

user: user-6
content: 引用 楼主 u014627144 的回复:char *p = "ubantu"; 中，p是否可以利用p++操作获得每一个字符？ char *p = "ubantu"; 中，申请的内存存放方式是如何的？ 可以读取，但不可修改。 因为这是字符串常量。  char *p = "ubantu"; 中，申请的内存存放方式是如何的？ --------------------------------------- 这个在内存的栈区。程序启动的时候就申请了内存。  如果想要修改字符串的内容可以这样： char *p= (char*)malloc(strlen("ubantu")+1); strcpy(p, "ubantu"); 这个时候是可以安全修改的。 用完记得free

user: user-7
content: 1、可以用p++，但注意内存越界。 2、p是临时变量，存储在栈区。"ubantu"存储在常量去，可以使用但不能修改。

user: user-8
content: char s[] = *p;

user: user-9
content: 可以，别越界，最大范围为发现\0就要break

user: user-10
content: 应该是ubuntu不是ubantu

user: user-8
content: char *p = "ubantu"; char s[] = &p;
user-0 提问: qsort函数中的comp函数的一点问题

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

user: user-2
content: 第一段代码的函数参数类型不符合要求， 第二段代码的效率有问题，用指针多好  int cmp1(const void* a,const void* b) {   node *i = (node*)a;   node *j = (node*)b;   return (-i->pos-3)*i->w - (-j->pos-3)*j->w; }

user: user-3
content: qsort的第四个参数要求输入一个指向函数的指针，stdlib.h里的定义是_In_ int (__cdecl * _PtFuncCompare)(const void *, const void *)，因为指向int cmp1(node i,node j)的函数指针，与要求的参数不匹配，所以不能作为qsort的参数，而int cmp1(const void* a,const void* b)可以作为qsort的参数

user: user-4
content: const void *a 这是定义了一个指针a，a可以指向任意类型的值，但它指向的值必须是常量。  在这种情况下，我们不能修改被指向的对象，但可以使指针指向其他对象。  例如：  const void *a；*a=0x123;//是编译通不过的，因为*a中放的是个const值。const值是不能被改变的。  const int  m=1;     const int n=2;  a=&m;    a=&n;//编译可以通过。     void* const  a 这是定义了一个const指针a，a可以指向任意类型的值，但a是指向某个对象的常量指针。  我们不能修改指针中存储的地址，但可以修改指针指向的对象。  例如：  void* const  a;这个定义：*a=0x123;是没问题的，  但是a=(void*)&b;是不行的，因为a是const变量。  如：  int  m=1;     nt n=2;  a=&m;    a=&n;//编译不成功。

user: user-5
content: qsort 是C库函数，实现对数组的快速排序， 要求传递，对指针所指对象比较的，比较函数（一个函数指针），作为参数。 这个函数指针的对应的函数， 两个指针参数，对应数组的两个元素的地址。 这个函数不适合链表排序。
user-0 提问: 求时间复杂度如何计算

回复:
user: user-1
content: 2^(⌊lgn⌋+1)-1

user: user-2
content: 指数形式的增长，计算的次数就是对数级的，也就是说时间复杂度是对数级。 对数形式的增长，计算次数是指数级，即指数级。 线性形式增长，时间复杂度也是线性的

user: user-3
content: 1+2+4+8+... =2^(⌊lgn⌋+1)-1

user: user-4
content: 2^(⌊lgn⌋+1)-1,你取n=8算一下不就清楚了
user-0 提问: 关于平衡二叉树的问题

回复:
user: user-0
content: #define EH 0 #define LH +1 #define RH -1 void LeftBalance(BiTree *T) {     BiTree L,Lr; 	L=(*T)->lchild; 	switch(L->bf) 	{ 	case LH: 		(*T)->bf=L->bf=EH; 		R_Rotate(&(*T)->lchild); 		break; 	case RH: 		Lr=L->rchild; 		switch(Lr->bf) 		{ 		case LH: 		      (*T)->bf=RH; 			  L->bf=EH; 			  break; 		case EH: 			(*T)->bf=L->bf=EH; 		case RH: 			(*T)->bf=EH; 			L->bf=LH; 			break; 		} 		Lr->bf=EH; 		L_Rotate(&(*T)->lchild); 		R_Rotate(T); 		break; 	} }
user-0 提问: 这个C程序错在哪？

回复:
user: user-1
content: 还不结贴在等啥！

user: user-2
content: if (fpout=fopen("ab.txt","r")==NULL)  -----> if ((fpout=fopen("ab.txt","r") )==NULL) 注意运算符优先级，赋值运算符的优先级是相当低的 下面还有一个类似的句子，楼主自己改吧
user-0 提问: 四舍五入

回复:
user: user-0
content: 引用 3 楼 boxmanstan 的回复:[quote=引用 2 楼 lovesmiles 的回复:] float的精度是6至7位。超过七位的有效值它是不保证的。你最后一位已经是八位有效值了，float肯定表示不了。所以达不到你想要的效果。double可以表示到16位有效位，所以没有问题  你是说小数点前面的也算在内是吗[/quote]  明白了

user: user-0
content: 引用 2 楼 lovesmiles 的回复:float的精度是6至7位。超过七位的有效值它是不保证的。你最后一位已经是八位有效值了，float肯定表示不了。所以达不到你想要的效果。double可以表示到16位有效位，所以没有问题  你是说小数点前面的也算在内是吗

user: user-1
content: float的精度是6至7位。超过七位的有效值它是不保证的。你最后一位已经是八位有效值了，float肯定表示不了。所以达不到你想要的效果。double可以表示到16位有效位，所以没有问题

user: user-0
content: double乘int  是double  这里也没有越界，怎么转float就不对了
user-0 提问: 为什么指针参数里的vector数组不能正确返回数据

回复:
user: user-1
content: 把代码简化一下，就好比你在练武功，练了一段让别人看不出套路的武功，哈哈

user: user-0
content: 你的变量是Vector<>*，没看到你new Vector啊？ (我在其他地方NEW的，怕写全了搞乱的大家的思路，就简化了，没想到大家还是觉得乱，呵呵）  引用 2 楼 lucifer886 的回复:[quote=引用 楼主 xh5000 的回复:] TopoDeviceData* Device = (*mission)->Region->RegionSearch_Instance->List_Device_Retrieval[deviceID]; (*mission)->tempErrDevs->push_back( Device);  调用g_MissionControl.DevOperJudge(&mission);后得到的mission对象，tempErrDevs数组里没有数据了。 在函数里插入的一个Device对象不是临时NEW出来的，而是存储在一个全局变量中的。 也许可能你在TopoDeviceData* Device = (*mission)->Region->RegionSearch_Instance->List_Device_Retrieval[deviceID];取出来就有问题，你push一个空指针进去vector又不会给你报错。 [/quote] 我在获得这个对象的时候监视过，跟踪过，是有数据的。  我觉得是在这里vector数组里重新new了一次导致的数据返回不出来。不知道我猜测的是不是这样

user: user-2
content: 好乱的代码。

user: user-3
content: 引用 楼主 xh5000 的回复:TopoDeviceData* Device = (*mission)->Region->RegionSearch_Instance->List_Device_Retrieval[deviceID]; (*mission)->tempErrDevs->push_back( Device);  调用g_MissionControl.DevOperJudge(&mission);后得到的mission对象，tempErrDevs数组里没有数据了。 在函数里插入的一个Device对象不是临时NEW出来的，而是存储在一个全局变量中的。 也许可能你在TopoDeviceData* Device = (*mission)->Region->RegionSearch_Instance->List_Device_Retrieval[deviceID];取出来就有问题，你push一个空指针进去vector又不会给你报错。

user: user-4
content: 你的变量是Vector<>*，没看到你new Vector啊？
user-0 提问: 求教一个C中的递归

回复:
user: user-0
content: 题目内容：   有一堆石子，A，B两人轮流从中取出石子，每次取出的石子数目只能为1，3，7或8，最后一枚石子谁取到就是输方。A,B两人都足够聪明，不会做出错误的判断。现给出一定数目的石子，A先取石子，计算A最终是输是赢，赢用1表示，输用0表示.   输入描述   第一行为一个整数n(0< n <=100),表示玩n局，接下来n行每行有一个整数，表示对应的局提供的石子数（不大于10000），   输出描述   编程输出A对应的n局是赢是输，赢输出1，输输出0.  输入样例   3 1 3 10  输出样例   0 0 1

user: user-1
content: 引用 8 楼 Idle_ 的回复:引用直接判断正负，然后%2不就行了吗 但是楼主给出的例子就是用另类的方法实现这个功能呀（也许为了教学递归或者考学生是否理解了递归）好BT的题目

user: user-2
content: 引用直接判断正负，然后%2不就行了吗 但是楼主给出的例子就是用另类的方法实现这个功能呀（也许为了教学递归或者考学生是否理解了递归）

user: user-1
content: 引用 6 楼 Idle_ 的回复:针对输入数组中的正整数如果是奇数则输出0，偶数输出1， 0和负数输出0直接判断正负，然后%2不就行了吗

user: user-2
content: 针对输入数组中的正整数如果是奇数则输出0，偶数输出1， 0和负数输出0

user: user-3
content: 引用 楼主 chengyunyi123 的回复:代码： #include <stdio.h> int win(int ballnums) {  if(ballnums <= 1) return false;  if(ballnums == 3) return false;  if(ballnums == 7) return false;  if(ballnums == 8) return true;  else return  !win(ballnums - 1)||  !win(ballnums - 3)||  !win(ballnums - 7)||  !win(ballnums - 8); } int main() {  int save[100];  int i,n;  scanf("%d",&n);  for(i = 0;i < n;++i)  { 	scanf("%d",&save[i]);  }  for(i = 0;i < n;++i)  {  printf("%d\n",win(save[i]));  } } 子函数中的递归不知道怎么递归的 ，想知道具体讲解。求教C高手。 递归就是自己调用自己，直到符合一定的条件后返回。

user: user-4
content: 你应该先告诉大伙你的程序是打算干嘛的。

user: user-5
content: 引用 2 楼 chengyunyi123 的回复: 谢谢老师。毕竟是新手，还不会调试。。 个人意见：新手首先要学会调试。

user: user-0
content: 谢谢老师。毕竟是新手，还不会调试。。

user: user-5
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 做了一个图书管理系统，出了点问题，求大神解答！

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

user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
user-0 提问: C程序设计语言1.9一道字符数组例题

回复:
user: user-0
content: 引用 5 楼 zxh707wk 的回复:引用 4 楼 u012184298 的回复:'\n'会被'\0'替换掉为什么会这样？如果我新定义一个字符数组 char[2]，初始化赋给'a'和'b'，它后面就会输出一堆乱码，这时为什么不把'b'替换为'\0'？ 应该是"a"和"b" [/quote]对啊，我记得编译器会在字符数组里字符串末尾加'\0'，不知道这种情况下它还会把原来有的东西替换掉。

user: user-1
content: 引用 4 楼 u012184298 的回复:'\n'会被'\0'替换掉为什么会这样？如果我新定义一个字符数组 char[2]，初始化赋给'a'和'b'，它后面就会输出一堆乱码，这时为什么不把'b'替换为'\0'？[/quote] 应该是"a"和"b"

user: user-0
content: 引用 3 楼 zxh707wk 的回复:[quote=引用 2 楼 u012184298 的回复:] 其实我想问，如果我在第array[9]输入'\n'的话，这个函数会怎么执行？ '\n'会被'\0'替换掉[/quote]为什么会这样？如果我新定义一个字符数组 char[2]，初始化赋给'a'和'b'，它后面就会输出一堆乱码，这时为什么不把'b'替换为'\0'？

user: user-1
content: 引用 2 楼 u012184298 的回复:其实我想问，如果我在第array[9]输入'\n'的话，这个函数会怎么执行？ '\n'会被'\0'替换掉

user: user-0
content: 引用 1 楼 user-2 的回复:int getline(char s[],int lim) {     int c,i; //向数组里写入字符, 其中字符不是结束符并且也不是换行符     for(i = 0;i < lim - 1 && (c=getchar())!=EOF && c!='\n'; ++i)         s[i] = c;  //如果是换行符的话,换行符也算一个字符     if(c=='\n'){         s[i] = c;         ++i;     } //最后一个写入结束符     s[i] = '\0';     return i; }   也就是说,数组的大小是10的话  array[0-7]是字符 , array[8]是'\n' array[9]是'\0'其实我想问，如果我在第array[9]输入'\n'的话，这个函数会怎么执行？

user: user-2
content: int getline(char s[],int lim) {     int c,i; //向数组里写入字符, 其中字符不是结束符并且也不是换行符     for(i = 0;i < lim - 1 && (c=getchar())!=EOF && c!='\n'; ++i)         s[i] = c;  //如果是换行符的话,换行符也算一个字符     if(c=='\n'){         s[i] = c;         ++i;     } //最后一个写入结束符     s[i] = '\0';     return i; }   也就是说,数组的大小是10的话  array[0-7]是字符 , array[8]是'\n' array[9]是'\0'
user-0 提问: 二维数组可以用一维数组表示吗？

回复:
user: user-0
content: 谢谢707wk、lovesmiles 、zjq9931！

user: user-1
content: 引用 楼主 lc_csdn 的回复:我用在学习C语言，碰到一个程序如下： # include<stdio.h> # define N 3 # define M 4 int main(void) { 	int arradd(int arr[],int n); 	static int a[N][M]={1,3,5,7,9,11,13,15,17,19,21,23}; 	int *p,total1,total2; 	int (*pt)(int arr[],int n); 	pt=arradd; 	p=a[0]; 	total1=arradd(p,N*M); 	total2=(*pt)(p,N*M); 	printf("total1=%d\ntotal2=%d\n",total1,total2); 	return 0; } int arradd(int a[],int n) { 	int i,sum=0; 	for(i=0;i<n;i++) 		sum+=a[i]; 	return sum; } 请问在被调用的函数arradd(int a[],int n)中怎么可用一个a[i]来表示主程序中的a[N][M]呢？请高手指点，谢谢！ 相当于把二维数组拉直了，就是一维数组。 1维数组相当于根线，而二维数组相当于由一根线织成的布，从宏观上看，这个布有了各种曲折，编制，但我们沿着一根线走下去还是可以把这片布过完的。

user: user-2
content: 因为二维数组内存的排列也是线性的。所以用线性的一维来访问也没有问题。

user: user-3
content: 按照数组的存储形式，二维数组可以当一维数组来用。。。 比如#include <stdio.h>  int main() { 	int a[2][3]; 	int i; 	for(i=0;i<6;i++) 	{ 		*(*a+i)=i; 	} 	for(i=0;i<6;i++) 	{ 		printf("%3d",*(*a+i)); 	} 	return 0; }

user: user-4
content: i = Row * M + Col

user: user-5
content: a[y*M+x]
user-0 提问: 关于C语言堆栈溢出的问题

回复:
user: user-1
content: http://blog.csdn.net/henzox/article/details/38379277 这篇文章介绍了下简单的溢出，条件比较容易达到，可以试一试。

user: user-2
content: 好像是(&a[3])>(&a[0])>&i ，a[3]和i并不是一个地址，记得面试的时候考的是a[10]当作a[12]来用，美其名曰内存4字节对齐，也不管编译器实际怎么优化的，被坑好几次

user: user-3
content: 引用 9 楼 amoyman 的回复:作了一点点调整，在Debug下，得到以下结果 楼主是不是想要这样？（重点在于 a 和 i 的地址，要在正确的地方写入 6）   #include<iostream> using namespace std; int main() {     int i = 4;     int a[3] = {11,22,33};     a[5] = 6;      printf("addr a:%p, addr i:%p\n", a, &i);      printf("i=%d\n", i);  	system("pause"); 	return 0; }   addr a:0012FF4C, addr i:0012FF60 i=6 请按任意键继续. . .  楼上是在64位下做的测验吧，32位a[3]=6即可，注意压栈顺序，注意字节对齐即可，但是我用2012实验会直接 提示a的缓冲区溢出，应该是2012对缓冲区溢出操作做过处理

user: user-3
content: 数组先压栈，然后压i， i的地址应该小于a

user: user-4
content: 数组越界了，数组下表从0开始的哦

user: user-5
content: 作了一点点调整，在Debug下，得到以下结果 楼主是不是想要这样？（重点在于 a 和 i 的地址，要在正确的地方写入 6）   #include<iostream> using namespace std; int main() {     int i = 4;     int a[3] = {11,22,33};     a[5] = 6;      printf("addr a:%p, addr i:%p\n", a, &i);      printf("i=%d\n", i);  	system("pause"); 	return 0; }   addr a:0012FF4C, addr i:0012FF60 i=6 请按任意键继续. . .

user: user-6
content: 引用 3 楼 Henzox 的回复:不知道你在什么环境下测试的。不过要想溢出成功，需要保证以下几点： 1. 确保程序没有被优化； 2. 确保 i 分配在数组 a 的高地址； 3. 确保在 Release 下进行，且数组周围没有填充缓冲区溢出检查；  其实这几点是很难保证的，所以想成功还是按照这几点先做了再说吧。  此楼正解，特别在VS的Debug模式会增加很多调试信息，会影响本的分布，楼主还是反汇编看一下吧，总结出来后可以给大家分享一下

user: user-7
content: 不知道。。。

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

user: user-9
content: &i 与 i时栈中的状态是不同的.   而你程序中a[3]这样的越界访问, 得到的当然就是不确定的东西.  我觉得楼主去研究这种错误的东西是没有意义的. 错误的东西得到未知的结果, 本身就是正常现象.

user: user-10
content: 引用为什么会输出i = 4呢？如果我把第一个printf的i前面的取地址符号去掉就是正确的i=6。 可能&i的结果占用了一个临时变量，具体看看反汇编。

user: user-10
content: 越界而已， 没有溢出哦。

user: user-11
content: 局部变量存放位置要看编译器和它的优化结果。  你做这样的实验没有任何意义。

user: user-8
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对应的汇编并单步执行观察相应内存和寄存器变化。）  不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。

user: user-1
content: 不知道你在什么环境下测试的。不过要想溢出成功，需要保证以下几点： 1. 确保程序没有被优化； 2. 确保 i 分配在数组 a 的高地址； 3. 确保在 Release 下进行，且数组周围没有填充缓冲区溢出检查；  其实这几点是很难保证的，所以想成功还是按照这几点先做了再说吧。

user: user-12
content: 一个区地址，一个取内容

user: user-13
content: 你去掉&，i还是4
user-0 提问:  CRT detected that the application wrote to memory after end of heap buffer

回复:
user: user-1
content: sizeof(PNODE)  // 指针的大小，32位系统的话就是4字节 sizeof(*pHead)  // 结构的大小，至少是一个pNext加上一个data PNODE pCur = (PNODE)malloc(sizeof(PNODE)); // 这里分配了4个字节的空间，然后写了8个字节的数据

user: user-1
content: 3楼写错了，应该是  sizeof(*pHead)

user: user-1
content: 先把这个改了 PNODE pHead = (PNODE)malloc(sizeof(*PNODE));

user: user-0
content: 引用 4 楼 user-1 的回复:3楼写错了，应该是  sizeof(*pHead)  sizeof应该是结构体的大小,是吧. 的定义结构体为: typedef struct node { 	int data; 	struct node * pNext; } NODE, * PNODE; 所以应该为: PNODE pCur = (PNODE)malloc(sizeof(NODE));

user: user-0
content: 引用 5 楼 user-1 的回复:sizeof(PNODE)  // 指针的大小，32位系统的话就是4字节 sizeof(*pHead)  // 结构的大小，至少是一个pNext加上一个data PNODE pCur = (PNODE)malloc(sizeof(PNODE)); // 这里分配了4个字节的空间，然后写了8个字节的数据  真的对了... 厉害...

user: user-0
content: 在2楼打错了字, '貌似是没有错的'

user: user-0
content: 我测试的时候,录入是4个元素,调试的时候,发现即将free的元素,就是第三个.没有就是没有错的,但是总报错. 这是辅助代码: void main() { 	PNODE pHead = Create(); 	Traverse(pHead); 	int v; 	Delete(pHead, 2, &v); 	Traverse(pHead); }  PNODE Create() { 	int len;	//total count of nodes to be created. 	int i; 	int val; //temp value for the current node. 	printf("enter the size of nodes:"); 	scanf("%d", &len); 	PNODE pHead = (PNODE)malloc(sizeof(PNODE)); 	pHead->pNext = NULL; 	PNODE pTail = pHead;  	if(NULL == pHead) { 		printf("allocate memory failed!"); 		exit(0); 	} 	for (i = 0; i < len; i++) 	{ 		PNODE pCur = (PNODE)malloc(sizeof(PNODE)); 		if(NULL == pCur) { 			printf("allocate memory failed!"); 			exit(0); 		} 		printf("enter the %d-th value : ", i + 1); 		scanf("%d", &val); 		pCur->data = val;  		//set the new node as the tail node. 		pTail->pNext = pCur;	 		pCur->pNext = NULL; 		pTail = pCur; 	} 	return pHead; }  void Traverse(PNODE pHead) { 	PNODE pCur = pHead->pNext; 	while(NULL != pCur) { 		printf("%d ", pCur->data); 		pCur = pCur->pNext; 	} 	printf("\n"); 	return; }
user-0 提问: VS2010 使用库函数max，能编译、运行，但提示未定义标识符

回复:
user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:用__max  我的遇到了相似的问题，我将COM中的dll文件import后，提示未定义标识符，COM中的函数也提示未定义，但是程序能运行。   请问您说将max换成__max，这是什么意思呢？我是小白，请指教。

user: user-2
content: 用__max
user-0 提问: 我是超级菜鸟 帮我看看这个代码啊  谢谢了

回复:
user: user-1
content: 正像一楼说的，不要这样x>y>z写，你看哪本书是这样写的，改了吧，楼主你用什么课本，我记得我那个教材（谭浩强的）上好像有这个例子，还有就是注意代码格式

user: user-2
content: 参考代码： #include <stdio.h>  int max(int x,int y,int z) { 	x=x>y?x:y; 	x=x>z?x:z; 	return x; }  int main() { 	int a,b,c;	 	scanf("%d%d%d",&a,&b,&c); 	printf("最大值为%d\n",max(a,b,c)); 	return 0; }

user: user-3
content: if(x>y>z||x>z>y)m=x; 改成 if(x>y && x>z)     m=x; 其他的几个类似

user: user-2
content: 引用 1 楼 u013491662 的回复:不要写 x>y>z 因为x>y的值不是0就是1 0>z 或 1>z 显然是错的 要写成 x>y&&y>z+1

user: user-4
content: 不要写 x>y>z 因为x>y的值不是0就是1 0>z 或 1>z 显然是错的 要写成 x>y&&y>z
user-0 提问: 求助，两个代码片段功能一样，为什么后者会出错

回复:
user: user-1
content: copy完了，旧源的内容都变了，谁觉得copy成功我跟谁急！

user: user-2
content: 引用 6 楼 Zzy_ZhangZeyu_ 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 因为： copy的意思是操作完成后，新目标和旧源内容相同，且旧源内容不变。 move的意思是操作完成后，新目标和旧源内容相同，旧源内容不一定不变。  所以： 当新目标和旧源内容保存的位置有重叠时，根本不可能实现copy，只能实现move！  不对啊，我在我自己电脑上运行的时候即使有重叠，memcpy用起来也没问题。只有在提交到网上后，在oj上会出错[/quote]  都说了这段代码是只达不到你的逻辑要求。在release的版本，被重叠的内存如果是可以写入的，当然不会出错了。如果是只读内存，肯定会出错。你搞个const内存试试看吧。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:因为： copy的意思是操作完成后，新目标和旧源内容相同，且旧源内容不变。 move的意思是操作完成后，新目标和旧源内容相同，旧源内容不一定不变。  所以： 当新目标和旧源内容保存的位置有重叠时，根本不可能实现copy，只能实现move！  不对啊，我在我自己电脑上运行的时候即使有重叠，memcpy用起来也没问题。只有在提交到网上后，在oj上会出错

user: user-2
content: release版本应该不会有runtime error吧。

user: user-1
content: 因为： copy的意思是操作完成后，新目标和旧源内容相同，且旧源内容不变。 move的意思是操作完成后，新目标和旧源内容相同，旧源内容不一定不变。  所以： 当新目标和旧源内容保存的位置有重叠时，根本不可能实现copy，只能实现move！

user: user-3
content: 引用 2 楼 Zzy_ZhangZeyu_ 的回复:[quote=引用 1 楼 user-4 的回复:] The memcpy function copies count bytes of src to dest. If the source and destination overlap, this function does not ensure that the original source bytes in the overlapping region are copied before being overwritten. Use memmove to handle overlapping regions.  我靠，大哥，你太给力了 虽然我以前也知道memcpy处理重叠情形的时候会出问题，但没想到居然是RUNTIME ERROR这类错误，谢谢了，长个教训！[/quote] 使用memmove

user: user-0
content: 引用 1 楼 user-4 的回复:The memcpy function copies count bytes of src to dest. If the source and destination overlap, this function does not ensure that the original source bytes in the overlapping region are copied before being overwritten. Use memmove to handle overlapping regions.  我靠，大哥，你太给力了 虽然我以前也知道memcpy处理重叠情形的时候会出问题，但没想到居然是RUNTIME ERROR这类错误，谢谢了，长个教训！

user: user-4
content: The memcpy function copies count bytes of src to dest. If the source and destination overlap, this function does not ensure that the original source bytes in the overlapping region are copied before being overwritten. Use memmove to handle overlapping regions.
user-0 提问: 分析程序

回复:
user: user-0
content: 引用 3 楼 u013491662 的回复:这个是运算符优先级问题 优先级： 等于运算符（==）>逻辑或运算符（||）>赋值运算符（=） 所以if语句里的表达式相当于  iParam1 = (2 || (iParam2 == 2))  因为iParam2等于2，所以表达式iParam2 == 2的值为1 2||1的值为1 iParam1 = 1这个赋值表达式的值为1，此时iParam1的值为1 所以if语句相当于if(1) 执行 iRet = iParam1 + iParam2; 因为iParam1的值为1， iParam2的值为2，所以iRet的值为3！  按照你的分析，我去试了下，变化不同的值，得到的自己分析的结果。所以你的分析正确，谢谢！

user: user-1
content: 这个是运算符优先级问题 优先级： 等于运算符（==）>逻辑或运算符（||）>赋值运算符（=） 所以if语句里的表达式相当于  iParam1 = (2 || (iParam2 == 2))  因为iParam2等于2，所以表达式iParam2 == 2的值为1 2||1的值为1 iParam1 = 1这个赋值表达式的值为1，此时iParam1的值为1 所以if语句相当于if(1) 执行 iRet = iParam1 + iParam2; 因为iParam1的值为1， iParam2的值为2，所以iRet的值为3！

user: user-2
content: 既然代码正确，那就是iParam1 变成1了呗，至于为什么变成1而不是2，你可以自己再查查

user: user-0
content: 引用 1 楼 banshichiqinglangzi 的回复:iParam1 = 2不是iParam1 = =2？  确定是iParam1 = 2

user: user-2
content: iParam1 = 2不是iParam1 = =2？
user-0 提问: 纯C语言求改正，由于受编译环境限制，不能用c++的引用“&”符号

回复:
user: user-0
content: 引用 6 楼 Idle_ 的回复:引用int CreateListR_Link(LinkList *L,int elem[],int n){   LNode *p,*q;   int i;   L=(LinkList *)malloc(sizeof(LinkList));  <<--L变量被替换，它不再指向传入的LinkList内存块，而是指向了新malloc的内存 ...  return OK;   <<-- 原始传入的LinkList并未改变，新malloc的内存泄漏  }   int main(){   ...  CreateListR_Link(&LL,a,5);  <<--调用完后LL中的内容未改变，所以LL.next != NULL (栈变量，LL.next多半是个非0的无效数)  printf("%d\n",LengthList_Link(&LL));  <<-- LengthList_Link中判断p=p->next; p != NULL为TRUE, 但是p已指向非法内存，所以报错  return 0;  }   谢谢，学习了

user: user-1
content: 引用int CreateListR_Link(LinkList *L,int elem[],int n){   LNode *p,*q;   int i;   L=(LinkList *)malloc(sizeof(LinkList));  <<--L变量被替换，它不再指向传入的LinkList内存块，而是指向了新malloc的内存 ...  return OK;   <<-- 原始传入的LinkList并未改变，新malloc的内存泄漏  }   int main(){   ...  CreateListR_Link(&LL,a,5);  <<--调用完后LL中的内容未改变，所以LL.next != NULL (栈变量，LL.next多半是个非0的无效数)  printf("%d\n",LengthList_Link(&LL));  <<-- LengthList_Link中判断p=p->next; p != NULL为TRUE, 但是p已指向非法内存，所以报错  return 0;  }

user: user-0
content: 引用 3 楼 zxhuser-2 的回复:这样？ 嗯嗯，对的，感谢大神，由于自学数据结构，虽然有些时间了，但好像总停留在理论层面，现在想弄精通点，一较真就出现各种问题了

user: user-2
content: 链表创建、插入、删除、排序、反向代码 在这堆代码中有http://pan.baidu.com/s/17yIcQ

user: user-2
content: 这样？ #include <stdlib.h> #include <stdio.h>  typedef struct LNode { 	int data; 	struct LNode *next; }LNode,LinkList;  LinkList* CreateListR_Link(int elem[],int n); int LengthList_Link(LinkList *L);  LinkList* CreateListR_Link(int elem[],int n) { 	LNode *head,*p,*q; 	int i=0; 	head=p=(LinkList *)malloc(sizeof(LinkList)); 	p->data=elem[i]; 	printf("%d\t",p->data); 	for(i++;i<n;i++) 	{ 		q=(LNode *)malloc(sizeof(LNode)); 		q->data=elem[i]; 		printf("%d\t",q->data); 		p->next=q; 		p=q; 	} 	p->next=NULL; 	return head; }  int LengthList_Link(LinkList *p) { 	int n=0; 	while(p!=NULL) 	{ 		n++; 		p=p->next; 	} 	return n; }  int main() { 	LinkList* LL; 	int i; 	int a[5]; 	for(i=0;i<5;i++) 		a[i]=11+i; 	LL=CreateListR_Link(a,5); 	printf("\nnode num:%3d\n",LengthList_Link(LL)); 	return 0; };

user: user-0
content: 引用 1 楼 zxhuser-2 的回复:没弄懂lz的意思  能直接调试代码吗？ 把LengthList_Link(LinkList *L)这函数里的cc=getchar();全部注释起来你就会发现问题了

user: user-2
content: 没弄懂lz的意思
user-0 提问: 单链表的定义的问题

回复:
user: user-1
content: 单链表是由节点通过指针构成的，每个节点包含一个数据和一个指针（单链表），所以必然是指针类型了

user: user-2
content: 定义指针。。。

user: user-3
content: 引用 2 楼 Edward2Jason 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 因为LinkList的类型是struct Node *而不是struct Node 我们用指针指向单链表，所以必须是用struct Node *，是这样吗？[/quote] 是的，意思就是说以后可以用LinkList来代替typedef struct Node *了

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:因为LinkList的类型是struct Node *而不是struct Node 我们用指针指向单链表，所以必须是用struct Node *，是这样吗？

user: user-4
content: 因为LinkList的类型是struct Node *而不是struct Node
user-0 提问: c语言高手来下，帮我看几个宏定义什么意思

回复:
user: user-0
content: 引用 2 楼 zxh707wk 的回复:1.判断两个字符串是否相同 2.求出数组的长度 3.判断x最后一位是否为1（x应该是一个字节，判断第8位是否为1） 4.自定义头文件   [quote=引用 1 楼 zhao4zhong1 的回复:] 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E +1[/quote] 非常感谢   你这一说我瞬间明白多了   谢谢

user: user-1
content: 1.判断两个字符串是否相同 2.求出数组的长度 3.判断x最后一位是否为1（x应该是一个字节，判断第8位是否为1） 4.自定义头文件  引用 1 楼 zhao4zhong1 的回复:编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E +1

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

回复:
user: user-1
content: 引用 5 楼 w7390348 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] for(i=0;i<3;i++) {  fgets(str[i],20,stdin);if ('\n'==str[i][strlen(str[i])-1];str[i][strlen(str[i])-1]=0; }  感谢，赵老师[/quote] if后第一个;应替换为)

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:for(i=0;i<3;i++) {  fgets(str[i],20,stdin);if ('\n'==str[i][strlen(str[i])-1];str[i][strlen(str[i])-1]=0; }  感谢，赵老师

user: user-1
content: for(i=0;i<3;i++) {  fgets(str[i],20,stdin);  int L1=(int)strlen(str[i])-1;  if ('\n'==str[i][L1]) str[i][L1]=0; }

user: user-2
content: [code=for(i=0;i<3;i++) {  fgets(str[i],20,stdin);if ('\n'==str[i][strlen(str[i])-1];str[i][strlen(str[i])-1]=0; }c][/code]  引用 1 楼 zhao4zhong1 的回复:for(i=0;i<3;i++) {  fgets(str[i],20,stdin);if ('\n'==str[i][strlen(str[i])-1];str[i][strlen(str[i])-1]=0; }  可读性呀，赵老师

user: user-3
content: fgets(str[i],20,stdin); 文件指针用成stdin即可。

user: user-1
content: for(i=0;i<3;i++) {  fgets(str[i],20,stdin);if ('\n'==str[i][strlen(str[i])-1];str[i][strlen(str[i])-1]=0; }
user-0 提问: C 指针问题

回复:
user: user-1
content: a是指针变量， 一个变量名可以理解成内存地址，而且这个地址的存储单元内存了相对应使用时类型的值。对于指针变量，变量名的地址内存了是一个地址值，而且是指针类型的。指针变量在使用时分为左值和右值，这里是有区别的相同的写法放到其使用时的区别里就会有不同的用法。printf()是一个定义了可变参数的函数，使用的时候有他的规则，不同的格式化字符需要相应的类型的参数。

user: user-2
content: 这下明别了 大家以后往里面发代码时，先编辑好， 然后选着C/C++ 代码格式， 再把代码剪贴到里面去，在内；  然后跳出写文字； 这样对大家都好，号召大家发规范代码， 读起来舒心。。

user: user-2
content: #include<stdio.h> int main(int argc, char* argv[]) { 	char  *a = "this"; 	printf("string a address is %02x\n",a); 	printf("string value is %c\n",*a); 	return 0; }  怎么代码没有缩进呀， 看着别扭

user: user-2
content: #include<stdio.h> int main(int argc, char* argv[]) { 	char  *a = "this"; 	printf("string a address is %02x\n",a); 	printf("string value is %s\n",a); 	return 0; } 运行正确。。。 a 是一个指针，即是地址 ，打印a 指向的值不是该*a吗？为什么运行时会出错呢？ 如果是一个字符或者一个整数， *a，是表示a所指的值；正确。 但是，%s 格式的， 要求就是一个数组的的首地址。。 #include<stdio.h> int main(int argc, char* argv[]) { 	char  *a = "this"; 	printf("string a address is %02x\n",a); 	printf("string value is %c\n",*a); 	return 0; } 也是正确的， 但是是输出一个字符：t...

user: user-3
content: puts(a)

user: user-4
content: %p

user: user-5
content: %s格式化字符需要一个字符指针，如果是%c则需要一个字符（*a）

user: user-6
content: printf("string value is %s\n",*a); ------------------------------------------ 是%s只要给出，指针即可。 *a是‘t’这个字符。由于%s这个要求的是指针，你给个字符，肯定会出错。
user-0 提问: 同样的代码在不同的C语言运行平台上得出的结果不同

回复:
user: user-1
content: 不同的平台在数值范围方面可能不一样。

user: user-2
content: 相同的代码不同的平台得出不同的结果没什么奇怪的，LZ还是把自己的算法描述一下，别人才能分析。

user: user-0
content: 试了，还是一样的

user: user-3
content: 把有sizeof的地方仔细看一下。

user: user-4
content: 理论上不会出现这种情况，建议用平台自己的相关功能查看一下大小是否相同。
user-0 提问: 请问变址运算的规则到底是什么？

回复:
user: user-1
content: 只看不用，很难懂。懂也是假懂。

user: user-1
content: 引用 3 楼 k91191 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 学汇编你不学Windows下的WinDbg？Linux下的GDB？ 但是我得首先掌握汇编的规则吧，您说是不是？要不然怎么看得懂[/quote] 边看，边用，边懂。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:学汇编你不学Windows下的WinDbg？Linux下的GDB？ 但是我得首先掌握汇编的规则吧，您说是不是？要不然怎么看得懂

user: user-1
content: 学汇编你不学Windows下的WinDbg？Linux下的GDB？

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

回复:
user: user-1
content: 结构体类型Control 成员是一个指针变量save，这是一个函数指针，指向 参数为struct ControlTag *类型变量，无返回值的函数

user: user-2
content: 函数指针啦，返回 void， 参数是struct ControlTag *ctrl