Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 出圈

回复:
user: user-1
content: 仅供参考：//假设有n个人团团围做，从第1个人开始数数，数到第m个人时候，第m个人出列， //然后继续从1开始数数，数到第m个人退出 #include <stdio.h> #include <conio.h> int i,k,t; int n,m; static char f[1001];//0该座位未出圈,1该座位已出圈 void main() {     while (1) {         printf("Input n m(1000>=n>=m>=1):");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1000>=n && n>=m && m>=1) break;         }     }     t=0;//已出圈总人数     i=1;//座位编号     k=1;//当前要数的数     while (1) {         if (0==f[i]) {             if (m==k) {                 t++;                 f[i]=1;                 printf("%3d ",i);                 if (0==t%10) printf("\n");                 if (t>=n) break;             }             k++;if (k>m) k=1;         }         i++;if (i>n) i=1;     }     cprintf("Press any key ...");     getch(); }  看来“仅供参考”这四个字我应该去注册专利了。

user: user-2
content: 这不是用数组模拟约瑟夫环吗？！ #include <stdio.h> #include <stdlib.h>  #define OUT_FLAG 7  /*初始化数组*/ int *init_arr(int *a, int len) { 	int i = 0;  	for(; i < len; i++) 		printf("%d ", a[i] = i+1); 	printf("\n");  	return a; }  /*约瑟夫环1*/ void print_out_order(int *a, int len) { 	/*      * num:队列中非0数字的个数      * mark:出列的标记数      * ret:最终剩下的数      * row:换行打印标记      */ 	int num = 0, row = 1, mark = 0, ret; 	int j;  	while(num != 1){ 		num = 0; 		for(j = 0; j < len; j++){ 			if(a[j] != 0){ 				num++; 				mark++; 				ret = a[j]; 			} 			if(mark == OUT_FLAG){ 				printf("%2d%c", a[j], !(row % 10) ? '\n' : ' '); 				a[j] = 0; 				mark = 0; 				row++; 			} 		} 	} 	printf("\n\n--------\"%d\" is the last one!\n", ret); }  /*约瑟夫环2*/ void print_out_order2(int *a, int len) { 	int i, count = 0, rem = len;  	for(i = 0; rem > 1; i++){ 		if(i > (len-1)) 			i = 0; 		if(a[i]){ 			count++; 			if(OUT_FLAG == count){ 				count = 0; 				printf("%d ", a[i]); 				a[i] = 0; 				rem--; 			} 		} 	} 	putchar('\n'); }  int main(void) { 	int len; 	printf("How many people in the queue?\n"); 	scanf("%d", &len);  	int *arr = (int *)malloc(sizeof(int) *len);     if (!arr) {         fprintf(stderr, "malloc error!\n");         return -1;     } 	init_arr(arr, len);  	printf("\nThe order of people quit queue is:\n"); 	print_out_order(arr, len); 	printf("---------proc 2-------------\n");  	int arr2[len]; 	init_arr(arr2, len);  	print_out_order2(arr2, len);      free(arr); 	return 0; } 仅供参考
user-0 提问: C语言读取文件的问题

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

user: user-0
content: 找到问题在哪了，但是如果把这句话注释掉的话就只能输出txt文件中的最后一行。

user: user-0
content: 引用 6 楼 cfjtaishan 的回复:建议直接贴代码，不建议用图片显示代码  //wenjian    void filec(TotalNode *head) 	{     int i; 	TotalNode *end; 	TotalNode *pTeacher;     FILE *fp;     fp=fopen("course.txt","r"); //以只读方式打开当前目录下.txt          if(fp==NULL)     {         printf("无法打开文件");         exit(0);        }     head=(TotalNode *)malloc(sizeof(TotalNode));     end=head;     end->next=NULL;          while(!feof(fp)) //------!feof(fp)值为0，不在执行循环语句  ------      	{         pTeacher=(TotalNode *)malloc(sizeof(TotalNode));         fscanf(fp,"%s%s%s\n",&pTeacher->CourseNum,&pTeacher->CourseName,&pTeacher->CourseTeacher);         pTeacher->next=NULL;         end->next=pTeacher;         end=pTeacher;      	}     fclose(fp);                // 选课学生的计数   	 for(i=0;i<20;i++)     {         pTeacher->stuNo[i][0]='\0';     }         }   /* 教师信息的输出-链表 */ void OutTeacherNode(TotalNode *head) {    TotalNode *p;     int num=0;     int i;    p=pTeacher;    	     if(pTeacher==NULL)     { 		puts("\t\t\t*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=");         puts("\t\t\t          没有数据!");        	puts("\t\t\t*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=");         return;     }    while(p!=NULL)      { 		puts("\t\t\t*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=");         printf("\t\t\t课程代码:%s\t\n",p->CourseNum);         printf("\t\t\t课程名称:%s\t\n",p->CourseName);         printf("\t\t\t课程老师:%s\t\n",p->CourseTeacher);          for(i=0;i<20;i++)         {             if(pTeacher->stuNo[i][0]!='\0')             {                 num++;             }         }         printf("\t\t\t选课学生:%d\t\n",num); 	    puts("\t\t\t*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=");         num=0;  //  清0操作         putchar('\n');         p=p->next;     }         putchar('\n');   }   pTeacher是全局的

user: user-2
content: 建议直接贴代码，不建议用图片显示代码

user: user-2
content: 引用 4 楼 weixin_40642114 的回复:第二张图跟第三张图顺序反了 p是不是应该指向head； 另外pTeacher是什么指针，全局的？

user: user-0
content: 引用 1 楼 qq_42067537 的回复: 且你的链表似乎只有一个结点  你是不是没有增加链表结点  谢谢~ 这个问题我也发现了，现在已经改完了。又出现了新的问题，能不能帮忙看一下。  这个是我改完的文件读取，我试验过没有问题。 下边这个是输出的函数，怎么调程序都是输出没有数据。不知道哪里出的问题。

user: user-0
content: 第二张图跟第三张图顺序反了

user: user-3
content: 且你的链表似乎只有一个结点  你是不是没有增加链表结点
user-0 提问: 求助，不知道下面的程序哪里出了问题

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

user: user-2
content: 老赵这是代码复用的典范...

user: user-2
content: 程序太乱，完全没法看，这功能应该可以很简单实现。

user: user-3
content: DDDD拿分呀，不然没得下载.

user: user-1
content: 边界条件 输入输出格式 ……

user: user-4
content: 代码是自己的，调试一下
user-0 提问: 请问访问指针范围之外的空间，为什么程序没有崩溃？

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

user: user-2
content: C语言本身就支持直接访问内存的，内存分配函数只是告诉编译器说申请的内存我程序要用，不要用来做其他事，并不是说没有申请的空间程序就不能访问。 通常内存越界引起程序崩溃是因为你访问的内存空间编译器已经用在其他地方了，结果你修改了内容导致程序运行数据异常，所以才会崩溃 这个属于内存管理的，具体细节说起来就复杂了... 从你的程序来说，你申请了10个字节的内存空间，编译器会保证这10个字节空间不会用在其他地方；但是因为你的程序比较简单，所以这10个字节空间之后的空间也处于空闲状态未被使用，所以你的访问并没有引起程序的异常

user: user-3
content: 崩溃是一种保护行为。如果系统检测到你越界，则会系统崩溃，以免影响其他程序用错误的数据，发生更加莫名其妙的行为。到时不是所有的越界系统都能检查的。

user: user-4
content: 未定义行为并不代表一定要崩溃，崩溃验明不了什么，最多只能说你运气好

user: user-5
content: 越界访问是未定义的行为，若越界的内存空间未被使用，且是可读可写的，那么使用写或者读是没问题。但是越界这部分空间，可能会被其他程序使用，可能会导致其他程序想这段区域写数据，会导致数据出错。 另外，calloc申请空间不一定是根据我们申请的字节数来的，比如我们申请１０个字节的空间，那么内存管理会按照内存管理给予相应的比１０字节要多的内存空间。因此也可能是这种原因导致的不异常。  但是这样的操作还是很有风险的，越界操作不一定每次都没问题，当然也可能出问题。所以，还是申请多少就用多少比较保险。

user: user-0
user-0 提问: C语言冒泡法，改了好久还是不知道错在哪

回复:
user: user-1
content: 越界问题： for(k=0;k<N;k++)     {         for(i=0;i<N-k-1;i++)         {             if(a[i]<a[i+1])             {t=a[i];a[i]=a[i+1];a[i+1]=t;}         }     }

user: user-2
content: 第一个程序你参照第二个就好

user: user-2
content: 第二个算法修改：  #include<stdio.h> #define N 10 void main() { 	int i, t, k, a[N]; 	printf("Bubble sort\n"); 	printf("old numbers:"); 	for (i = 0; i < N; i++) 		scanf("%d", &a[i]); 	for (k = 0; k < N; k++) 	{ 		for (i = 0; i < N - k - 1; i++) 		{ 			if (a[i] < a[i + 1]) 			{ 				t = a[i]; a[i] = a[i + 1]; a[i + 1] = t; 			} 		} 	} 	printf("new numbers:"); 	for (i = 0; i < N; i++) 		printf("%4d", a[i]); 	printf("\n"); 	system("pause"); }

user: user-3
content: 数组已经越界了，修改一下

user: user-4
content: for(k=0;k<N;k++)     {         for(i=0;i<N-k-1;i++)         {             if(a[i]<a[i+1])             {t=a[i];a[i]=a[i+1];a[i+1]=t;}         }     }

user: user-4
content: 数据越界了，超出范围

user: user-5
content: 明显越界了 啊

user: user-6
content: 调试的时候少用几个数据、排序3-5个数就行了。哪里有问题很容易看出来。

user: user-7
content: 第二个code的冒泡算法一样，也是会出现越界。

user: user-7
content: for(k=0;k<N;k++)     {         for(i=0;i<N-k-1;i++)         {             if(a[i]<a[i+1])             {t=a[i];a[i]=a[i+1];a[i+1]=t;}         }     } 数组越界，当k＝＝０时，i < N;那么i+1就会是N，下表只能是从０～Ｎ－１;因此会会越界；

user: user-8
content: if(a[i]<a[i+1])  a[i+1]) 数组越界了      for(k=0;k<N-1;k++)     {         for(i=0;i<N-k-1;i++)
user-0 提问: 新手求问问题出在哪？

回复:
user: user-1
content: 输入数字的前面还应该加英文逗号

user: user-2
content: 应该是输入的格式不对。 正确的输入格式是需要加,逗号的。注意是英文的逗号；  scanf("%d,%d,%d",&a,&b,&c); printf("a = %d, b = %d, c = %d\n", a, b, c);  再输入后加一条打印信息，若输出等于输入的，则格式正确，否则输入的格式不对
user-0 提问: 为什么这个代码运行后输入m输出不是monday而是error？

回复:
user: user-1
content: 好像没问题， 输入m输出就是monday

user: user-0
content: 非常感谢！@das白

user: user-2
content: 用scanf吧 scanf_s 最后还有一个参数 你用的不对 所以没输入到i里  详情百度scanf_s的用法

user: user-0

user: user-0
content: 为什么我用VS2013运行的时候 结果是“”error”？
user-0 提问: 新手入门C语言，关于”兰州烧饼“”的问题请教？

回复:
user: user-1
content: 有点像脑筋急转弯，3 7返回应该是5, x y表示x个烧饼正面，y个烧饼反面： 3 0 3 0 1 2 0 3 0 2

user: user-2
content: 这样想就好了，7个饼，一共14个面，一次最多3个面，就是5分钟

user: user-3
content: 百度搜相关关键字。

user: user-0
content: 引用 4 楼 真相重于对错的回复:3，2 第一次，放入2个烧饼，一分钟后好了一面 第二次，拿出其中1个烧饼，放入剩下一个，另外一个翻面，一分中后，一个全熟，两个半熟。 第三次，把全熟的拿出，放入两个， 共3分钟。 感谢提示   还真是这么回事   之前一直没没想明白

user: user-4
content: 合理利用资源。三面的时候你非要先把俩个烙好，剩下一个花俩分钟那就没辙了

user: user-5
content: 比如有3个饼，两口锅，先把其中两个的一面，放入锅里一份钟，再把这两个饼的其中一个的第二面，和第三个饼的第一个面，放入锅里一份钟，最后把原来的两个饼的另外一个的第二个面，和第三个饼的第二个面，放入锅里一份钟，所以一共需要3分钟。

user: user-6
content: 3，2 第一次，放入2个烧饼，一分钟后好了一面 第二次，拿出其中1个烧饼，放入剩下一个，另外一个翻面，一分中后，一个全熟，两个半熟。 第三次，把全熟的拿出，放入两个， 共3分钟。

user: user-0
content: 引用 2 楼 qq_42044484的回复:我是说网上给的答案能看明白，截图中样例输入3  2，样例输出3，不可能是3分钟啊，肯定是偶数分钟 我是说网上给的答案没看明白，截图中样例输入3  2，样例输出3，不可能是3分钟啊，肯定是偶数分钟

user: user-0
content: 我是说网上给的答案能看明白，截图中样例输入3  2，样例输出3，不可能是3分钟啊，肯定是偶数分钟

user: user-7
content: 3   7 结果是6 结果肯定是偶数,没毛病啊

user: user-8
content: z=(n/k)*2+(n%k?2:0); 没问题啊，先求得整数倍用时，再加上剩余个数用时（以7为例，7/3 == 2，整数相除结果为整数，然后求余7%3 == 1为真，选择2) 你有什么疑惑呢
user-0 提问: C程序未曾修改，有时候可以运行，有时候却运行一半卡住

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

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  不要依赖调试器输出复杂数据结构！而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出，非常有助于调试！或者可以说是“基础设施”  数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-0
content: 希望有大佬可以指点我一下
user-0 提问: 为什么float有效位是7，最准确的是6

回复:
user: user-1
content: 引用 2 楼 user-3 的回复:2^23 = 8388608，结果是7位数，最多能表示7位有效数字，但绝对能保证的则是6位 就是这个意思了，8388608以下的保证7位，8388608以上的数字可以保证6位

user: user-2
content: 理解和讨论之前请先学会如何观察！  浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-3
content: 引用 1 楼 papaweilun的回复:我不太懂为什么要用2的24次方。。。。。。这是因为这样子表示有2的24次方个数可以被表达吗？ 每一位有0和1两种状态，N个位就可以表示 2^N个值

user: user-3
content: 这里说的有效位是小数点后的位数，而隐藏的1位不是小数点后的

user: user-3
content: 2^23 = 8388608，结果是7位数，最多能表示7位有效数字，但绝对能保证的则是6位

user: user-0
content: 我不太懂为什么要用2的24次方。。。。。。这是因为这样子表示有2的24次方个数可以被表达吗？
user-0 提问: 程序终止

回复:
user: user-1
content: 报错贴一下啊

user: user-2
content: 调试一下

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

回复:
user: user-1
content: 项目属性——C/C++-——语言——符合模式：否

user: user-1
content: 正确的写法应该是：const char * str = "12345";  之前允许是由于历史原因，但你修改它一样会导致程序崩溃  当然你要在VS2017下通过编译，可以在：项目属性——C//C++ 把符合模式改一下就行

user: user-0
content: 谢谢版主大大，问题解决了~
user-0 提问: 困扰了我一天的问题，谁能帮忙解解惑

回复:
user: user-0
content: 谢谢大家问题已解决

user: user-1
content: 你的指针q没有指向有效的内存，你还没有初始q，就在QInit函数中访问指针指向的内存  一种改法是：   #include<stdio.h> #include<stdlib.h> #include <stdbool.h> #define buf_size 256  typedef struct { 	int top; 	int end; 	char qlist[buf_size]; }QUEUE; void QInit(QUEUE *q) { 	q->top = 0; 	q->end = 0; 	for (int i = 0; i < buf_size; i++) 	{ 		q->qlist[i] = 0; 	} } void main() { 	int len1 = 0; 	int tmp = 0; 	int data = 0; 	bool QFull_judge; 	char buf[13] = { 58,0,2,0,1,3,41,42,43,0,201,13,10 }; 	QUEUE q; 	QInit(&q); 	printf("hello...\n"); 	system("pause"); }

user: user-2
content: 没有给指针分配内存 指针指向哪里？ 用函数初始化 用引用传递吧

user: user-3
content: 指针初始化一下   #include<stdio.h>  #include<stdlib.h>    #define buf_size 256   typedef struct  {  int top;  int end;  char qlist[buf_size];  }QUEUE;   void QInit(QUEUE *q)  {  q->top = 0;  q->end = 0;  for (int i = 0; i < buf_size;i++)  {  q->qlist[i]=0 ;  }  printf("hello...\n");  }   void main()  {  int len1=0;  int tmp=0;  int data = 0;  bool QFull_judge;  char buf[13] = {58,0,2,0,1,3,41,42,43,0,201,13,10};  QUEUE *q = (QUEUE*)malloc(sizeof(QUEUE));  QInit(q);  free(q);  q=NULL;  printf("hello...\n");  system("pause");  }
user-0 提问: 有没有大神能看懂这个程序中的QInit函数为什么调试不进去

回复:
user: user-1
content: 引用 8 楼 湘南smile的回复:debug调试运行可以进入到函数QInit里面，但是release调试运行就不可以，可以解释一下为什么吗 因为release时代码会被优化，要调试在debug下进行

user: user-0
content: debug调试运行可以进入到函数QInit里面，但是release调试运行就不可以，可以解释一下为什么吗

user: user-0
content: 已解决，谢谢大家

user: user-2
content: 是否进去执行了，在QInit函数内加一条调试打印不可以了吗？！

user: user-3
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）

user: user-1
content: 引用 6 楼 湘南smile的回复:我是单步调试的，但是运行到QInit的时候要么是直接跳过去，根本就不进去，要么就是直接引起中断 从代码看应该没问题，要进函数要点步入

user: user-0
content: 我是单步调试的，但是运行到QInit的时候要么是直接跳过去，根本就不进去，要么就是直接引起中断

user: user-1
content: 引用 4 楼 湘南smile的回复:出错的位置就在QInit，要么就是直接不进去，要么就是在QInit这里中断，改了好几次都不行，是因为这个程序里面既有C语言又有C++吗？还是内存问题 从你给的代码看，QInit没问题，建议单步跟踪程序运行，以观察程序流程及分析原因

user: user-0
content: 出错的位置就在QInit，要么就是直接不进去，要么就是在QInit这里中断，改了好几次都不行，是因为这个程序里面既有C语言又有C++吗？还是内存问题

user: user-1
content: 引用 2 楼 湘南smile的回复:这个程序有问题，编译的时候能成功，但是程序根本就进不到QInit函数里面，调用不起来 你怎么知道没进到QInit，如果是运行时错误，出错时点中断，通过调用堆栈定位到你代码相关位置，分析原因

user: user-0
content: 这个程序有问题，编译的时候能成功，但是程序根本就进不到QInit函数里面，调用不起来

user: user-1
content: 什么叫调试不进去，你设置断点就可以在里面中断了
user-0 提问: 用单链表实现批量删除时出现了问题，请大佬看一下

回复:
user: user-1
content: 楼上的答案不正确吧，这并没有真正的删除，只不过是结点后继跳过去了，而后面结点根本没有free掉

user: user-2
content: //删除元素 void DeleteList_L(LinkList L){     LinkList p;     LinkList q=(LinkList)malloc(sizeof(LNode));     p=L;     i=1;     if(x>=y)         printf("输入错误");     while(p->next!=NULL){         q=p->next;         if((q!=NULL)&&(q->data>=x)&&(q->data<=y)){ 			             p->next=q->next;             //p=p->next;                          printf("\n第%d次删除后单链表的存储状态为:",i);             PrintList_L(L);             i++;         } 		else p=p->next;      } 	free(q); 	q=NULL; }

user: user-0
content: 太谢谢啦已经可以了~原来是自己的逻辑问题....十分感谢！

user: user-0
content: 刚才看了那个帖子主要是排序的，而且是C++的，我的问题主要在批量删除这块，还有程序运行到一半就不动了是怎么回事呢？麻烦大佬再看看

user: user-3
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
user-0 提问: 能执行程序，但是得到的答案越界了，请各位大神帮忙修改一下

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

user: user-2
content: scanf("%d",&m);     for (i=1;i<=N;i++ )     {         for (j=1;j<=N;j++)         {             if(j==1)             {                 result[j]=a[i]%n;             }             else                 result[j]=result[j-1]*a[i]%n; //递归求模！避免大数运算         }     }     for (j=1;j<=N;j++)     {         for(g=1;g<=N;g++)         {             if (result[g]==result[j]) //判断是否有两个或以上相同的结果             { Q++;             }             return 0;         }         return 0;     } 这里的result使用都是越界了。result数组长度是１，那么下表只能是０，所以下表大于０都是越界的。

user: user-1
content: 百度搜相关关键字。
user-0 提问: 关于c语言中浮点数在实际编程中的有效范围

回复:
user: user-1
content: 按 IEEE754标准,   1.17549435E-38 是规格化数能表示的最小浮点数 (0x00800000, 阶码 -126, 尾数1.0...., 表示 1 * 2^-126),    更小的可以表示为为非规格化数,  最小的是 0x00000001 ,  阶码 -127,  尾数 0.0.....1,  表示  1 * 2^-(126+23) ...  非规格化数丢失精度, 所以一般说表示范围都指规格化数表示的范围,  还有不少模拟实现的浮点库视所有的非规格化数为0 ...

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

user: user-3
content: float能表示的最大和最小分别是FLT_MAX宏和FLT_MIN宏 ，这点你不用怀疑  double则是DBL_MAX 和 DBL_MIN

user: user-3
content: printf你指定多少他输出多少，但超过浮点数范围后面的都不是准确的
user-0 提问: 程序运行错误，指针如果未初始化那么对指针赋值NULL，可是该指针位于字符串常量区，不可以修改指针内容，见下面一段代码

回复:
user: user-1
content: char *arr = NULL; gets(arr); 第一条语句是将指针指向了ＮＵＬＬ，NULL是指不可读，不可写的区域。这样初始化是为了保证arr指针不是野指针。gets是向指针指向的内存区域写数据，但是指针指向NULL，所以会导致运行异常。

user: user-2
content: 就是指针未初始化, 不是什么在常量区
user-0 提问: 新人求助mpich（C语言），实现两数组生成随机数并行相加并和串行进行比较时间

回复:
user: user-1
content: 如果要比较两个并行相加和串行相加的时间，建议每个功能定义一个函数，在函数的开始使用start时间，函数结束使用end时间

user: user-2
content: 百度搜相关关键字。
user-0 提问: [c语言]跪求大神帮我看看哪里出了问题

回复:
user: user-1
content: 引用 2 楼 cheese143的回复:引用 1 楼 user-1 的回复:你的node变量要的空间太大，在栈上分配导致栈空间用完，应该在堆上分配它请问该怎么改呀，查了一下堆分配还是不太懂 node* y = (node*)malloc(sizeof(node));  这里y是指针，后面访问按指针操作

user: user-0
content: 引用 1 楼 user-1 的回复:你的node变量要的空间太大，在栈上分配导致栈空间用完，应该在堆上分配它请问该怎么改呀，查了一下堆分配还是不太懂

user: user-1
content: 你的node变量要的空间太大，在栈上分配导致栈空间用完，应该在堆上分配它
user-0 提问: printf精度控制

回复:
user: user-1
content: printf("%.15g",A);

user: user-2
content: 例如%m,n控制输出结果中一共有m位，其中小数占n位。你可以根据你的需要控制精度值。 或者你可以比如对第三位小数进行四舍五入算法 n=(n*100+0.5)/100控制精度等等。

user: user-3
content: printf("%10.2f",A);

user: user-4
content: double能表示的最多就15位，还能用%g

user: user-5
content: printf("%g",A);

user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437
user-0 提问: 关于链表

回复:
user: user-1
content: 比如下面这段代码  int initInt(int a)  { 	a = 5; }  在main里面调用时, initInt(b), 调用完之后b的值并不会改变; 如果把initInt函数改为  int initInt(int *pA) { 	*pA = 5; }  在main里面调用initInt(&b),b的值就会改变为5了  同样的道理,在main里面调用这个方法int InitList(LinkList &L), 可以传入参数指向的地址

user: user-2
content: 引用，引用就是别名，即形参就是实参的一个别名。别名和原有的名字都指向同一个内存区域，对别名（形参）修改，就是对原有（实参）的修改。这样达到通过InitList函数将链表头初始化得到。 若不用引用，当然也可以用二重指针，两种方法是等效的。  但是，若用一重指针（不加引用），根据参数的传递是值传递，形参和实参是相互独立（加了引用，形参和实参就是别名的关系），对于形参的修改，不能影响到实参。

user: user-3
content: 就是使用引用，在函数里可以修改它

user: user-4
content: 其实就是引用传递

user: user-5
content: 引用调用，和传指针一样的效果。

user: user-6
content: 这个是函数的参数  加& 是引用传递  详情百度 引用传递 和 值传递

user: user-7
content: 百度 C引用 int InitList(LinkList &L) 等同于 int InitList(LNode *&L) 内部L=new LNode;影响实参，否则赋值仅仅是影响函数内的临时副本
user-0 提问: c语言有几个变量不知道该怎么定义，求大神指导

回复:
user: user-1
content: 错误的信息是未找到定义，原因是这些未定的变量被你注释掉了。

user: user-2
content: 你的编译器不是很老的话, 应该是支持用到的时候再定义变量, 无需一次性全部定义出来 至少 C99 就已经可以了

user: user-3
content: nt n,tab,tab1,k,i,m,N,j;//result,mod,a,length,sum; 红色部分被注释掉了，去掉注释 int n,tab,tab1,k,i,m,N, result,mod,a,length,sum; /*以上为复制的答案*/ 另外问一句，你是来故意发帖凑活跃度的么？

user: user-4
content: int n,tab,tab1,k,i,m,N,j;//result,mod,a,length,sum; 红色部分被注释掉了，去掉注释 int n,tab,tab1,k,i,m,N, result,mod,a,length,sum;

user: user-5
content: 建议再去找一本基础的C语言书籍看一下吧，从基础开始，别急着写程序，按书上步骤一步一步来
user-0 提问: C怎么正确显示中文？

回复:
user: user-1
content: 你系统是中文的吗

user: user-0
content: 引用 5 楼 qq_38204686 的回复:看看cmd小黑框的编码格式  不对了改一下 应该就是这个原因了。 我改成UTF-8后就能显示中文了。  照这个改的： https://blog.csdn.net/tfs411082561/article/details/78416569

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:是因为编码格式的问题吧，代码的格式应该是utf-8格式，但是win7下一般是gb2312吧 出现乱码，肯定是编码的问题嘛。 代码应该是utf-8的。那要怎么处理？ c在读取文件，或者print的时候，不能指定编码方式吗？

user: user-2
content: 编码里边转为ANSI编码  或 转为UTF-8编码

user: user-3
content: 这种乱码应该都是格式造成的吧 统一成 utf-8 看看还有没有问题 Windows 里默认的应该不是

user: user-4
content: project------->setting----------->Resource   里面language选简体中文

user: user-5
content: 看看cmd小黑框的编码格式  不对了改一下

user: user-6
content: 是因为编码格式的问题吧，代码的格式应该是utf-8格式，但是win7下一般是gb2312吧

user: user-7
content: 你的环境？什么编译器？

user: user-0
content: 引用 2 楼 hdt 的回复:你的环境？什么编译器？ gcc，都在cmd中执行。系统是win7 大概是这种： 先编译——gcc path/file.c -o path/file.o 再执行.o文件——path/file.o
user-0 提问: C 语言 - 有关pointer aliasing violations的问题

回复:
user: user-1
content: 引用 3 楼 jianwen0529 的回复:作用不一样吧 第一种指针置NULL 第二种是指针指向填充了一个void*的数据，即NULL？ void*指针大小

user: user-1
content: 作用不一样吧 第一种指针置NULL 第二种是指针指向填充了一个void*的数据，即NULL？

user: user-0
content: 其实这两种实现都能达到目的，只是我不太明白为何第二种会被采用，这段代码是摘录开源code。

user: user-2
content: 你如果是想让指针释放后指向NULL，第二种方法实际是自欺欺人
user-0 提问: 选择排序法，这个程序哪里错了吗？

回复:
user: user-1
content: 補充：程序報錯是因爲數組越界，也就是非法訪問内存了。

user: user-1
content: 首先，數組a總共10個元素，所以最后一個是a[9]；其次以下這個調用：  sort(&a[10],10);  傳入的是a[10]的地址，但你的函數應該傳入的是數組a的首地址。所以建議改爲：  sort(a,10);
user-0 提问: read 返回 -1, 为什么？

回复:
user: user-1
content: O_DIRECT这种东西，要搞明白含义再使用。

user: user-2
content: linux下返回-1，一般都是错误的。可以用strerror(errno)来获取错误的详细信息

user: user-3
content: 建议判断一下open的返回值，即需要判断文件是否成功打开。 很有可能是文件打开失败

user: user-4
content: 引用 2 楼 wllabs 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 建议判断一下open的返回值，即需要判断文件是否成功打开。 很有可能是文件打开失败  打印了下是 3。 有值， 我把这个 flags |= O_DIRECT  去掉就可以读了。这是为什么？ [/quote] https://blog.csdn.net/axw2013/article/details/70242228

user: user-4
content: 引用 2 楼 wllabs 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 建议判断一下open的返回值，即需要判断文件是否成功打开。 很有可能是文件打开失败  打印了下是 3。 有值， 我把这个 flags |= O_DIRECT  去掉就可以读了。这是为什么？ [/quote] https://blog.csdn.net/axw2013/article/details/70242228

user: user-3
content: #include<stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h>  int main() {     char file[] = "/root/b.c";     int flags = O_RDONLY, ret;     flags |= O_DIRECT;     flags |= O_SYNC;     int fd = open(file, flags);     if (fd < 0)         return 1;     char buff[4096];     ret = read(fd, buff, 2);     if (ret < 0)         printf("%s\n", strerror(errno));     else if (ret > 0)         puts(buff);     //printf("%d\n", read(fd, buff, 2));     while(read(fd, buff, 2) > 0)     {         printf("aaaa\n");         printf("%s", buff);     }     close(fd);      return 0; } 用strerror(errno)定位是什么原因导致的return -1

user: user-5
content: https://www.baidu.com/s?wd=O_DIRECT

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:建议判断一下open的返回值，即需要判断文件是否成功打开。 很有可能是文件打开失败  打印了下是 3。 有值， 我把这个 flags |= O_DIRECT  去掉就可以读了。这是为什么？
user-0 提问: 为什么多维数组传参第一个中括号里边的数字可以省略不写

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

user: user-0
content: 引用 3 楼 赵4老师的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx 蟹蟹赵4老师的回答，我好像明白了

user: user-0
content: 引用 1 楼 user-3的回复:最后一个可以不写吧，相当于传递一个指针过去，根据类型就可以自动知道存放在什么地方，而且是连续存放的 最后一个必须要写的，楼儿好像说的对

user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx

user: user-2
content: 因为 1传入到函数中数组退化为指针。 2 传入到函数中如果最后一维不写    void test( int  a[][3])    {      int b = a+1; 将会得到错误的结果，a+1相当于指向第二行。只有知道最后一维的尺寸，才能正确知道正确的位置。    }

user: user-3
content: 最后一个可以不写吧，相当于传递一个指针过去，根据类型就可以自动知道存放在什么地方，而且是连续存放的
user-0 提问: 小白求教 约瑟夫环问题

回复:
user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-1
content: 百度搜相关关键字。

user: user-0
content: 又重写了了一下，运行还是出问题 #include<stdlib.h> #include<stdio.h>  //声明循环链表结构体  typedef struct node {int data; char name[10]; 	char sex; 	int age; struct node *next; }node; struct node stu;  //创建单循环链表  node *Creatlist(node *h,int n) {  node *p,*q;//创建两个结点指针  int S; h=(node*)malloc(sizeof(node));//分配动态存储空间  h->next=NULL;//h指向下一个元素结点为空，确定*h是头结点指针 q=h;//将头结点的数据赋给q  for(S=n;S>0;S--)//遍历整个链表  { p=(node*)malloc(sizeof(node));//分配动态存储空间  scanf("%d %s %c %d",&p->data,p->name,&p->sex,&p->age);//输入p的数值  p->next=q->next;//指针*q跟着*p后面，一个接一个插入 q->next=p; q=p;//把p的值再传给q } q->next=h->next;//从链表中删除  free(h);//释放头结点*h  return q->next;//形成单循环链表  }  //执行出列操作  void Printlist(node *h) {node *p,*q; p=h;//找到第M个人所在位置  while(p->next!=h)//当*p不再指向头结点时 ，即找到要出列人的位置  {printf("%d",p->data); p=p->next; } printf("%d ",p->data); printf("\n"); free(p); p=NULL; while(q->next!=NULL)//当*q不再指向空结点时，即找到剩余人的位置  {printf("\t\t\t编号\t\t\t姓名\t\t\t性别\t\t\t年龄\n"); for(q=h;q!=NULL;q=q->next) printf("\t\t\t%d\t\t\t%s\t\t\t%c\t\t\t%d\n",q->data,q->name,q->sex,q->age); } }  //约瑟夫环  void YueSeFuHuan(node *h,int S,int n) {node *p,*q; int M,m,e; p=h; for(M=1;M<S;M++) { p=p->next;} printf("被删除的编号：",p); while(p->next!=p)//用循环输出链表中的元素 	{for(m=1;m<n-1;m++) 	{p=p->next;} q=p->next;p->next=q->next;e=q->data; free(q); printf("%d ",e); p=p->next; } e=p->data; free(p); printf("%d\n",e); }  void input(node stu[]);//input函数声明   //主函数  int main() {node *L; int N,S,M,X; {printf("输入人数N: \n"); scanf("%d",&N); node stu[N];//*p=stu;//定义结构体数组和指针  input(stu);//调用input函数  printf(stu); } printf("输入每个人的编号\n"); L=Creatlist(L,N); printf("建立的循环链表:\n"); Printlist(L); printf("输入开始数数的人的位置:\n"); scanf("%d",&S); printf("间隔的个数:\n"); scanf("%d",&M); printf("输入剩余人数：\n"); scanf("%d",&X); printf("删除的编号:\n"); YueSeFuHuan(L,S,M); //printf("输出最后剩余的人的编号，姓名、性别和年龄:\n"); //printf("data:%d\nname:%s\nsex:%c\nage:%d\n\n",stu[].data,stu[0].name,stu[0].sex,stu[0].age); }  void input(node stu[])//定义input函数  { 	int i,N; 	printf("输入各编号所对应的学生姓名，性别，年龄：\n"); 	for(i=0;i<N;i++) 	{ scanf("%d %s %c %d",&stu[i].data,stu[i].name,stu[i].sex,&stu[i].age); } }
user-0 提问: Linux下fread读取结构体的问题

回复:
user: user-1
content: 引用 7 楼 olivehht 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 olivehht 的回复:] 由于是二进制文件，比如文件的头四个字符对应的十六进制是0x00 0x00 0x00 0xD9，这个文本在AIX下用fread读，直接就可以读出来为217，可是不用fread的话，要如何将其读出来呢？ 可以用fgetc  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 [/quote] fgetc读第一个字符就退出来了。我是用UltraEdit查看的[/quote] 仅供参考：#include <stdio.h> #include <string.h> #include <conio.h> FILE *fi,*fo; int i; int main(int argc,char **argv) {     if (argc<3) {         printf("Usage:%s src des\n",argv[0]);         return 1;     }     if (0==stricmp(argv[1],argv[2])) {         printf("Src and des is same!\n");         return 2;     }     fo=fopen(argv[2],"wb");     if (NULL==fo) {         printf("Can not create file %s\n",argv[2]);         return 3;     }     fi=fopen(argv[1],"rb");     if (NULL==fi) {         fclose(fo);         printf("Can not find file %s\n",argv[1]);         return 4;     } 	i=0;     fseek(fi,-1L,SEEK_END);     while (1) {         fputc(fgetc(fi)^0x5A,fo); 		i++; 		if (i%1000000==0) cprintf("\r%dKB",i/1000);         if (fseek(fi,-2,SEEK_CUR)) break;     }     fclose(fi);     fclose(fo); 	cprintf("\r%dKB OK.\r\n",i/1000);     return 0; }

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 olivehht 的回复:] 由于是二进制文件，比如文件的头四个字符对应的十六进制是0x00 0x00 0x00 0xD9，这个文本在AIX下用fread读，直接就可以读出来为217，可是不用fread的话，要如何将其读出来呢？ 可以用fgetc  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 [/quote] fgetc读第一个字符就退出来了。我是用UltraEdit查看的

user: user-1
content: 引用 5 楼 olivehht 的回复:由于是二进制文件，比如文件的头四个字符对应的十六进制是0x00 0x00 0x00 0xD9，这个文本在AIX下用fread读，直接就可以读出来为217，可是不用fread的话，要如何将其读出来呢？ 可以用fgetc  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-0
content: 由于是二进制文件，比如文件的头四个字符对应的十六进制是0x00 0x00 0x00 0xD9，这个文本在AIX下用fread读，直接就可以读出来为217，可是不用fread的话，要如何将其读出来呢？

user: user-2
content: 应该是字节序不同。 aix跑在小机上的话跟suse跑在x86上大小端刚好是相反的。 你这个字段这么多，转换起来也很麻烦，别用结构体了 直接打印输出成文本吧，一行一个，跨平台也没问题

user: user-3
content: 没看bs是什么  建议单步跟踪程序运行，观察每一步变化情况，分析原因

user: user-0
content: 引用 1 楼 自信男孩的回复:只看到你读取了，那么写入是怎么做的呢？写入和读取最好是匹配的，否则不保证每次都对呢。 fread／fwrite匹配 写入是别人做的，对方提供文件

user: user-4
content: 只看到你读取了，那么写入是怎么做的呢？写入和读取最好是匹配的，否则不保证每次都对呢。 fread／fwrite匹配
user-0 提问: DEVC的调试问题

回复:
user: user-1
content: 点击工具下的编译选项 点击 代码生成/优化 然后点 连接器 把 产生调试信息后的No 选为Yes 然后确定 就可以调试了

user: user-2
content: 引用 楼主 weixin_40709508的回复: 设置断点和添加变量后单步调试不给反应呢 我也碰到这样的问题了，烦ヽ(‘⌒´メ)ノ老哥你解决没，教教我

user: user-3
content: 建议赶快换这个： Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-4
content: 先设置断点，然后f5进入调试，然后再添加变量监控，然后再逐步进入呢。

user: user-5
content: 建议找一下该软件调试说明
user-0 提问: 求大佬搭救，菜单选项输入不了选项。

回复:
user: user-1
content: 学会调试比改好这段程序重要； 学会找水比要水现在解渴重要。

user: user-2
content: #include<stdio.h>  void showmenu(void); int getchoice(int high, int low);  int main(void) {     int code;      showmenu();     while((code = getchoice(4,1)) != 4)     {         printf("I like choice %d.\n",code);         showmenu();     }      return 0; }  void showmenu(void) {     printf("Please choose one of following:\n");     printf("1) copy files       2) move files\n");     printf("3) remove files     4) quit\n");     printf("Enter the number of your choice:\n"); }  int getchoice(int high, int low) {     int num, good;      good = scanf("%d", &num);     while(good == 1 && (num < low || num > high))     {         printf("%d is not a valid choice; try again.\n", num);         showmenu();         good = scanf("%d", &num);     }     //if(scanf("%d", &num) != 1)     if(good != 1)     {         printf("Input error.");         num = 4;     }      printf("%d", num);      return num; } 参考一下吧  因为while后面还有一个scanf，所以你需要输入两次才行。但是，修改一下，改成如上就可以了。

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

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

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

回复:
user: user-1
content: #include<stdlib.h> #include<stdio.h> #include<string.h> #include<malloc.h>  struct studtype {     char name[20];     long studnum;     int studage;     char studsex;     float studscore;     int order;     struct studtype *next; };  //struct studtype * stu_init(); //struct studtype *stu_creat(); struct studtype * init(); struct studtype * creat();  int main() {            system("pause"); }  struct studtype * init() {     printf("enter the date in order\n");     return creat();  } struct studtype *creat() {     struct studtype *h, *info, *p;     for (;;)     {         info = (struct studtype*)malloc(sizeof(struct studtype));          if (!info) {             printf("内存不足\n");             break;             //return NULL;         }         printf("name\n");         scanf("%s", info->name);         printf("studnum\n");         scanf("%ld", &info->studnum);         if (info->studnum == 0)             break;         printf("age\n");         scanf("%d", &info->studage);         printf("sex");         scanf("%c", &info->studsex);         info->next = NULL;         if (h == NULL)             h = info;         else         {             p = h;             while (p->next != NULL)             {                 p = p->next;             }             p->next = info;         }      }      return h; } 参考一下吧 还有其他一些问题，一并做了修改，建议对比参考一下  找一下这个结构体名称的区别： struct stdutype 和 struct studtype

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

user: user-3
content: 44 45 行需要加大括号吧

user: user-3
content: 你的main函数没有返回值吧
user-0 提问: 一维数组的初始化问题

回复:
user: user-1
content: 初始化与赋值的问题。

user: user-2
content: 第二种形式不是定义，而是赋值，但是赋值有数组越界，等号两边类型不匹配。

user: user-3
content: a[10]={...}属于赋值语句，单独为a[10]赋值，并且a[10]已经越界

user: user-4
content: 第二个不是在初始化，而是在为a[10]这个元素赋值（虽然这个位置已经越界），没有这样的用法。

user: user-5
content: “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

user: user-6
content: 区分赋值与初始化
user-0 提问: 新人求指教，错在哪里

回复:
user: user-1
content: main写成mian；

user: user-2
content: 第一，main写成mian； 第二，函数声明是这样的float volume（float  b， float c，）跟函数实体不符 第三，printf("%.2f\n,d)n后面少了"

user: user-3
content: 写代码的时候细心点吧

user: user-4
content: mian改成main

user: user-5
content: main函数拼写错误 printf("%.2f\n,d);改为printf("%.2f\n”,d);

user: user-6
content: 少了一个引号

user: user-7
content: #include <stdio.h>  #define A 1.2  float volume(float b,float c);  int main() {     float b;     float c;     float d;     printf("输入b的长度:\n");     scanf("%f",&b);     printf("输入c的长度；\n");     scanf("%f",&c);     d=volume(b,c);     printf("输出体积：");     printf("%.2f\n", d);     return 0; } float volume(float b,float c) {     float d=(b*c)*A;     return d; } 参考一下吧 宏定义建议使用大写单词或字母 最后一个参数后没有逗号  这些错误应该编译时会提示，建议注意下，并读懂编译提示

user: user-7
content: main不是mian，单词拼写注意一下

user: user-8
content: printf("%.2f\n,d);  n后面少了个引号

user: user-8
content: d=volume(b,c,);  c后面多了个逗号

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

回复:
user: user-1
content: 比如你定义一个数组，char str[5];这是可以的，如果你定义一个char str[num];那就是不可以的（新标准可能可以）也就是里边的数量不能是变量，这个时候就需要动态创建这个数组了，memset是将内存初始化为某个值，相当于你申请了一块地，需要自己修整一下，才能使用

user: user-0
content: 引用 2 楼 focuslight的回复:char *p = (char*)malloc(len*2+1); *2干什么？ char *p = (char*)malloc(len+1); strcpy (p,arr); strcat(p,arr) 所以是len*2+1 不知道对不对

user: user-2
content: 引用 5 楼 spaceman_c 的回复:[quote=引用 1 楼 pwanbul的回复:]你应该是初学者，malloc用于在堆上动态分配内存，如果分配成功，通过返回的指针就能使用了，memset 函数是用初始化内存的，因为用内存上会有垃圾值！ 开辟的大小，怎么看，每次申请是用多少申请多少，还是要多申请一点[/quote] 可以考虑需要多少申请多少，如果第一次申请的不够，也可以使用realloc追加

user: user-0
content: 引用 1 楼 pwanbul的回复:你应该是初学者，malloc用于在堆上动态分配内存，如果分配成功，通过返回的指针就能使用了，memset 函数是用初始化内存的，因为用内存上会有垃圾值！ 懂了，，多谢指教。。。

user: user-0
content: 引用 1 楼 pwanbul的回复:你应该是初学者，malloc用于在堆上动态分配内存，如果分配成功，通过返回的指针就能使用了，memset 函数是用初始化内存的，因为用内存上会有垃圾值！ 开辟的大小，怎么看，每次申请是用多少申请多少，还是要多申请一点

user: user-0
content: 引用 4 楼 自信男孩的回复:malloc申请的空间是根据动态需要来的，比如程序运行开始不知道应该申请多少内存。运行过程中知道了需要多少内存，就是使用malloc/realloc； 从你的这个函数里来看，也可以不memset，strcpy/strcat会将'\0'拷贝值p中，memset是初始化，因为malloc的内存空间的数据是随机数，memset一下可以初始化。 多谢指教，那个开辟内存刚开始申请多少

user: user-2
content: malloc申请的空间是根据动态需要来的，比如程序运行开始不知道应该申请多少内存。运行过程中知道了需要多少内存，就是使用malloc/realloc； 从你的这个函数里来看，也可以不memset，strcpy/strcat会将'\0'拷贝值p中，memset是初始化，因为malloc的内存空间的数据是随机数，memset一下可以初始化。

user: user-3
content: malloc开辟动态内存空间的大小由你自己决定，memset函数用于初始化

user: user-4
content: char *p = (char*)malloc(len*2+1); *2干什么？ char *p = (char*)malloc(len+1);

user: user-5
content: 你应该是初学者，malloc用于在堆上动态分配内存，如果分配成功，通过返回的指针就能使用了，memset 函数是用初始化内存的，因为用内存上会有垃圾值！
user-0 提问: 求矩阵的部分和

回复:
user: user-1
content: 数组定义的时候需要指定大小，不管是几维数组，除非你在定义的时候初始化它。 int array_one[] = {1,2,3,4}; int array_two[4] = {0}; 其他类型或多维数组同上

user: user-2
content: #include<stdio.h>  int main() {     int n,i,j;     int a[10][80];     int sum = 0;     scanf("%d",&n);     if (n > 10)         return 0;     for(i=0;i<n;i++)         for(j=0;j<n;j++)             scanf("%d", &a[i][j]);     for(i=0;i<n;i++)         for(j=0;j<n;j++){             if(j!=n-1&&i!=n-1&&i+j==n+1)                 sum=sum+a[i][j];         }     printf("%d",sum);     return 0; } 参考一下吧  定义数组时，需要指定数组的行数和列数（二维数组）。 另外，scanf需要加&

user: user-3
content: a[][999]的前面那个中括号也要指定大小吧
user-0 提问: 请教一个链接问题

回复:
user: user-1
content: 静态的库是编译时链接的即会在编译时加入到可执行程序里。，动态库是执行可执行程序时动态加载的。 因此若想用liba.a的库，不想用libb.a的库，只需要在编译时不引用liba.a的库
user-0 提问: 顺序表实现过程中没有打印出任何值，求问哪里出现问题？

回复:
user: user-1
content: 每次插入后，length没有改变，导致后面再插入时，i>sqlist->length + 1 直接返回错误

user: user-2
content: //将第i个元素以及第i个元素后面的元素后移     for (int j = sqlist->length; j >= i; j--)         sqlist->elem[j] = sqlist->elem[j - 1]; 这个操作也可以去掉了，冗余代码

user: user-0
content: 我自己的错，插入的时候成员搞错了

user: user-2
content: #include <stdio.h> #include <stdlib.h>  #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10  #define OK 0 #define error -1 #define OVERFLOW -2  typedef int ElemType;  typedef struct _SqList {     ElemType *elem;     int length;        //表长度     int listsize;    //当前分配的存储容量 }SqList,*pSqList;  //增加存储空间容量 int addcapacity(SqList *sqlist) {     ElemType *newbase;    //分配一个新的基址     //newbase = (ElemType *)malloc((sqlist->listsize + LISTINCREMENT) * sizeof(ElemType));     newbase = (ElemType *)realloc(sqlist->elem, (sqlist->listsize + LISTINCREMENT) * sizeof(ElemType));     if (newbase == NULL)         exit(OVERFLOW);     sqlist->elem = newbase;     sqlist->listsize += LISTINCREMENT;     return OK; }  //初始化顺序表 int InitList_sq(SqList *sqlist) {     if (sqlist == NULL)         return error;     //给线性表分配初始容量     sqlist->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));     if (!sqlist->elem)         exit(OVERFLOW);     sqlist->length = 0;     sqlist->listsize = LIST_INIT_SIZE;      return OK; }  //在表的第i个位置插入新元素newelem int ListInsert(SqList *sqlist, int i, ElemType newelem) {     if (sqlist == NULL || i < 1 || i > sqlist->length + 1)     {         return error;     }     if (sqlist->length >= sqlist->listsize)    //检查线性表是否已满，如果满了就扩充空间容量     {         if (addcapacity(sqlist) != OK)             return OVERFLOW;     }     //将第i个元素以及第i个元素后面的元素后移     for (int j = sqlist->length; j >= i; j--)         sqlist->elem[j] = sqlist->elem[j - 1];     sqlist->elem[i - 1] = newelem;     //sqlist->elem++;     sqlist->length++;     return OK; }  //顺性表输出 void Print_list(SqList *sqlist) {     int i;     for (i = 0; i < sqlist->length; i++)         printf("%d  ", sqlist->elem[i]);     printf("\n"); }  int main() {     SqList L;     InitList_sq(&L);      for (int i = 0; i < 10; i++)    //将0-9插入顺序表     {         ListInsert(&L, i + 1, i);     }     Print_list(&L);     return 0; } 参考一下吧  问题1：addcapacity函数内，建议使用realloc而不能使用malloc，因为使用malloc确实把空间扩展了，但是原来的数据应该就没了，realloc就可以避免这个问题。 问题2：insert函数内，没有对length进行修改，那么比较空间是否需要扩展就没有意义了，因为length还是0. 问题3：insert函数内，sqlist->elem++;这个操作是修改了指针的位置，这个是为什么你输出的时候没有任何数据的原因，当然还跟length没有修改有关； 问题4：if (sqlist->length > sqlist->listsize)    //检查线性表是否已满，如果满了就扩充空间容量     {         if (addcapacity(sqlist) != OK)             return OVERFLOW;     } 这个比较建议加上=，因为不加会越界。因为下表的值是从0～listsize-1;
user-0 提问: 给出一个数，求这个数的所有本原元

回复:
user: user-1
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-2
content: 是不是benyuan ();这句应该放在printf之前

user: user-2
content: printf ("请输入一个素数%d",p);  scanf("%d",&n); f= pow(m,i); p=f%n; printf("全部本原元为:%d",m); 虽然不知道什么意思～但这里的m的值不会因为你输入的值而改变吧

user: user-3
content: 什么是本原元，描述的不够清晰。建议举出一个或者一些例子来

user: user-4
content: 素数的因子不是一和他的本身吗？
user-0 提问: 请教

回复:
user: user-1
content: include 后面要跟头文件  #include <stdio.h>

user: user-2
content: 引用 11 楼 qq_31504597 的回复:[quote=引用 10 楼 Fantacy936 的回复:]  提示结果错误, 应该是打印的内容有误.  #include <stdio.h> int main() {     printf("Hello world!\n");     return 0; } [/quote] +++  多年的编程经验，不加<stdio.h>，编译都过不去，更别说运行了。

user: user-3
content: 头文件没加啊

user: user-4
content: 题目要求是打印Hello world！， 你为啥要打印别的额，不明白。  引用 10 楼 Fantacy936 的回复:

user: user-5
content: #include<stdio.h> int main() {     printf("让我们学习C语言向世界问好。\n");     return 0; } 楼主，此问题中你遇到的问题是在#include中需要引入头文件<stdio.h>

user: user-6
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-7
content: 引用 10 楼 Fantacy936 的回复: 提示结果错误, 应该是打印的内容有误.  #include <stdio.h> int main() {     printf("Hello world!\n");     return 0; }

user: user-0

user: user-2
content: 引用 8 楼 Fantacy936 的回复:改成那个是没问题的，但是输入到网课上面老是有问题 截图不够清晰吧，看不清呢

user: user-0
content: 改成那个是没问题的，但是输入到网课上面老是有问题

user: user-2
content: 引用 4 楼 Fantacy936 的回复:改成那个是可以，但是他不满足网课给的要求，提交作业的时候还是显示错误 网课是什么要求？

user: user-2
content: #include <stdio.h>  int main() {     printf("让我们学习C语言向世界问好。\n");      return 0; } 需要引入头文件

user: user-8
content: #include ->改成 #include<stdio.h>

user: user-0
content: 改成那个是可以，但是他不满足网课给的要求，提交作业的时候还是显示错误

user: user-0
content: 还是有个编译的错误 编译错误 a.c:1:19: fatal error: iostream: No such file or directory compilation terminated.

user: user-9
content: 引用 2 楼 Fantacy936 的回复:还是有个编译的错误 编译错误 a.c:1:19: fatal error: iostream: No such file or directory compilation terminated.  改成stdio.h

user: user-9
content: 头文件：#include <iostream>
user-0 提问: System.Reflection.TargetInvocationException: 调用的目标发生了异常   求解

回复:
user: user-1
content: System.DllNotFoundException: 无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块。

user: user-2
content: 信息太少了吧，但从异常的打印上看，是动态库加载有问题。
user-0 提问: 哪位大佬指点一下，小弟感激不尽，调用哪个函数求数学英语物理总成绩的平均值呢

回复:
user: user-1
content: 也可以直接在display( ) 添加语句： cout<<“评价值”<<(mscore+escore+pscore)/3<<endl;

user: user-1
content: 自己再定义一个方法，来求平均值

user: user-2
content: 自己写函数，没有能直接调用的

user: user-3
content: 修改一下display函数  void display( ) // 定义公用函数display { cout<<"姓名："<<name<<endl; cout<<"学号："<<num<<endl; cout<<"数学成绩："<<mscore<<endl; cout<<"英语成绩："<<escore<<endl; cout<<"物理成绩："<<pscore<<endl; cout<<“平均成绩：”<<(mscore+escore+pscore)/3<<endl;  };

user: user-4
content: (x+y+z)/3.0
user-0 提问: 请对以下程序运行结果的分析总结，函数实现程序时间复杂度分析

回复:
user: user-1
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！
user-0 提问: c语言没有报错，但是运行不了，求大神解答

回复:
user: user-0
content: 已经可以运行出来了，但是想输入一个基数，n个指数，同时输出结果，就是例如2^3,2^5,2^7这样同时输出，想让大神们指导一下

user: user-1
content: 根据报错逐次修改代码

user: user-2
content: #include <stdio.h> #include <math.h> int main() { 	int n; //修改1 ： 声明 n     double base, exponent, result,i;     printf("基数: ",base);     scanf("%lf", &base);     printf("指数: ",exponent);     scanf("%lf", &exponent);     n=(int)exponent;// 修改2:   n 赋值(int)强制类型转换 for(i=1;i<=n-1;i++) {     // 计算结果     result = pow(base, exponent);     printf("%.1lf^%.1lf = %.2lf", base, exponent, result);     return 0; } }

user: user-3
content: i，n都没有定义，而且i应该是整型的，i=exponent又是双精度转换成整型

user: user-0
content: 我想实现的是把一个数e从1次幂到n次幂全部都存在一个数组中，我试了楼上那种把那些语句都注释掉，但是还是运行不了

user: user-4
content: #include <stdio.h> #include <math.h>  int main() { 	double base, exponent, result, i; 	//printf("基数: ",base); 	printf("基数: "); 	scanf("%lf", &base); 	//printf("指数: ",exponent); 	printf("指数: "); 	scanf("%lf", &exponent); 	//i = exponent; 	/* 	for(i = 1; i <= exponent-1;i++) 	{ 		// 计算结果 	} 	*/ 	result = pow(base, exponent); 	printf("%.1lf^%.1lf = %.2lf", base, exponent, result); 	return 0; }  参考一下吧； 对比一下找找问题

user: user-5
content: n未定义，程序逻辑也有问题
user-0 提问: 代码运行结果不正确

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

user: user-2
content: 代码看着好累，，你插入代码试试
user-0 提问: 5.	用for循环计算圆周率，计算到某项的绝对值小于10-6止。(其中一种公式为：PI / 4 = 1 – 1/3 + 1/5- 1/7+1/9 -……）（约为

回复:
user: user-1
content: 引用 2 楼 NNSSHXS 的回复:[quote=引用 1 楼 wang0635 的回复:] 1.0/i<10e-6 ==> 1.0/i>10e-6 printf("PI=%lf\n",PI); ==> printf("PI=%f\n",PI); PI=4*x; ==>最好拿到循环外头来 非常感谢您！ 还有一个小问题想请教您，按我这样写得到的结果和给出的参考答案不太一样（我的结果是3.141573，而参考答案是3.141591），是我这样还有什么产生误差的地方吗？[/quote]1e-6 写成 10e-6 了

user: user-0
content: 我明白了，谢谢您！

user: user-2
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-0
content: 引用 1 楼 wang0635 的回复:1.0/i<10e-6 ==> 1.0/i>10e-6 printf("PI=%lf\n",PI); ==> printf("PI=%f\n",PI); PI=4*x; ==>最好拿到循环外头来 非常感谢您！ 还有一个小问题想请教您，按我这样写得到的结果和给出的参考答案不太一样（我的结果是3.141573，而参考答案是3.141591），是我这样还有什么产生误差的地方吗？

user: user-1
content: 1.0/i<10e-6 ==> 1.0/i>10e-6 printf("PI=%lf\n",PI); ==> printf("PI=%f\n",PI); PI=4*x; ==>最好拿到循环外头来
user-0 提问: dev可以运行，oj却过不去。求助大佬！！！

回复:
user: user-1
content: 杭电第三题，我不知道我为啥也过不了

user: user-0
content: 这是大数相加，long long是存不下的，需要用字符串接收，然后转化为数字相加

user: user-2
content: Notice that the integers are very large, that means you should not process them by using 32-bit integer.  虽然我的英语很烂，也看懂人家要求你不能用32为整形来处理这个问题  提示，用字符串
user-0 提问: C语言程序，但在dev中无法正常运行，求大神解答

回复:
user: user-1
content: 第一个循环前i没有初始化，后面的x、1x2没有初始化

user: user-2
content: 扔掉DEV C++，安装VS2010 Express Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-0
content: 自顶。。。。。。。。
user-0 提问: 数据结构——单链表删除问题

回复:
user: user-1
content: 纸上学来终觉浅，绝知此事要躬行。

user: user-2
content: 引用 4 楼 zhao4zhong1 的回复:数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633 其实和队列的删除元素原理差不多。。。。。。

user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:看我在http://bbs.csdn.net/topics/392201633 这个帖子中的最新回复。  感谢老师解惑！！！昨晚困扰到现在，一直在看，看了各种删除操作，始终不得其中的诀窍，  怒了，中午开始直接上手做，边做边想，发现思路清晰很多，  真心感谢老师的指点，  下面这段代码是我自己敲的， status List_Delete_i(List* L, int i)//删除第i个 { 	List p, q; 	p = *L; 	int j = 1; 	while (p->next && j < i) 	{ 		p = p->next; 		j++; 	} 	/* 	if (!(p->next) || j > i) 	{ 		return ERROR; 	}*/ 	if (p->next) 	{ 		q = p->next; 		p->next = q->next; 		free(q); 	} return OK; }  我也明白了为什么要用 p->next作为判断位置合理的原因了，这么简单，

user: user-1
content: 看我在http://bbs.csdn.net/topics/392201633 这个帖子中的最新回复。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 zyx6680599 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633 其实和队列的删除元素原理差不多。。。。。。[/quote] 千句讨论和解释，比不上一行例子代码。 千句例子代码，比不上一副对相应代码足够清晰的图解。[/quote]  感谢论坛元老的指点迷津， 可是小白，就这个问题还没有理解， 怎么理解这个判断条件 if (!(p->next) || j > i)

user: user-0
content: 引用 1 楼 hdt 的回复:你的代码有问题，把一个指针传入函数，无论函数中对这个指针进行同级修改，函数返回后这个指针指向的地址不变，只能改变这个指针指向的内存。  代码是这里看到的 https://blog.csdn.net/bestallen/article/details/53148836#t4  对于删除操作，我不是很明白，尤其是用    if (!(p->next) || j > i)   判断合理性的时候，我就搞不懂了，为什么要用p->next去判断？

user: user-1
content: 引用 5 楼 zyx6680599 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633 其实和队列的删除元素原理差不多。。。。。。[/quote] 千句讨论和解释，比不上一行例子代码。 千句例子代码，比不上一副对相应代码足够清晰的图解。

user: user-3
content: Status ListDelete(LinkList *L,int i,ElemType *e)  如果我要删除第一个元素将会出错，所以有些链表的实现，会加一个头元素，头元素下一个指向实际的第一个元素

user: user-4
content: 直接p->NEXT==NULL是不是就可以了？同为菜鸟

user: user-3
content: 你的代码有问题，把一个指针传入函数，无论函数中对这个指针进行同级修改，函数返回后这个指针指向的地址不变，只能改变这个指针指向的内存。
user-0 提问: 分别定义一个char类型的数组和char*指针数组，为什么每个指针数组a的地址相差是8byte,数组b的地址相差1byte..有理解错的地方还望各位大侠指教

回复:
user: user-1
content: 引用 1 楼 RATNG的回复:懂了，因为每个指针数组存放的都是都是一个指针，在64位机器中，指针的大小是8个byte. 纠正下，是64位程序指针是8字节，而不是64位系统，64位系统下也可以运行32位程序，指针是4字节

user: user-2
content: 引用 1 楼 qq_35196982 的回复:懂了，因为每个指针数组存放的都是都是一个指针，在64位机器中，指针的大小是8个byte. 编译器背锅.

user: user-2
content: 指针数组:mac或者64位程序  指针占8个字节。32位程序占四个字节。 另一个相差1没什么问题

user: user-0
content: 懂了，因为每个指针数组存放的都是都是一个指针，在64位机器中，指针的大小是8个byte.

user: user-0
content: 引用 4 楼 paschen 的回复:[quote=引用 1 楼 RATNG的回复:]懂了，因为每个指针数组存放的都是都是一个指针，在64位机器中，指针的大小是8个byte. 纠正下，是64位程序指针是8字节，而不是64位系统，64位系统下也可以运行32位程序，指针是4字节[/quote] 谢谢！！！
user-0 提问: 扫雷游戏，感觉逻辑都正确，为什么运行结果会挂掉

回复:
user: user-1
content: 判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-0
content: 引用 1 楼 user-3的回复:在函数init_board里面，你的两个数组都有越界访问的操作，导致数组附近堆栈损毁，然后程序崩溃。  如果你定义一个数组 int a[10]，那么代表他有10个元素，其下标范围是[0, 10)，这是一个半开半闭的区间。下标从0开始，到9结束。所以你在遍历这个数组时，应该这样：  for (int i = 0; i < 10; ++i)  如果你对C语言中这种数组的不对称边界以及为什么这么设计感兴趣，可以阅读《C陷阱和缺陷》的 3.6小节 边界计算与不对称边界 。 不对啊，改了之后第一行第一列返回的ret就错了

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

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

user: user-2
content: 呃，不是迷宫，是雷图...

user: user-2
content: 两个问题： 1.  void game() {     char arr[row][col];     char mine[row][col]; 这里的arr、mine应该定义为全局数组，不要放在game()里 2. 可能你的想法是迷宫存储比显示大一圈，这样就不用判断输入的某点是否在边界上了，这么设计没问题，但是实现上有一点错误，要显示10x10的迷宫，col和row要设置为12，显示使用1..10，0和11作为不可见的边界。

user: user-3
content: 在函数init_board里面，你的两个数组都有越界访问的操作，导致数组附近堆栈损毁，然后程序崩溃。  如果你定义一个数组 int a[10]，那么代表他有10个元素，其下标范围是[0, 10)，这是一个半开半闭的区间。下标从0开始，到9结束。所以你在遍历这个数组时，应该这样：  for (int i = 0; i < 10; ++i)  如果你对C语言中这种数组的不对称边界以及为什么这么设计感兴趣，可以阅读《C陷阱和缺陷》的 3.6小节 边界计算与不对称边界 。