Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 把下面的快速排序 代码 修改为降序（原来的是升序）代码非原创

回复:
user: user-1
content: 将   if(lower < pivot)               quickSort(num,lower,pivot-1);           if(pivot < upper)               quickSort(num,pivot+1,upper);   里面的<都改为>试试？

user: user-2
content: 快速排序给你个我之前写的，分为递归版与非递归版，你随便先一个就行  里面又分升序与降序，如果你要降序，把升序那部分的代码删除了  //快速排序（递归版） void QSort(int* a,int left,int right) { 	int tmp = a[left]; 	int p = left; 	int i = left,j = right; 	while(i<=j) 	{ 		//升序 		{ 			while(a[j]>=tmp && j>=p) 				j--; 			if(j>=p) 			{ 				a[p] = a[j]; //比划分元小的交换到左边 				p = j; 			} 			while(a[i]<=tmp && i<=p) 				i++; 			if(i<=p) 			{ 				a[p] = a[i]; //比划分元大的交换到右边 				p = i; 			} 		} 		 		//降序 		{ 			while(a[j]<=tmp && j>=p) 				j--; 			if(j>=p) 			{ 				a[p] = a[j]; //比划分元大的交换到左边 				p = j; 			} 			while(a[i]>=tmp && i<=p) 				i++; 			if(i<=p) 			{ 				a[p] = a[i]; //比划分元小的交换到右边 				p = i; 			} 		} 	} 	a[p] = tmp; 	if(p-left>1) 		QSort(a,left,p-1); 	if(right-p>1) 		QSort(a,p+1,right); }  //快速排序（非递归版） int Partition(int* a,int left,int right) { 	int pivot = a[right]; 	while(left<right) 	{ 		//升序 		{ 			while(a[left]<pivot && left<right) 				left++; 			if(left<right) 				a[right--] = a[left]; 			while(a[right]>pivot && left<right) 				right--; 			if(left<right) 				a[left++] = a[right]; 		} 		 		 		//降序 		{ 			while(a[left]>pivot && left<right) 				left++; 			if(left<right) 				a[right--] = a[left]; 			while(a[right]<pivot && left<right) 				right--; 			if(left<right) 				a[left++] = a[right]; 		} 	} 	a[left] = pivot; 	return left; }

user: user-0
content: 规定是要数组的 不用指针 能写个数组的吗？ 还有那个修改的 不行 谢谢了
user-0 提问: TCP重连之后还是收到之前的数据

回复:
user: user-1
content: 断开连接需要2步 close 和 shutdown  谁在前我忘了

user: user-2
content: 应该是你代码有问题，TCP连接断开后，重新建立新的连接，不可能受到的是上次数据！ 检查一下，是否没清理自己的缓冲区？recv返回的有本次接收的数据长度，请严格按照返回的长度来定位数据。若超出了，则有可能是你上次没清理掉的数据！

user: user-3
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

user: user-4
content: 引用 楼主 chllcy 的回复:我这边客户端事阻塞模式，一个send，一个recv，当出现recv超时时，会close，然后重新建立TCP连接，但是压测发现有时候超时重连，下一次send之后recv数据还是之前发过来的数据，导致后续的数据都错乱了。 而且我在TCP重连后下一次send之前已经用select查看接收缓冲区有没有数据了，有就清除。 这个问题，比较偶现，不知道为什么TCP重连之后还能接收到上次的数据，有什么办法避免这种情况呢？  数据不会错乱的，tcp是基于流的，只有可能是解包逻辑有问题。 常用的方法是将数据放入缓存，找到自己的合法报头， 根据报头中的长度， 将数据依次解出来。 至于其他数据，因为不符合要求，抛弃掉就可以了。
user-0 提问: 求迷宫最短路径，输出路径各点坐标

回复:
user: user-1
content: for(int v=0;v<8,!found;v++)   是不是要写成：  for(int v=0;v<8 && !found;v++)

user: user-1
content: 你的 #include"SqStack.cpp"   CPP文件不需要包含，添加到工程就可以了

user: user-2
content: 出来冒泡，顺便帮你顶顶。。。。。。

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

回复:
user: user-1
content: 可以，C + WINDOWS API函数

user: user-2
content: 老毛桃 PE 不行吗  或者安装的时候多分区引导

user: user-3
content: TC调用INT 13h

user: user-0
content: 引用 1 楼 Rewen 的回复:可以，需要学习windows的底层编程知识，或者熟悉硬盘引导分区的数据结构。   看来挺复杂的。。

user: user-4
content: 可以，需要学习windows的底层编程知识，或者熟悉硬盘引导分区的数据结构。
user-0 提问: 把下面的快速排序代码改为 降序（或者给个快速排序的代码要求10随机生成数，用数组，降序）

回复:
user: user-1
content: 改成这样：  #include<stdio.h>   #include<stdlib.h>   #include<time.h>   #define NUMBER 10   //NUMBER为数组的大小    void quickSort(int[], int, int); void display(int[], int); int main() { 	int num[NUMBER]; 	int randValue = 0; 	int i, temp;  	srand(time(NULL)); 	//随机生成NUMBER个1-100的随机数    	for (i = 0; i<NUMBER; i++) 	{ 		randValue = 1 + (int)rand() % 100; 		num[i] = randValue; 	} 	srand(time(NULL)); 	printf("使用快速排序算法\n"); 	printf("排序前："); 	display(num, NUMBER);//打印数组内容    	quickSort(num, 0, NUMBER - 1);//调用快速排序算法    	printf("排序后："); 	display(num, NUMBER);  	return 0; } void quickSort(int num[], int lower, int upper) { 	int partition(int[], int, int); 	int pivot; 	//递归调用    	pivot = partition(num, lower, upper); 	if (lower < pivot) 		quickSort(num, lower, pivot - 1); 	if (pivot < upper) 		quickSort(num, pivot + 1, upper);  }  int partition(int num[], int left, int right) { 	int pivot, temp;  	pivot = num[left]; 	while (left<right) 	{ 		//从右往左扫描    		while (num[right] < pivot && left<right) 			right--; 		if (right != left) 		{ 			num[left] = num[right]; 			left++; 		}  		//从左往右扫描    		while (num[left] > pivot && left<right) 			left++; 		if (right != left) 		{ 			num[right] = num[left]; 			right--; 		} 	} 	num[left] = pivot; 	return(left); }  //打印数组    void display(int num[], int count) { 	int i; 	for (i = 0; i<count; i++) 	{ 		printf("%d\t", num[i]); 	} 	printf("\n"); }
user-0 提问: 求助

回复:
user: user-0
content: 引用 2 楼 user-2 的回复:typedef struct  {  	ElemType *elem; //存储空间基址  	int length; //当前长度  	int listsize; //当前分配的存储容量  }LinkList; //待排记录的顺序存储结构（即顺序表的类型） typedef struct  LNode {ElemType data;            //存储空间基地址 struct LNode *next;             //查找表的长度 }LNode,*LinkList;      另外上面这里的LinkList重复了

user: user-1
content: 除了楼上说的问题：你的L.R = new ElemType[MAXSIZE];又是啥？ 根本没有R这个成员变量的啊？

user: user-2
content: typedef struct  {  	ElemType *elem; //存储空间基址  	int length; //当前长度  	int listsize; //当前分配的存储容量  }LinkList; //待排记录的顺序存储结构（即顺序表的类型） typedef struct  LNode {ElemType data;            //存储空间基地址 struct LNode *next;             //查找表的长度 }LNode,*LinkList;      另外上面这里的LinkList重复了

user: user-2
content: LNode *LocateELem(LinkList L;Elemtpye e)  改成；  LNode *LocateELem(LinkList L;ElemType e)  注意大小写
user-0 提问: 这个数组定义为什么报错

回复:
user: user-1
content: int是整形类型。整形数组里面不能有除开整形之外的类型数据

user: user-2
content: 因为你数组第二维相当于是1，所以内层大括号里只能有一个数  你可以写成：int a[3] = { 1, 2, 3 };  或者： int a[3] = { {1}, {2}, {3} };  但里面的大括号不能有两个

user: user-3
content: 错在赋值 {1， {2, 3}}中只有两个元素，是1和{2, 3}，而{2,3}不是int类型元素  你可以这样赋值 int a[3] = { 1, 2, 3 };
user-0 提问: 各位帮忙看一下呗

回复:
user: user-0
content: 另外，还希望哪位大牛可以留下个联系方式，以后自己看不出来而且百度也找不到解决方案的时候还可以求助一下大牛

user: user-1
content: VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-0
content: 引用 11 楼 赵4老师的回复:“多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？ 嗯嗯 老师 懂了，但是上面的错误截图上面显示正确答案是19，但是我的答案是30    是不是最主要的错误不在这里呢？如果主要错误在这里的话，就算第255个是元音字母 ，不也应该差1个，而不是30-19个么？

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

user: user-2
content: char str[255+1]= {0}; for(i=0,cnt=0; i<strlen(str); i++)

user: user-0
content: 引用 8 楼 qq_36409192的回复:[quote=引用 6 楼 NDFour的回复:][quote=引用 3 楼 qq_36409192的回复:]题目好像没说输入一行字符串，然后接着输出对应的元音个数吧。。 说了啊，有样例输入和样例输出[/quote] 样例里面是一句输入一个输出？？我怎么看到的是输入完再输出的。。[/quote] 不是的  我们学校的题目就是这样。。。之前我也是你那样想的  一问老师才知道是输入一句  就输出一句

user: user-3
content: 引用 6 楼 NDFour的回复:[quote=引用 3 楼 qq_36409192的回复:]题目好像没说输入一行字符串，然后接着输出对应的元音个数吧。。 说了啊，有样例输入和样例输出[/quote] 样例里面是一句输入一个输出？？我怎么看到的是输入完再输出的。。

user: user-0
content: 引用 4 楼 paschen的回复:for(i=0,cnt=0; i<255; i++)  改成：  for(i=0,cnt=0; i<strlen(str); i++) 怎么了？有什么问题吗？没看懂你要表达什么意思

user: user-0
content: 引用 3 楼 qq_36409192的回复:题目好像没说输入一行字符串，然后接着输出对应的元音个数吧。。 说了啊，有样例输入和样例输出

user: user-0
content: 引用 2 楼 贫僧博企的回复:1 输入最长是２５５，但不一定是２５５，最长应该是字符串的长度。 2 switch括号,default 加好。 嗯嗯 谢谢改正，但是从那个错误提示来看 正确答案是19，我的是30  跟你刚刚说的这个应该没有什么关系，能不能帮忙看一下是不是我的逻辑在哪写错了？

user: user-4
content: for(i=0,cnt=0; i<255; i++)  改成：  for(i=0,cnt=0; i<strlen(str); i++)

user: user-3
content: 题目好像没说输入一行字符串，然后接着输出对应的元音个数吧。。

user: user-5
content: 1 输入最长是２５５，但不一定是２５５，最长应该是字符串的长度。 2 switch括号,default 加好。
user-0 提问: C语言中给指针的指向空间赋值问题

回复:
user: user-1
content: 会不会是因为指针没有初始化，导致指针指向的内存不存在？

user: user-2
content: 熟悉强制类型转换 Type Cast Operator:  (type) cast-expression :  unary-expression ( type-name ) cast-expression  A type cast provides a method for explicit conversion of the type of an object in a specific situation.  The compiler treats cast-expression as type type-name after a type cast has been made. Casts can be used to convert objects of any scalar type to or from any other scalar type. Explicit type casts are constrained by the same rules that determine the effects of implicit conversions. Additional restraints on casts may result from the actual sizes or representation of specific types.   Example  In the following example, the type cast operator converts the float value of 3.1 to an integer value of 3.  // Example of the type cast operator float x = 3.1; int i; i = (int)x;   // the value of i is now 3   熟悉指针加减规则 Pointer Arithmetic Additive operations involving a pointer and an integer give meaningful results only if the pointer operand addresses an array member and the integer value produces an offset within the bounds of the same array. When the integer value is converted to an address offset, the compiler assumes that only memory positions of the same size lie between the original address and the address plus the offset.  This assumption is valid for array members. By definition, an array is a series of values of the same type; its elements reside in contiguous memory locations. However, storage for any types except array elements is not guaranteed to be filled by the same type of identifiers. That is, blanks can appear between memory positions, even positions of the same type. Therefore, the results of adding to or subtracting from the addresses of any values but array elements are undefined.  Similarly, when two pointer values are subtracted, the conversion assumes that only values of the same type, with no blanks, lie between the addresses given by the operands.

user: user-3
content: 不要将类型转换成：uint8_t 否则你的移动的字节是不同的
user-0 提问: 关于文件读写的问题

回复:
user: user-1
content: 你单步跟踪程序运行，看每一步读到了什么，你的变量值是怎么变化的，然后很容易发现原因

user: user-2
content: 是不是这里的逻辑问题？  if(st[i]=='\n')            st[i]='\0';         else             while(getchar()!='\n')               continue;

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

回复:
user: user-1
content: 使用ps命令结束指定进程。

user: user-0
content: 这是源代码 #include<sys/types.h> #include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int d1[2]; int d2[2]; int d3[2]; int r,j,k; int i; int answer; char *delim=","; char *str[3]; char buff[200]; printf("Please input the numbers and characters:"); scanf("%s",buff);  r=pipe(d1); if(r==-1) { printf("shi bai\n"); exit(1); } r=pipe(d2); if(r==-1) { printf("shi bai\n"); exit(1); } r=pipe(d3); if(r==-1) { printf("shi bai\n"); exit(1); } r=fork(); if(r) { close(d1[1]); read(d1[0],buff,sizeof(buff)); j=fork(); if(j) { close(d2[1]); read(d2[0],buff,sizeof(buff)); printf("Pipe2: %s\n",buff); close(d2[0]); } else { close(d2[0]); write(d2[1],buff,strlen(buff)); printf("P2 finishes writing to pipe2.\n"); close(d2[1]); exit(0); } k=fork(); if(k) { close(d3[1]); read(d3[0],buff,sizeof(buff)); str[0]=strtok(buff,delim); for(i=1;i<3;i++) str[i]=strtok(NULL,delim); if(strcmp("+",str[0])==0) {         answer=atoi(str[1])+atoi(str[2]); } else if(strcmp("-",str[0])==0) {         answer=atoi(str[1])-atoi(str[2]); } else if(strcmp("*",str[0])==0) {         answer=atoi(str[1])*atoi(str[2]); } else if(strcmp("/",str[0])==0) {         answer=atoi(str[1])/atoi(str[2]); } printf("Pipe3: %d\n",answer); close(d3[0]); exit(0); } else { close(d3[0]); write(d3[1],buff,strlen(buff)); printf("P3 finishes writing to pipe3.\n"); close(d3[1]); exit(0); } } else { close(d1[0]); write(d1[1],buff,strlen(buff)); close(d1[1]); exit(0); } }
user-0 提问: 请问Win下怎么读取/修改其他进程中的内存数据？

回复:
user: user-1
content: ReadProcessMemory： https://msdn.microsoft.com/en-us/library/ms680553(VS.85).aspx  WriteProcessMemory： https://msdn.microsoft.com/en-us/library/ms681674.aspx
user-0 提问: 怎样将写好的一段matlab程序转换成C语言

回复:
user: user-1
content: 可以参考http://www.mathworks.com/products/featured/embeddedmatlab/， 但并不是所有代码都可以转。 另外可以考虑把matlab的脚本编译成可执行文件，然后在c++里调用。

user: user-2
content: 参看：《matlab与c/c++混合编程》第4版
user-0 提问: 新人求解malloc函数问题

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

user: user-2
content: #include <stdio.h> #include <stdlib.h>  int main(void) {     char **ch;     char * vl;     int n;     int i;      puts("how many words you want to enter:");     scanf("%d", &n);     getchar();      ch = (char **)malloc(n * sizeof(char *)); /* apply n pointers. */     if (ch == NULL)     {             puts("failed.bye");             exit(EXIT_FAILURE);         }     printf("you want to enter %d words\n", n);     for(i = 0; i < n; i++)     {             vl = (char *)malloc(10 * sizeof(char));             if ( vl == NULL)             {                         puts("failed.bye");                         exit(EXIT_FAILURE);                     }             fgets(vl, 10, stdin);             ch[i] = vl ;             //free(vl);    /* Free  a litter early, please free it below.*/         }     for( i = 0; i < n; i++) {         printf("%s", ch[i]);         free(ch[i]);  /* Free at here after you using it.*/     }     free(ch);     return 0; }  可以去查一下指针数组； 先申请n个指针空间(一个指针长度是固定的,跟处理器的位数有关,比如32位即为4个字节),然后在对n个指针申请空间,将每个指针指向有效内存(堆上)；然后将数据存放到这些内存里,最后输出(使用)指针指向的内容,最后将这些指针释放,再把指针数组释放；注意释放的先后是不能改变的.

user: user-3
content: 楼上的两位朋友回复很详细了，就不再赘述了，笑

user: user-0
content: ch[i] = vl 不是把指针*vl指向的数组vl 的首地址 赋给ch[i] 这个指针吗

user: user-4
content: ch[i] = vl ;  ch[i] 是 char类型，即一个字符，而vl是一个char*指针，你这样赋值是错的
user-0 提问: 关于寄存器保存值的问题

回复:
user: user-1
content: 指令寄存器（IR）指令寄存器用来保存当前正在执行的一条指令。指令划分为操作码和地址码字段，它们由二进制数字组成。为执行任何给定的指令，必须对操作码进行译码，以便指出所要求的操作。指令寄存器中操作码字段的输出就是指令译码器的输入。操作码一经译码后，即可向操作控制器发生具体操作的特定信号。

user: user-2
content: 是汇编代码转换成的机器码指令
user-0 提问: 求大神找找这个程序错误的原因

回复:
user: user-1
content: 最后一个for循环的循环条件改成 i < 4

user: user-2
content: 先略去你的二级指针这部分，我就试了下 这样输出也会有问题额~，调试了下发现a[i] != NULL这个校验循环停止的条件根本就没有用，然后我试了下改成 这样就好了，QAQ

user: user-3
content: VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-0
content: 懂了懂了懂了

user: user-0
content: 那为啥我将那个二维数组改为指针数组，就可以运行，而不改的时候要用*myp1!=NULL判断

user: user-4
content: myp1[i]是一个指针，不能作为判断条件，要么像我给你的这样，在后面再加个[0]，要么对myp1[i]进行解引。

user: user-5
content: 手速慢了一下，2楼的兄弟就赶上了我。

user: user-5
content: 要像这样子： for (int i = 0; *myp1[i] != NULL; i++) 	{ 		printf("%s", myp1[i]); 	}

user: user-6
content: 第二个循环改成这样就可以了。 for(int i=0; *myp1[i]!=NULL; i++){   printf("%s", myp1[i]); }

user: user-4
content: #include <cstdio> #include <cstdlib>  int main () { 	char a[4][10]={"Fllow me","wore","less"}; 	char **myp1; 	myp1=(char **)malloc(4*sizeof(char *)); 	 	for(int i=0;i<4;i++) 		myp1[i]=a[i]; 	for(int i=0;myp1[i][0];i++) 		printf("%s\n",myp1[i]); 	return 0; }
user-0 提问: 手机敲代码

回复:
user: user-1
content: 没电脑的时候你可以想想，等有电脑的时候实现一下，轻易不要在手机上尝试，因为我以前也这样试过，真的没什么效率，并且处理器也是不同的，由于字长等原因，可能会得出不同的结果，到时候会把你搞蒙的

user: user-2
content: 引用 7 楼 chenwenjing520 的回复:[quote=引用 2 楼 qq_36409192的回复:]敲代码用什么手机，效率又低又不好用。 只是在没电脑的时候也拿出来琢磨琢磨[/quote] 那你还不如直接看代码。。没必要用手机。。

user: user-3
content: 引用 11 楼 u014444402 的回复:拿双筷子喝汤效率能高? 但有人钻研这个。

user: user-4
content: 引用 17 楼 u010165006 的回复:[quote=引用 16 楼 hongwenjun 的回复:] [quote=引用 6 楼 u010165006 的回复:] 手机敲代码得多慢，某宝买个12寸的二手笔记本五、六百块钱，放在书包里也很方便。 淘宝找一根  OTG线 ,5.9包邮   USB键盘 ，到垃圾堆里找一个来  SSH 连到 linux 主机上学习吧[/quote]  这种供电够吗？[/quote] 刚测试过， USB 鼠标 键盘 和  无线鼠标都完美支持

user: user-5
content: 拿双筷子喝汤效率能高?

user: user-6
content: 有。叫c4啥来着。可以编c/c++。亲测可用。

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

user: user-0
content: 引用 13 楼 qq_36409192的回复:[quote=引用 7 楼 chenwenjing520 的回复:] [quote=引用 2 楼 qq_36409192的回复:]敲代码用什么手机，效率又低又不好用。 只是在没电脑的时候也拿出来琢磨琢磨[/quote] 那你还不如直接看代码。。没必要用手机。。[/quote] 谢谢大家的指导，也感谢大家的关心

user: user-7
content: 引用 16 楼 hongwenjun 的回复:[quote=引用 6 楼 u010165006 的回复:] 手机敲代码得多慢，某宝买个12寸的二手笔记本五、六百块钱，放在书包里也很方便。 淘宝找一根  OTG线 ,5.9包邮   USB键盘 ，到垃圾堆里找一个来  SSH 连到 linux 主机上学习吧[/quote]  这种供电够吗？

user: user-4
content: 引用 6 楼 u010165006 的回复:手机敲代码得多慢，某宝买个12寸的二手笔记本五、六百块钱，放在书包里也很方便。 淘宝找一根  OTG线 ,5.9包邮   USB键盘 ，到垃圾堆里找一个来  SSH 连到 linux 主机上学习吧

user: user-4
content: 还有就是 找个 USB接口的键盘，一条ATOG线，使用键盘就可以在手机输入文字了

user: user-4
content: 手机装个 APP ConnectBot SSH 连到 linux 主机上，  VIM 打开学习的源码，按 F5 运行 源代码 可以从  github.com  下载  git  clone 想玩的可以密我

user: user-8
content: 我以前也有题主类似的想法，后来用了手机，发现写代码真的很不方便，后来放弃了。建议题主不要想着用手机了

user: user-9
content: 最后手机安装上后就再也没用过了。

user: user-0
content: 引用 2 楼 qq_36409192的回复:敲代码用什么手机，效率又低又不好用。 只是在没电脑的时候也拿出来琢磨琢磨

user: user-7
content: 手机敲代码得多慢，某宝买个12寸的二手笔记本五、六百块钱，放在书包里也很方便。

user: user-10
content: 可以用CppDroid  不过想好好学用电脑吧

user: user-11
content: 编程还是用电脑有感觉

user: user-12
content: 手机上还不如看点别的更好

user: user-2
content: 敲代码用什么手机，效率又低又不好用。
user-0 提问: 请问C语言头文件加了#pramga once后, 对应的实现文件还需要加吗？

回复:
user: user-1
content: 头文件加不加#pramga once和对应的实现文件有什么关系吗？ #pramga once只是为了保证头文件只被编译一次，你的实现文件还是得添加到工程中的

user: user-2
content: 首先要明白 #pramga once 的功能，是为了防止一个头文件被一个源文件包含多次。  所以，只要是 include 包含的文件，都需要使用  #pramga once。

user: user-3
content: 不需要

user: user-4
content: 不需要了

user: user-5
content: 不需要，你都不会去“包含”实现文件，又怎么会出现重复呢
user-0 提问: 编写程序，实现对索引顺序表的查找。（即分块查找）

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

user: user-0
content: 到后面的那个请输入要查找的元素那里，我一输入数据就不可以了，而且那个每个模块的那个最大数不是自己出来的，怎么改？

user: user-2
content: scanf("%d",key);  改成：  scanf("%d",&key);  同理其他的scanf
user-0 提问: 【请教】VC中输入的数字变成“*”怎么无法判断

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

user: user-2
content: 你把gets(password);换成password[j]='\0';就OK了

user: user-3
content: int main() { 	int j,k; 	char password[7];  	while(1) 	{ 		k = 1; 		printf("       ---------------      请输入密码      ---------------\n"); 		for(j = 0; j < 6 ; j++) 		{ 			password[j] = getch(); 			if(password[j] == 'r') 				break; 			printf("*"); 		} 		password[j] = '\0';  		if(strcmp(password,"123")!= 0) 		{ 			//............. 		} 	} }  输入：  123r   比较结果相等
user-0 提问: 关于函数的递归调用的问题

回复:
user: user-0
content: @user-3

user: user-0
content: 修改后变成无限循环。

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

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

user: user-3
content: 引用 4 楼 xxpfei 的回复:修改后变成无限循环。  如果你的字符串不是以\0结尾的，你不能用strcmp去比较

user: user-3
content: if(strcmp(temp[7],po[7])!=0)  改成  if(strcmp(temp,po)!=0)  同理其他地方

user: user-3
content: pasw(pointer_pw,po[7]);  改成：  pasw(pointer_pw,po);
user-0 提问: 扑克牌

回复:
user: user-1
content: struct PokerCard { 	uint8_t color;  // 1黑桃 2红桃 3梅花 4方块  大小王0 	uint8_t num;    // 1-13 为 A,2,3,4,5,6,7,8,9,10,J,Q,K；小王53 大王54 };  void Reset(PokerCard in[], PokerCard out[]) { 	for (int i = 0 ; i < 54; i++) 	{ 		if (in[i].color == 0) 		{ 			assert(in[i].num == 53 || in[i].num == 54); 			out[in[i].num - 1] = in[i]; 		} 		else 		{ 			assert(in[i].color >= 1 && in[i].color <= 4 && in[i].num >= 1 && in[i].num <= 13); 			int index = ((in[i].color - 1) * 13 + in[i].num) - 1; 			out[index] = in[i]; 		} 	} }   大致思路便是这样

user: user-2
content: 用一个数组cards[54]，按顺序存储1~54张牌，另一个数组shuffle[54]，存储每次洗牌以后随机顺序的一副牌。 要恢复出厂，输出cards[54]。  仅供参考： C++ Builder写的《ZEC 纸牌游戏21点》 http://blog.163.com/tab_98/blog/static/119240972016115113039304/  图形用户界面可以学习C++ Builder，架构先进，入门比较容易。  仅供参考： 初学者学习C++ Builder第一个程序（模拟聊天室），经典！ http://blog.163.com/tab_98/blog/static/11924097201693033057497/ C++ Builder绘图示例（模拟时钟） http://blog.163.com/tab_98/blog/static/11924097201611324819376/ 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/  C++ Builder写的《ZEC 僵尸版打地鼠》 http://blog.163.com/tab_98/blog/static/11924097201601084117748/   书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社） 《C++Builder6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。
user-0 提问: 一道c语言选择题~~~

回复:
user: user-1
content: 是选c，因为*p没有定义，还有D答案while里面判断的就\0当while里面为\0跳出while

user: user-2
content: 选功能不相等的，c和d都有点问题，不过b选项好像有一个打印错误，这两来看只有A选项是正常的，那木b，c，d都有些问题，但是如果p1是初始化过的，就不需要考虑结尾的'\0',所以还是把题目补充完整我们再选

user: user-3
content: 最后必须补上'\0',楼主不是已经知道原因了吗

user: user-4
content: LZ你的命题是不是有错误?p1, p2,怎么会出现p呢

user: user-5
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-6
content: 你都说了D没\0，所以选D  不过C选项后面应该是*p1='\0'  而不是*p='\0' （应该是打印问题）

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

user: user-0
content: 说反了是选C，D没有'\0'
user-0 提问: 从网上下了一个基于散列通讯录的数据结构课程设计   用C语言的  求大神给解释一下

回复:
user: user-1
content: VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

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

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

user: user-2
content: 程序出错，如果编译器没报错，有两种解决方法，一种是单步调试，一种是在每一段语句之后加输出语句，输出相关值，看该值是否与你想要的值一样，如果不一样就说明该段语句有问题，否则继续往下，直到找出出问题的位置。

user: user-3
content: int flag1 = 0, flag2, mode;    c  后面多了一个c   while (betmoney>money)  这里money没有定义
user-0 提问: 请问VS2015自己定义的C语言头文件，声明和实现分别应该放在哪个路径？假设VS2015装在C盘

回复:
user: user-0
content: 引用 8 楼 user-1 的回复:[quote=引用 7 楼 yyxgs 的回复:] [quote=引用 6 楼 user-1 的回复:] [quote=引用 5 楼 yyxgs 的回复:] [quote=引用 4 楼 user-1 的回复:] [quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 user-1 的回复:] 放在你Project所在路径，而不是VS安装路径  我是想像stdio,stdarg这些头文件这样，可以重复使用的[/quote]  那你自己找一个地方，然后在项目属性中包含目录里添加你的这个路径[/quote]  哦哦，能不能请问这个两个文件的代码该怎么写，我在头文件里写了输出hello world的函数声明，然后在实现文件里包含了这个头文件，然后实现了这个函数，为什么VS2015提示外部命令解析错误呢？[/quote]  将CPP文件添加到你的Project[/quote]       添加了，编译的时候通过，但是执行就报错，是我代码写错了吗？[/quote]  将cpp文件添加到Project，不是只放到目录下，项目上右键——添加——现有项[/quote]   好了，感谢！

user: user-1
content: 引用 7 楼 yyxgs 的回复:[quote=引用 6 楼 user-1 的回复:] [quote=引用 5 楼 yyxgs 的回复:] [quote=引用 4 楼 user-1 的回复:] [quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 user-1 的回复:] 放在你Project所在路径，而不是VS安装路径  我是想像stdio,stdarg这些头文件这样，可以重复使用的[/quote]  那你自己找一个地方，然后在项目属性中包含目录里添加你的这个路径[/quote]  哦哦，能不能请问这个两个文件的代码该怎么写，我在头文件里写了输出hello world的函数声明，然后在实现文件里包含了这个头文件，然后实现了这个函数，为什么VS2015提示外部命令解析错误呢？[/quote]  将CPP文件添加到你的Project[/quote]       添加了，编译的时候通过，但是执行就报错，是我代码写错了吗？[/quote]  将cpp文件添加到Project，不是只放到目录下，项目上右键——添加——现有项

user: user-1
content: 放在你Project所在路径，而不是VS安装路径

user: user-0
content: 引用 6 楼 user-1 的回复:[quote=引用 5 楼 yyxgs 的回复:] [quote=引用 4 楼 user-1 的回复:] [quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 user-1 的回复:] 放在你Project所在路径，而不是VS安装路径  我是想像stdio,stdarg这些头文件这样，可以重复使用的[/quote]  那你自己找一个地方，然后在项目属性中包含目录里添加你的这个路径[/quote]  哦哦，能不能请问这个两个文件的代码该怎么写，我在头文件里写了输出hello world的函数声明，然后在实现文件里包含了这个头文件，然后实现了这个函数，为什么VS2015提示外部命令解析错误呢？[/quote]  将CPP文件添加到你的Project[/quote]       添加了，编译的时候通过，但是执行就报错，是我代码写错了吗？

user: user-1
content: 引用 5 楼 yyxgs 的回复:[quote=引用 4 楼 user-1 的回复:] [quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 user-1 的回复:] 放在你Project所在路径，而不是VS安装路径  我是想像stdio,stdarg这些头文件这样，可以重复使用的[/quote]  那你自己找一个地方，然后在项目属性中包含目录里添加你的这个路径[/quote]  哦哦，能不能请问这个两个文件的代码该怎么写，我在头文件里写了输出hello world的函数声明，然后在实现文件里包含了这个头文件，然后实现了这个函数，为什么VS2015提示外部命令解析错误呢？[/quote]  将CPP文件添加到你的Project

user: user-0
content: 引用 4 楼 user-1 的回复:[quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 user-1 的回复:] 放在你Project所在路径，而不是VS安装路径  我是想像stdio,stdarg这些头文件这样，可以重复使用的[/quote]  那你自己找一个地方，然后在项目属性中包含目录里添加你的这个路径[/quote]  哦哦，能不能请问这个两个文件的代码该怎么写，我在头文件里写了输出hello world的函数声明，然后在实现文件里包含了这个头文件，然后实现了这个函数，为什么VS2015提示外部命令解析错误呢？

user: user-1
content: 引用 2 楼 yyxgs 的回复:[quote=引用 1 楼 user-1 的回复:] 放在你Project所在路径，而不是VS安装路径  我是想像stdio,stdarg这些头文件这样，可以重复使用的[/quote]  那你自己找一个地方，然后在项目属性中包含目录里添加你的这个路径

user: user-0
content: 防尘补丁安装中。。。。

user: user-0
content: 引用 1 楼 user-1 的回复:放在你Project所在路径，而不是VS安装路径  我是想像stdio,stdarg这些头文件这样，可以重复使用的
user-0 提问: vs2015关于fwrite的问题求帮助

回复:
user: user-0
content: 引用 1楼user-1 的回复:你这是二进制的文件，用文本工具看当然可能有乱码我就想不通为什么字符串数组那两个没事   两个int就炸了   我把两个int改成char还是炸

user: user-1
content: 你这是二进制的文件，用文本工具看当然可能有乱码

user: user-1
content: 引用 2 楼 w_1005ei 的回复:引用 1楼user-1 的回复:你这是二进制的文件，用文本工具看当然可能有乱码我就想不通为什么字符串数组那两个没事   两个int就炸了   我把两个int改成char还是炸  用"wt"方式打开文件
user-0 提问: 为什么两次找出的单词不一样？

回复:
user: user-0
content: 找到了，刚刚看了很久就是找不出来，蒙了

user: user-1
content: for(i=0;i<k;i++) c1[i]=s[max_start+i];  i<max!!!! 自己调试程序是一个程序员的基本素养。

user: user-2
content: printf("%c\n%c\n",s[max_start],s[max_start+max-1]); 	for (i=0; i<max; i++)  k改成max

user: user-3
content: for(i=0;i<k;i++) c1[i]=s[max_start+i]; printf("%s\n",c1); }   k这个变量，是为了查找会改变的，为什么打印结果要用这个？难道不是max?
user-0 提问: c语言

回复:
user: user-1
content: ++k表示计算但不显示结果而k++是计算显示结果

user: user-2
content: 先取值，打印，最后再加1

user: user-3
content: 为什么要是6？！！

user: user-4
content: 1.注意运算符优先级http://www.jb51.net/article/37282.htm 2.注意前++和后++的区别 PS：尽量写可读性好的代码，而不是这样的代码

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

user: user-6
content: 怎么我看不到我的图！

user: user-7
content: 自增自减问题，注意++.--的位置，如果是在前面，则表示在执行该语句之前已经进行了自增自减，如果是在后面，则表示在执行该语句之后再进行自增自减。所以你这里的值只有在输出完c+1的值以后才会进行自增。

user: user-8
content: #include <stdio.h> void main() { int c[ ]={2,4,6,8};  int*k=c+1;//  这里相当于 k存放4的地址。 printf("%d\n",*k++); //与运算符的优先级有关， 先运行(*k),而（*k）==4, 然后k++,k存放6的地址。   } // 你可能没有弄清楚 k++；与++k;的区别。

user: user-9
content: k++ 是输出k之后k才加1  如果要输出6，改成++k

user: user-10
content: printf("%d\n", *k++); 等同于: printf("%d\n", *k);  //输出*k k++;                      //指向下一单元

user: user-11
content: 后++, 先取值，再移动指针
user-0 提问: c语言

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

user: user-2
content: 程序出错，如果编译器没报错，有两种解决方法，一种是单步调试，一种是在每一段语句之后加输出语句，输出相关值，看该值是否与你想要的值一样，如果不一样就说明该段语句有问题，否则继续往下，直到找出出问题的位置。

user: user-3
content: #include <stdio.h> void main() { 	int i;  	float max, min, ave, a[6], sum = 0; 	printf("请输入6位同学的成绩\n"); 	/*for (i = 0; i < 6; i++) 	{ 		scanf_s("%f", &a[i]); 	}*/ 	for (i = 0; i<6; i++) 	{ 		scanf_s("%f", &a[i]); 		sum = sum + a[i]; 	} 	ave = sum / 6; 	max = min = a[0]; 	for (i = 0; i<6; i++) 	{ 		if (max<a[i]) 			max = a[i]; 	} 	for (i = 0; i<6; i++) 	{ 		if (min>a[i]) 			min = a[i]; 	} 	printf("平均值为%f", ave); 	printf("最高值为%f", max); 	printf("最小值为%f", min); }

user: user-4
content: #include <stdio.h> void main() { int i; float max,min,ave,a[6],sum=0; printf("请输入6位同学的成绩\n"); scanf("%f",&a[i]);//需要循环输入。 /*  改为这样：  for (i=0;i<6;i++)   scanf("%f",&a[i]); */ for (i=0;i<6;i++) {sum=sum+a[i];} ave=sum/6; max=min=a[0]; for(i=0;i<6;i++) {if(max<a[i]) max=a[i];} for(i=0;i<6;i++) {if(min>a[i]) min=a[i];} printf("平均值为%f",ave); printf("最高值为%f",max); printf("最小值为%f",min); }

user: user-5
content: scanf("%f",&a[i]);， 你的 i 都没初始化就使用了  你应该放到循环里接收输入

user: user-6
content: printf("请输入6位同学的成绩\n"); scanf("%f",&a[i]);  这儿只读入了一个数据吧，应该加个循环 for(i=0;i<6;i++) scanf("%f",&a[i]);
user-0 提问: C语言考试编程题求助

回复:
user: user-1
content: 另外，for(p=c;*p!='\0';p++)，你的数组c都没初始化，*p!='\0'是一个未定义行为

user: user-1
content: scanf("%c",*p);  改成；  scanf("%c",p);  scanf("%c",m);  改成  scanf("%c",&m);
user-0 提问: 编程小白问题

回复:
user: user-0
content: 谢谢谢谢~~~~

user: user-1
content: c是一个字符数组，c[0]、c[1]、...、c[8]都用于存放某个字符，访问c[9]已造成数组越界， 给字符数组赋值可以通过下面的方式： strcpy(c, "computer");  // 需要头文件#include <string.h>
user-0 提问: C语言错误怎么解决

回复:
user: user-1
content: char  name[20];改成char  *name;也可以

user: user-2
content: 程序出错，如果编译器没报错，有两种解决方法，一种是单步调试，一种是在每一段语句之后加输出语句，输出相关值，看该值是否与你想要的值一样，如果不一样就说明该段语句有问题，否则继续往下，直到找出出问题的位置。

user: user-3
content: b.name="李四"   改成：  strcpy(b.name, "李四");   注意数组与指针的区别

user: user-4
content: strcpy(b.name, "李四");
user-0 提问: 在for循环里的if语句，不进入if语句，希望大神帮帮忙，谢谢；

回复:
user: user-1
content: 进不去要么就是你输入的n,m本来就不满足进入if的条件。 或者就是你调试的方法有问题。单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: break 跳出循环!

user: user-3
content: 这里有4个条件：2个for 2个if 输入的数据不合法就不进入了，譬如n=1 或n > m 就是不进入啊。  这是个数学问题，与代码本身无关。要不就是算法写错啦。  你得告诉别人你想实现什么样的算法，别人才能帮到你。

user: user-4
content: 你都没有定义i这个变量·
user-0 提问: c语言,数据结构,出错

回复:
user: user-1
content: 引用 3 楼 qq_28482411 的回复:我的意思是为什么这句话会编译出错 a.name = "hello word!"; 还有使用gets(book.name)的时候输入的个数明显大于定义的数组长度,但为什么没有将相邻的存储区域覆盖了  上面已经说了，没有对数组进行这样赋值的语法，所以是错的  至于长度超过数组大小只是看似正确而已，你可能已经把其他不属于你的数据覆盖掉了

user: user-0
content: 已经注意到了,但为什么

user: user-0
content: 我的意思是为什么这句话会编译出错 a.name = "hello word!"; 还有使用gets(book.name)的时候输入的个数明显大于定义的数组长度,但为什么没有将相邻的存储区域覆盖了

user: user-1
content: book.name 不是指针，而是数组，所以不能book.name = "hello word!";  其次book不是对象，而是类名，你不能拿类名来调用成员函数  需要strcpy(xxx.name,"hello word!" );  （xxx是book类型的对象）

user: user-2
content: book.name = "hello word!";应该用strcpy http://blog.csdn.net/rookie_wei/article/details/38361943

user: user-0
content: 谢谢.理解了,首先a.name = "hello word!";这样的用法只能在初始化的时候使用,总是忘了这一点. 其次.我说的那个gets(a.name);如果写入的字符个数过大,确实可以覆盖了a.age的存储区域. book总共占16位 name占10位 age占4位 间隔2位 当name使用字符过大时,将覆盖age内存,改变age的值. 因为存的时候使用字符的方式存的,所以要注意字符对应的数值是多少. 感谢各位的解答.
user-0 提问: 萌新求助啊，找了半天不知道错在哪

回复:
user: user-0
content: 引用 3 楼 user-1 的回复:scanf("%s,%f",&p1->name,&p1->score); 这个p1->name本身就是指针 并不需要&  哈哈这个好像是对的   我总算能把链表创建了  但是后面的分数的p1前的&我还是留着了好像要用的。 但是我在用一个scnaf命令输入的时候不知道怎么终止字符串，逗号和后面的分数都算在前面的name里面了。只能拆开，不过算是弄出来了可以输出。 明天接着做后面的插入删除一类的    #include<stdio.h> #include<stdlib.h> #include<string.h> #define LEN sizeof(struct Student)  struct Student {   char * name;   float score;   struct Student*next; };  int n;  struct Student *creat(void) {         struct Student *head; 	   struct Student *p1,*p2; 	   n=0; 	   p1=p2=(struct Student *)malloc(LEN); 	   p1->name=(char *)malloc(sizeof(char)); 	   printf("enter name:  "); 	   scanf("%s",p1->name); 	   printf("enter score: "); 	   scanf("%f",&p1->score); 	   head=NULL; 	   while(p1->score!=-1) 	   { 	       n=n+1; 		   if(n==1)head=p1; 		   else p2->next=p1; 		   p2=p1; 		   p1=(struct Student *)malloc(LEN);            p1->name=(char *)malloc(sizeof(char));            printf("enter name:  "); 	       scanf("%s",p1->name); 	       printf("enter score: "); 	       scanf("%f",&p1->score); 	   } 	   p2->next=NULL; 	   return(head); }  void printList(struct Student* head) {     if (NULL==head) 		printf("链表为空"); 	else{ 	    while(head!=NULL) 		{ 			printf("name:%s score:%5.1f \n",head->name,head->score); 			head=head->next; 		} 	} 	printf("\n"); }  int main(void) {     struct Student*pt; 	pt=creat(); 	printList(pt); }  谢谢各位大佬

user: user-1
content: scanf("%s,%f",&p1->name,&p1->score); 这个p1->name本身就是指针 并不需要&

user: user-0
content: 引用 1 楼 user-1 的回复:p1->name=(char *)malloc(sizeof(char)); 这个开大点  是说空间开大点吗  但我输入的都是什么jack，88.5   lucy，60.2一类的 调试的时候好像都没有值。

user: user-1
content: p1->name=(char *)malloc(sizeof(char)); 这个开大点
user-0 提问: C语言返回一个数组时，输入数组初始化方式对程序正确性的影响

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

user: user-2
content: 两个程序最后输出的不都是5 1 吗

user: user-2
content: for (i=0;i<n;i++)         if (arr[i]>maxNum)             {maxNum=arr[i];maxIndex=i+1;}  第一次循环 5 > 0满足，maxNum变为5;maxIndex变为1 第二次循环 2 > 5 不满足  所以之后两个元素是5 1

user: user-0
content: 引用 2 楼 user-2 的回复:两个程序最后输出的不都是5 1 吗 我摸索出来了。c语言变量必须在使用函数前声明。因此，c语言不支持 int *b=setValue(a,2); 必须分开。 改为 int *b; b=setValue(a,2); 才能编译成功。再次感谢版主的回答。

user: user-0
content: 引用 2 楼 user-2 的回复:两个程序最后输出的不都是5 1 吗谢谢版主的热心回答，我的vs运行后者出错，不知道怎么回事；我用一个在线 c编译器却运行成功。或者把后缀改为 cpp 就能编译成功。貌似程序里出现了只有c++采用的语法。
user-0 提问: 关于把一个文件复制到另外一个文件夹下

回复:
user: user-1
content: 使用 CopyFile() 能满足你的需求吗？

user: user-0
content: 引用 5 楼 shihengzhen101 的回复:直接调用系统命令copy也是可以的，使用system函数配合copy命令，可以实现直接拷贝文件  谢谢，已经写好了。获取到第一个文件的最后一个文件名称，拼接到第二个路径的后面就好了。

user: user-0
content: 引用 4 楼 l357630798 的回复:使用 CopyFile() 能满足你的需求吗？ 谢谢，不过已经解决了。是linux下的C

user: user-2
content: 引用 2 楼 zw1103053925 的回复:[quote=引用 1 楼 paschen 的回复:] 从字符串未尾倒着遍历字符串，直到找到'/'或者到达开头，然后后面的就是文件名  谢谢版主，找到了是strrchr函数。请问把一个带路径或者不带路径的文件复制到另外一个文件夹还有更好的思路吗？[/quote]  直接使用操作系统的API函数

user: user-3
content: 直接调用系统命令copy也是可以的，使用system函数配合copy命令，可以实现直接拷贝文件

user: user-0
content: 引用 1 楼 paschen 的回复:从字符串未尾倒着遍历字符串，直到找到'/'或者到达开头，然后后面的就是文件名  谢谢版主，找到了是strrchr函数。请问把一个带路径或者不带路径的文件复制到另外一个文件夹还有更好的思路吗？

user: user-2
content: 从字符串未尾倒着遍历字符串，直到找到'/'或者到达开头，然后后面的就是文件名
user-0 提问: socket编程UDP广播程序会收到自己的广播包

回复:
user: user-1
content: udp发送和接收都是同一个端口 理论上应该是可以收到自己发送的udp信息的

user: user-0
content: 引用 3 楼 user-2 的回复:[quote=引用 2 楼 ally_yu 的回复:] [quote=引用 1 楼 user-2 的回复:] 这有什么问题？收到自己的广播，不处理直接扔掉就好了！ 所以这是正常的是吗？我觉得是因为我广播的端口和监听的端口是同一个，所以会收到广播包，对吗？[/quote] 我认为是这样的。[/quote] 谢谢你了！

user: user-0
content: 引用 1 楼 user-2 的回复:这有什么问题？收到自己的广播，不处理直接扔掉就好了！ 所以这是正常的是吗？我觉得是因为我广播的端口和监听的端口是同一个，所以会收到广播包，对吗？

user: user-2
content: 这有什么问题？收到自己的广播，不处理直接扔掉就好了！

user: user-2
content: 引用 2 楼 ally_yu 的回复:[quote=引用 1 楼 user-2 的回复:] 这有什么问题？收到自己的广播，不处理直接扔掉就好了！ 所以这是正常的是吗？我觉得是因为我广播的端口和监听的端口是同一个，所以会收到广播包，对吗？[/quote] 我认为是这样的。
user-0 提问: 二叉树

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:creatree函数中：  if(c='#')  改成：  if(c=='#') 谢谢，解决了。手误手误

user: user-1
content: creatree函数中：  if(c='#')  改成：  if(c=='#')
user-0 提问: 能帮我看看这个文件流吗

回复:
user: user-1
content: w      Truncate file to zero length or create text file for writing.  The stream is positioned at the beginning of the file.  w+     Open for reading and writing.  The file is created if it does not exist, otherwise it is truncated.  The stream is positioned at the beginning of the file. 你的然后后面的东西看不到! w和w+方式打开文件,都会将文件的长度截断为0,若文件已存在时；所以,如果该文件已存在,若只想读文件里的内容,建议使用"r"方式打开,如果是是读写,可以使用"r+"方式打开；

user: user-2
content: fp = fopen ( " DUMMY.FIL"," w " );  //这里是新建个文件写的，后面又从文件里读了冲突 // 如果打开读写。应该 改成 w+ 就可以了
user-0 提问: 我的符号三角形暴力搜索不知道哪里出错了，有大神帮忙看看哪错了吗？

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

user: user-2
content: for(i=0;i<n;i++) 	p[i]=new int[n];  这个循环执行完时，i 的值已经变成了n  下面的p[0][i]=temp%2;已经越界了
user-0 提问: 跪求大神解决问题

回复:
user: user-1
content: 右键 打开 stdbool.h 文件，就可以查到 相关的 boo 值定义  和自己使用下面三行代码其实差不多的意思 typedef int bool;   #define false 0   #define true  1

user: user-1
content: 从C99标准开始，类型名字为“_Bool”，如果你的编译器支持C99，就可以直接使用布尔类型。另外，C99为了让C和C++兼容，增加了一个头文件stdbool.h。里面定义了bool、true、false，让我们可以像C++一样的定义布尔类型。        _Bool类型不需要引用其他库函数，直接就可以使用，       bool类型，则需要 #include <stdbool.h>，使用如上文

user: user-1
content: 改扩展名为 cpp 使用 g++ 编译就好  C 语言  以前没有 bool ，不知道现在新标准是否支持了

user: user-2
content: 因为gcc暂时不支持bool，所以用不了  把bool 改成 int  false改成0  true改成1
user-0 提问: 递归次数的统计

回复:
user: user-1
content: i  很明显就是一个全局变量啊. 这个程序就是用 全局变量i来统计递归的次数.  多个return并不是返回多个值, 而是在不同的条件下, 这个函数会返回不同的值.  实际上你这个程序中的 那句  return i;  是永远不会执行的.

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

user: user-3
content: 两个return不是返回两个值，而是在不同情况下返回不同的值

user: user-0
content: 我不太会结贴。。。新手

user: user-0
content: 引用 6 楼 小灸舞的回复:VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 厉害了，新生，对编译器还不熟。。。我用的是devc++

user: user-4
content: VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。
user-0 提问: C语言求解

回复:
user: user-1
content: for(k=0; k<strlen(s)-3; k++)

user: user-2
content: 无法通过的字符串有吗

user: user-3
content: 引用 2 楼 qq_36973349的回复:但是参考答案也是输一个字符串就判断有没有，下面是正确的代码 #include <stdio.h>   02.#include <stdlib.h>   03.#include <string.h>   04.#define N 100   05.int main()   06.{   07.    int T;   08.    char s[N+5];   09.    scanf("%d",&T);   10.    while (T--)   11.    {   12.        int k,m=0;   13.        scanf("%s",s);   14.        int len=strlen(s);   15.        for(k=0; k<len-2; k++)   16.        {   17.            if(s[k]=='G'&&s[k+1]=='L'&&s[k+2]=='B')   18.            {   19.                m=1;   20.                break;   21.            }   22.        }   23.        if(m)   24.            printf("YES\n");   25.        else   26.            printf("NO\n");   27.    }   28.    return 0;   29.} 没必要纠结这些东西。。有些题目的答案还是错的呢！自己把东西弄懂就可以了。。

user: user-4
content: 会写了以后，用strstr函数比较简单。

user: user-0
content: 但是参考答案也是输一个字符串就判断有没有，下面是正确的代码 #include <stdio.h>   02.#include <stdlib.h>   03.#include <string.h>   04.#define N 100   05.int main()   06.{   07.    int T;   08.    char s[N+5];   09.    scanf("%d",&T);   10.    while (T--)   11.    {   12.        int k,m=0;   13.        scanf("%s",s);   14.        int len=strlen(s);   15.        for(k=0; k<len-2; k++)   16.        {   17.            if(s[k]=='G'&&s[k+1]=='L'&&s[k+2]=='B')   18.            {   19.                m=1;   20.                break;   21.            }   22.        }   23.        if(m)   24.            printf("YES\n");   25.        else   26.            printf("NO\n");   27.    }   28.    return 0;   29.}

user: user-3
content: 测试不能通过的原因估计是你没审题，我估计题目的意思是让你先输入一个T，然后底下跟T组字符串，最后再输出结果。（代码没问题）
user-0 提问: C语言程序container_of问题

回复:
user: user-1
content: 前面二位已经回答了，应该追加  #include <linux/kernel.h >  试试看结果

user: user-2
content: http://blog.csdn.net/npy_lp/article/details/7010752

user: user-3
content: http://blog.csdn.net/cuijianzhongswust/article/details/8249352
user-0 提问: 【小白求助】vs2015输出字符的时候显示问号

回复:
user: user-1
content: scanf_s 在%c %s格式式，还要加上大小，你要写成：  scanf_s("%c", &a, 1);   或者  scanf("%c", &a);   或者  a = getchar();

user: user-2
content: scanf_s输入%c或者%s时，必须多传入一个参数用来指定输入的字符串的大小，否则会出错。 https://msdn.microsoft.com/en-us/library/w40768et.aspx?query=

user: user-3
content: 用_s版，你还得加上变量大小 scanf_s("%c", &c, 1);
user-0 提问: hdu2005 实在不知道怎么错了 求指导

回复:
user: user-0
content: 引用 1 楼 user-3 的回复:    a[1] = a[1] + 1;  这句修改是永久的。第一个闰年日期修正以后，后序的闰年日期再继续修正就全部是错的了。 程序中的 a 如果声明为 const，此类错误就很好抓了。 偶对 终于知道了 想了好久！！ 谢谢指教！！

user: user-1
content: #include<stdio.h>  int main(int argc, const char *argv[]) {     int y, m, d;     int a[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };    /* the length is 12 not 11 */     while (scanf(" %d/%d/%d", &y, &m, &d) != EOF)     {         int x = 0, i;         if ((y % 100 != 0 && y % 4 == 0) || (y % 400 == 0))         {             a[1] = a[1] + 1;         }         for (i = 0; i < m - 1; i++)         {             x = x + a[i];         }         x = x + d;         printf("%d\n", x);     }     return 0; }

user: user-0
content: 引用 2 楼 paschen 的回复:一年有12个月吧，你的数组a里只有11个元素  计算的时候是用不到第12月的天数，没必要定义了，12月几号是前十一个月天数再加上最后的“几号”

user: user-2
content: 一年有12个月吧，你的数组a里只有11个元素

user: user-3
content: a[1] = a[1] + 1;  这句修改是永久的。第一个闰年日期修正以后，后序的闰年日期再继续修正就全部是错的了。 程序中的 a 如果声明为 const，此类错误就很好抓了。
user-0 提问: C语言程序编程代码疑问

回复:
user: user-1
content: 搜“析构函数”

user: user-2
content: http://blog.csdn.net/vagrxie/article/details/1588484

user: user-3
content: 另外这个是C++语法，不是C语言

user: user-3
content: ~CDB_Control_Dlg 表示析构函数  ::表示作用范围，即CDB_Control_Dlg::类中的~CDB_Control_Dlg函数

user: user-4
content: ::是一个域的表示方法，表示CDB_Control_Dlg类有一个~CDB_Control_Dlg()函数，而~表示这是一个析构函数，析构函数和类名相同，没有返回值，只是前面加一个~ 符号

user: user-5
content: 这是C++的概念，推荐：C++ Primer Plus，如果嫌太厚，清华的郑莉版的、钱能版的也不错。 如果想快速入门，买本200多页的书可以达到，然后还需要一本详细全面的。

user: user-5
content: CDB_Control_Dlg::~CDB_Control_Dlg()   //析构函数定义 类名             析构函数同类名前面加~，无返回值类型无参数
user-0 提问: printf("%x")输出负数会输出很奇怪的一串东西，网上说是补码，不懂，求详解，谢谢！

回复:
user: user-1
content: public static member constant  <string> std::string::nposstatic const size_t npos = -1;Maximum value for size_t npos is a static member constant value with the greatest possible value for an element of type size_t.  This value, when used as the value for a len (or sublen) parameter in string's member functions, means "until the end of the string".  As a return value, it is usually used to indicate no matches.  This constant is defined with a value of -1, which because size_t is an unsigned integral type, it is the largest possible representable value for this type.   公共静态成员常量 <string> std :: string :: nposstatic const size_t npos = -1; size_t的最大值 npos是一个静态成员常数值，对于size_t类型的元素，它的值最大。  此值在用作字符串成员函数中len（或sublen）参数的值时，意味着“直到字符串结尾”。  作为返回值，它通常用于指示无匹配。  此常量定义为值-1，这是因为size_t是无符号整数类型，它是此类型的最大可能的可表示值。

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

user: user-3
content: 自己搜 原码 反码 补码

user: user-4
content: 哪奇怪了  -1的补码二进制就是32个1，十六进制就全是F

user: user-5
content: 用 %x 输出有符号数是一个未定义行为

user: user-6
content: 1的内存是:0000 00010000 0001//原1111 1110//取反1111 1111//+1,有符号就是-1而-1就是1的取反+1,即1111 1111 而%x是输出无符号的,所以就输出FF了 (PS:到底会输出几个FF就看你的编译器了,就是用多少位保存该数据或默认的类型) 1 编译器为16位。 int 占16位，-1的16进制值为0xFFFF。所以会输出 ffff 2 编译器为32位或者64位。 int占32位，-1的16进制为0xFFFFFFFF。所以会输出 ffffffff
user-0 提问: strcmp

回复:
user: user-1
content: 4楼正解，不需要再用取地址符

user: user-2
content: 引用 3 楼 bringtree 的回复:[quote=引用 1 楼 paschen 的回复:] 提示说的很明白嘛，类型不匹配嘛  你试下：strcmp(p->word,temp)!=0 这样呢 引用 2 楼 qq423399099 的回复:你的p->word有问题。 贴一下你的结构体类型，你的p->word应该是个指针类型吧？不需要取地址了  但是 平时赋值的时候为什么直接是这样子p->word = "aaaa";  如果 p->word 是个指针类型 不是应该*(p->word)="aaaa"[/quote]  如果p->word的类型是(const) char*的话，那么p->word = "aaaa"; 是对的，因为"aaaa"是字符数组，会退化为指针  但*(p->word)则是char类型，只是一个字符，而不是字符串

user: user-0
content: 引用 1 楼 paschen 的回复:提示说的很明白嘛，类型不匹配嘛  你试下：strcmp(p->word,temp)!=0 这样呢 引用 2 楼 qq423399099 的回复:你的p->word有问题。 贴一下你的结构体类型，你的p->word应该是个指针类型吧？不需要取地址了  但是 平时赋值的时候为什么直接是这样子p->word = "aaaa";  如果 p->word 是个指针类型 不是应该*(p->word)="aaaa"

user: user-3
content: 你的p->word有问题。 贴一下你的结构体类型，你的p->word应该是个指针类型吧？不需要取地址了

user: user-2
content: 提示说的很明白嘛，类型不匹配嘛  你试下：strcmp(p->word,temp)!=0 这样呢
user-0 提问: 虚拟机下运行C程序，出现了segmentation fault(core dumped)，求大神帮解

回复:
user: user-1
content: 1、既然你提到了出现 coredump了，所以请以后这样发贴的时候，可以将coredump信息发出来 2、如果你申请共享内存时，shmid_f不等于-1呢？ 3、加入程序可以正常执行，在程序结束的时候，是否应该执行IPC_RMID？ 4、错误处理也不够严谨  还需要多加练习

user: user-0
content: 这个程序是为了开两个缓冲区，在这两个缓冲区上弄四个信号量@lilachue

user: user-2
content: 没看明白你的代码。给你说一些方法来确定报错的代码范围：屏蔽部分代码/增加printf打印一些信息。另外，建议个体set_sembuf_struct里增加一个对空指针的判断。
user-0 提问: 萌新遇到一难题希望大神解答

回复:
user: user-1
content: 引用 5 楼 DAWAMASTER 的回复:好吧谢谢TAT  题主你有没有认真看我的回复啊，真心着急。比如您这段代码： {case 1:for(n=0;n<5;n++)                     {                     if(a[n].chinese>a[n+1].chinese) 当n是4时，依然会执行这句比较chinese的分数的步骤，但您告诉我：a[4].chinese > a[4+1].chinese，这里的a[5]是什么鬼？？

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

user: user-3
content: 引用 5 楼 DAWAMASTER 的回复:好吧谢谢TAT  代码一段一段的调试, 不要着急. swtich里面 一个case一个case的调试

user: user-0
content: 好吧谢谢TAT

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

user: user-0
content: 这是题目QAQ，我已经要疯了，谁能帮帮我，改了下数组大小还是不对

user: user-1
content: 题主您实在是太疏忽了，case中的for循环怎么能是【a < 5】呢？？应该是小于4啊，比如最后的a[4]你让它跟a[4+1]比较，不出错才怪

user: user-5
content: 你的结构体数组a只有5个元素，也就是说有效索引只是0~4  你代码中多处下面这样的语句都已经越界了：  printf("%s\t%f",a[5].name,a[5].chinese);break;
user-0 提问: C语言程序

回复:
user: user-1
content: 引用 2 楼 hzhgagaga 的回复:[quote=引用 1楼paschen 的回复:]printf("%d\n",i+1,sum/(m-1)); 你只有一个%d，但后面有两个要输出的   printf("%f\n",sum/n);    %f输出的是浮点型，sum/n 是整数除法，最后得到的是int类型 如果要浮点型，改成(float)sum / n我到了这一步，输入1或者2或者3或者4都会闪一下，但是最后没有任何结果显示[/quote]  因为你输入1或者2或者3或者4之后有了结果，程序立马又运行了main函数中的while里的system("cls"); 把所有内容全清空了

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

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

user: user-0
content: 引用 1楼paschen 的回复:printf("%d\n",i+1,sum/(m-1)); 你只有一个%d，但后面有两个要输出的   printf("%f\n",sum/n);    %f输出的是浮点型，sum/n 是整数除法，最后得到的是int类型 如果要浮点型，改成(float)sum / n我到了这一步，输入1或者2或者3或者4都会闪一下，但是最后没有任何结果显示

user: user-1
content: printf("%d\n",i+1,sum/(m-1)); 你只有一个%d，但后面有两个要输出的   printf("%f\n",sum/n);    %f输出的是浮点型，sum/n 是整数除法，最后得到的是int类型 如果要浮点型，改成(float)sum / n
user-0 提问: 怎么查看函数的默认参数是什么

回复:
user: user-1
content: 如果有默认参数，那么你可以不提供这个参数  VS上直接在函数名上右键——转到定义，即可跳转到函数定义位置

user: user-2
content: windows下学会使用dumpbin.exe linux下学会使用objdump

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-0
content: 引用 5 楼 zhao4zhong1 的回复:C语言默认函数返回int，无参数。我猜。  自己定义的函数，调用时不加参数gcc会报错的，不知道wait为什么不报错，搞混了c应该是不支持默认参数的，更加不知道wait是怎么做到的

user: user-2
content: C语言默认函数返回int，无参数。我猜。

user: user-0
content: 引用 2 楼 qq423399099 的回复:有的IDE支持直接右键函数名--转到定义 也可以查看MSDN：https://msdn.microsoft.com/en-us/library/w40768et.aspx http://www.cplusplus.com/reference/  sys/wait.h没看到有定义默认的值，不知道gcc为什么不报错

user: user-0
content: 引用 1 楼 paschen 的回复:如果有默认参数，那么你可以不提供这个参数  VS上直接在函数名上右键——转到定义，即可跳转到函数定义位置  gcc也是奇葩的，没定义默认参数怎么不报错，或者gcc应该加哪个参数啊，linux下调试不熟，不知道直接wait()是不是随便找了个堆栈的值传进去

user: user-3
content: 有的IDE支持直接右键函数名--转到定义 也可以查看MSDN：https://msdn.microsoft.com/en-us/library/w40768et.aspx http://www.cplusplus.com/reference/