Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 运算符优先级问题

回复:
user: user-1
content: 引用 7 楼 wang0635 的回复:[quote=引用 4 楼 ai977313677 的回复:] [quote=引用 3 楼 weixin_38470851 的回复:] [quote=引用 1 楼 wang0635 的回复:] --比&&和||的优先级高，而&&和||有短路性质，所以 先计算--x，若为0，则表达式的值为假，结束 否则，再计算--y，若非0，则表达式的值为真，结束 否则，计算--z，若为0，则表达式值为假，若非0，则表达式值为真  执行--后，为什么不是先执行 （）呢，而是直接被&&短路了，不是应该先执行（），然后再执行&& [/quote] 在逻辑表达式中，如果&&之前的--x已经为负数（C++中int<0都可以表示为false），那么整个表达式就已经是false，就不会继续向后执行了。 而逻辑或||之前为正数，那么整个表达式就已经是true，不会继续向后执行。 这个原理牵扯的比较底层。[/quote] 目的也很简单，就是避免不必要的运算。就像我们计算 0*1*2*3*...*100一样，可以直接得到结果0，不用算到最后。[/quote] 但是，问他的具体实现的话，涉及到编译层面的优化操作，而目前回答的都是比较高层，就是面向语言的的设计内容。

user: user-2

user: user-3
content: 引用 4 楼 ai977313677 的回复:[quote=引用 3 楼 weixin_38470851 的回复:] [quote=引用 1 楼 wang0635 的回复:] --比&&和||的优先级高，而&&和||有短路性质，所以 先计算--x，若为0，则表达式的值为假，结束 否则，再计算--y，若非0，则表达式的值为真，结束 否则，计算--z，若为0，则表达式值为假，若非0，则表达式值为真  执行--后，为什么不是先执行 （）呢，而是直接被&&短路了，不是应该先执行（），然后再执行&& [/quote] 在逻辑表达式中，如果&&之前的--x已经为负数（C++中int<0都可以表示为false），那么整个表达式就已经是false，就不会继续向后执行了。 而逻辑或||之前为正数，那么整个表达式就已经是true，不会继续向后执行。 这个原理牵扯的比较底层。[/quote] 目的也很简单，就是避免不必要的运算。就像我们计算 0*1*2*3*...*100一样，可以直接得到结果0，不用算到最后。

user: user-4
content: 对照这张图可以清楚知道运算符优先级

user: user-5
content: 如果你想知道是怎么一步一步判断的，你可以把表达式写成几行，然后设断点调试跟踪

user: user-1
content: 引用 3 楼 weixin_38470851 的回复:[quote=引用 1 楼 wang0635 的回复:] --比&&和||的优先级高，而&&和||有短路性质，所以 先计算--x，若为0，则表达式的值为假，结束 否则，再计算--y，若非0，则表达式的值为真，结束 否则，计算--z，若为0，则表达式值为假，若非0，则表达式值为真  执行--后，为什么不是先执行 （）呢，而是直接被&&短路了，不是应该先执行（），然后再执行&& [/quote] 在逻辑表达式中，如果&&之前的--x已经为负数（C++中int<0都可以表示为false），那么整个表达式就已经是false，就不会继续向后执行了。 而逻辑或||之前为正数，那么整个表达式就已经是true，不会继续向后执行。 这个原理牵扯的比较底层。

user: user-0
content: 引用 1 楼 wang0635 的回复:--比&&和||的优先级高，而&&和||有短路性质，所以 先计算--x，若为0，则表达式的值为假，结束 否则，再计算--y，若非0，则表达式的值为真，结束 否则，计算--z，若为0，则表达式值为假，若非0，则表达式值为真  执行--后，为什么不是先执行 （）呢，而是直接被&&短路了，不是应该先执行（），然后再执行&&

user: user-0
content: 执行--后，为什么不是先执行 （）呢，而是直接被&&短路了，不是应该先执行（），然后再执行&&

user: user-3
content: --比&&和||的优先级高，而&&和||有短路性质，所以 先计算--x，若为0，则表达式的值为假，结束 否则，再计算--y，若非0，则表达式的值为真，结束 否则，计算--z，若为0，则表达式值为假，若非0，则表达式值为真
user-0 提问: linux下应用数组溢出的影响，麻烦看看

回复:
user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:最严重能造成入侵者拿到root权限。  这个 倒不存在

user: user-0
content: 引用 6 楼 hzy_76 的回复:要看這些代碼出現在哪裏，如果是用戶層，可能導致其他應用異常，某些應用在啓動階段會調用的話，還可能導致啓動異常。 但是如果出現在内核代碼中，就嚴重得多，基本就無法啓動了。  無論如何，不會導致flash損壞的，更換flash解決可能只是一個誤解，巧合。也許剛好溢出到的位置是那片flash本來有問題的位置？我猜測而已。  我认为应用也不会导致F损坏，  但有没可能 应用 数组越界，会改写嵌入式linux什么系统文件导致无法启动

user: user-1
content: 要看這些代碼出現在哪裏，如果是用戶層，可能導致其他應用異常，某些應用在啓動階段會調用的話，還可能導致啓動異常。 但是如果出現在内核代碼中，就嚴重得多，基本就無法啓動了。  無論如何，不會導致flash損壞的，更換flash解決可能只是一個誤解，巧合。也許剛好溢出到的位置是那片flash本來有問題的位置？我猜測而已。

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:[quote=引用 3 楼 u011609112 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 数组越界是未定义行为，主要看越界的内容会不会被覆盖或者把其他数据内容覆盖。数组越界很有可能导致程序异常。因此，应处理掉数组越界的问题  没错，我想你写的在烂的app，也不知道导致flash芯片出问题吧？[/quote] 我不写app，程序出问题不要找芯片的问题。当你保证了自己写的程序没问题了，再去找别人的问题，比如flash芯片。数组都越界访问，自己本身就有问题，再去怀疑别人的问题，比如芯片，这是说不过去的 [/quote]  我意思是前同事写的接口代码确实错误不少，尤其操作文件这块，但应该不至于导致flash芯片出问题吧、

user: user-2
content: 引用 3 楼 u011609112 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 数组越界是未定义行为，主要看越界的内容会不会被覆盖或者把其他数据内容覆盖。数组越界很有可能导致程序异常。因此，应处理掉数组越界的问题  没错，我想你写的在烂的app，也不知道导致flash芯片出问题吧？[/quote] 我不写app，程序出问题不要找芯片的问题。当你保证了自己写的程序没问题了，再去找别人的问题，比如flash芯片。数组都越界访问，自己本身就有问题，再去怀疑别人的问题，比如芯片，这是说不过去的

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:数组越界是未定义行为，主要看越界的内容会不会被覆盖或者把其他数据内容覆盖。数组越界很有可能导致程序异常。因此，应处理掉数组越界的问题  没错，我想你写的在烂的app，也不知道导致flash芯片出问题吧？

user: user-0
content: flash芯片是  NANDFlash ， 现在就是不知道到底无法启动的原因是什么？

user: user-2
content: 数组越界是未定义行为，主要看越界的内容会不会被覆盖或者把其他数据内容覆盖。数组越界很有可能导致程序异常。因此，应处理掉数组越界的问题

user: user-3
content: 最严重能造成入侵者拿到root权限。

user: user-4
content: 1 可能是由于越界导致了某些代码补擦除了，导致启动不了。 2 可能是由于越界导致flash在程序中被多次擦除，烧写，导致了flash坏了。如这样的代码： while(1) {      擦除();      写Flash（） }  不一定是while,但是是这样的一个循环结构。
user-0 提问: c语言程序

回复:
user: user-1
content: #include "stdafx.h" #include "stdio.h" #include <iostream>  #define INIT 20 #define  increment  2  typedef struct{     char name[20];     float china;     float math;     float English;     int num; //学号     int Class;    //年级     float average;     float All; }Stu; typedef struct{     Stu *elem;     int length;     int initsize; }link; link L; //定义全局线性表变量L void Init(link &l)   //初始化线性表 {     l.elem = (Stu*)malloc(sizeof(Stu)*INIT);     l.length = 0;     l.initsize = INIT; } void entry()  //信息录入 { int i;     for (i = 0; i<10; i++)  //录入十个学生信息     {         printf("姓名：");         //scanf_s("%s", L.elem[i].name);         scanf_s("%s", L.elem[i].name, 20);         printf("语文成绩：");         scanf_s("%f",&(L.elem[i].china));         printf("数学成绩：\n");         scanf_s("%f",&(L.elem[i].math));         printf("英语成绩：\n");         //scanf_s("%f",(L.elem[i].English));         scanf_s("%f", &(L.elem[i].English));         printf("学号：");         scanf_s("%d",&(L.elem[i].num));         printf("年级：");         scanf_s("%s",&(L.elem[i].Class));         L.elem[i].All = L.elem[i].china + L.elem[i].math + L.elem[i].English;         printf("总成绩：%f", L.elem[i].All);         L.elem[i].average = L.elem[i].All/3;         printf("平均成绩:%f", L.elem[i].average);         L.length=L.length+1;     }     //L.length=L.length+1;     return; } 发现三处错误，建议对比一下找到自己的问题

user: user-2
content: 楼主，上面代码在vs2013中是能编译通过的，编译没有错误。
user-0 提问: 字符串的二叉树动态查找

回复:
user: user-0
content: 怎么输入不同的字符串就不给进行输入要查找的字符串的

user: user-1
content: 因为我的系统是英文版，请无视乱码。最后输出修改为no suc是为了让你看清楚。

user: user-1
content: // T392406882.cpp : Defines the entry point for the console application. //  #include "stdafx.h"   #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct node{ char *data; struct node *lchild,*rchild; }Btree;  typedef Btree *BiTree; int InsertBiTree(Btree **root,char *x){ Btree *current,*parent=NULL ,*p; current=*root; while(current!=NULL){ if(strcmp(current->data,x)==0)  return 0;  parent=current;  if(strcmp(current->data,x)<0)  current=current->rchild;  else   current=current->lchild; } p=(Btree*)malloc(sizeof(Btree)); if(p==NULL){ printf("空间不够\n"); exit(1); } p->data = (char *)(malloc(sizeof(char) * 100)); //修改这里 strcpy(p->data,x); //修改这里 p->lchild=NULL; p->rchild=NULL; if(parent==NULL)     *root=p; else if(strcmp(x,current->data)<0)     parent->lchild=p; else      parent->rchild=p; return 1; } int BiTreeSearch(Btree *root ,char *x){ Btree *current; if(root!=NULL){ current=root; while(current!=NULL){ if(strcmp(current->data,x)==0) return 1; if(strcmp(current->data,x)<0)  current=current->rchild; else current=current->lchild; } } return -1; } int main(void){ Btree *s=NULL; int i; char ch[5]; printf("请输入字符串:\n"); for(i=0;i<2;i++){ scanf("%s",ch); InsertBiTree(&s,ch);     } printf("请输入要查找的字符串:"); scanf("%s",ch); if(BiTreeSearch(s,ch)==-1) printf("no"); else printf("suc");  return 0; }

user: user-2
content: 百度搜相关关键字。
user-0 提问: 无报错警告的程序在VC上不能完全运行完，在Dev C++上不能运行

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。
user-0 提问: c语言有没有类似boost这样的库?libc太简陋了

回复:
user: user-1
content: 引用 5 楼 zyx6680599 的回复:[quote=引用 2 楼 u010165006 的回复:] 可以C++当C用，加上boost。 我指的是lz[/quote]  指针不要乱指，会绕晕

user: user-2
content: c没有直接的boost库，只能间接调用

user: user-3
content: 引用 2 楼 u010165006 的回复:可以C++当C用，加上boost。 我指的是lz

user: user-3
content: 你前两天还说C++不好  引用 3 楼 mLee79 的回复:libc 过于庞大了, 大部分都没啥用 ...

user: user-4
content: libc 过于庞大了, 大部分都没啥用 ...

user: user-5
content: 不能说没有, 但是必须用c的环境一定是嵌入式, 有库你也没空间用. 不然你为啥不用c++呢, 就算是普通的嵌入式也可能用c++

user: user-1
content: 可以C++当C用，加上boost。
user-0 提问: 求助,c语言gb2312转utf8

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

user: user-0
content: qiuzhu a

user: user-0
content: 笔误, g2u((char *)cust_name,strlen((char *)cust_nm),name_out,100);  这句我上面打错了,cust_nm是cust_name,笔误.
user-0 提问: c语言大佬路过看一下 自己写的带界面转换器 有点小问题但是不怎么怎么回事

回复:
user: user-0
content: 因为学校要求vc 所以用的vc 编译没有错误但是界面显示数字有点问题 输入123只显示23 然后转换后的结果也不正确

user: user-0
content: void o2() {    int n;    int N;    char A[10];    char B[5];    char C[100];    SqStack s;     SElemType E;    InitStack(&s);      scanf("%d",&n);    itoa(n,A,10);    outtextxy(180,80,A);      scanf("%d",&N);    itoa(N,B,10);    outtextxy(200,140,B);     while(n)     {      Push(&s,n%N);       n=n/N;    }    while(!StackEmpty(s))     {      Pop(&s,&E); 	 if(E<10) 	 { 	 itoa(E,C,10);  	 outtextxy(10,240,C); 	 } 	 else  	 {  		 char C=' '; 		 switch(E){ 		    case 10:C='a';break;             case 11:C='b';break;   	        case 12:C='c';break; 	        case 13:C='d';break;             case 14:C='e';break;             case 15:C='f';break;}           outtextxy(10,240,C);  	 }  getch();	     } }  int main() { 	lead();  }

user: user-0
content: #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <string.h> #include <graphics.h>   typedef int SElemType;  #include"C1.H" #include"C3-1.H"  #include"BO3-1.C"  #define WIDTH 400 #define HEIGHT 500  void o1(); void o2(); void lead();  void lead() { 	initgraph(WIDTH,HEIGHT); 	setbkcolor(RGB(135,206,250)); 	settextcolor(RGB(0,0,0)); 	o1(); 	o2();  }  void o1() { 	cleardevice();  	setfont(40,0," 微软雅黑");  	RECT r1={0,20,400,60}; 	drawtext("进制转换器:",&r1,DT_CENTER|DT_VCENTER|DT_SINGLELINE);  	RECT r2={0,80,400,120}; 	drawtext("输入的数字:",&r2,DT_LEFT|DT_SINGLELINE);  	RECT r3={0,140,400,180}; 	drawtext("输入转换进制:",&r3,DT_LEFT|DT_SINGLELINE);  	RECT r4={0,200,400,240}; 	drawtext("转换后的数字:",&r4,DT_LEFT|DT_SINGLELINE);    	setfillcolor(RGB(255,255,255)); 	solidrectangle(180,80,390,120); 	solidrectangle(200,140,390,180); 	solidrectangle(10,240,390,490);  	setfont(30,0," 微软雅黑"); 	settextcolor(RGB(0,0,0)); 	setbkcolor(RGB(255,255,255));  	getch();  }

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

回复:
user: user-1
content: 宏相当于源文件的文本替换。 第一个直接用1替换对应的代码 第二个是个变量，能替换吗？

user: user-2
content: 这宏属于预编译，比编译更早。不能这样用吧，还是得用数组。

user: user-0
content: 求助，谢谢！

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

user: user-3
content: 了解一下代码生成技术。

user: user-0
content: 引用 楼主 yangyunzhao 的回复: #define random_reslev(_ResType) random(Res##_ResType##Levs[0], Res##_ResType##Levs[1])    // 代码1 int lev = random_reslev(1);  // 正确  // 代码2 int type = 1; int lev = random_reslev(type); // 编译失败   请改如何使用才可以实现代码2的目标？谢谢  // 变量定义类似这样 int Res0Levs[2]={10,20}; int Res1Levs[2]={20,35}; int Res2Levs[2]={40,80};
user-0 提问: 为什么要使用 malloc（）是动态内存分配函数？

回复:
user: user-1
content: 举个例子说，我让你给我读取一个文件，这个文件有可能只有几个字节，也可能是有几个GB这么大。 只有到运行时候才知道它的实际大小。 数组是用不了的，因为数组必须是用常量确定它的大小。也就是说编译时必须确定数组的大小。 如果你用一个运行时才能确定其值的变量去定义数组的大小是编译报错的，比如下面这样就写代码就是错的。  int fileSize = size; //size是已经确定的文件大小 unsigned char fileBuff[fileSize] = { 0 }; //错了，数组必须是用常量定义大小。    如果想要实现之前说的功能，就必须使用malloc动态内存分配，像下面这样：  int fileSize = size; //size是已经确定的文件大小 unsigned char* pFileBuff = (unsigned char*)::malloc(fileSize); //文件处理操作代码略 ::free(pFileBuff); //千万记着，动态分配的内存必须手动释放，否则会引发内存泄漏

user: user-2
content: （1）如果int X[100] 是全局变量，那么他的生存周期可与malloc类似；如果int x 是临时变量，则该程序结束后，int x则消失，malloc需要使用free函数释放内存； （2）个人感觉使用malloc的原因，如'caozhy'版主和‘自信男孩’所述，是为了动态分配内容，合理使用内存容量。

user: user-3
content: 容量大小从小到大：栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储

user: user-4
content: 如果你不知道你需要多少内存，比如说用数组存储学生的信息，那么你不知道你程序要输入多少个学生的信息。 你不动态分配只能估计个值，估计大了，在程序运行的大部分时候，都浪费了存储。估计小了，在程序少部分情况下就无法满足需要。 这就是静态指定数组大小的弊端。

user: user-5
content: 引用 楼主 MM_man 的回复:1、相对于自动分配内存，malloc（）函数申请分配的内存地址有什么不同：  比如：  int x[100]   int * x = (int *)malloc(100 *sizeof(int))  二者之间的内存地址有什么区别？  求教，谢谢  2、C语言什么情况下需要用malloc来申请内存？求教，谢谢  说的简单通俗一点，malloc分配指的是堆内存，也就是说除了malloc分配的变量，其他的都在栈里面，假如在一个函数里面定义的一个整型变量， int a;那么这个a就会在这个函数里面的最后一行结束｝被释放掉了，如果另外一个函数想调用这个函数int a时已经不可能了,因为他已经被释放了，所以要定义一个堆内存malloc,当这个函数}结束时，a不会被释放，就是这么理解

user: user-3
content: 容量大小从小到大：栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储

user: user-6
content: 1.自动分配的是在栈上，动态申请的是在堆上申请的。内存的申请的位置不同 2. 作用域不同，自动分配的，作用域是在函数内，从申请申请开始到函数结束，它的生命周期也就结束了，所以栈上的空间是系统分配和系统回收，不需要程序员手动去做什么；动态分配的作用域是从申请开始到调用free释放结束；所以，不限于函数内，但是释放需要程序员参与，否则会出现内存泄露。  什么时候使用malloc，那就是需要动态改变大小的时候，通过realloc变更内存的大小（可变大可变小）；

user: user-7
content: 1. 自动分配的内存函数结束就不能使用了 malloc 分配的内存可以一直使用直到你调用了 free  2.   (1). 内存大小需要等到运行的时候才能确定.  (2). 内存的大小超过了栈的大小  (3). 内存的使用范围
user-0 提问: C语言一级指针字符串去空格程序求挑错

回复:
user: user-1
content: 又重新研究了一下。 #include<stdlib.h> #include<stdio.h> #include<string.h> #include<stdbool.h>  //去掉字符串中的空格并输出 void qukongge(char *instr, char *outstr, int *num) { char *intemp = instr; int count = 0; while (*intemp!='\0') { if (*intemp==' ') { intemp++; count++; } else { *outstr = *intemp; outstr=outstr+sizeof(*instr); intemp=intemp+sizeof(*instr);//新增 } } *outstr = '\0'; *num = count; }  void main() { char *instr = "   daffdfa dsf dff saf    "; char *outstr=(char*)malloc(100); int num = 0; qukongge(instr, outstr, &num); printf("空格数为%d\n去空格后为%s\n", num, outstr);//修改*outstr为outstr，因为*outstr对应的是一个字符。 system("pause"); }

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-0
content: 求挑错。。 提示的是内存错误 0x0039154C 处的第一机会异常(在 2018.06.24.exe 中): 0xC0000005: 写入位置 0x01509000 时发生访问冲突。 如有适用于此异常的处理程序，该程序便可安全地继续运行。

user: user-1
content: #include<stdlib.h> #include<stdio.h> #include<string.h> #include<stdbool.h>  //去掉字符串中的空格并输出 void qukongge(char *instr, char *outstr, int *num) { int count=0; int j=0; int i=0; for(i=0;(*(instr+i)!='\0');i++)  {   if (*(instr+i)==' ')    {      count++;     continue;     } else    {     *(outstr+j) = *(instr+i);     j++;    }  } *(outstr+j) = '\0'; *num = count; }  int main(void) { char instr[32]= "   daffdfa dsf dff saf    "; char *outstr=(char*)malloc(sizeof(instr)); int num = 0; qukongge(instr, outstr, &num); printf("空格前为%s\\0\n", instr);  printf("空格数为%d\n", num); printf("去空格后为%s", outstr); return 0; }
user-0 提问: win32 SDK LISTVIEW控件分组问题？

回复:
user: user-0
content: 有大神方便帮我看看吗？

user: user-0
content: 有大神方便帮我看看吗？

user: user-0
content: 有人知道吗？ 我是新手，想了很久，还是不行啊！ 为什么我的commctrl.h里都没有这些LISTVIEW分组需要的定义？？ 我是用MinGW编译的。它里面commctrl.h不全吗？？
user-0 提问: vc6.0运行一直说0x00401221指令引用的0xccccccd8内存，该内存不能为read

回复:
user: user-1
content: windows里常见的内存填充数据含义  * 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory 漱 * 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers 涵?  * 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory 很?  * 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger 撅饰 * 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files 烫烫 * 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory 屯屯 * 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory 葺葺 * 0xDDDDDDDD : Used by Microsoft's free() or delete to mark freed heap memory 蕲蕲 * 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash  * 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-0
content: 没发完 void PreThreading(BiThrTree p) { 	if(p) 	{ 		if(p->lchild) 		{ 			p->lchild=pre;p->Ltag=1; 		} 		if(pre->rchild) 		{ 			pre->rchild=p;pre->Rtag=1; 		} 		pre=p; 		if(p->Ltag==0)PreThreading(p->lchild); 		if(p->Rtag==0)PreThreading(p->rchild); 	} }   void PreOrderTraverse_Thr(BiThrTree Thrt) {       BiThrTree p; 	p=Thrt->lchild; 	while(p!=Thrt) 	{ 		printf("%c->",p->data); 		while(p->Ltag==0) 		{ 			p=p->lchild;printf("%c->",p->data); 		} 			while((p->Rtag==1)&&(p->rchild!=Thrt)) 			{ 				p=p->rchild; printf("%c->",p->data); 			} 			if(p->Ltag==0)  p=p->lchild; 			else p=p->rchild; 	} }   void main() { 	BiThrTree T,Thrt; 	printf("请输入树的结点（#表示结点为空）：\n");   	PreOrderThreading(Thrt,T); 	PreOrderTraverse_Thr(Thrt); 	printf("先序遍历结果：\n"); 	printf("\n");  }
user-0 提问: 0xC0000005读取位置0xCDCDCDDD时发生访问冲突

回复:
user: user-0
content: cout << "请选择要进行的操作：\n1.请求分配内存 \n2.请求回收内存 \n3.退出\n"; 		cin >> choice; 		if(choice == 1) 		{ 			cout << "请求分配内存\n"; 			cout << "请输入要分配的内存的长度："; 			cin >> len; 			Distribute(len); 		} 		else if (choice == 2) 		{ 			cout << "请求回收内存\n"; 			cout << "请输入要回收的内存的ID："; 			cin >> ID; 			recover(ID); 		} 		else if (choice == 3) 		{ 			break; 		} 		else 		{ 			cout << "输入有误！请重新输入!\n"; 			continue; 		} 	} 	return 1; }

user: user-0
content: //若回收的分区有上邻空闲分区和（或）下邻空闲分区，要求合并为一个空闲分区登记在空闲分区表的一个表项里   				temp->next->next = temp->next->next->next; 				temp->next->state = 0;        //分区状态改为空闲   			} 		} 		cout << "回收内存后的内存状态：" << endl;  		display(); 	} } int main()        //主函数   { 	int choice; 	int len; 	int ID; 	//初始化内存分区状态   	fstream file; 	file.open("start.txt", ios_base::in | ios_base::out | ios_base::app);   //读写input.txt文件，读入最初的内存分配状态   	string s0; 	getline(file, s0);                //从输入流读取一行到s0   	istringstream sin(s0);          //从s0中读取单个字符   	sin >> FQCount;                    //将sin向右位移6位   	FQ *temp = (FQ*)malloc(sizeof(FQ));     //定义当前指针   	temp = First; 	for (string s; getline(file, s);)        //将文件中的分区起始地址，分区长度及分区状态读入程序   	{ 		FQ *fq = (FQ*)malloc(sizeof(FQ)); 		istringstream sin(s); 		sin >> fq->beginAddress; 		sin >> fq->length; 		sin >> fq->state; 		fq->ID = ++maxID; 		fq->next = NULL; 		temp->next = fq; 		temp = fq; 	} 	cout << "最初的内存分配状态：" << endl; 	display(); 	while(1) 	{

user: user-0
content: while (!(temp->next->state == 0 && temp->next->length >= len))     //此分区的状态为占用状态或者分区长度小于需要的长度   	{ 		temp = temp->next;                    //考虑下一个分区   	} 	temp = temp->next; 	//  修改分区表   	FQ *fq1 = (FQ*)malloc(sizeof(FQ)); 	fq1->ID = ++maxID; 	fq1->next = temp->next; 	fq1->beginAddress = temp->beginAddress + len; 	fq1->length = temp->length - len; 	fq1->state = 0; 	temp->next = fq1; 	temp->length = len; 	temp->state = 1; 	cout << "分配内存后的内存状态：" << endl; 	display(); } void recover(int id)               //回收内存函数   { 	if (id>maxID)                      //判断想要回收的分区是否合理   	{ 		cout << "输入的id过大，没有与之匹配的分区" << endl;  	} 	else{ 		FQ *temp = (FQ*)malloc(sizeof(FQ)); 		temp = First;                          //当前指针指向头指针   		while (!(temp->next->ID == id))        //寻找要回收的分区的id   		{ 			temp = temp->next; 		} 		if (temp->state == 0)                //分区状态为空闲时   		{ 			if (temp->next->next == NULL) 			{ 				temp->next = NULL; 				temp->length = temp->length + temp->next->length; 				//若回收的分区有上邻空闲分区和（或）
user-0 提问: int值保存初始化

回复:
user: user-0
content: #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <ctype.h> #define Length 10 #define Amount 5 int _tmain(int argc, char * argv[]) { 	struct three_name{ 		char last_name[Length]; 		char mid_name[Length]; 		char first_name[Length]; 	}; 	struct member{ 		char account[Length]; 		struct three_name name; 	};  	struct member m_member[Amount] = { { "101", { "aaa", "bb2", "dccc" } }, { "202", { "abb", .mid_name = "fccc" } }, { "303", { "acc", "bb4", "hccc" } }, { "404", { "add", "bb5", "fccc" } }, { "505", { "aee", "bb6", "ccc" } } };  	system("PAUSE"); 	return 0; }

user: user-1
content: 不会吧，程序第二次运行。count应该还是从1开始的，你可以输出count看一下变量值

user: user-0
content: fseek函数一般用于二进制文件，也可以用于文本文件。用于文本文件操作时，需特别注意回车换行的情况：因为在一般浏览工具如UltraEdit中，回车换行视为两个字符0x0D和0x0A，但真实的文件读写和定位时却按照一个字符0x0A进行处理，因此碰到此类问题时，可以考虑将文件整个读入内存，然后在内存中手工插入0x0D的方法，这样可以达到较好的处理效果。

user: user-0
content: 第二次运行结果

user: user-0
content: 第一次运行结果

user: user-0
content: 0 1 2 3 4 5 6 7 8 9 1 8 7 6 5 4 3 2 1 0 2 0 0 0 2 2 2 0 0 0 3 1 2 4 5 6 7 8 6 5 4 5 4 5 4 5 4 5 4 5 5 7 7 7 7 9 9 9 9 9 6 3 3 3 4 4 4 1 1 1

user: user-0
content: #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define Length 20 int _tmain(int argc, char * argv[]) { 	char name[Length]; 	char ch; 	int data_n[7][10] = {}; 	char data_i[8][10] = {}; 	FILE * fp; 	char image_n[10] = { ' ', '.', '/', '-', '+', '*', '&', '^', '#', '@' }; 	int num = 0, value = 0; 	printf("Please enter the file's name:"); 	scanf("%s",name); 	if ((fp = fopen(name, "r")) == NULL) 	{ 		printf("Cna't open %s file.", name); 		exit(EXIT_FAILURE); 	} 	for (size_t i = 0; i < 7; i++) 	{ 		for (size_t j = 0; j < 10; j++) 		{ 			//fseek(fp, fp_n, SEEK_SET); 			ch = fgetc(fp); 			//ch = getc(fp); 			value = (int)(ch - '0'); 			data_n[i][j] = value; 			fgetc(fp); 			//fp_n = fp_n +  2; 		} 		//fp_n = fp_n - 1; 	} 	for (size_t i = 0; i < 7; i++) 	{ 		for (size_t j = 0; j < 10; j++) 		{ 			num = data_n[i][j]; 			data_i[i][j] = image_n[num]; 		} 	} 	for (size_t i = 0; i < 10; i++) 	{ 		data_i[7][i] = image_n[1]; 	} 	for (si

user: user-2
content: 打印出来的count，是读出文件中的单词的计数。第二次运行时，文件中追加了一句话后，却又从头开始读出，当然要有前面的东西了

user: user-3
content: 《程序员的自我修养——链接、装载与库》
user-0 提问: VC 连接 MySQL数据库时，如何实现条件查询，条件由用户输入

回复:
user: user-1
content: 搓→矬

user: user-2
content: res = mysql_query(&my_connection, "SELECT childno, fname,                                            age FROM children WHERE age > 5"); 这一句后面改成你输入的sql语句

user: user-2
content: 代码都贴不全，是我浏览器问题？？csdn现在做的越来越搓了

user: user-2
content: #include <stdlib.h>       #include <stdio.h>       #include "mysql.h"       MYSQL my_connection;       MYSQL_RES *res_ptr;       MYSQL_ROW sqlrow;       int main(int argc, char *argv[]) {          int res;          mysql_init(&my_connection);           if (mysql_real_connect(&my_connection, "localhost", "rick",                                                   "bar", "rick", 0, NULL, 0)) {          printf("Connection success\n");          res = mysql_query(&my_connection, "SELECT childno, fname,                                            age FROM children WHERE age > 5");          if (res) {            printf("SELECT error: %s\n", mysql_error(&my_connection));          } else {             res_ptr = mysql_store_result(&my_connection);            if (res_ptr) {            printf("Retrieved %luows\n",(unsignedlong)mysql_num_rows(res_ptr));              while ((sqlrow = mysql_fetch_row(res_ptr))) {                printf("Fetched data...\n");              }             if (m
user-0 提问: 程序有个很难理解的bug,求助！请教各位大神，注释的那句//printf("%d",array[i]);为什么一定要加，不加程序就会停止运行，不应该啊。加

回复:
user: user-1
content: 明显的内存溢出

user: user-2
content: C++ 本身并没有对内存做什么保护, 你访问越界了, 直接就覆盖掉后面部分的内存, 如果后面部分的内存刚好没有其他人使用, 没有覆盖到关键数据, 就会出现看起来正常的现象.

user: user-0
content: 嗯嗯，发完就注意到了，array=(int*)malloc(2*num*sizeof(int));，申请内存空间不够。 但是我在测试的时候发现即使申请的内存不够，有时也是可以用的，例如，申请3个int空间，可以存6个；但是申请5 个，不能存10个。虽然应该用多少，申请多少，但是看来申请的时候，内存机制也不一定会完全按照你申请的来，是这样吗？

user: user-2
content: 申请的内存是 num 个:  malloc(num*sizeof(int)); 访问却是 2 * num 个: for(i=0;i<2*num;i++) 这不是赤裸裸的越界吗!

user: user-3
content: 引用 2 楼 zhanshen112 的回复:嗯嗯，发完就注意到了，array=(int*)malloc(2*num*sizeof(int));，申请内存空间不够。 但是我在测试的时候发现即使申请的内存不够，有时也是可以用的，例如，申请3个int空间，可以存6个；但是申请5 个，不能存10个。虽然应该用多少，申请多少，但是看来申请的时候，内存机制也不一定会完全按照你申请的来，是这样吗？ 只是你没有遇到更难受的结果。不能正常运行，这不就是问题吗？至于加了之后可以了，也只能说错误的效果相互抵消了而已

user: user-4
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。
user-0 提问: C语言里的Struct里使用错鋘

回复:
user: user-1
content: 性别和班级要用字符串存储，"男"实际上是个字符串，由两个字符组成

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

user: user-3
content: 引用 2 楼 weixin_38495478 的回复:谢谢！你的指点，其实我想做的是这个程序的，想通过上面的那个小程序进行的测试，最后那个到了输入班级的时候就出了问题：   #   include<stdio.h> #   include<stdlib.h> #   include<time.h>   struct information { 	char name[300];//姓名； 	char sex[50];//性别	 	int age;//年龄；	 	char class1[250];//班级	 };  int main(void) { 	struct information st; 	int i,j;  	printf("输入学生数量"); 	scanf("%d",&j);  	for(i=1;i<=j;++i) 	{ 		printf("第%d位学生的信息：\n",i);  		printf("姓名:"); 		scanf("%s",st.name);  		printf("性别:"); 		scanf("%s",st.sex);   		printf("年龄:"); scanf("%d",&st.age);    		printf("班级:"); 		scanf("%s",st.class1); 	}  	system("pause"); 	return 0; }  代码没有大问题，只是年龄那里应该是scanf("%d",&st.age); //scanf %d对应的是整形地址，所以要加个地址符&

user: user-4
content: printf("年龄:"); scanf("%d",st.age);  那个st.age前加上&

user: user-3
content: name 是字符串，定义的时候双引号“张三”，而班级你定义的是字符，定义的时候单引号里面必须是单个字符，高二三班就是字符串了，   1 #include<stdio.h>   2    3 struct student{   4         char name[100];   5         char sex;   6         int age;   7         char class[100];   8 };   9   10 int main(){  11           12         struct student stu={"张三",'M',20,"高三二班"};//M代表男，Ｆ代表女     13         printf("%s,%c,%d,%s\n",stu.name,stu.sex,stu.age,stu.class);  14           15           16         return 0;  17 } ~

user: user-0
content: 谢谢！你的指点，其实我想做的是这个程序的，想通过上面的那个小程序进行的测试，最后那个到了输入班级的时候就出了问题：   #   include<stdio.h> #   include<stdlib.h> #   include<time.h>   struct information { 	char name[300];//姓名； 	char sex[50];//性别	 	int age;//年龄；	 	char class1[250];//班级	 };  int main(void) { 	struct information st; 	int i,j;  	printf("输入学生数量"); 	scanf("%d",&j);  	for(i=1;i<=j;++i) 	{ 		printf("第%d位学生的信息：\n",i);  		printf("姓名:"); 		scanf("%s",st.name);  		printf("性别:"); 		scanf("%s",st.sex);   		printf("年龄:"); 		scanf("%d",st.age);    		printf("班级:"); 		scanf("%s",st.class1); 	}  	system("pause"); 	return 0; }
user-0 提问: 二维数组指针操作 求助大神！！

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组

user: user-2
content: 首先，既然你声明的是 unsigned char a[2][3]={{10,5,6},{1,2,3}};和unsigned char (*m)[3]那么在你的e函数中的for循环中i的取值范围就应该是0到2，否则就越界了。因为你这么声明，其实m[i][j]就是a[i][j]，相当于给a取了个别名叫做m for(i=0;i<2;i++) {          if(memcmp(m[i],l,3)==0) {return i;}  } 其次，起步向前走也已经提到了，你的e函数仅仅在for循环中有返回值，return的是i；但是如果都不符合你的if条件的话，我这边测试的时候程序默认返回的是0，那岂不是达不到你的目的。所以对于e函数最终还是需要设定一个返回值，用来表示什么条件都不满足条件的情况，并且能够与符合条件时的返回值区分开来。鉴于你的函数返回值类型是unsigned char，弄个255已经是最大了。 参考代码如下，我加了两处printf可供你参考#include <stdio.h> #include <string.h> unsigned char e(unsigned char (*m)[3],unsigned char *l) {     unsigned char i;     for(i=0;i<2;i++)     {         printf("m[%d]=%d,%d,%d\n",i, m[i][0],m[i][1],m[i][2]);         if(memcmp(m[i],l,3)==0) {return i;}     }     return 255; } int main() {    unsigned char a[2][3]={{10,5,6},{2,2,3}};    unsigned char b[]={1,2,3,5,6,9,6};      for(int i=0;i<2;i++)     {         printf("a[%d]=%d,%d,%d\n",i, a[i][0],a[i][1],a[i][2]);     }     int q=0;     q=e(a,b);     printf("%d",q);     return 0; }

user: user-0
content: 引用 6 楼 weixin_42518655 的回复:[quote=引用 5 楼 qq_42523402 的回复:] 各位大神 看看还有问题吗  if(memcmp(m[i],l,3)==0) {return i;}//这一句需要优化一下，如果没有相等的字符，那么你怎么控制该子程序有反馈值。[/quote] 不是很明白 ？？

user: user-3
content: 引用 5 楼 qq_42523402 的回复:各位大神 看看还有问题吗  if(memcmp(m[i],l,3)==0) {return i;}//这一句需要优化一下，如果没有相等的字符，那么你怎么控制该子程序有反馈值。

user: user-0
content: 不是哦 找到问题了   #include <stdio.h> #include <string.h> unsigned char e(unsigned char (*m)[3],unsigned char *l) {     unsigned char i;     for(i=0;i<3;i++)     {          if(memcmp(m[i],l,3)==0) {return i;}     }  } int main() {     unsigned char a[2][3]={{10,5,6},{1,2,3}};    unsigned char b[]={1,2,3,5,6,9,6};     int q=0;     q=e(a,b);     printf("%d",q);     return 0; }

user: user-4
content: 在你眼中int和int[]是同一个东西么？

user: user-0
content: 引用 1 楼 SHIGUANGTUJING 的回复:兄弟,你闹呢,e函数参数是指针型整数变量,你用的时候给他传的是数组, 他没报错?  一维数组可以用 二维的怎么改 谢谢 了

user: user-0
content: 各位大神 看看还有问题吗

user: user-5
content: 兄弟,你闹呢,e函数参数是指针型整数变量,你用的时候给他传的是数组, 他没报错?
user-0 提问: 为什么最后生成TXT文件中stu.id 为乱码 如何修改

回复:
user: user-0
content: printf("%d*%d=",a,b);                     ques[i][0]=a;                     ques[i][1]='*';                     ques[i][2]=b;                     ques[i][3]=a*b;                     break;                 }             }             scanf("%d",&ans[i]);             break;             case 3:             while(1)             {                 a=(int)rand()%100;                 b=(int)rand()%100;                                       if(b!=0&&a%b==0)                 {                      printf("%d/%d=",a,b);                     ques[i][0]=a;                     ques[i][1]='/';                     ques[i][2]=b;                     ques[i][3]=a/b;                     break;                 }             }             scanf("%d",&ans[i]);             break;             }     } time(&end); stu.time=difftime(end,start); //����ɼ� stu.score=0; if(ans[i]==ques[i][3]) { stu.score =stu.score + 10; printf("Score:%d Time:%d seconds\n",stu.score,stu.time); } infile=fopen("d:\\record.text","a");

user: user-0
content: {                     printf("%d+%d=",a,b);                     ques[i][0]=a;                     ques[i][1]='+';                     ques[i][2]=b;                     ques[i][3]=a+b;                     break;                 }             }             scanf("%d",&ans[i]);             break;             case 1:             while(1)             {                 a=(int)rand()%100;                 b=(int)rand()%100;                 if(a-b>=0)                     {                         printf("%d-%d=",a,b);                         ques[i][0]=a;                         ques[i][1]='-';                         ques[i][2]=b;                         ques[i][3]=a-b;                         break;                     }             }             scanf("%d",&ans[i]);             break;             case 2:             while(1)             {                 a=(int)rand()%100;                 b=(int)rand()%100;                                       if(a*b<100)                 {

user: user-0
content: {        int i,num1=0,num2=0;//num1��ʾǰ������ĸ��num2��ʾ���ĸ�����        for(i=0;i<2;i++)       {          if((id[i]>=97&&id[i]<=122)||(id[i]>=65&&id[i]<=90))          {           num1++;             }        }        for(i=2;i<6;i++)        {        if(id[i]>=48&&id[i]<=57) num2++;         }        if(num1==2&&num2==4) break;          { 		   printf("The id is invalid,please put in again\n"); 		   gets(id);            } 	} }  void Startext(char id[]) { struct STU stu; FILE *infile; time_t start,end; time(&start); srand(time(NULL)); char ques[10][4]; FILE  *fptr; int a,b,op,i;//op��ʾ�㷨���� i��ʾ10������ĵڼ��� char ans[10]; for(i=0;i<10;i++) { srand(time(NULL)); op=(int)(rand()%4); a=(int)(rand()%100); b=(int)(rand()%100);     for(i=0;i<10;i++)     {         srand(time(NULL));         op=(int)rand()%4;         switch(op)         {             case 0:             while(1)             {                 a=(int)rand()%100;                 b=(int)rand()%100;                 if(a+b<100)

user: user-1
content: 代码不全呢，建议贴全代码。CSDN的论坛界面做的越来越烂了

user: user-2
content: 代码缺失了,是不是被截断了
user-0 提问: C语言文件，疑惑不解，请求支援

回复:
user: user-1
content: 引用 2 楼 JutuQishui 的回复:谢谢你的帮助，我感觉自己总是犯同样的错误，if后面总加分号，也查找不出来，下次一定会多注意的。 （1）但理论上有分号是不会继续执行语句的，为何此处又执行了了呢？ （2）我认为此处与源文件的关系并不大，若源文件第五行有回车键，应该也会影响第一程序的执行结果的，你认为呢？ 回复（1）：有分号表示执行空语句，执行完之后，会继续向下进行。 回复（2）：如果原文件的下一行无空格之类的，那么应该检索到了文件结尾，也不会有多余的输出了。

user: user-0
content: 谢谢你的帮助，我感觉自己总是犯同样的错误，if后面总加分号，也查找不出来，下次一定会多注意的。 （1）但理论上有分号是不会继续执行语句的，为何此处又执行了了呢？ （2）我认为此处与源文件的关系并不大，若源文件第五行有回车键，应该也会影响第一程序的执行结果的，你认为呢？

user: user-1
content: 我是菜鸟，第一次回答问题。呵呵。 原因有两个： （1）第二个程序中的fscanf()后面多了一个分号； （2）估计原文件中的第五行有个回车键。 所以最后一次扫描时，虽然“if（fscanf（)不等于3”，但依然可以执行下面的语句，所以又使用原数据输出了一行。 你再检查一下源文件是否像我说的。
user-0 提问: 为什么BinTree tree无输出，而BinTree = NULL就有输出？

回复:
user: user-1
content: 因为，你注意看一下insert函数，若不是定义tree = NULL;那么传入insert中的tree就是随机值，就可能无法执行这个分支的逻辑：  if(!(*tree)){                            //如果树不为空          Temp = (BinTree)malloc(sizeof(struct TreeNode));    //为零时节点申请一个空间，并初始化          Temp->Data = val;         Temp->Left = NULL;         Temp->Right = NULL;         *tree = Temp;                        //将临时节点挂到树上      }

user: user-0
content: 在main函数的第一行是BinTree tree；的时候就无法正常输出， 改为BinTree tree = NULL；是就可以正常输出。 这是为什么？

user: user-0
content: void DelTree(BinTree tree)					//删除一个树得节点  { 	if(tree){								//非空才能free  		free(tree->Left);					//先free左节点，再free右节点，最后free根节点  		free(tree->Right); 		free(tree);  	} }   void PreOrderTraversal(BinTree tree) { 	if(tree){								//如果这个树不为空，则对他进行先序遍历  		printf("%d ",tree->Data); 		PreOrderTraversal(tree->Left); 		PreOrderTraversal(tree->Right);  	}  }

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:因为，你注意看一下insert函数，若不是定义tree = NULL;那么传入insert中的tree就是随机值，就可能无法执行这个分支的逻辑：  if(!(*tree)){                            //如果树不为空          Temp = (BinTree)malloc(sizeof(struct TreeNode));    //为零时节点申请一个空间，并初始化          Temp->Data = val;         Temp->Left = NULL;         Temp->Right = NULL;         *tree = Temp;                        //将临时节点挂到树上      }  谢谢，明白了
user-0 提问: 求助怎么把c++的程序改成C语言，老师布置的作业，原来的程序是个火柴人

回复:
user: user-1
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George  前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题；他觉得前同事们应该用这些问题来问自己；实际上不管在哪里工作的开发者们都应该经常问问自己这些问题： ◆“要保证这个问题不会再出现，我该怎么做？” ◆“要想少出些Bug，我该怎么做？” ◆“要保证Bug容易被修复，我该怎么做？” ◆“要保持对变化的快速响应，我该怎么做？” ◆“要保证我的软件的运行速度，我该怎么做？” 如果大多数团队都能不时问一下自己，必定会从中得益，因为这些都是真正强而有力的问题。

user: user-2
content: 代码都是半截子

user: user-3
content: 还不如学点C++，能阅读更多代码。

user: user-1
content: #include <stdio.h> #include <graphics.h> #include <conio.h> #include <time.h>  /******全局变量******/ #define	STEPDISTANCE	6	// 一步的距离。数值越大，移动速度越快 #define	JUMPSPEED	10	// 数值越小，跳得越远 #define	ROLLDISTANCE	30	// 滚动的总步数。数值越大，滚得越远  /******全局变量******/ int s_v = STEPDISTANCE; //障碍物和人物移动速度 int	p_v	= JUMPSPEED;	//人物跳跃速度 int	score	= 0;	//分数 int	max_s	= 0; char keydown;	//按键值  /********************/ void move(); void Login();  /*************************************障碍物类****************************************/ // 障碍物 struct zhangai {     int left;     int top;     int right;     int bottom;     int r; } s1, s2, s3;  // 障碍物类型 void zhangai_style(struct *ps) {     int a;     srand((unsigned int) time(NULL));     a = rand() % 5 + 1;     switch(a) {     case 0:     case 1:     case 2:     case 3:     case 4:         ps->top = 330;         ps->bottom = 361;         break;     case 5:         ps->top = 260;         ps->bottom = 291;         break;     }

user: user-4
content: 你们老师真是个笨蛋哟，出这些莫名其妙的踢呀！

user: user-3
content: 引用 6 楼 user-5 的回复:[quote=引用 5 楼 u010165006 的回复:] [quote=引用 4 楼 user-5 的回复:] [quote=引用 3 楼 u010165006 的回复:] 还不如学点C++，能阅读更多代码。 那是你不懂C的奥妙[/quote]  面向过程，组织以函数，代码随意写的奥妙？[/quote] of course 但你没说出C操作DOS Windows时多顺手（想当初我刚学时背cmd命令背了三天）[/quote]  引用 6 楼 user-5 的回复:[quote=引用 5 楼 u010165006 的回复:] [quote=引用 4 楼 user-5 的回复:] [quote=引用 3 楼 u010165006 的回复:] 还不如学点C++，能阅读更多代码。 那是你不懂C的奥妙[/quote]  面向过程，组织以函数，代码随意写的奥妙？[/quote] of course 但你没说出C操作DOS Windows时多顺手（想当初我刚学时背cmd命令背了三天）[/quote]  操作DOS Windows？调用系统API？C++一样简单。

user: user-5
content: 引用 5 楼 u010165006 的回复:[quote=引用 4 楼 user-5 的回复:] [quote=引用 3 楼 u010165006 的回复:] 还不如学点C++，能阅读更多代码。 那是你不懂C的奥妙[/quote]  面向过程，组织以函数，代码随意写的奥妙？[/quote] of course 但你没说出C操作DOS Windows时多顺手（想当初我刚学时背cmd命令背了三天）

user: user-3
content: 引用 4 楼 user-5 的回复:[quote=引用 3 楼 u010165006 的回复:] 还不如学点C++，能阅读更多代码。 那是你不懂C的奥妙[/quote]  面向过程，组织以函数，代码随意写的奥妙？

user: user-5
content: 引用 3 楼 u010165006 的回复:还不如学点C++，能阅读更多代码。  引用 3 楼 u010165006 的回复:还不如学点C++，能阅读更多代码。 那是你不懂C的奥妙
user-0 提问: 关于扫雷中递归的问题

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

user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-0
content: 引用 1 楼 user-2 的回复:static void open_board(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)   {       int i, j;       if ((x >= 1 && x <= ROW) && (y >= 1 && y <= COL))  //坐标合法       {           if (CountMine(mine, x, y) == 0)                //坐标周围没有雷           {               show[x][y] = '0';                                        for (i = x - 1; i <= x + 1; i++)               {                   for (j = y - 1; j <= y + 1; j++)                   {                       if (show[i][j] == '*')             //如果这个地方没有展开，则递归展开                           open_board(mine, show, i, j);                   }               }           }           else               show[x][y] = CountMine(mine, x, y) + '0';       }   } 感谢大佬的提示，问题已解决。顺带问一下堆栈段溢出是怎么回事

user: user-0
content: ·感谢大佬的提示，问题已解决。顺带问一下堆栈段溢出是怎么回事？

user: user-2
content: static void open_board(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)   {       int i, j;       if ((x >= 1 && x <= ROW) && (y >= 1 && y <= COL))  //坐标合法       {           if (CountMine(mine, x, y) == 0)                //坐标周围没有雷           {               show[x][y] = '0';                                        for (i = x - 1; i <= x + 1; i++)               {                   for (j = y - 1; j <= y + 1; j++)                   {                       if (show[i][j] == '*')             //如果这个地方没有展开，则递归展开                           open_board(mine, show, i, j);                   }               }           }           else               show[x][y] = CountMine(mine, x, y) + '0';       }   }
user-0 提问: 用fprintf输入增加文本数据时，输入值结果为数字

回复:
user: user-1
content: 提供的信息不足，问题也不清晰呢。 建议贴出更多代码

user: user-2
content: fprintf向流中写入数据 fscanf从流中读取数据

user: user-3
content: printf("请输入要增加候选人的信息：序号 姓名 票数（请输入序号为%d）",j); //使用scanf()函数，添加从键盘输入的代码 //将输入保存在worker中 //接下来再使用fprintf()函数将worker的数组写入到文件中     fprintf(fin,"%4d\t%s\t %d\n",worker[j].num,worker[j].name,worker[j].vote); fprintf()函数的作用是将数据写入到文件中

user: user-4
content: fprintf已經是往文件中寫了，之前你應該從其他地方得到值，比如用scanf從標準輸入中取得。
user-0 提问: 求问，2字节的short为什么输出了4个字节？

回复:
user: user-1
content: 我就想问问新版限制一次贴更少的代码，是出于什么考虑？

user: user-1
content: printf("%s\n",binstr);     } }

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

user: user-2
content: short是2个字节，你用sizeof(short)看看就知道了

user: user-3
content: short是2个字节，但是%d是输出整型数（32位或64位）的格式。 对于short，建议用%hd格式输出。 同理%x也是输出的整型数(32位或64位）。
user-0 提问: c语言用fscanf 和fprintf来复制并修改数据出现问题。

回复:
user: user-0
content: 加上process.h也不行

user: user-0
content: #include <stdio.h> #include <stdlib.h> struct Data { 	int num; 	char name[20]; 	int vote; }worker[40];    void xiugai() {     FILE *fin,*ftp;     int i=0,j;     printf("请输入要修改的人员的序号"); 	scanf("%d",&j);      fin=fopen("1.data","r");     ftp=fopen("2.data","w");     if(fin==NULL || ftp==NULL){         printf("打开失败...\n");         exit(0);     }     	while(!feof(fin)) 	{    	    if(i!=j)         fscanf(fin,"%d  %s  %d",&worker[i].num,worker[i].name,&worker[i].vote),         fprintf(ftp,"%d  %s  %d",worker[i].num,worker[i].name,worker[i].vote);         i++;         i++;     }     fclose(fin);     fclose(ftp);     remove("1.data");     rename("2.data","1.data");     FILE *fin2;     fin2=fopen("1.data","a+");     printf("请输入修改的信息 "); 	fprintf(fin2,"%d  %s  %d",&worker[j].num,worker[j].name,&worker[j].vote); 	fclose(fin2); 	printf("修改完成");  }     这是代码，而且发现运行时并没有过滤那个特定的行，最后输入的值也是数字

user: user-1
content: 加上process.h再试一次
user-0 提问: 新手求助 printf没有输出

回复:
user: user-1
content: #include <stdio.h>  int main() { #if 1     int cnt = 0;     char t;      while (scanf("%c", &t) == 1 && t != '.') {         cnt++;         if (t == ' ') {             printf("%d\n", cnt);             cnt = 0;         }     }     printf("%d\n", cnt); #else     char t=' ';     while(t != '.'){         int cnt=0;         while(t != ' '){             cnt++;             scanf("%c", &t);             if(t=='.'){                 printf("%d\n",cnt);                 goto out;             }         }         printf("++%d\n",cnt);         scanf("%c", &t);     } out: #endif     return 0; } 参考一下吧

user: user-2
content: 上面笔误，将 scanf("%s",&t); 改为 scanf("%c",&t);

user: user-2
content: 确实，正如楼上几位所说的那样，感觉问题主要处在对scanf()这个函数的使用上。这个函数的格式之一为 int scanf(const char* format, argument); 其中，第一个参数format是格式化控制字符串，指定了以什么样的格式读取输入的数据，格式化字符串的基本格式为“%type”，其中type是单个的字母，%s表示以字符串的方式读取数据，%c表示以字符的方式读取数据。由于t的类型是char，所以在读取t时需要将格式化字符串设置为%c而不是%s。 所以，需要修改的代码为 scanf("%s",&t); 改为 scanf("%c",&t); 因为scanf()函数的第二个参数必须是指针，所以还需要修改的代码为 scanf("%s",t); 改为 scanf("%s",&t);

user: user-3
content: 两个scanf改为  scanf("%c", &t);

user: user-4
content: 給t的定義只是一個char，卻以字符串進行輸入，這裏就溢出了。 起碼要定義成一個字符數組，比如   char t[32] = '0';   另外前後兩個scanf的寫法也不一樣，要糾正一下。
user-0 提问: VS2017C语言编程，写入位置时发生访问冲突

回复:
user: user-0
content: 引用 2 楼 cfjtaishan 的回复:  //if (j == 13)     if (j >= 13)         return 1; 这个条件改一下，把j == 13改成j >= 13;否则，你会发现j的值会大于13，最终会导致 nt coordinate1[13] = { 0 }; //横坐标 int coordinate2[13] = { 0 }; //纵坐标 数组越界，导致内存溢出而程序异常退出。  可以试一下，不改成j >= 13;在mov函数里加一句打印j的值。 printf("j = %d\n", j); 看看是不是j的值大于13了，我测试的结果是j= 967，然后程序异常退出（段错误）  回复一下2楼的前辈，包含原点在内，移动12步，数组的长度是13，因为之前使用matlab，角标是1~13，但是C应该是0~12，所以经过你的提示那部分代码应该改为，   //if (j == 13)     if (j >11)         return 1; j>11，j的最小值是12，coordinate[12]就是第13个单元，不需要也不能产生第14个坐标，所以我认为应该这么修改。 将j==13改为j>11之后，的确解决了出现的问题，但是结果仍然不对。需要继续修改。

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

user: user-2
content: 程序里用到了j+1, 所以判断要改成 if (j>=12)

user: user-3
content: //if (j == 13)     if (j >= 13)         return 1; 这个条件改一下，把j == 13改成j >= 13;否则，你会发现j的值会大于13，最终会导致 nt coordinate1[13] = { 0 }; //横坐标 int coordinate2[13] = { 0 }; //纵坐标 数组越界，导致内存溢出而程序异常退出。  可以试一下，不改成j >= 13;在mov函数里加一句打印j的值。 printf("j = %d\n", j); 看看是不是j的值大于13了，我测试的结果是j= 967，然后程序异常退出（段错误）

user: user-0
content: 我用单步执行，每一步之后的变量值的确符合我的预期。
user-0 提问: 在linux中调用XML文件

回复:
user: user-1
content: 引用 4 楼 super828 的回复:主要目的就是实现一些参数的存储与读取，使用libxml2有点太大了 So，#3正解。

user: user-0
content: 主要目的就是实现一些参数的存储与读取，使用libxml2有点太大了

user: user-1
content: fopen fscanf fprintf fclose

user: user-0
content: 应该说是操作，有没有比较简便的操作方法

user: user-2
content: 调用? 还是解析?  解析的话看看tinyxml,Expat-XML之类的开源库
user-0 提问: C语言  输入三边判断三角形的类型（直角 锐角  钝角）

回复:
user: user-1
content: 1.  a、b、c一定是某个三角形的三边长吗？ 2.  A=cos(b*b+c*c-a*a/2*b*c) 什么意思？余弦定理是 cosA = (b*b + c*c - a*a）/（2*b*c）啊

user: user-2
content: #include<stdio.h> #include<math.h>  int main() {     int a,b,c,t;     double A;     printf("三角形的三边是：");     scanf("%d,%d,%d",&a,&b,&c);      if(a>=b)     {         if(a>=c) {             t = a;             a = c;             c = t;         } else{             t = c;             b = a;             a = t;         }     }     else     {         if(b>=c) {             t = b;             b = a;             a = t;         }         if(b<c) {             t = c;             c = a;             a = t;         }     }     A = cos(b*b+c*c-a*a/2*b*c);     if(A > 0 && fabs(A) >= 1e-16)         printf("此三角形为钝角三角形");     else if(A < 0 && fabs(A) >= 1e-16)         printf("此三角形我锐角三角形");     else if (fabs(A) < 1e-16)         printf("此三角形为直角三角形");      return 0; } 参考一下吧

user: user-3
content: if(b>=c)    t=b;b=a,a=t;   if(b<c)    t=c,c=a,a=t; 中间有个分号，还是加个括号吧。
user-0 提问: 问个动态内存分配数组的问题，执行程序后段错误，求解。。。

回复:
user: user-1
content: //#include "/home/coy/coyhead/myhead.h"  void coyArr_Type(int **pArr,int *len); void coyArr_Type2(int *pArr, int *len);  int main() {     if((system("clear")) == 0)     {         ;     }      int len = 0;      puts("请输入数组长度");      if((scanf("%d", &len)) == 1)     {         ;     }       int *Arr = (int*)malloc(sizeof(int) * len);     if (!Arr)         exit(0);      coyArr_Type(&Arr, &len);     coyArr_Type2(Arr, &len);      return 0; }  void coyArr_Type(int **pArr, int *len) {     printf("请输入不超过%d个数的数组元素\n", *len);      for(int i = 0; i < *len; i++)     {         //if((scanf("%d", pArr[i])) == 1)         if((scanf("%d", &(*pArr)[i])) == 1)         {             ;         }     }      return; }  void coyArr_Type2(int *pArr, int *len) {     printf("请输入不超过%d个数的数组元素\n", *len);      for(int i = 0; i < *len; i++)     {         //if((scanf("%d", pArr[i])) == 1)         if((scanf("%d", &pArr[i])) == 1)         {             ;         }     }      return; } 若是传递二重指针，那么就需要用&(*pArr)[i]作为scanf的参数。若直接用pArr[i],第一个元素即i= 0时还没问题，但是若是i>0则是内存越界了。 建议了解一下一重指针和二重指针的关系
user-0 提问: 求大佬修改一下C语言啊啊啊，不会写带有数组的子函数

回复:
user: user-1
content: 数组子函数用指针啊 int *arry（int *in，int length） {      int *out；     //中间把你要干的事弄到out里     return out; }

user: user-2
content: 请参考《C++函数的数组形参》 希望能够帮到你

user: user-3
content: 2楼正解啊，，为什么不采纳？你直接把#if 1 #else 和你自己写的内容去掉   就好了啊，不去掉程序也能实现

user: user-4
content: #include<stdio.h> #include <stdlib.h> #include<time.h>    void init_array(int *parr, int len); void sort_array(int *parr, int len); void show_array(const int *parr, int len); int get_pass_nums(int *parr, int len, int key);  int main(void) { #if 1     int K[30], count;      init_array(K, 30);     printf("升序前：\n");     show_array(K, 30);     printf("\n升序后：\n");     sort_array(K, 30);     show_array(K, 30);      count = get_pass_nums(K, 30, 60);     printf("\n[60,100]的数目：%d\n", count);  #else     int i,K[30],temp,count,j;     srand((unsigned int)time(NULL));     printf("升序前：\n");     for (i=0; i<30; i++)     {         K[i]=rand()%101;//生成[0,100] 的数         printf(" %d",K[i]);     }     printf("\n升序后：\n");     for(i=0;i<29;i++)     {         for(j=i+1;j<30;j++)         {              if(K[i]>K[j])             {                 temp=K[i];                 K[i]=K[j];                 K[j]=temp;             }         }     }     for(i=0;i<30;i++)     {         printf(" %d",K[i]);     }     printf("\n[60,100]的数：");     for(i=0;i<30;i++)     {         if(K[i]>60)             printf(" %d",K[i]);      }     for(i=0;i<30;i++)     {         if(K[i]>60)             count++;     }     printf("\n[60,100]的数目：%d",count-1); #endif  }  void init_array(int *parr, int len) {     int i;      srand((unsigned int)time(NULL));     for (i=0; i< len; i++)         parr[i] = rand() % 101;//生成[0,100] 的数 }  void show_array(const int *parr, int len) {     int i;      for (i = 0; i < len; i++)         printf(" %d", parr[i]);     putchar(10); }  void sort_array(int *parr, int len) {     int i, j;     int temp;      for(i=0;i< len-1;i++)     {         for(j=i+1;j < len;j++)         {              if(parr[i]> parr[j])             {                 temp = parr[i];                 parr[i] = parr[j];                 parr[j]=temp;             }         }     } }  int get_pass_nums(int *parr, int len, int key) {     int i, cnt = 0;      for(i=0;i<len;i++)     {         if(parr[i] > key)             cnt++;     }      return cnt; } 供参考

user: user-5
content: 请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？