Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 请问C语言这么分配了内存后，这么释放正确吗?

回复:
user: user-1
content: 仅供参考：//在堆中开辟一个4×5的二维int数组 #include <stdio.h> #include <malloc.h> int **p; int i,j; void main() {     p=(int **)malloc(4*sizeof(int *));     if (NULL==p) return;     for (i=0;i<4;i++) {         p[i]=(int *)malloc(5*sizeof(int));         if (NULL==p[i]) return;     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             p[i][j]=i*5+j;         }     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             printf(" %2d",p[i][j]);         }         printf("\n");     }     for (i=0;i<4;i++) {         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19  //在堆中开辟一个3×4×5的3维int数组 #include <stdio.h> #include <malloc.h> int ***p; int i,j,k; void main() {     p=(int ***)malloc(3*sizeof(int **));     if (NULL==p) return;     for (i=0;i<3;i++) {         p[i]=(int **)malloc(4*sizeof(int *));         if (NULL==p[i]) return;         for (j=0;j<4;j++) {             p[i][j]=(int *)malloc(5*sizeof(int));             if (NULL==p[i][j]) return;         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 p[i][j][k]=i*20+j*5+k;             }         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 printf(" %2d",p[i][j][k]);             }             printf("\n");         }         printf("---------------\n");     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             free(p[i][j]);         }         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //--------------- // 20 21 22 23 24 // 25 26 27 28 29 // 30 31 32 33 34 // 35 36 37 38 39 //--------------- // 40 41 42 43 44 // 45 46 47 48 49 // 50 51 52 53 54 // 55 56 57 58 59 //---------------

user: user-2
content: 引用 3 楼 yyxgs 的回复:[quote=引用 2 楼 qq423399099 的回复:] 需要循环逐个释放  然后还要释放str本身吗?[/quote] 要的

user: user-0
content: 引用 1 楼 user-3 的回复:for 循环里申请的空间仍然没有释放  如果里面释放了，str本身还需要释放吗?

user: user-0
content: 引用 2 楼 qq423399099 的回复:需要循环逐个释放  然后还要释放str本身吗?

user: user-2
content: 需要循环逐个释放

user: user-3
content: for 循环里申请的空间仍然没有释放
user-0 提问: 关于VS2013中打开文件的问题

回复:
user: user-0
content: 而且有一个很奇怪的问题就是,当我调试的时候,是可以打开文件的并写入的...

user: user-0
content: 引用 2 楼 face_t0_sea 的回复:能打开，就是写不进去东西。 while (ch = getchar() != '@') 你这里运算符顺序错了，啥都没写进去，应该是： while ( ( ch = getchar() ) != '@')  确实是打不开文件啊,后面的运算符顺序错误改了之后还是这样

user: user-0
content: 谢谢各位的指点

user: user-1
content: fopen_s这样用：   FILE* pFile; fopen_s(&pFile,filename,"w")   另需要判断是否打开文件成功  如果仍想用fopen可以选择以下任何一种方法： 1、新建项目时不要勾选安全开发生命周期检查 2、在项目属性C/C++命令行中加上 /D _CRT_SECURE_NO_WARNINGS

user: user-1
content: 再另外，注意：fopen_s打开文件成功返回的是0  https://msdn.microsoft.com/zh-cn/library/z5hh6ee9.aspx

user: user-2
content: #pragma warning(disable:4996) ...

user: user-3
content: 楼上正解，注意优先级（记不清就用小括号括起来）

user: user-4
content: 能打开，就是写不进去东西。 while (ch = getchar() != '@') 你这里运算符顺序错了，啥都没写进去，应该是： while ( ( ch = getchar() ) != '@')

user: user-5
content: 标准打开文件方式 #iclude<stdio.h>      main()      {           FILE *fp;                /*定义一个文件指针*/           int i;           fp=fopen("CLIB", "rb");  /*打开当前目录名为CLIB的文件只读*/           if(fp==NULL)             /*判断文件是否打开成功*/              puts("File open error");/*提示打开不成功*/           i=fclose(fp);            /*关闭打开的文件*/           if(i==0)                 /*判断文件是否关闭成功*/             printf("O,K");         /*提示关闭成功*/           else             puts("File close error");/*提示关闭不成功*/      }
user-0 提问: codeblocks中输出中文就会出现这样的编译错误·

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

user: user-2
content: .CodeBlocks 默认情况下，是保存为windows本地编码的，也就是WINDOWS-936字符集，也就是GBK编码。    但是很神奇的是，GCC编译器默认编译的时候是按照UTF-8解析的。你存成GBK，但是当成UTF-8解析，这还能编译通过，这才有鬼了，所以这两个地方编码不统一好，编译的时候报错：error: converting to execution character set: Illegal byte sequence，你根本连通过编译的可能性都没有！  其实要解决这个问题很简单，编写Code：：Blocks的人只需要在调用编译器之前检测一下源文件是什么编码，然后就自动让编译器用什么编码进行解释，问题就解决了。
user-0 提问: 菜鸟求助，C语言 if 的问题。

回复:
user: user-1
content: 最后一次的计算结果遗留在寄存器中，被返回 所以，虽然没有返回一个值， 在编译器没有报错的情况下，结果应该是对的 不过，很难保证，任何时候，都一定会这么巧

user: user-2
content: 如果你使用汇编代码就能看出为什么不需要 return 了。 ax 寄存器直接返回。

user: user-0
content: 引用 3 楼 qq423399099 的回复:[quote=引用 2 楼 fff_kiseki 的回复:] [quote=引用 1 楼 qq423399099 的回复:] 楼主居然能得到正确的结果？ 这样的代码在很多编译器连编译都过不去，返回值是int类型的，但又没有地方return  #include <stdio.h> bool IsPrime(int x) { 	int i; 	for(i=2;i<=x/2;i++) 	{ 		if(x%i==0) 			return false; 	} 	return true; } 		 		  int main() {     int x;     printf("input : ");     scanf("%d", &x);     if (IsPrime(x))         printf("%d is a prime number\n", x);     else         printf("%d is not a prime number\n", x);     system("pause");     return 0; }  是我的编译器太智能了吗？[/quote] GCC？[/quote]是的，用的codeblocks

user: user-3
content: 引用 2 楼 fff_kiseki 的回复:[quote=引用 1 楼 qq423399099 的回复:] 楼主居然能得到正确的结果？ 这样的代码在很多编译器连编译都过不去，返回值是int类型的，但又没有地方return  #include <stdio.h> bool IsPrime(int x) { 	int i; 	for(i=2;i<=x/2;i++) 	{ 		if(x%i==0) 			return false; 	} 	return true; } 		 		  int main() {     int x;     printf("input : ");     scanf("%d", &x);     if (IsPrime(x))         printf("%d is a prime number\n", x);     else         printf("%d is not a prime number\n", x);     system("pause");     return 0; }  是我的编译器太智能了吗？[/quote] GCC？

user: user-0
content: 引用 1 楼 qq423399099 的回复:楼主居然能得到正确的结果？ 这样的代码在很多编译器连编译都过不去，返回值是int类型的，但又没有地方return  #include <stdio.h> bool IsPrime(int x) { 	int i; 	for(i=2;i<=x/2;i++) 	{ 		if(x%i==0) 			return false; 	} 	return true; } 		 		  int main() {     int x;     printf("input : ");     scanf("%d", &x);     if (IsPrime(x))         printf("%d is a prime number\n", x);     else         printf("%d is not a prime number\n", x);     system("pause");     return 0; }  是我的编译器太智能了吗？

user: user-3
content: 楼主居然能得到正确的结果？ 这样的代码在很多编译器连编译都过不去，返回值是int类型的，但又没有地方return  #include <stdio.h> bool IsPrime(int x) { 	int i; 	for(i=2;i<=x/2;i++) 	{ 		if(x%i==0) 			return false; 	} 	return true; } 		 		  int main() {     int x;     printf("input : ");     scanf("%d", &x);     if (IsPrime(x))         printf("%d is a prime number\n", x);     else         printf("%d is not a prime number\n", x);     system("pause");     return 0; }
user-0 提问: 我是菜鸟  ，请指出错误。

回复:
user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-0
content: 引用 1 楼 qq423399099 的回复:不可能吧，肯定楼主在执行scanf("%c",&ch);之前输入缓冲区有遗留的数据（比如回车符） scanf("%c",&ch);之前加一句fflush(stdin);试试    解决

user: user-0
content: 成功解决，确实是回车残留但是ffush (stdin)好像在xcode中用不了，使用getchar（）就可以了

user: user-2
content: 不可能吧，肯定楼主在执行scanf("%c",&ch);之前输入缓冲区有遗留的数据（比如回车符） scanf("%c",&ch);之前加一句fflush(stdin);试试
user-0 提问: unsigned short *强制转换unsigned int *,另一个参数莫名被修改

回复:
user: user-0
content: 楼上讲的都对，平均给分了

user: user-1
content: unsigned int是4个字节，unsigned short是占2个字节，写的时候已经写到后面的内存了

user: user-2
content: 你把unsigned short d 这个short变量的地址当做int变量地址送给xxx函数处理，破坏了之后两个字节的内存，结果未定，在你的机器上就是那个结果~~~~

user: user-3
content: 楼主自己sizeof(unsigned short)看看是不是2，如果是2的话那肯定修改了地址的跨度

user: user-4
content: 这有什么好匪夷所思的？short型只占2字节，把它的地址强制成int*传参，当作占4个字节修改，自然修改到了其它地方。
user-0 提问: #line指令用法

回复:
user: user-1
content: 这显然是用了什么别的预处理工具。而你那个.c是预处理过的文件。  预处理会改变源文件中行的位置，所以需要#line这个功能标记原本的位置。  比如预处理要把.h文件的内容插入到.c里，最终生成一个文件交给编译器。如果没有#line功能，编译器只能输出错误在这个最终的文件里的位置。而这个最终的文件一般来说用户根本看不到。而如果预处理器在这个最终文件中用#line标记当前行对应的原始文件和行号，编译器就可以输出错误在原始文件中的位置了。  #line并不是设计给人用的，这主要是预处理器和编译器间的一个协议。

user: user-2
content: 引用 2 楼 caddor9100 的回复:如果没有关系的话，那为什么要在other_file里加上一些c语言的代码！， 当然也有一些怪异语法，如：  %(DEFAULT_BODY)s  我测试了，看到结果是没有影响，你可以换个文件名，对边写写东西，测试看看。但是关于你说到的怪异语法，真的不懂~~~

user: user-0
content: 引用 1 楼 face_t0_sea 的回复:我也是刚学会。。。 确实是不经常用的一个宏，主要用于调试 程序编译后代码行号可能会有变化，这个宏能准确定位代码行，一般这么使用     # line100"other_file"     printf("current line number %d ,current file %s\n",__LINE__,__FILE__);return0; 执行了  # line100"other_file" 之后，下一行__LINE__变量会从100开始，__FILE__会变成你指定的文件名other_file；和other_file本身内容没有任何关系。不影响程序流程。在# line100"other_file"之前在打印下这两个变量，立即就懂了。  如果没有关系的话，那为什么要在other_file里加上一些c语言的代码！， 当然也有一些怪异语法，如：   %(DEFAULT_BODY)s

user: user-2
content: 我也是刚学会。。。 确实是不经常用的一个宏，主要用于调试 程序编译后代码行号可能会有变化，这个宏能准确定位代码行，一般这么使用     # line100"other_file"     printf("current line number %d ,current file %s\n",__LINE__,__FILE__);return0; 执行了  # line100"other_file" 之后，下一行__LINE__变量会从100开始，__FILE__会变成你指定的文件名other_file；和other_file本身内容没有任何关系。不影响程序流程。在# line100"other_file"之前在打印下这两个变量，立即就懂了。
user-0 提问: windows下C语言实现的多线程实例

回复:
user: user-1
content: 自己填自己挖的坑吧。

user: user-0
content: 引用 8 楼 cutmelon 的回复:另外2楼说的问题是clientsocket这个变量的生命周期问题，按你的代码，一旦跳出主循环，clientsocket就失效了，如果这时候线程才启动的话，得到的参数就是一个未知的东西。一般而言，传给线程的参数不是全局有效的话，都是new/malloc出来，然后伺机释放(在线程里或者线程结束之后由主程序释放)可以给我讲讲socket多线程的逻辑吗？，同时多个客户端发送数据过来服务要怎么处理，（单线程的时候我把客户端发送过来的数据存入数据库的，）单线程是成功了的，  现在多线程我不知道怎么写进去，，，

user: user-0
content: 引用 4 楼 pengzhixi 的回复:[quote=引用 3 楼 fyf350232349 的回复:] 什么意思？clientsocket这个参数怎么啦？ @pengzhixi首先弄清楚clientsocket所占内存是在哪，再确认作为参数这么传是否会引起问题。[/quote]可以和我讲讲socket多线程的逻辑吗？同时多个客户端发送数据过来服务要怎么处理，（单线程的时候我把客户端发送过来的数据存入数据库的，）  现在多线程我不知道怎么写进去，，，

user: user-2
content: 另外2楼说的问题是clientsocket这个变量的生命周期问题，按你的代码，一旦跳出主循环，clientsocket就失效了，如果这时候线程才启动的话，得到的参数就是一个未知的东西。一般而言，传给线程的参数不是全局有效的话，都是new/malloc出来，然后伺机释放(在线程里或者线程结束之后由主程序释放)

user: user-2
content: 大体意思没错，只不过接收线程没做tcp的分包粘包处理，所以程序结果就超出你想象了。 看你的代码大概是字符串协议吧，客户端发过来的字符串最后如果是exit，就表明关闭连接，现在问题来了： 如果客户端发送了123456789 exit，服务端接收到的可能分两次，第一次是123456，第二次是789 exit。按你现在的代码，是判断不出exit的啦。 这只是一个基础问题，其他的异常断线、超时、收发失败、数据处理现在的模型都还没处理，离实用还有好远，好好学习，嘿嘿

user: user-0
content: @pengzhixi 可以和我讲讲socket多线程的逻辑吗？同时多个客户端发送数据过来服务要怎么处理，（单线程的时候我把客户端发送过来的数据存入数据库的，）  现在多线程我不知道怎么写进去，，，

user: user-0
content: 没有错啊，他能进入到线程函数，

user: user-1
content: 引用 3 楼 fyf350232349 的回复:什么意思？clientsocket这个参数怎么啦？ @pengzhixi首先弄清楚clientsocket所占内存是在哪，再确认作为参数这么传是否会引起问题。

user: user-0
content: 什么意思？clientsocket这个参数怎么啦？ @pengzhixi

user: user-3
content: if(strcmp(buffer, "exit"))

user: user-1
content: clientsocket这种参数你也敢传给多个线程做参数。
user-0 提问: 菜鸟求助，华为oj用链表提示内存超限，我自己试了几个例子，运行结果正确，求大神指出菜鸟程序需要改进的地方

回复:
user: user-0
content: 引用 6 楼 face_t0_sea 的回复:你的数据结构有问题，遍历free都很麻烦，使用类析构函数释放内存；或者优化下逻辑，明知道节点个数，一次分配连续内存，一次释放节点数组内存吧大胸第，我错了，free(Head)只是释放了头节点

user: user-0
content: 引用 6 楼 face_t0_sea 的回复:你的数据结构有问题，遍历free都很麻烦，使用类析构函数释放内存；或者优化下逻辑，明知道节点个数，一次分配连续内存，一次释放节点数组内存吧大胸第，这是一个链表，Head是表头，free(Head)就相当于把整个链表释放了吧，中间申请的节点只不过是这个链表的一部分而已。。。你没法预测输入节点个数，因为你要对链表添加或删除节点。

user: user-1
content: 你的数据结构有问题，遍历free都很麻烦，使用类析构函数释放内存；或者优化下逻辑，明知道节点个数，一次分配连续内存，一次释放节点数组内存吧

user: user-1
content: 引用 4 楼 xusongge 的回复:malloc是为了开辟新节点，然后插入到原有的链表中，在输出之前根本不能free啊 你输出之后也没有free啊

user: user-0
content: 引用 3 楼 face_t0_sea 的回复:malloc很多次，free只对head用了一次。会不会就是这个问题？ 按理来说Main退出内存会释放，我水平有限，不确认有没有其他调用方式会造成这里内存泄露，最好释放掉吧。 malloc是为了开辟新节点，然后插入到原有的链表中，在输出之前根本不能free啊

user: user-1
content: malloc很多次，free只对head用了一次。会不会就是这个问题？ 按理来说Main退出内存会释放，我水平有限，不确认有没有其他调用方式会造成这里内存泄露，最好释放掉吧。

user: user-0
content: 一楼说错了，是删除（2，5）（5，8）

user: user-0
content: 一楼忘了放程序了#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<stdbool.h> #include<string.h> #include<math.h> typedef struct node { 	int coor; 	int val; 	struct node *next; }Node; typedef Node *LinkList; int main(void) { 	LinkList Head,p; 	Head = (LinkList)malloc(sizeof(Node)); 	int m, n; 	scanf("%d%d", &m, &n); 	scanf("%d%d", &Head->coor, &Head->val); 	m--; 	Head->next = (LinkList)malloc(sizeof(Node)); 	p = Head->next; 	while (m--) 	{ 		scanf("%d%d", &p->coor, &p->val); 		if (m != 0) 		{ 			p->next = (LinkList)malloc(sizeof(Node)); 			p = p->next; 		} 		else 			p->next = NULL; 	} 	p = Head; 	LinkList p1,temp,temp1; 	int d,k; 	while (p->next != NULL) 	{ 		if (p->coor == p->next->coor) 		{ 			if (p->next->next == NULL) 				p->next = NULL; 			else 			{ 				p->next = p->next->next; 				d = p->next->coor - p->coor - 1; k = 1; 				temp = p->next; temp1 = p; 				while (d--) 				{ 					p1 = (LinkList)malloc(sizeof(Node)); 					p1->coor = temp1->coor + k; 					p1->val = temp1->val + ((temp->val - temp1->val) / (temp->coor - temp1->coor))*k++; 					p1->next = p->next; 					p->next = p1; 					p = p->next; 				} 				p = p->next; 			} 		} 		else 		{ 			d = p->next->coor - p->coor-1; k = 1; 			temp = p->next; temp1 = p; 			while (d--) 			{ 				p1 = (LinkList)malloc(sizeof(Node)); 				p1->coor = temp1->coor + k; 				p1->val = temp1->val + ((temp->val - temp1->val) / (temp->coor - temp1->coor))*k++; 				p1->next = p->next; 				p->next = p1; 				p = p->next; 			} 			p = p->next; 		} 	} 	p = Head; 	while (p->next != NULL) 	{ 		printf("%d %d ", p->coor, p->val); 		p = p->next; 	} 	printf("%d %d\n", p->coor, p->val); 	free(Head); 	system("pause"); 	return 0; }
user-0 提问: 用递归求x的y次幂，x是double类型，y是int 型

回复:
user: user-1
content: 不要直接运行程序，运行调试程序，出错时点中断，通过调用堆栈、变量窗口等观察分析原因

user: user-2
content: y--应为--y或y-1，否则无限递归导致栈溢出 PS：建议换个便于分辨空格的字体
user-0 提问: 求大神指教任意多边形（凸或凹多边形）与点的关系

回复:
user: user-1
content: 查MSDN是Windows程序员必须掌握的技能之一。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:PtInRegion The PtInRegion function determines whether the specified point is inside the specified region.   BOOL PtInRegion(   HRGN hrgn,  // handle to region   int X,      // x-coordinate of point   int Y       // y-coordinate of point );   Parameters hrgn  Handle to the region to be examined.  X  Specifies the x-coordinate of the point.  Y  Specifies the y-coordinate of the point.  Return Values If the specified point is in the region, the return value is nonzero.  If the specified point is not in the region, the return value is zero.   QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in wingdi.h.   Import Library: Use gdi32.lib.  See Also Regions Overview, Region Functions, RectInRegion赵老师，你这个是在VC++里面运行的么？

user: user-1
content: PtInRegion The PtInRegion function determines whether the specified point is inside the specified region.   BOOL PtInRegion(   HRGN hrgn,  // handle to region   int X,      // x-coordinate of point   int Y       // y-coordinate of point );   Parameters hrgn  Handle to the region to be examined.  X  Specifies the x-coordinate of the point.  Y  Specifies the y-coordinate of the point.  Return Values If the specified point is in the region, the return value is nonzero.  If the specified point is not in the region, the return value is zero.   QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in wingdi.h.   Import Library: Use gdi32.lib.  See Also Regions Overview, Region Functions, RectInRegion

user: user-0
content: 我是新人不太懂，所以不好意思啊！就是想看一个点与多边形的关系，判断这个点是在多边形内部还是外部还是在多边形上。现在就是这段代码有错误

user: user-2
content: 给点背景描述别人才好帮你看啊~~~   想要什么效果，现在的结果什么样~~~~~~
user-0 提问: return()是什么意思？括号里不填

回复:
user: user-1
content: 估计打错了，没有return() 这种的用法

user: user-2
content: 引用 3 楼 TheBigBangWOW 的回复:[quote=引用 1 楼 yuelengdihai 的回复:] 转到定义看看，一般都是return 0； return 1；或者return；  谢谢，那为什么这里是return()，感觉这里应该是return 0才对[/quote] 我感觉也是return 0；

user: user-3
content: 引用 4 楼 TheBigBangWOW 的回复:是的，是一道考试题目  这里不是需要填的，因为需要填的话会像前面那样有   （1） 的标记，表示第一题  return ()语法是错误的，如果不需要填就是题目打印错了。动手测试下就行了，多点怀疑精神

user: user-0
content: 引用 2 楼 face_t0_sea 的回复:我感觉你在做题，return（） 的括号是让你填空的~~~~~~~~  不然return()通不过编译的。  是的，是一道考试题目  这里不是需要填的，因为需要填的话会像前面那样有   （1） 的标记，表示第一题

user: user-0
content: 引用 1 楼 yuelengdihai 的回复:转到定义看看，一般都是return 0； return 1；或者return；  谢谢，那为什么这里是return()，感觉这里应该是return 0才对

user: user-3
content: 我感觉你在做题，return（） 的括号是让你填空的~~~~~~~~  不然return()通不过编译的。

user: user-2
content: 转到定义看看，一般都是return 0； return 1；或者return；

user: user-0
content: 谢谢各位，明白了 return应该只有1 0 或者什么都不加这几种情况

user: user-4
content: return 0;  排版的人不懂C，以为0是个()

user: user-5
content: 它是不是想让读者自己思考那个地方应该return啥 那个地方是满足皇后相互攻击的条件，应当返回FALSE
user-0 提问: 菜鸟问大神C语言问题

回复:
user: user-1
content: 运算符的优先级问题

user: user-0
content: 哦，懂了。那我应该用什么判别式让他们两同时执行并判断他们到结尾就终止呢 引用 3 楼 paschen 的回复:A && B  中：如果A为假，那么将不会去计算B

user: user-2
content: 引用 4 楼 qq_15340759 的回复:哦，懂了。那我应该用什么判别式让他们两同时执行并判断他们到结尾就终止呢 引用 3 楼 paschen 的回复:A && B  中：如果A为假，那么将不会去计算B  分开写，或者 A & B

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

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

user: user-2
content: A && B  中：如果A为假，那么将不会去计算B

user: user-4
content: fgets(buf,Max,SREfile）== NULL  这个是表示读文件失败吧？ 2个文件都读失败，怎么把读到的结果fputs？ 我糊涂啦。

user: user-0
content: 大牛们，在线等啊。小弟求东啊
user-0 提问: PCHAR定义问题

回复:
user: user-0
content: 是win32，不是MFC 看了之前的反汇编看明白了 不过还是谢谢回复   回复 验证码把我 头都看歪了...

user: user-1
content: vbx就是要显示的文本，转化为string就能显示了  CTime ctime=CTime::GetCurrentTime(); //得到当前系统时间 CString strTime=time.Format("%H:%M:%S"); ::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime); //送到指定控件 在vc6.0以后的版本中不支持AfxGetMainWnd()->m_hWnd来获取HWND，所以需要把这一句改为： SetDlgItemText(AfxGetApp()->m_pMainWnd->m_hWnd,IDC_TIME, strTime);
user-0 提问: 稀疏矩阵的十字链表存储，如何做到O(1)时间的随机访问？

回复:
user: user-1
content: 十字链表，全称十字交叉链表，属于图数据结构之一，其数据结构是由不同的链表之间相互交错组成，形象的说，就像立交桥，只要知道所在位置，搜索效率是很高的。

user: user-2
content: int A[1000*1000]; struct LOC {  int y,x; } loc; map <int *,struct LOC *> v2yx;  loc.y=123; loc.x=456; A[loc.y*1000+loc.x]=789; v2yx[&A[loc.y*1000+loc.x]]=&loc;  ?

user: user-3
content: 创建的时候就能记录每一个元素的行列index'

user: user-0
content: 引用 1 楼 user-4 的回复:哈希表貌似可以 呃，好像可以。但是原文说加了一个索引矩阵

user: user-4
content: 哈希表貌似可以
user-0 提问: c语言用二分法求解！！！求大神帮忙看看，运行之后总是等于0.

回复:
user: user-1
content: 引用 3 楼 qq423399099 的回复:while(fabs(f0)<=1e-5);应该改为while(fabs(f0)>=1e-5); (楼主肯定能想明白) 改正后结果：   他是不是do while循环的终止条件搞错了？

user: user-2
content: while(fabs(f0)<=1e-5);应该改为while(fabs(f0)>=1e-5); (楼主肯定能想明白) 改正后结果：

user: user-0
content: 引用 1 楼 yuelengdihai的回复:x是行参，你打印x值干嘛？ 我打印的是x0啊！！

user: user-3
content: x是行参，你打印x值干嘛？
user-0 提问: 求助，读取文件内容改个格式

回复:
user: user-1
content: for(ign=0;ign<9;ign++)	/*指针指向第10行开头*/ { memset(c,0,1024);	 fgets(c,1024,fpr); }     这里已经把t.txt里面的内容读到c中了   后面就把c按格式写到note.txt中就行 了
user-0 提问: C语言程序问题

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

user: user-0
content: 引用 9 楼 gaopengon的回复:不给指针指定地址，系统会随机给指针指定一个地址，就可能去访问不能访问的地址。从而发生段错误。 解决了，谢谢…………

user: user-2
content: 不给指针指定地址，系统会随机给指针指定一个地址，就可能去访问不能访问的地址。从而发生段错误。

user: user-0
content: 引用 6 楼 醉花阴柳的回复:name是数组指针，gets(name)会段错误 嗯，问题解决了，谢谢

user: user-3
content: 引用 6 楼 醉花阴柳的回复:name是数组指针，gets(name)会段错误 打错了，上面是指针数组

user: user-3
content: name是数组指针，gets(name)会段错误

user: user-0
content: 图片显示不出来……这

user: user-0
content: 引用 2 楼 yuelengdihai的回复:你这怎么可能0错误0警告 参考下这个把 #include<stdio.h>   #include<conio.h>   int main()   {            void BubbleSort(int []);            int a[10];            int i,j,temp;            printf("Input tem integer numbers for a[10]:");            for(i=0;i<10;i++)               scanf("%d,",&a[i]);            printf("\n");            BubbleSort(a);            printf("The sorted array is:\n");               for(j=0;j<10;j++)                    printf("%d,",a[j]);            printf("\n\n");            getch();   }      void BubbleSort(int array[])   {            int i,j,temp;              for(j=0;j<9;j++)                 for(i=0;i<9-j;i++)                    if(array[i]>array[i+1])                     {                         temp=array[i];                         array[i]=array[i+1];                         array[i+1]=temp;                      }   }   真的是0错误0警告。冒泡排序上学期学过，不过这学期学到指针，要求用指针存放字符串，上次问老师老师说输入函数有问题，这样输入会随机分配到不同的地址，他说这是考点之一，可我看好久都不知道错在哪，我C语言太渣，求指教

user: user-0
content: 如图，就是这种问题……

user: user-4
content: 你这怎么可能0错误0警告 参考下这个把 #include<stdio.h>   #include<conio.h>   int main()   {            void BubbleSort(int []);            int a[10];            int i,j,temp;            printf("Input tem integer numbers for a[10]:");            for(i=0;i<10;i++)               scanf("%d,",&a[i]);            printf("\n");            BubbleSort(a);            printf("The sorted array is:\n");               for(j=0;j<10;j++)                    printf("%d,",a[j]);            printf("\n\n");            getch();   }      void BubbleSort(int array[])   {            int i,j,temp;              for(j=0;j<9;j++)                 for(i=0;i<9-j;i++)                    if(array[i]>array[i+1])                     {                         temp=array[i];                         array[i]=array[i+1];                         array[i+1]=temp;                      }   }

user: user-0
content: 求各路大神帮帮忙，帮帮忙，
user-0 提问: 各位大神，为什么会运行会出错？

回复:
user: user-0
content: /*3、一个班上有30名学生，每个学生的数据作为 一个记录，每个记录包括 学号、姓名、三门课程的成绩和三门课程平均成绩。 从键盘输入学生的学号、姓名及三门课的成绩。 要求打印三门课程平均成绩最高分的学生记录（要求使用顺序表）。*/ #include"iostream" #include"stdlib.h" #include"string" #define MAXSIZE 3 using namespace std; typedef struct { 	int China; 	int math; 	int English; 	float average; }Date; typedef struct { 	int num; 	string name; 	Date score; }Stud_information; typedef struct { 	Stud_information *Stud; 	int Length; }SqList;  //初始化 void InitList(SqList *p) { 	p->Stud =(Stud_information*)malloc(MAXSIZE*sizeof(Stud_information)); 	p->Length = 0; }  //创建 void CreateList(SqList *p) { 	for (int i = 0; i < MAXSIZE;i++) 	{ 		cout << "学号" << "姓名"<< "语文" << "数学" << "英语" << endl; 		cin >> p->Stud[i].num>>p->Stud[i].name >> p->Stud[i].score.China >> p->Stud[i].score.math >> p->Stud[i].score.English; 		p->Length++; 	} }  //平均成绩 void Stud_average(SqList *p) { 	int N = p->Length - 1; 	for (int i = 0; i < N; i++) 		p->Stud[i].score.average = (p->Stud[i].score.China + p->Stud[i].score.math + p->Stud[i].score.English) / 3; }  //比较平均成绩 float bijiao(SqList *p) { 	float max = p->Stud[0].score.average; 	int N = p->Length; 	for (int i = 0; i < N; i++) 		if (p->Stud[i].score.average>max) 			max = p->Stud[i].score.average; 	return max; }    //查找最大平均成绩所在的位置及输出 void search(SqList *p, float max) { 	int N = p->Length - 1; 	for (int i = 0; i < N; i++) 		if (p->Stud[i].score.average = max) 		{ 		cout << "学号" << "姓名:" << "语文:" << "数学:" << "英语:" << "平均成绩" << endl; 		cout << p->Stud[i].num << "　" << p->Stud[i].name << "   " << p->Stud[i].score.China << "  " << p->Stud[i].score.math << "  " << p->Stud[i].score.English << "  " << p->Stud[i].score.average << endl; 		}  } int main() { 	SqList *L; 	L = new SqList; 	InitList(L); 	CreateList(L); 	Stud_average(L); 	float MAX = bijiao(L); 	search(L, MAX); 	return 0; } 现在呢？

user: user-0
content: 引用 6 楼 gaopengon 的回复:空间开辟还不对啊，你可以把你开辟的空间的大小打印出来看看就知道还需要给stu开辟空间。 谢谢，你说的太对了，我现在知道还没给Stu开辟空间了，但怎么打印出来呢？

user: user-1
content: 空间开辟还不对啊，你可以把你开辟的空间的大小打印出来看看就知道还需要给stu开辟空间。

user: user-0
content: 空间不是开辟了吗？L没有free？什么意思？

user: user-2
content: 引用 1 楼 user-5 的回复:cin >> p->Stud->num>>p->Stud->name >> p->Stud->score.China >> p->Stud->score.math >> p->Stud->score.English;  这句里你还没未Stud分配内存  错误不在这吧~~ void CreateList(SqList *p)函数中的p是形参，在main函数中的调用点传递的实参是分配内存的。

user: user-3
content: *Stu没有申请空间，还有L没有free

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

user: user-5
content: cin >> p->Stud->num>>p->Stud->name >> p->Stud->score.China >> p->Stud->score.math >> p->Stud->score.English;  这句里你还没未Stud分配内存
user-0 提问: 大家好，我问一个很白的问题，求大神不要喷，比如我在本地运行一个计算器，这些数据是在计算机内存里面的，那么如果我在网络上运行一个计算器，数据是储存在哪里的呢？

回复:
user: user-0
content: 引用 7 楼 u010165006 的回复:应该是的。不过如果网页上有一个用JavaScript写的计算器（也是静态网页），那就是在本机由浏览器运行JavaScript代码计算出来的。   明白了，感谢!

user: user-1
content: 引用 4 楼 yyxgs 的回复:[quote=引用 2 楼 u010165006 的回复:] 在网络上运行一个计算器，指的是什么？在浏览器里运行，还是类似远程桌面之类的操纵另一台电脑上运行？还是分布式计算？  比如我用C写一个表达式计算器，输入1+1，得出结果2，这些数据都是运行在我的内存中的 如果我在百度上输入1+1，会有一个网页的计算器，那它们的数据是在哪里的呢?[/quote]  在百度上输入1+1，输入的信息会被提交到百度网站的某台服务器上，服务器后端会解析输入（动态网页），然后把结果翻译成静态网页（前端）回复给浏览器。ASP、JSP、PHP就是做动态网页的，根据用户提交的页面请求信息，动态网页的服务器程序（比如Tomcat）会执行动态网页的代码（比如JSP）代码，比如从数据库中检索到信息，生成HTML的表格形式（或其它的静态页面组织形式），返回给用户浏览器，浏览器显示页面得到想要的内容。

user: user-1
content: 应该是的。不过如果网页上有一个用JavaScript写的计算器（也是静态网页），那就是在本机由浏览器运行JavaScript代码计算出来的。

user: user-0
content: 引用 5 楼 u010165006 的回复:[quote=引用 4 楼 yyxgs 的回复:] [quote=引用 2 楼 u010165006 的回复:] 在网络上运行一个计算器，指的是什么？在浏览器里运行，还是类似远程桌面之类的操纵另一台电脑上运行？还是分布式计算？  比如我用C写一个表达式计算器，输入1+1，得出结果2，这些数据都是运行在我的内存中的 如果我在百度上输入1+1，会有一个网页的计算器，那它们的数据是在哪里的呢?[/quote]  在百度上输入1+1，输入的信息会被提交到百度网站的某台服务器上，服务器后端会解析输入（动态网页），然后把结果翻译成静态网页（前端）回复给浏览器。ASP、JSP、PHP就是做动态网页的，根据用户提交的页面请求信息，动态网页的服务器程序（比如Tomcat）会执行动态网页的代码（比如JSP）代码，比如从数据库中检索到信息，生成HTML的表格形式（或其它的静态页面组织形式），返回给用户浏览器，浏览器显示页面得到想要的内容。[/quote]    也就是说我输入的1+1是在服务器上进行处理的?

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:如果是java script，数据仍是在你本地计算机内存中。 如果是jsp或asp或cgi或php，数据应该是在Web服务器上的内存中。  谢谢,学习了!

user: user-0
content: 引用 2 楼 u010165006 的回复:在网络上运行一个计算器，指的是什么？在浏览器里运行，还是类似远程桌面之类的操纵另一台电脑上运行？还是分布式计算？  比如我用C写一个表达式计算器，输入1+1，得出结果2，这些数据都是运行在我的内存中的 如果我在百度上输入1+1，会有一个网页的计算器，那它们的数据是在哪里的呢?

user: user-1
content: 在网络上运行一个计算器，指的是什么？在浏览器里运行，还是类似远程桌面之类的操纵另一台电脑上运行？还是分布式计算？

user: user-2
content: 如果是java script，数据仍是在你本地计算机内存中。 如果是jsp或asp或cgi或php，数据应该是在Web服务器上的内存中。
user-0 提问: debug没事，一运行就崩溃，哪位大神帮我看看这是怎么回事？

回复:
user: user-1
content: 仅供参考：//在堆中开辟一个4×5的二维int数组 #include <stdio.h> #include <malloc.h> int **p; int i,j; void main() {     p=(int **)malloc(4*sizeof(int *));     if (NULL==p) return;     for (i=0;i<4;i++) {         p[i]=(int *)malloc(5*sizeof(int));         if (NULL==p[i]) return;     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             p[i][j]=i*5+j;         }     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             printf(" %2d",p[i][j]);         }         printf("\n");     }     for (i=0;i<4;i++) {         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19

user: user-2
content: 你只对Ps 分配了内存， 但是*Ps 的指针是不可预期的地址。 对了， 1楼已经说的很准确了。  另外， 有内存分配， 却没有内存释放， 应该要养成这样的习惯： 1. 有分配， 有释放。 2. 有open， 有close 3. 有lock， 有unlock。  祝你技术上不断进步。

user: user-3
content: 二维数组不是像你这样申请的

user: user-4
content: debug没事？怎么可能，我debug就出问题了. Ps初始化了, 但是ps指向的东西没有
user-0 提问: 怎么把调用的函数写进数组，然后通过数组调用函数

回复:
user: user-0
content: 其实是可以通过编译的

user: user-0
content: 哈哈，搞定了，谢咯

user: user-1
content: 你的数组赋值应该通过不了编译，除非强制类型转化。 	unsigned int Color[2] = { 		{(unsigned int)*First_color}, 		{(unsigned int)*Second_color}, 	}; 然后调用的时候必须在转化回函数指针： typedef void (*FUNC_POINT)(void);   // 定义指针类型 ((FUNC_POINT)Color[0])();  // 这样就可以调用了。  其实可以直接定义函数指针数组的啊： typedef void (*FUNC_POINT)(void); FUNC_POINT funs[2] = {First_color, Second_color}; (funs[0])();
user-0 提问: 想请教一下void (*func)(int); 这样的函数定义应该怎么理解？？

回复:
user: user-1
content: 表示不能理解void (*func)(int); 这类的形式  解释:func是一个函数指针，指向一个函数，此函数形参列表接受一个int值，返回值为void

user: user-2
content: 函数名定义：void A(int); 函数指针定义：void (*B)(int);  括弧中的*B = A; B = &A;即B为指向函数首地址的指针。

user: user-3
content: //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-0
content: 引用 2 楼 face_t0_sea 的回复:void (*signal)(int signo, void (*func)(int)) (int);  是复杂句式定义  为了便于理解才分成两部分，是复杂句式是一致的： typedef void Sigfunc(int);  Sigfunc *signal(int, Sigfunc *);  typedef定义了一种函数类型，该类型接受一个int参数，返回值void; signal是这么一种函数，返回值是上面定义的函数指针（Sigfunc*）,参数有两个，一个是Int,第二个同样是上面定义的函数类型的指针（Sigfunc *）  感谢！

user: user-4
content: void (*signal)(int signo, void (*func)(int)) (int);  是复杂句式定义  为了便于理解才分成两部分，是复杂句式是一致的： typedef void Sigfunc(int);  Sigfunc *signal(int, Sigfunc *);  typedef定义了一种函数类型，该类型接受一个int参数，返回值void; signal是这么一种函数，返回值是上面定义的函数指针（Sigfunc*）,参数有两个，一个是Int,第二个同样是上面定义的函数类型的指针（Sigfunc *）

user: user-5
content: 这是函数指针

user: user-6
content: void (*func)(int)转成人话的逻辑就是void(int)*func，void(int)是说返回类型是void参数是一个int的函数，void(int)*就是指向这么个函数的指针，然后void(int)* func就是定义一个这个指针的变量叫func。  C/C++里这种定义带括号的，除了参数表以外，表示的意义都是括号后面的内容要和括号前面的内容关联，而不是和自己前面的内容关联。最经典的还是那个int *[3]，[3]是三个int *，int (*)[3]人话是int[3]*，是指向int[3]的*。
user-0 提问: linux 开源作品非常操蛋的地方，让人恼火

回复:
user: user-1
content: 引用 14 楼 csshow 的回复:[quote=引用 7 楼 jack960330 的回复:] 我也认为没必要debug版本，加日志即可，日志分析 高手就是这样做的[/quote] 恩

user: user-2
content: 如果是CMake构建的项目，使用内建的CMAKE_BUILD_TYPE=Debug就行了； 如果是configure，需要看一下configure --help，类似于CFLAGS这类编译选项里可以添加你需要的东西。 debug这个东西比较灵活，不同的平台加的选项也不一样，就算作者提供了debug版本，使用者还是要自己修改掉的，所以也没必要提供了。

user: user-3
content: ./configure CXXFLAGS=“-g -O0”  autotools 写的规矩的可以在 configure 的时候增加参数。

user: user-4
content: 引用 7 楼 jack960330 的回复:我也认为没必要debug版本，加日志即可，日志分析 高手就是这样做的

user: user-5
content: 可能你用的开源代码还不够成熟吧，一般都是有的 再说就算没有，也是作者愿意，有什么办法呢

user: user-6
content: 不支持编译Debug版本

user: user-7
content: 引用 3 楼 u012879787 的回复:[quote=引用 2 楼 mLee79 的回复:] 你直接 export  CFLAGS=-g 编译就有调试信息了。  去 O2 直接 sed 下就是了， 有啥麻烦的  指需要修改makefile文件吗？   autoconf之类的一类的工具，有没有一种可能性，把gcc的命令放到其她文件里（文件名字不同于makefile)[/quote]  不用手工改啥文件， 运行 configure  的时候指定下 CFLAGS 就可以了， 就像这样    CFLAGS="-g -Og" ./configure && make -j8 && sudo make install   就可以了。

user: user-1
content: 我也认为没必要debug版本，加日志即可，日志分析

user: user-0
content: 引用 5 楼 ynsenyu 的回复:那个库能弄出几十个makefile出来？说说名字看看? 引用 4 楼 zhao4zhong1 的回复:个人意见：没必要弄什么debug版本。加日志即可调试。  第三方库你有能耐就自己加日志吧！  自己写的代码，基本不调试， 只是第三方库才Debug

user: user-8
content: 一般库都是release，调试要自己配置下参数 感觉自己加日志习惯了也挺好的

user: user-7
content: CFLAGS=“-g ..."  ./configure 就是指定个环境变量再运行 configure 。 如果有很多库要编译， 大家一般都 export CFLAGS="-g ...."  然后在运行 configure ...

user: user-7
content: 引用 9 楼 chouxiaoya8100 的回复:[quote=引用 8 楼 mLee79 的回复:] [quote=引用 3 楼 u012879787 的回复:] [quote=引用 2 楼 mLee79 的回复:] 你直接 export  CFLAGS=-g 编译就有调试信息了。  去 O2 直接 sed 下就是了， 有啥麻烦的  指需要修改makefile文件吗？   autoconf之类的一类的工具，有没有一种可能性，把gcc的命令放到其她文件里（文件名字不同于makefile)[/quote]  不用手工改啥文件， 运行 configure  的时候指定下 CFLAGS 就可以了， 就像这样    CFLAGS="-g -Og" ./configure && make -j8 && sudo make install   就可以了。 [/quote]  CFLAGS="-g -Og"   这是什么语法？   如果， ./configure 生成的makefile文件里的， cflags后面跟着很多参数，你直接使用这个命令，会不会影响到其他参数？ [/quote]  这能有啥影响， 大部分库交叉编译的时候大家都是这样子编译， 就没啥问题过， 偶尔有写的有问题的 autoconf,  手工稍微改改就是了 。。。  CFLAGS="-I${TARGET_INSTALL_PATH}/usr/include -march=armv7-a -mtune=cortex-a8 -mfpu=neon"  \ LDFLAGS="-L${TARGET_INSTALL_PATH}/usr/lib"  \ ...... \ ./configure --build=${TARGET} --prefix=/usr ....  && make -j8 && make install DESTDIR=${TARGET_INSTALL_PATH}

user: user-9
content: 引用 8 楼 mLee79 的回复:[quote=引用 3 楼 u012879787 的回复:] [quote=引用 2 楼 mLee79 的回复:] 你直接 export  CFLAGS=-g 编译就有调试信息了。  去 O2 直接 sed 下就是了， 有啥麻烦的  指需要修改makefile文件吗？   autoconf之类的一类的工具，有没有一种可能性，把gcc的命令放到其她文件里（文件名字不同于makefile)[/quote]  不用手工改啥文件， 运行 configure  的时候指定下 CFLAGS 就可以了， 就像这样    CFLAGS="-g -Og" ./configure && make -j8 && sudo make install   就可以了。 [/quote]  CFLAGS="-g -Og"   这是什么语法？   如果， ./configure 生成的makefile文件里的， cflags后面跟着很多参数，你直接使用这个命令，会不会影响到其他参数？

user: user-0
content: 引用 2 楼 mLee79 的回复:你直接 export  CFLAGS=-g 编译就有调试信息了。  去 O2 直接 sed 下就是了， 有啥麻烦的  指需要修改makefile文件吗？   autoconf之类的一类的工具，有没有一种可能性，把gcc的命令放到其她文件里（文件名字不同于makefile)

user: user-10
content: 那个库能弄出几十个makefile出来？说说名字看看?

user: user-11
content: 个人意见：没必要弄什么debug版本。加日志即可调试。

user: user-7
content: 你直接 export  CFLAGS=-g 编译就有调试信息了。  去 O2 直接 sed 下就是了， 有啥麻烦的

user: user-0
content: 为什么作者不提供debug编译选项？  不知道读者累吗？
user-0 提问: 程序执行错误。。。。求解？

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-0
content: .

user: user-2
content: 运行调试程序，出错点中断，通过调用堆栈、变量窗口等观察分析原因

user: user-3
content: 楼主这里读入scanf("%d,%d", &G->n, &G->e); 必须输入3,3才行，楼主输入3 3,后面的G->e将读不到3
user-0 提问: c语言读文件中的字符串遇到换行符跳出循环

回复:
user: user-0
content: 谢谢大大们，上周问了之后自己解决了，忘记上来结帖了

user: user-1
content: fscanf遇到空格和换行时结束 楼主可以考虑用fgets

user: user-2
content: int table_read(NODE *head) {     int index=0;     FILE *fp;     NODE*p=head;     char create_name[amount];     char buffer[amount]={0};     printf(">>Please enter a file name\n>>");     gets(create_name);     fp=fopen(create_name,"r");     if (NULL==fp)     {         printf("cannot open the file!\n");         exit(0);     }     while (1)     {         if (NULL==fgets(buffer,amount,fp)) break;         p->arr[index] = (char *)malloc(strlen(buffer) + 1);         strcpy(p->arr[index],buffer);         if (buffer[strlen(buffer)-1]=='\n')         {             p=p->next;             index=0;         }         else         {             index++;         }     }     fclose(fp);     return index; }

user: user-3
content: windows下文本文件换行是用\r\n
user-0 提问: C语言读图外加图像处理求答疑

回复:
user: user-1
content: 先了解一下JPEG格式再提问。

user: user-2
content: libjpeg-turbo是用的最多的jpeg开源解码库，可以试试看，楼主的想法是bmp格式才可以，那也要去掉文件头

user: user-3
content: 仅供参考：#include <iostream> #include <fstream> #include <string> #include <windows.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib")  using namespace std; using namespace Gdiplus;  int main() {     GdiplusStartupInput gdiplusstartupinput;     ULONG_PTR gdiplustoken;     GdiplusStartup(&gdiplustoken, &gdiplusstartupinput, NULL);      wstring infilename(L"1.jpg");     string outfilename("color.txt");      Bitmap* bmp = new Bitmap(infilename.c_str());     UINT height = bmp->GetHeight();     UINT width  = bmp->GetWidth();     cout << "width " << width << ", height " << height << endl;      Color color;     ofstream fout(outfilename.c_str());      for (UINT y = 0; y < height; y++)     for (UINT x = 0; x < width ; x++) {             bmp->GetPixel(x, y, &color);             fout << x << "," << y << ";"                  << (int)color.GetRed()   << ","                  << (int)color.GetGreen() << ","                  << (int)color.GetBlue()  << endl;     }      fout.close();      delete bmp;     GdiplusShutdown(gdiplustoken);     return 0; }

user: user-0
content: 引用 7 楼 u012947309 的回复:[quote=引用 5 楼 xr_zy1110 的回复:] 运行了一下 能通过，但查看的数字貌似不对 你看看是不是pBuffer根本没读满，后面有很多元素是0，而且你这样没读文件头。[/quote] 运行了一下 全部显示的是-52

user: user-4
content: jpg文件格式我不知道 bmp图片如果你用c读的话，是要自己解析文件头的。 比如你的图像是390*260=101400个像素值，你会发现其实这个文件的大小是101400+xxx； 多出来的xxx大小就是文件头等信息，包含了这个文件的色素通道调色板等等。 需要自己在c中写个struct来读。  jpg据说压缩过，所以文件应该小于101400，但是同样包含文件头信息头等内容需要自己写struct去读。 代码比较麻烦其实。

user: user-4
content: 引用 5 楼 xr_zy1110 的回复:运行了一下 能通过，但查看的数字貌似不对 你看看是不是pBuffer根本没读满，后面有很多元素是0，而且你这样没读文件头。

user: user-0
content: 能不能举个小例子，以代码的形式

user: user-0
content: 运行了一下 能通过，但查看的数字貌似不对

user: user-0
content: #include<stdio.h> #include<stdlib.h> int main() { 	FILE *fp; 	char pBuffer[390*283]; 	int n=0, i;  	fp = fopen("a.jpg","rb"); 	if(!fp) 	{ 		printf("文件打开失败"); 		return -1; 	} while(!feof(fp)){   fread(pBuffer, 1, 1, fp);      n++; }   for(i=0;i<n;i++) 	  printf("  %d  ",pBuffer[i]); printf("%d",n);   return 0; }

user: user-3
content: JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用 http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/

user: user-5
content: 首先你要了解jpg文件的存储格式，然后才能知道怎么去读

user: user-6
content: JPEG图片是经过熵编码的，直接用fread读文件到缓冲区，缓冲区的数据是未解码的不可理解的。 可以用某种图像库函数读取JPG文件，然后可以操作它的每一个像素。
user-0 提问: 大神帮我看看 应该在哪释放内存！！！

回复:
user: user-1
content: 没用了就释放，再用时再申请 记住申请释放要配对就行了

user: user-2
content: 不再会使用的时候就可以free了。。。 不过要注意不要重复free free的空间不要有堆溢出的情况（或者已经被破坏） 不要访问已经free的空间

user: user-3
content: 程序退出（也就是进程）时，操作系统会帮你自动free掉你malloc后没free的内存。 所以 只要 你的程序每次运行都是启动新进程（在cmd窗口中输入exe文件名运行或在资源管理器或桌面上双击运行）， 或 每次被其它程序调用都是用“通过文件将待加工数据传递给你，创建新进程运行你的程序；你的程序运行完毕，将处理后的数据保存到结果文件，退出程序；其它程序读取结果文件”方法， 在你的程序中就没必要free掉你malloc后没free的内存。

user: user-4
content: 在不需要使用时即可释放，如果程序运行整个期间均需要，可以在程序结束前释放
user-0 提问: 苍天啊  又死在内存身上了。。求内存跟踪记录软件

回复:
user: user-1
content: valgrind可见检测内存泄漏

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

user: user-3
content: malloc动态分配内存应该会好点。

user: user-4
content: http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio

user: user-0
content: 引用 1 楼 user-5 的回复:你用C++是怎么搞出内存泄漏的  就是找不到所以的原因， 只是找到了一个 。   是我调用的库里面 的 窗口句柄没有释放。  这还是我不断观察程序句柄数目  才发现的。   其他的泄漏 我就找不到了/  所以需要一款软件记录目标程序的   句柄数目变化规律     内存变化规律

user: user-0
content: 引用 2 楼 visoncomputer 的回复:malloc动态分配内存应该会好点。  多谢提醒  这个已经在用了  。。。 不是这个问题。。

user: user-0
content: 引用 5 楼 paschen 的回复:http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio  感谢版主提供了这个链接。  链接所对应是一个叫Visual Leak Detector （建成VLD）的一个软件（或者称之为插件）之类的东西。  用于在Visual studio 环境下，使用C++编程的时候，帮助开发人员发现 内存泄漏。  ×××××××××××××××××× 链接中可以提供，这个软件（或者称之为插件），源代码。  并且提供了使用方法。   ×××× 蛮不错的软件，我会研究 学习 如何去使用它。   最后谢谢版主。

user: user-0
content: 引用 6 楼 user-5 的回复:[quote=引用 4 楼 wenluderen 的回复:] [quote=引用 2 楼 visoncomputer 的回复:] malloc动态分配内存应该会好点。  多谢提醒  这个已经在用了  。。。 不是这个问题。。[/quote]  如果你老老实实使用RAII机制的话，C++里几乎是搞不出泄露的...[/quote]  感谢前辈  给出了这么好的一个机制，我大致看了下，  这个机制似乎是把资源释放 放到对象的 析构函数里面做的。   其实我是想有个  内存开销 记录 的软件，记录下我想要调试的那个程序的内存开销和时间的曲线。  用于分析我是那一段代码出了问题。  最如果这个软件   可以记录  句柄的数目变化过程，那就更好了。    谢谢

user: user-5
content: 引用 4 楼 wenluderen 的回复:[quote=引用 2 楼 visoncomputer 的回复:] malloc动态分配内存应该会好点。  多谢提醒  这个已经在用了  。。。 不是这个问题。。[/quote]  如果你老老实实使用RAII机制的话，C++里几乎是搞不出泄露的...

user: user-5
content: 你用C++是怎么搞出内存泄漏的
user-0 提问: 关于c语言开发工具库的问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:音视频的openal portaudio ffmpeg都是c写的吧，gui的话gtk+windows下面支持不好的，可以试试iup，打包的话都支持静态链接的，可以做成单文件绿色版 gtk+windows支持的不好？指的是什么？iup又是什么？难道是面向对象的？

user: user-1
content: 音视频的openal portaudio ffmpeg都是c写的吧，gui的话gtk+windows下面支持不好的，可以试试iup，打包的话都支持静态链接的，可以做成单文件绿色版
user-0 提问: 关于约瑟夫环问题

回复:
user: user-0
content: 已解决  LZ把判断符号弄错了

user: user-1
content: 程序崩溃返回的错误是什么？哪一步崩溃的，断点调试看看错误信息是什么

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

回复:
user: user-1
content: 验证正常

user: user-2
content: 写入文件后，先关闭文件，然后再打开。 ... printf ("生成结束\n"); // 因为你写入文件时，fopen的模式为"w"，此时文件指针无法seek回文件的起始。 // 你可以检查一下fscanf的返回值，按你的代码，应该返回值均为-1，也就是说读取文件是失败的； // numbers[i]中的值只不过是栈上的内存中的一些随机值。 // 需要先关闭文件，再用“r"模式重新打开 fclose(bigarray); bigarray = fopen("bigarray.txt", "r");

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

回复:
user: user-1
content: 浮点数是有精度误差的 float 有效位数大概就7位，转成float时存的其实大概是2.14748365e+009  注意最后是65，所以是比原来的整数要大的 之后转换回int导致溢出

user: user-2
content: float有效数字只有24位，2147483647一共31位有效数字所以就给近似成2147483648了。顺便2147483648是1 * 2 ^ 31，有效数字只有1位。  转回来的时候因为溢出了所以2147483648成了-2147483648

user: user-3
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-4
content: float只是表示的范围比Int大，精度的话就6位有效数字。

user: user-0
content: float的精度不是比int应该要大的吗？？在转化的时候为什么2147483647变成了2147483648？？？是什么原因 求解。新手实在搞不明白。
user-0 提问: 关于数组指针的标准输出

回复:
user: user-1
content: //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

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

user: user-2
content: %s 需要的是以\0结尾的字符串，所以需要传递char*而不是char

user: user-3
content: char *head[5]={"hello","how","are","you","today"};是一个指针数组，每个元素都为一个指针 head[2]是一个char *指针（相当于head[2] = "are";）（当然要用%s输出） *head[2]就是取指针的第一个字符了(单个字符要用%c输出) *(head+2)和head[2]是一模一样的

user: user-1
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt  参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c的内容。

user: user-4
content: 表达式的类型不同。 head 的类型是数组，元素类型是char *； head [2] 的类型是char * ； * head [2] 的类型是char 。
user-0 提问: 各位大哥，这是什么原因？库文件冲突？？？怎么解决

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

user: user-2
content: 上面贴的代码一堆拼写错误

user: user-3
content: 拼错系统找不到main函数了

user: user-4
content: int mian() ????  main

user: user-5
content: minGW去编译VC的项目么？ WinMain是VC内置在VC库里的伪入口函数，在minGW里不见得有实现。
user-0 提问: strstr（）函数不可以用于比较字符吗？

回复:
user: user-1
content: 'c'和"c"是不同的两个东西，第一个表示一个字符，第二个表示一个字符串，这个字符串里有两个内容，一个是字符c还有一个隐含的结束符'\0'

user: user-2
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-3
content: strstr 比较的是以 \0 结尾的字符串，char b[]={'c'};的话后面是没有\0的

user: user-4
content: 引用 3 楼 baidu_28726667 的回复:[quote=引用 2 楼 qq423399099 的回复:] 用单引号赋值不会自动加上'\0',这样的话调用strstr它就不会在比较一个字符以后就结束（因为没有碰到'\0'） 而且楼主sizeof(b)也是1，所以很明显只对某个位置赋值了，没有加'\0',后面紧跟着垃圾值 以下是strstr的实现，很明显在比较一个字符后还会继续比较一些垃圾值，  char *strstr(const char *find, const char *need) { 	assert(find !=NULL && need !=NULL); 	while( *find !='\0') 	{ 		const char *p=find; 		const char *q =need; 		const char *res= NULL;  		if(*p == *q) 		{     			res= p; 			while(*p++ == *q++) 				; 			if(*q == '\0') 				return res; 		} 		find ++; 	} 	return NULL; }   这里有点不懂，我这种数组初始化方式不就是让数组的大小自动识别为1吗？ 而且既然sizeof只有1. 那不就是证明我这个数组里面只有1个元素吗？ 这个'c' 后面还能有空间有随机值？[/quote] 你如果是双引号赋值char b[]={"c"};那么sizeof(b)是2，因为自动会加上'\0' 你如果是char b[]={‘c’};那么紧跟着字符c后面的可能是垃圾值（你没有紧跟'\0'，它又怎么知道你这个数组有多长呢） 你用char指针去读，它要读到'\0'才会停止或者越界崩溃

user: user-0
content: 引用 2 楼 qq423399099 的回复:用单引号赋值不会自动加上'\0',这样的话调用strstr它就不会在比较一个字符以后就结束（因为没有碰到'\0'） 而且楼主sizeof(b)也是1，所以很明显只对某个位置赋值了，没有加'\0',后面紧跟着垃圾值 以下是strstr的实现，很明显在比较一个字符后还会继续比较一些垃圾值，  char *strstr(const char *find, const char *need) { 	assert(find !=NULL && need !=NULL); 	while( *find !='\0') 	{ 		const char *p=find; 		const char *q =need; 		const char *res= NULL;  		if(*p == *q) 		{     			res= p; 			while(*p++ == *q++) 				; 			if(*q == '\0') 				return res; 		} 		find ++; 	} 	return NULL; }   这里有点不懂，我这种数组初始化方式不就是让数组的大小自动识别为1吗？ 而且既然sizeof只有1. 那不就是证明我这个数组里面只有1个元素吗？ 这个'c' 后面还能有空间有随机值？

user: user-4
content: 用单引号赋值不会自动加上'\0',这样的话调用strstr它就不会在比较一个字符以后就结束（因为没有碰到'\0'） 而且楼主sizeof(b)也是1，所以很明显只对某个位置赋值了，没有加'\0',后面紧跟着垃圾值 以下是strstr的实现，很明显在比较一个字符后还会继续比较一些垃圾值，  char *strstr(const char *find, const char *need) { 	assert(find !=NULL && need !=NULL); 	while( *find !='\0') 	{ 		const char *p=find; 		const char *q =need; 		const char *res= NULL;  		if(*p == *q) 		{     			res= p; 			while(*p++ == *q++) 				; 			if(*q == '\0') 				return res; 		} 		find ++; 	} 	return NULL; }

user: user-5
content: 你先弄清楚c语言双引号和单引号的区别了吧，双引号会自动在字符串的末尾加上'\0'，单引号不会，而c语言函数库正是使用这个来判断该字符串是否结束，否则你的程序可能抛异常。
user-0 提问: 数据结构，逆波兰式，求高手帮忙解释一段代码，谢谢

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

user: user-2
content: 引用 11 楼 Adonis044 的回复:以‘\0’结束我知道，可是他把str【i】复制给\0，为什莫，str[i应该在str[i++]前面才对呀。  str[i++]=c; str[i]='\0'; 相当于： str[i]=c; i++; str[i]='\0'; //字符串最后置0, 0在c这个字符后面；下一次循环的时候0这个位置又被赋为c，c后面又被赋为0  不是“复制给\0 ”，是赋0  推荐你看一本书：《深入理解C指针》

user: user-0
content: 引用 8 楼 u010165006 的回复:[quote=引用 7 楼 qzhuorui的回复:][quote=引用 4 楼 u010165006 的回复:] str[i++]=c; str[i]='\0'; 相当于： str[i]=c; i++; str[i]='\0'; //字符串最后置0我理解为，c赋值给str[i++]，可是为什么紧接着要加上一句str[i]='\0';还有麻烦问下为什么要这样写，新手有点不太理解，麻烦你了，谢谢。[/quote] C语言中字符串是以0结尾的，你可以翻下书本。[/quote]以‘\0’结束我知道，可是他把str【i】复制给\0，为什莫，str[i应该在str[i++]前面才对呀。

user: user-0
content: 引用 9 楼 paschen 的回复:引用 6 楼 Adonis044 的回复:[quote=引用 1 楼 paschen 的回复:] 出错时点中断，通过调用堆栈、变量窗口等观察分析原因，必要时也可单步跟踪程序运行听不懂啊，你说的好复杂.......  首先要学会调试，经常遇到BUG是肯定的，你不可能每次都来问  去网上搜索如何调试程序BUG[/quote]谢谢

user: user-3
content: 引用 6 楼 Adonis044 的回复:引用 1 楼 paschen 的回复:出错时点中断，通过调用堆栈、变量窗口等观察分析原因，必要时也可单步跟踪程序运行听不懂啊，你说的好复杂.......  首先要学会调试，经常遇到BUG是肯定的，你不可能每次都来问  去网上搜索如何调试程序BUG

user: user-2
content: 引用 7 楼 qzhuorui的回复:[quote=引用 4 楼 u010165006 的回复:] str[i++]=c; str[i]='\0'; 相当于： str[i]=c; i++; str[i]='\0'; //字符串最后置0我理解为，c赋值给str[i++]，可是为什么紧接着要加上一句str[i]='\0';还有麻烦问下为什么要这样写，新手有点不太理解，麻烦你了，谢谢。[/quote] C语言中字符串是以0结尾的，你可以翻下书本。

user: user-0
content: 引用 4 楼 u010165006 的回复:str[i++]=c; str[i]='\0'; 相当于： str[i]=c; i++; str[i]='\0'; //字符串最后置0我理解为，c赋值给str[i++]，可是为什么紧接着要加上一句str[i]='\0';还有麻烦问下为什么要这样写，新手有点不太理解，麻烦你了，谢谢。

user: user-0
content: 引用 1 楼 paschen 的回复:出错时点中断，通过调用堆栈、变量窗口等观察分析原因，必要时也可单步跟踪程序运行听不懂啊，你说的好复杂.......

user: user-0
content: 引用 2 楼 qq423399099 的回复:不知道楼主是哪里看不懂？红色字体标注的那，表示不理解

user: user-2
content: str[i++]=c; str[i]='\0'; 相当于： str[i]=c; i++; str[i]='\0'; //字符串最后置0

user: user-4
content: 新手…过滤数字那里看不懂…

user: user-5
content: 不知道楼主是哪里看不懂？

user: user-3
content: 出错时点中断，通过调用堆栈、变量窗口等观察分析原因，必要时也可单步跟踪程序运行
user-0 提问: 在使用vs编辑c链表时出现的问题（节选），求告知错误解决方式

回复:
user: user-0
content: 引用 4 楼 paschen 的回复:另外你Student结构体的定义在哪？ 我输出的只是节选

user: user-0
content: 引用 3 楼 paschen 的回复:scanf_s("%d",pNew->iNumber); 改成 scanf_s("%d",&pNew->iNumber); 也没有用，还是那些报错

user: user-1
content: 另外你Student结构体的定义在哪？

user: user-1
content: 这里是不是打错了，应该是Student  struct Student { 	char cName[20]; 	int iNumber; 	struct Struct*pNext; };

user: user-0
content: 引用 6 楼 paschen 的回复:这里是不是打错了，应该是Student  struct Student { 	char cName[20]; 	int iNumber; 	struct Struct*pNext; };

user: user-1
content: scanf_s("%d",pNew->iNumber); 改成 scanf_s("%d",&pNew->iNumber);

user: user-0
content: 改了，可是也没有任何变化啊

user: user-2
content: scanf_s("%s",pNew->cName); 改为 scanf_s("%s",pNew->cName,19);
user-0 提问: 程序为什么不能输出？

回复:
user: user-1
content: gets()函数不安全。你的程序当输入的字符不大于10个时可以正常工作，否则s1数组不足以存储所有字符，产生越界。

user: user-2
content: 用楼主的代码可以输出啊。。。