Question: 关于C语言文件处理的问题，小白求指点。。急！

引用 6 楼 paschen 的回复:[quote=引用 5 楼 qingfeng__ 的回复:] [quote=引用 1 楼 paschen 的回复:] 你要在42+3= 输入45之前，要将后面的内容向后移动两个字符大小，然后再插入，否则会覆盖了之前的内容  也可按行读取，然后依次计算，把所有计算结果重新找成一个字符串，然后一次性写入那请问如何向后移动字符再插入呢？是重新把所有数据读取出来然后重新写一遍吗？[/quote]  比较好的办法就用我上面说的第二种，直接重新构造整个字符串，然后再一次性写入空文件  或者可以考虑使用文件内存映射，这样可以直接用指针的方式读写文件中的内容[/quote]谢谢大神，文件内存映射我没学过，我试试你的第一种方法吧。

引用 5 楼 qingfeng__ 的回复:[quote=引用 1 楼 paschen 的回复:] 你要在42+3= 输入45之前，要将后面的内容向后移动两个字符大小，然后再插入，否则会覆盖了之前的内容  也可按行读取，然后依次计算，把所有计算结果重新找成一个字符串，然后一次性写入那请问如何向后移动字符再插入呢？是重新把所有数据读取出来然后重新写一遍吗？[/quote]  比较好的办法就用我上面说的第二种，直接重新构造整个字符串，然后再一次性写入空文件  或者可以考虑使用文件内存映射，这样可以直接用指针的方式读写文件中的内容

引用 1 楼 paschen 的回复:你要在42+3= 输入45之前，要将后面的内容向后移动两个字符大小，然后再插入，否则会覆盖了之前的内容  也可按行读取，然后依次计算，把所有计算结果重新找成一个字符串，然后一次性写入那请问如何向后移动字符再插入呢？是重新把所有数据读取出来然后重新写一遍吗？

那请问如何向后移动字符再插入呢？是重新把所有数据读取出来然后重新写一遍吗？  （不好意思，我不知道怎么直接回复楼层，想问问二楼的兄弟的）

因为文件系统中每个字节的组织不是链表，而是数组那样的连续存储，所以如果在中间插入的话，需要后面的字符全部依次往后挪一个位置，成本太高了，所以不提供插入的方法。

楼上正解~~~


Question: 字符拼接的问题

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

VS下，没出现你所说的问题 你把  char reminders[MAX_REMIND][MSG_LEN+3]; 等初始化下看看

建议在必要的地方设置断点，然后单步跟踪程序运行，观察程序每一步执行结果与你期望的结果是否一致，很容易找到原因


Question: 嵌入式linux 反汇编 objdump求教

26d040:	0a000030 	beq	26d108 <static_ext_paint+0x178> 26d040 指令所在的地址 0a000030 指令的内容 beq	26d108  指令对应的汇编 ： 跳转到26d108处运行 <static_ext_paint+0x178> 对26d108  的解析，即26d108  是static_ext_paint函数便宜0X178的地方  26d044:	e51b0024 	ldr	r0, [fp, #-36]	; 0x24 不知道后面的0X24是啥 前面的指令应该是讲fp-36地址处取一个字（4字节）存到r0寄存器中


Question: 求助，大神看下我这哪里错了.

呃，我吐糟的是一些书籍。 c++贴吧的：http://tieba.baidu.com/p/4900195154 另外，有一本铁道出版社出版的 c++STL.....开发指南。。。一个博士后写的。那代码风格也是。。。。

骚年,拿去看看,规范一下格式. http://download.csdn.net/download/u011137631/9706539

代码风格怎么样就不吐槽了，你扔个图片上来，就算有人闲的没事想拿你的代码去运行一下都不方便 就不能使用论坛代码功能吗？

引用 2 楼 weixin_36921802 的回复:引用 1楼paschen 的回复:自己单步调试吧，代码写成这种风格没救了我第一次写这种东西.确实写的烂.老哥帮我看下qsort能这样用吗 引用 5 楼 GKatHere 的回复:引用 1 楼 paschen 的回复:自己单步调试吧，代码写成这种风格没救了 呵呵，2013年以前出版的国内教材，有这样的风格的。  我说的不是你代码烂不烂的问题，是你写代码的习惯........

hash函数中，判断小于不能使用那样使用的，要分开。'a' <= *s;  *s <= 'z';  使用'a' <=  *s <= 'z'的话，前一个<= 符号返回bool值了，后面的判断没用用了。 'a' <= *s返回true或者false

自己单步调试吧，代码写成这种风格没救了


Question: openssl  AES-CBC 加密解密问题 IV 如何保存下来。

必须保存iv，否则解不出来了。

保存在大脑中以免被黑。

是不是 可以设置固定的 iv呢？


SORRY .  你那个C没有定义。 前面 加上char C；

还是不懂，，，，

using namespace std；


Question: printf（） 接受中间带有空格的字符串时，字符串从空格处被折断

用gets和puts试试？

这样改就可以一直到回来：  	char s1[10]; 	char s2[10]; 	printf(" \n请输入s1： "); 	scanf("%[^\n]", s1); 	getchar(); 	printf(" \n请输入s2： "); 	scanf("%[^\n]", s2);  	printf("\n%s%s%s", "---", s1, "---"); 	printf("\n%s%s%s", "---", s2, "---"); 	printf("\n");  	system("pause");

printf(" \n请输入s1： ");         scanf("%9[^\n]",s1);

printf(" \n请输入s1： ");         scanf("%9[^\n]",&s1);


Question: C语言求解，基础

谢谢，我没发现，粗心了

#define 语句后边，不能加分号  预处理指令后边都没有分号


Question: 这个代码怎么优化啊（集合）

我初学c语言,不知道STL是什么。题目似乎还要加查询这一项，还有集合中的数的个数无法判断 我用我仅有的知识又改了点 #include <stdio.h> int main() { 	int s1[100],s2[100]; 	int i,j,k,l,m,n,h; 	printf("请输入两个集合中各有多少个数："); 	scanf("%d%d",&n,&m); 	printf("请输入第一个集合："); 	for(i=0;i<n;i++) 	{ 		scanf("%d",&s1[i]); 	} 	printf("第一个集合为："); 	for(i=0;i<n;i++) 	{ 		printf("%d ",s1[i]); 	} 	printf("\b\n"); 	printf("请输入第二个集合："); 	for(i=0;i<m;i++) 	{ 		scanf("%d",&s2[i]); 	} 	printf("第二个集合为："); 	for(i=0;i<m;i++) 	{ 		printf("%d ",s2[i]); 	} 	printf("\b\n请输入要查询的数："); 	scanf("%d",&l); 	for(i=0;i<n;i++) 	for(j=0;j<m;j++) 		{ 		if(l==s1[i]) 		{ 			h=1; 			break; 		} 		if(l==s2[j]) 		{ 			h=0; 			break; 		} 		} 	if(h==1) 		printf("%d为第一个集合中第%d个数",l,i+1); 	if(h==0) 		printf("%d为第二个集合中第%d个数",l,j+1); 	else 		printf("查无此数！"); 	 	printf("\b\n交集为："); 	for(i=0;i<n;i++) 	{ 		for(j=0;j<m;j++) 		{ 			if(s1[i]==s2[j]) 			printf("%d ",s1[i]); 		} 	} 	printf("\b\n"); 	printf("并集为："); 	for(i=0;i<n;i++) 	{ 		printf("%d ",s1[i]); 	} 		for(j=0;j<m;j++) 		{ 			for(k=0;k<n;k++) 			{ 				if(s1[k]==s2[j]) 				{ 					h = 1; 					break; 				} 				else	 					h = 0;	 			}  			if(h==0) 			{ 				printf("%d ",s2[j]); 				h = 1; 			} 		} 	printf("\b\n"); 	printf("差集为："); 	for(i=0;i<n;i++) 		{ 			for(k=0;k<m;k++) 			{ 				if(s2[k]==s1[i]) 				{ 					h = 1; 					break; 				} 				else 				{ 					h = 0; 				}	 			} 			if(h==0) 			{ 				printf("%d ",s1[i]); 			} 		} 		printf("\t"); 		printf("或者为："); 		for(j=0;j<m;j++) 		{ 			for(k=0;k<n;k++) 			{ 				if(s1[k]==s2[j]) 				{ 					h = 1; 					break; 				} 				else 					h = 0;	 			} 			if(h==0) 				printf("%d ",s2[j]); 		} 		printf("\b\n"); 	return 0; }

呵呵，直接调用STL算法，最优化了。要求的STL中都有

题目中的查询是什么意思

#include <stdio.h> //#include <stdlib.h> //#include <time.h>  #define MAX_SETS_LEN     10   static void init_sets(int *arr, int len) {     int i;     //srand(time(NULL));     printf("Please input %d integer number, then enter: ", len);     for (i = 0; i < len; i++)         //arr[i] = rand() % 100;         scanf("%d", arr+i); } static void init_zero_sets(int *arr, int len) {     int i;      for (i = 0; i < len; i++)         arr[i] = 0; }  static void print_sets(int *arr, int len) {     int i;      for (i = 0; i < len; i++) {         if (!arr[i])             break;         printf("%d\t", arr[i]);     }     putchar(10); }  void get_intersection_sets(int *set1, int *set2, int *inters_sets) {     int i, j, k = 0;      for (i = 0; i < MAX_SETS_LEN; i++) {         for (j = 0; j < MAX_SETS_LEN; j++) {             if (set1[i] == set2[j])                 inters_sets[k++] = set1[i];         }     } }   void get_union_sets(int *set1, int *set2, int *union_sets) {     int i, j, k = 0;      for (i = 0; i < MAX_SETS_LEN; i++) {         union_sets[k++] = set1[i];     }     int cnt = k;     for (i = 0; i < MAX_SETS_LEN; i++) {         for (j = 0; j < cnt; j++)             if (union_sets[j] == set2[i])                 break;         if (j == cnt)             union_sets[k++] = set2[i];     } }  void get_diff_sets(int *set1, int *set2, int *diff_sets) {     int i, j, k = 0;      for (i = 0; i < MAX_SETS_LEN; i++) {         for (j = 0; j < MAX_SETS_LEN; j++)             if (set1[i] == set2[j])                 break;         if (j == MAX_SETS_LEN)             diff_sets[k++] = set1[i];     } }   int main(int argc, const char *argv[]) {     int arr_set1[MAX_SETS_LEN], arr_set2[MAX_SETS_LEN];      int inters_sets[MAX_SETS_LEN], union_sets[2*MAX_SETS_LEN], diff_sets[MAX_SETS_LEN];      init_sets(arr_set1, MAX_SETS_LEN);     init_sets(arr_set2, MAX_SETS_LEN);     init_zero_sets(inters_sets, MAX_SETS_LEN);     init_zero_sets(union_sets, 2 *MAX_SETS_LEN);     init_zero_sets(diff_sets, MAX_SETS_LEN);     printf("Print first sets: \n");     print_sets(arr_set1, MAX_SETS_LEN);     printf("Print Second sets: \n");     print_sets(arr_set2, MAX_SETS_LEN);      get_intersection_sets(arr_set1, arr_set2, inters_sets);     get_union_sets(arr_set1, arr_set2, union_sets);     get_diff_sets(arr_set1, arr_set2, diff_sets);      printf("Intersection sets list: \n");     print_sets(inters_sets, MAX_SETS_LEN);     printf("Union sets list: \n");     print_sets(union_sets, 2 * MAX_SETS_LEN);     printf("different sets list: \n");     print_sets(diff_sets, MAX_SETS_LEN);     return 0; }  我写的demo,参考一下吧.如有问题,及时指出来吧； 建议不要把所有功能放到主函数里,可以尝试写成小函数然后主函数调用.

仅供参考：#include <algorithm> #include <iostream> #include <functional> #include <cstring> using namespace std; int main() {     char *Alphabet = "abcdefghijklmnopqrstuvwxyz" ;     char *Vowels   = "aeiou" ;     char *AlphaNum = "0123456789abcdef" ;     char result[45] ;     char *last ;      int lenA  = strlen(Alphabet) ;     int lenV  = strlen(Vowels  ) ;     int lenAN = strlen(AlphaNum) ;      cout << "Alphabet = " << Alphabet << endl ;     cout << "Vowels   = " << Vowels   << endl ;     cout << "AlphaNum = " << AlphaNum << endl ;      cout << "\nusing non-predicate versions" << endl ;      //non-predicate set_difference     last = set_difference(Alphabet, Alphabet+lenA,                           AlphaNum, AlphaNum+lenAN,                           result) ;     *last = 0 ;     cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;      //non-predicate set_intersection     last = set_intersection(Alphabet, Alphabet+lenA,                             AlphaNum, AlphaNum+lenAN,                             result) ;     *last = 0 ;     cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;      //non-predicate set_symmetric_difference     last = set_symmetric_difference(Alphabet, Alphabet+lenA,                                     Vowels  , Vowels  +lenV,                                     result) ;     *last = 0 ;     cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;      //non-predicate set_union     last = set_union(Alphabet, Alphabet+lenA,                      AlphaNum, AlphaNum+lenAN,                      result) ;     *last = 0 ;     cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;      cout << "\nusing predicate versions" << endl ;      //predicate set_difference     last = set_difference(Alphabet, Alphabet+lenA,                           AlphaNum, AlphaNum+lenAN,                           result  , less<char>()) ;     *last = 0 ;     cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;      //predicate set_intersection     last = set_intersection(Alphabet, Alphabet+lenA,                             AlphaNum, AlphaNum+lenAN,                             result  , less<char>()) ;     *last = 0 ;     cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;      //predicate set_symmetric_difference     last = set_symmetric_difference(Alphabet, Alphabet+lenA,                                     Vowels  , Vowels  +lenV,                                     result  , less<char>()) ;     *last = 0 ;     cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;      //predicate set_union     last = set_union(Alphabet, Alphabet+lenA,                      AlphaNum, AlphaNum+lenAN,                      result  , less<char>()) ;     *last = 0 ;     cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;      return 0 ; }


Question: 把下面的快速排序 代码 修改为降序（原来的是升序）代码非原创

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

快速排序给你个我之前写的，分为递归版与非递归版，你随便先一个就行  里面又分升序与降序，如果你要降序，把升序那部分的代码删除了  //快速排序（递归版） 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; }

规定是要数组的 不用指针 能写个数组的吗？ 还有那个修改的 不行 谢谢了


Question: 用c语言编写程序 使用快速排序算法对数组中的数据进行 降序 排序（要求随机生成10个1-99之间的要排序的数据，放入数组中。）

生成随机数很方便，你直接用rand就行，我就不写代码了  快速排序给你个我之前写的，分为递归版与非递归版，你随便先一个就行  里面又分升序与降序，如果你要降序，把升序那部分的代码删除了  //快速排序（递归版） 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; }

要 快速排序 的 怎么把下面的快速排序改为降序的 （代码非原创）     #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");       }

参考：  #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { 	int a[10]; 	int i, j, t; 	srand(time(NULL)); 	for (i = 0; i < 10; i++) 		a[i] = rand() % 100; 	for (i = 0; i < 9; i++) 	for (j = i + 1; j < 10; j++) 	if (a[i]<a[j]) 	{ 		t = a[i]; 		a[i] = a[j]; 		a[j] = t; 	} 	for (i = 0; i < 10; i++) 		printf("%d ", a[i]); }

规定是要数组的 不用指针 能写个数组的吗？麻烦你了


Question: TCP重连之后还是收到之前的数据

断开连接需要2步 close 和 shutdown  谁在前我忘了

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

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

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


Question: 求迷宫最短路径，输出路径各点坐标

for(int v=0;v<8,!found;v++)   是不是要写成：  for(int v=0;v<8 && !found;v++)

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

出来冒泡，顺便帮你顶顶。。。。。。

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


Question: 请问可以用纯C写一个修复Windows引导程序吗？

可以，C + WINDOWS API函数

老毛桃 PE 不行吗  或者安装的时候多分区引导

TC调用INT 13h

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

可以，需要学习windows的底层编程知识，或者熟悉硬盘引导分区的数据结构。


Question: 把下面的快速排序代码改为 降序（或者给个快速排序的代码要求10随机生成数，用数组，降序）

改成这样：  #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"); }


Question: 求助

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

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

LNode *LocateELem(LinkList L;Elemtpye e)  改成；  LNode *LocateELem(LinkList L;ElemType e)  注意大小写


Question: 这个数组定义为什么报错

int是整形类型。整形数组里面不能有除开整形之外的类型数据

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

错在赋值 {1， {2, 3}}中只有两个元素，是1和{2, 3}，而{2,3}不是int类型元素  你可以这样赋值 int a[3] = { 1, 2, 3 };


Question: 各位帮忙看一下呗

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

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

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

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

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

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

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

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

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

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


Question: C语言中给指针的指向空间赋值问题

会不会是因为指针没有初始化，导致指针指向的内存不存在？

熟悉强制类型转换 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.

不要将类型转换成：uint8_t 否则你的移动的字节是不同的


Question: 关于文件读写的问题

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

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

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


Question: 关于创建遍历二叉树

引用 5 楼 paschen 的回复:我不知你要输入什么  我帮你调试时输入 1 2 3 0 0 0 0 ，输出了结果123  不知你要问什么  你能输出吗我怎么不行 就是要把数据放进二叉树里面输入0表示输入结束  然后遍历二叉树打印出来

引用 4 楼 qq423399099 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 你能输出吗我怎么不行 就是要把数据放进二叉树里面输入0表示输入结束  然后遍历二叉树打印出来

引用 1 楼 qq_36409192 的回复:#include<iostream> using namespace std;  typedef struct node { 	struct node *leftChild; 	struct node *rightChild; 	char data; }BiTreeNode, *BiTree;  void createBiTree(BiTree &T) { 	char c; 	cin >> c; 	if('#' == c) 		T = NULL; 	else 	{ 		T = new BiTreeNode; 		T->data = c; 		createBiTree(T->leftChild); 		createBiTree(T->rightChild); 	} }  // 先序遍历 void preOrderTraverse(BiTree T) { 	if(T) 	{ 		cout << T->data << " "; 		preOrderTraverse(T->leftChild); 		preOrderTraverse(T->rightChild); 	} }   // 中序遍历 void inOrderTraverse(BiTree T) { 	if(T) 	{ 		inOrderTraverse(T->leftChild); 		cout << T->data << " "; 		inOrderTraverse(T->rightChild); 	} }  // 后序遍历 void postOrderTraverse(BiTree T) { 	if(T) 	{ 		postOrderTraverse(T->leftChild); 		postOrderTraverse(T->rightChild); 		cout << T->data << " "; 	} }  int main() { 	BiTree T; 	createBiTree(T); 	cout << "先序遍历:" << endl; 	preOrderTraverse(T); 	cout << endl << endl; 	 	cout << "中序遍历:" << endl; 	inOrderTraverse(T); 	cout << endl << endl; 	 	cout << "后序遍历:" << endl; 	postOrderTraverse(T); 	cout << endl << endl;  	return 0; }  我就照着这个帖子来的结果就是打印不出来结果编译能过去

引用 2 楼 qq_36151474的回复:[quote=引用 1 楼 qq_36409192 的回复:] #include<iostream> using namespace std;  typedef struct node { 	struct node *leftChild; 	struct node *rightChild; 	char data; }BiTreeNode, *BiTree;  void createBiTree(BiTree &T) { 	char c; 	cin >> c; 	if('#' == c) 		T = NULL; 	else 	{ 		T = new BiTreeNode; 		T->data = c; 		createBiTree(T->leftChild); 		createBiTree(T->rightChild); 	} }  // 先序遍历 void preOrderTraverse(BiTree T) { 	if(T) 	{ 		cout << T->data << " "; 		preOrderTraverse(T->leftChild); 		preOrderTraverse(T->rightChild); 	} }   // 中序遍历 void inOrderTraverse(BiTree T) { 	if(T) 	{ 		inOrderTraverse(T->leftChild); 		cout << T->data << " "; 		inOrderTraverse(T->rightChild); 	} }  // 后序遍历 void postOrderTraverse(BiTree T) { 	if(T) 	{ 		postOrderTraverse(T->leftChild); 		postOrderTraverse(T->rightChild); 		cout << T->data << " "; 	} }  int main() { 	BiTree T; 	createBiTree(T); 	cout << "先序遍历:" << endl; 	preOrderTraverse(T); 	cout << endl << endl; 	 	cout << "中序遍历:" << endl; 	inOrderTraverse(T); 	cout << endl << endl; 	 	cout << "后序遍历:" << endl; 	postOrderTraverse(T); 	cout << endl << endl;  	return 0; }  我就照着这个帖子来的结果就是打印不出来结果编译能过去[/quote] 你把我发的和你的对比一下就知道问题出在哪里了。。

再供参考：//1 2 3 //4 5 6 求一笔划过所有9个键的所有方法 //7 8 9 #include <stdio.h> int g[10][9]={     {0,0,0,0,0,0,0,0,0},     {2,4,5,0,0,0,0,0,0},//1     {1,3,4,5,6,0,0,0,0},//2     {2,5,6,0,0,0,0,0,0},//3     {1,2,5,7,8,0,0,0,0},//4     {1,2,3,4,6,7,8,9,0},//5     {2,3,5,8,9,0,0,0,0},//6     {4,5,8,0,0,0,0,0,0},//7     {4,5,6,7,9,0,0,0,0},//8     {5,6,8,0,0,0,0,0,0},//9 }; int k,i,n; int h[10];//记录是否划过h[1..9],history int p[10];//记录划的顺序p[1..9],path void go(int f,int L) {     int j;      if (L==9) {         p[L]=f;         n++;         printf("%08d:",n);         for (i=1;i<=9;i++) printf(" %d",p[i]);         printf("\n");     } else {         p[L]=f;         h[f]=1;         j=0;         while (1) {             if (g[f][j]==0) break;             if (h[g[f][j]]==0) {                 go(g[f][j],L+1);                 h[g[f][j]]=0;             }             j++;         }     } } int main() {     n=0;     for (k=1;k<=9;k++) {         for (i=1;i<=9;i++) h[i]=0;         go(k,1);     }     return 0; } //00000001: 1 2 3 5 4 7 8 6 9 //00000002: 1 2 3 5 4 7 8 9 6 //00000003: 1 2 3 5 6 9 8 4 7 //00000004: 1 2 3 5 6 9 8 7 4 //00000005: 1 2 3 5 7 4 8 6 9 //00000006: 1 2 3 5 7 4 8 9 6 //00000007: 1 2 3 5 9 6 8 4 7 //00000008: 1 2 3 5 9 6 8 7 4 //00000009: 1 2 3 6 5 4 7 8 9 //00000010: 1 2 3 6 5 7 4 8 9 //00000011: 1 2 3 6 5 9 8 4 7 //00000012: 1 2 3 6 5 9 8 7 4 //00000013: 1 2 3 6 8 4 7 5 9 //00000014: 1 2 3 6 8 7 4 5 9 //00000015: 1 2 3 6 8 9 5 4 7 //00000016: 1 2 3 6 8 9 5 7 4 //00000017: 1 2 3 6 9 5 4 7 8 //00000018: 1 2 3 6 9 5 4 8 7 //00000019: 1 2 3 6 9 5 7 4 8 //00000020: 1 2 3 6 9 5 7 8 4 //00000021: 1 2 3 6 9 5 8 4 7 //00000022: 1 2 3 6 9 5 8 7 4 //00000023: 1 2 3 6 9 8 4 5 7 //00000024: 1 2 3 6 9 8 4 7 5 //00000025: 1 2 3 6 9 8 5 4 7 //00000026: 1 2 3 6 9 8 5 7 4 //00000027: 1 2 3 6 9 8 7 4 5 //00000028: 1 2 3 6 9 8 7 5 4 //00000029: 1 2 4 5 3 6 9 8 7 //00000030: 1 2 4 5 7 8 9 6 3 //00000031: 1 2 4 7 5 3 6 8 9 //00000032: 1 2 4 7 5 3 6 9 8 //00000033: 1 2 4 7 5 8 9 6 3 //00000034: 1 2 4 7 5 9 8 6 3 //00000035: 1 2 4 7 8 5 3 6 9 //00000036: 1 2 4 7 8 5 9 6 3 //00000037: 1 2 4 7 8 6 3 5 9 //00000038: 1 2 4 7 8 6 9 5 3 //00000039: 1 2 4 7 8 9 5 3 6 //00000040: 1 2 4 7 8 9 5 6 3 //00000041: 1 2 4 7 8 9 6 3 5 //00000042: 1 2 4 7 8 9 6 5 3 //00000043: 1 2 4 8 7 5 3 6 9 //00000044: 1 2 4 8 7 5 9 6 3 //00000045: 1 2 4 8 9 6 3 5 7 //00000046: 1 2 5 3 6 9 8 4 7 //00000047: 1 2 5 3 6 9 8 7 4 //00000048: 1 2 5 4 7 8 9 6 3 //00000049: 1 2 5 7 4 8 9 6 3 //00000050: 1 2 6 3 5 4 7 8 9 //00000051: 1 2 6 3 5 7 4 8 9 //00000052: 1 2 6 3 5 9 8 4 7 //00000053: 1 2 6 3 5 9 8 7 4 //00000054: 1 2 6 9 8 4 7 5 3 //00000055: 1 2 6 9 8 7 4 5 3 //00000056: 1 4 2 3 5 6 9 8 7 //... ... //00000776: 9 8 7 4 5 6 3 2 1 //00000777: 9 8 7 5 1 4 2 3 6 //00000778: 9 8 7 5 1 4 2 6 3 //00000779: 9 8 7 5 3 6 2 1 4 //00000780: 9 8 7 5 3 6 2 4 1 //00000781: 9 8 7 5 4 1 2 3 6 //00000782: 9 8 7 5 4 1 2 6 3 //00000783: 9 8 7 5 6 3 2 1 4 //00000784: 9 8 7 5 6 3 2 4 1

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

仅供参考：//每一步只能迈上1个或2个台阶。先迈左脚，然后左右交替，最后一步是迈右脚，也就是说一共要走偶数步。那么，上完39级台阶，有多少种不同的上法呢？ //------------------------------------------------------- //状态c[i][0]表示走到第i个楼梯时最后一步是左脚的方法数，c[i][1]是右脚的方法数。。 //那么，由于每一步能上一到两级，c[i][0] = c[i-1][1]+c[i-2][1](因为最后一步为左脚， //倒数第二步肯定为右脚。。)。。然后一直递推。。最后c[39][1]即上到第39级而且是右脚的方法数即为答案。 #include <stdio.h> int c[40][2];//0为左脚，1为右脚。。 int main(){     int i;     c[0][0] = c[1][1] = 0;     c[0][1] = c[1][0] = 1;     for(i = 2; i <= 39; ++i){         c[i][0] = c[i - 1][1] + c[i - 2][1];         c[i][1] = c[i - 1][0] + c[i - 2][0];     }     printf("%d\n", c[39][1]);     return 0; } //------------------------------------------------------- //走到第n级台阶的时候，他的上一步不是在n-1级就是在n-2级上， // f(n) = f(n - 1) + f(n - 2) 很简单的递归思想 int num=0; void fun(int n,int step) {   if(n<0)     return;   if(n==0)   {     if(step%2==0) num++;     return;    }    fun(n-1,step+1);    fun(n-2,step+1); } void main() {   fun(39,0);   printf("%d",num); } //------------------------------------------------------- int aux(int steps, int cnt) {     if (steps <= 0)     {         if (0 == steps && (cnt && !(cnt % 2)))             return 1;         return 0;     }     return aux(steps - 1, cnt + 1) + aux(steps - 2, cnt + 1); }<br> inline int func(steps) {     return aux(steps, 0); } //------------------------------------------------------- #include <stdio.h> static int trace[40]; static int count=0; void go(int, int, int); int main() {         go(39, 0, 1);         go(39, 0, 2);         printf("count=%d\n",count); } // // left: left steps // mt:   mount_times // step: steps of current movement // void go(int left, int mt, int step) {     int i;     if(left < 0)return;     if(left == 0){         if(!(mt%2)&&(step==1)){             /* 用来记录小明的脚步，当然题目里并不要求我们记下来。             for(i=0;i<mt;i++){                     printf("%3d",trace[i]);             }             printf("\n");             for(i=mt;i<sizeof(trace);i++){                     trace[i]=0;             }             */             count++;         }         return;     }     trace[mt] = step;     left -= step;     mt++;     go(left, mt, 1);     go(left, mt, 2); }

引用 9 楼 paschen 的回复:[quote=引用 8 楼 qq_36151474 的回复:] [quote=引用 5 楼 paschen 的回复:] 我不知你要输入什么  我帮你调试时输入 1 2 3 0 0 0 0 ，输出了结果123  不知你要问什么  你能输出吗我怎么不行 就是要把数据放进二叉树里面输入0表示输入结束  然后遍历二叉树打印出来[/quote]  能输出啊，给个你输入的截图看下[/quote]  奥大哥我理解错了这样输如才行可以输出，能不能麻烦你帮忙看下这个题，我知道要用到数据结构二叉树，但是具体下来就不知道怎么办了

引用 8 楼 qq_36151474 的回复:[quote=引用 5 楼 paschen 的回复:] 我不知你要输入什么  我帮你调试时输入 1 2 3 0 0 0 0 ，输出了结果123  不知你要问什么  你能输出吗我怎么不行 就是要把数据放进二叉树里面输入0表示输入结束  然后遍历二叉树打印出来[/quote]  能输出啊，给个你输入的截图看下


Question: socket通信getpeername（）客户端ip获取总是错误

找到错误了，getpeername第三个参数没有sizeod http://aigo.iteye.com/blog/1905564  #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<unistd.h> #include<string.h> #include<stdio.h> #include<errno.h> void printfd(int sock) { 	//thread  safe  C99 	socklen_t						peer_addr_size,selflen; 	struct sockaddr_in 			peer_addr,self; 	unsigned int				esme_port=0; 	char						esme_ip[200]; 	int ern; 	int ret=0; 	peer_addr_size=sizeof(struct sockaddr); 	ret=getpeername(sock,(struct sockaddr*)&peer_addr,&peer_addr_size); 	ern=errno; 	if(!ret){ 	printf("peer[%s]\n",inet_ntop(peer_addr.sin_family,&peer_addr.sin_addr,esme_ip,sizeof(esme_ip)));  	esme_port = ntohs(peer_addr.sin_port); 	printf("peer%d**[sock=%d] port[%d] ip[%s]\n",ret,sock,esme_port,esme_ip); 	}else 	{ 		printf("peer %s\n",strerror(ern)); 	} 	selflen=sizeof(struct sockaddr); 	ret=getsockname(sock, (struct sockaddr*)&self,&selflen); 	ern=errno; 	if(!ret){ 	printf("self[%s]\n",inet_ntop(self.sin_family,&self.sin_addr,esme_ip,sizeof(esme_ip))); 	esme_port = ntohs(self.sin_port); 	printf("self%d**[sock=%d] port[%d] ip[%s]\n",ret,sock,esme_port,esme_ip); 	}else 	{ 		printf("self %s\n",strerror(ern)); 	} }

void printfd(int sock) { 	//thread  safe  C99 	socklen_t						peer_addr_size,selflen; 	struct sockaddr_in 			peer_addr,self; 	unsigned int				esme_port=0; 	char						esme_ip[200];     	int ern; 	int ret=0; 	ret=getpeername(sock,(struct sockaddr*)&peer_addr,&peer_addr_size); 	ern=errno; 	if(!ret){ 		if(NULL!=inet_ntop(peer_addr.sin_family,&peer_addr.sin_addr,esme_ip,sizeof(esme_ip))){ 			//ip  线程   inet_ntoa不安全   			esme_port = ntohs(peer_addr.sin_port); 			printf("peer%d**[sock=%d] port[%d] ip[%s]\n",ret,sock,esme_port,esme_ip); 			}else{ 				ern=errno; 				printf("peer %s\n",strerror(ern)); 			} 	}else 	{ 		printf("peer %s\n",strerror(ern)); 	} 	 	ret=getsockname(sock, (struct sockaddr*)&self,&selflen); 	ern=errno; 	if(!ret){ 		if(NULL!=inet_ntop(self.sin_family,&self.sin_addr,esme_ip,sizeof(esme_ip))){ 			esme_port = ntohs(self.sin_port); 			printf("self%d**[sock=%d] port[%d] ip[%s]\n",ret,sock,esme_port,esme_ip); 	}else{ 				ern=errno; 				printf("peer %s\n",strerror(ern)); 			} 	}else 	{ 		printf("self %s\n",strerror(ern)); 	} }引用 4 楼 zhao4zhong1 的回复:/*	作用：tcp协议实现通信  */  #include<stdio.h> #include<stdlib.h> #include<sys/socket.h> #include<sys/types.h> #include<netinet/in.h> #include<string.h> #include <arpa/inet.h>  int main() { int sk=socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = 10089;  bind(sk,(const struct sockaddr *)&addr,sizeof(addr)); listen(sk,30); char * buf = malloc(64); while(1) { struct sockaddr_in userip,servip,sq; socklen_t userlen; socklen_t servlen; char add[60]; char ipAddr[18]; int x = 0; int * lenth = malloc(4); char ZZaddr[200]; unsigned short ZZport; int sd=accept(sk,(struct sockaddr * __restrict__)&sq,lenth); strcpy(ZZaddr,inet_ntoa(sq.sin_addr)); ZZport=ntohs(sq.sin_port); printf("%s,  ,%d\n",ZZaddr,ZZport); getsockname(sd,(struct sockaddr * __restrict__)&servip,&servlen); strcpy(ZZaddr,inet_ntoa(servip.sin_addr)); ZZport=ntohs(servip.sin_port); printf("%s   %d\n",ZZaddr,ZZport);   getpeername(sd,(struct sockaddr * __restrict__)&userip,&userlen);// strcpy(ZZaddr,inet_pton(AF_INET,(const char * __restrict__)&userip.sin_addr,ipAddr)); ZZport=ntohs(userip.sin_port); printf("%d   %d\n",ZZaddr,ZZport); strcpy(ZZaddr,inet_ntop(AF_INET,&userip.sin_addr,ipAddr,sizeof(ipAddr))); ZZport=ntohs(userip.sin_port); printf("%s   %d\n",ZZaddr,ZZport);

服务器accept后立即打印一下，getpeername 会错误Address family not supported by protocol。如果sleep(2)我得到的peer0**[sock=4] port[0] ip[0.0.0.0]，和客户端进行首发以后 答应正确peer0**[sock=4] port[49351] ip[127.0.0.1]   这种是什么原因？ 引用 4 楼 zhao4zhong1 的回复:/*	作用：tcp协议实现通信  */  #include<stdio.h> #include<stdlib.h> #include<sys/socket.h> #include<sys/types.h> #include<netinet/in.h> #include<string.h> #include <arpa/inet.h>  int main() { int sk=socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = 10089;  bind(sk,(const struct sockaddr *)&addr,sizeof(addr)); listen(sk,30); char * buf = malloc(64); while(1) { struct sockaddr_in userip,servip,sq; socklen_t userlen; socklen_t servlen; char add[60]; char ipAddr[18]; int x = 0; int * lenth = malloc(4); char ZZaddr[200]; unsigned short ZZport; int sd=accept(sk,(struct sockaddr * __restrict__)&sq,lenth); strcpy(ZZaddr,inet_ntoa(sq.sin_addr)); ZZport=ntohs(sq.sin_port); printf("%s,  ,%d\n",ZZaddr,ZZport); getsockname(sd,(struct sockaddr * __restrict__)&servip,&servlen); strcpy(ZZaddr,inet_ntoa(servip.sin_addr)); ZZport=ntohs(servip.sin_port); printf("%s   %d\n",ZZaddr,ZZport);   getpeername(sd,(struct sockaddr * __restrict__)&userip,&userlen);// strcpy(ZZaddr,inet_pton(AF_INET,(const char * __restrict__)&userip.sin_addr,ipAddr)); ZZport=ntohs(userip.sin_port); printf("%d   %d\n",ZZaddr,ZZport); strcpy(ZZaddr,inet_ntop(AF_INET,&userip.sin_addr,ipAddr,sizeof(ipAddr))); ZZport=ntohs(userip.sin_port); printf("%s   %d\n",ZZaddr,ZZport);

inet_ntoa The Windows Sockets inet_ntoa function converts an (Ipv4) Internet network address into a string in Internet standard dotted format.  char FAR * inet_ntoa (   struct in_addr in   );   Parameters in  [in] A structure that represents an Internet host address.  Remarks The inet_ntoa function takes an Internet address structure specified by the in parameter and returns an ASCII string representing the address in ".'' (dot) notation as in "a.b.c.d''. The string returned by inet_ntoa resides in memory that is allocated by Windows Sockets. The application should not make any assumptions about the way in which the memory is allocated. The data is guaranteed to be valid until the next Windows Sockets function call within the same thread, but no longer. Therefore, the data should be copied before another Windows Sockets call is made.  Return Values If no error occurs, inet_ntoa returns a char pointer to a static buffer containing the text address in standard ".'' notation. Otherwise, it returns NULL.   QuickInfo   Windows NT: Yes   Windows: Yes   Windows CE: Use version 1.0 and later.   Header: Declared in winsock2.h.   Import Library: Link with ws2_32.lib.  See Also inet_addr

大神求指点啊！！ 可以通信，但是ip输出不对，是不输出的时候不对还是getpeername函数用错了

大神的意思是在Windows系统下么？我这是在linux系统上，难道函数用的 不对？


Question: 操作系统问题

使用ps命令结束指定进程。

这是源代码 #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); } }


Question: 查询问题，一种函数总是查询到最后一个，另一种看起来没问题，但结果显示不出来

strcmp 如果两字符串相等返回的是0  其次： scanf("%s",&no); scanf("%s",&name); 都把&去掉，虽然他们值是一样的，但表示的类型是不同的

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

#if 0 #include "stdio.h" #include "string.h" #include "stdlib.h" #endif #include <stdio.h> #include <stdlib.h> #include <string.h>  #define N 7 #define MAX_STU_NUM 7  struct student {     char name[20];  //姓名     char no[10];    //学号     int math;       //数学分数     int english;    //英语分数     int computer;   //计算机分数     int score;      //交换用分数     int eveave;     //个人平均分 }; struct student st[N];         //定义学生结构体 void subject(struct student st[],int n)//选定某个学科进行分析 {      int number;     int temp;     printf("        请选择要分析的学科: ");     scanf("%d", &number);     int i=0;     switch(number)     {         case 1:             printf("     以下是关于数学的成绩分析：\n");             for(i=0;i<n;i++)                 st[i].score=st[i].math;             break;         case 2:             printf("       以下是关于英语的成绩分析：\n");             for(i=0;i<n;i++)                 st[i].score=st[i].english;              break;         case 3:             printf("      以下是关于计算机成绩分析：\n");             for(i=0;i<n;i++)                 st[i].score=st[i].computer;             break;     }     int j;     printf("        按学号每个人的原始数据为:\n");     for(i=0;i<n;i++)         printf("        %d\n",st[i].score);     printf("        排序后的数据为\n");     for(i=0;i<n-1;i++)     {          for(j=0;j<n-i;j++)             if(st[j+1].score<st[j].score)             {                 temp=st[j].score;                 st[j].score=st[j+1].score;                 st[j+1].score=temp;             }     }     for(i=0;i<n;i++)         printf("        %d\n",st[i].score);     printf("        该门课的平均成绩为：\n");     float sum=0;     float courseave;     for(i=0;i<n;i++)     {         sum=sum+st[i].score;     }     courseave=sum/7;     printf("        %f\n",courseave);     printf("        该门课的最高分为：\n");     int max=st[0].score;     for(i=0;i<n;i++)     {         if(st[i].score>max)         {             max=st[i].score;         }     }     printf("        %d\n",max);//最高分     printf("        该门课的最低分为：\n");     int min=st[0].score;     for(i=0;i<n;i++)     {         if(st[i].score<min)         {             min=st[i].score;         }     }     printf("        %d\n",min);//最低分     int bjg=0;     int jg=0;     int zd=0;     int lh=0;     int yx=0;     for(i=0;i<n;i++)     {         if(st[i].score<60)    //计算不及格人数         {             bjg++;         }         if(st[i].score>=60&&st[i].score<70)//计算60~69人数         {             jg++;         }         if(st[i].score>=70&&st[i].score<80)//计算70~79人数         {             zd++;         }         if(st[i].score>=80&&st[i].score<90)//计算80~89人数         {             lh++;         }         if(st[i].score>=90)//计算90分以上人数         {             yx++;         }     }     printf("该门课的不及格人数为：\n %d\n60~69人数：\n%d\n70~79人数：\n%d\n80~89人数：\n %d\n90分以上人数：\n%d\n",bjg,jg,zd,lh,yx);    } void studentave(struct student st[],int n)//计算每个人的平均成绩并排序 {     int i, j;     int temp;     for(i = 0; i < n; i++) {         st[i].eveave=(st[i].math+st[i].english+st[i].computer)/4;     }     printf("        每个人平均成绩为：\n");     for(i=0;i<n;i++)         printf("        %d\n",st[i].eveave);      for(i = 0; i < n-1; i++)     {         for(j = 0; j < n-1-i; j++)             if(st[j].eveave > st[j+1].eveave)             {                 temp=st[j].eveave;                 st[j].eveave=st[j+1].eveave;                 st[j+1].eveave=temp;             }     }     printf("        平均成绩排序为：\n");     for(i=0;i<n;i++)         printf("        %d\n",st[i].eveave); }  void nosearch(struct student st[],int n)//按学号查找学生的各门成绩 {     int i=0;     n=7;     char no[10];     printf("        请输入要查找的学生号:");     scanf("%s",no);     while(strcmp(no,st[i].no)==0&&i<n)         i++;     if(i==n)     {         printf("        meizhaodao\n");     }     else         printf("        %s\t%s\t%d\t%d\t%d\n",st[i].no,st[i].name,st[i].math,st[i].english,st[i].computer); } void namesearch(struct student st[],int n)//按姓名查找学生的各门成绩 {     int i=0;     n=7;     char name[20];     printf("        请输入要查找的姓名:");     scanf("%s", name);     while(strcmp(name,st[i].name)==0&&i<7)         i++;     if(i==n)     {         printf("        meizhaodao\n");     }     else         printf("        %s\t%s\t%d\t%d\t%d\n",st[i].no,st[i].name,st[i].math,st[i].english,st[i].computer); } void cunchu(struct student st[],int n)    //存盘 {     int i;     FILE *fp;     fp=fopen("C:\\RJ\\input.dat","wb");//以"写"方式打开一个二进制文件     if(fp==NULL)     {         printf("Can't open!\n");         exit(0);     }      for(i=0;i<n;i++)     {         fwrite(&st[i],sizeof(struct student),1,fp);//一次写入一个学生的成绩     }     fclose(fp); } void duqu(struct student st[],int n)      //读取数据 {     int i;     FILE *fp;     fp=fopen("C:\\RJ\\input.dat","rb");//以"读"方式打开一个二进制文件     if(fp==NULL)     {         printf("Can't open!\n");         exit(0);     }     for(i=0;i<7;i++)     {         fread(&st[0],sizeof(struct student),1,fp);//一次读取一个学生的成绩         printf("                  %s\t%s\t%d\t%d\t%d\n",st[i].no,st[i].name,st[i].math,st[i].english,st[i].computer);     }     fclose(fp); }  int main(int argc, const char *argv[]) {     struct student st[7]={  {"01","王芳",78,77,90},         {"02","张强",89,67,88},         {"03","李浩",56,66,78},         {"04","黄鹏",89,86,85},         {"05","尚校",67,88,76},         {"06","赵鹏",45,54,67},         {"07","蒋泽",78,76,70}};     printf(" 本题的实验数据为数据：\n");     cunchu(st,7);//存盘input.dat     duqu(st,7);//读取数据     printf("  对各科的成绩分析如下：\n");     printf("        本实验采取switch()语句，分别1~3中的表示不同的学科\n        输入1表示计算关于数学方面的成绩；\n        输入2表示计算关于英语方面的成绩；\n        输入3表示计算关于计算机方面的成绩；\n");     subject(st,7);//按各科成绩排序     subject(st,7);//按各科成绩排序     subject(st,7);//按各科成绩排序     printf("   关于个人平均成绩分析：\n");     studentave(st,7);//计算每个人的平均成绩并排序     printf("   按照不同条件查询分析：\n");     nosearch(st,7);//按学号查找学生的各门成绩     namesearch(st,7);//按姓名查找学生的各门成绩     return 0; }   试一下这个版本~

怎么也找不到,因为你的初始化和你的结构体对不上好；第一个不是学好,你的数据结构里第一个是name;如果你输入学号,怎么可能和name匹配呢 改成这样,不过里面还有其他问题.  struct student { char no[10];//学号 char name[20];//姓名 int math;//数学分数 int english;//英语分数 int computer;//计算机分数 int score;//交换用分数 int eveave;//个人平均分 };

scanf("%s",&no);这句本身就有问题: 改成scanf("%s", no);

while(strcmp(no,st[i].no)==0&&i<n) 改成 while (strcmp(no,st[i].no) != 0 && i < n)


Question: 请问Win下怎么读取/修改其他进程中的内存数据？

ReadProcessMemory： https://msdn.microsoft.com/en-us/library/ms680553(VS.85).aspx  WriteProcessMemory： https://msdn.microsoft.com/en-us/library/ms681674.aspx


Question: 怎样将写好的一段matlab程序转换成C语言

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

参看：《matlab与c/c++混合编程》第4版


Question: 在做MIT操作系统实验lab4的时候遇到的问题，求解答啊啊

中间隔的一层syscall有没有调试过啊


Question: 新人求解malloc函数问题

#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个指针申请空间,将每个指针指向有效内存(堆上)；然后将数据存放到这些内存里,最后输出(使用)指针指向的内容,最后将这些指针释放,再把指针数组释放；注意释放的先后是不能改变的.

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

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

ch[i] = vl ;  ch[i] 是 char类型，即一个字符，而vl是一个char*指针，你这样赋值是错的


Question: c++模板问题

引用 5 楼 qq_34524827 的回复:[quote=引用 3 楼 paschen的回复:]这样写吧：   #include<iostream> #include<string.h> using namespace std; template<class A> A sum(A *array,int size=0) { 	A total=0; 	for(int i=0;i<size;i++) 		total+=array[i]; 	return total; };   char* sum(char *array,int size=0) { 	array[size] = '\0'; 	return array; };   int main() { 	int n,int_array[100]; 	double double_array[100]; 	float float_array[100]; 	char char_array[100]; 	cout<<"int :"<<endl; 	cin>>n; 	for(int i=0;i<n;i++) 		cin>>int_array[i]; 	int itotal=sum(int_array,n); 	cout<<"int sum:"<<itotal<<endl;  	cout<<"double :"<<endl; 	cin>>n; 	for(int j=0;j<n;j++) 		cin>>double_array[j]; 	double dtotal=sum(double_array,n); 	cout<<"double sum:"<<dtotal<<endl;  	cout<<"float :"<<endl; 	cin>>n; 	for(int k=0;k<n;k++) 		cin>>float_array[k]; 	double ftotal=sum(float_array,n); 	cout<<"float sum:"<<ftotal<<endl;  	cout<<"char :"<<endl; 	cin>>n; 	for(int l=0;l<n;l++) 		cin>>char_array[l]; 	char* ctotal=sum(char_array,n); 	cout<<"char sum:"<<ctotal<<endl;  	return 0; }  运行出错好像是char*sum和模板sum重复了[/quote]  什么错误  这里是重载形式，不存在重复问题，另外重复也是编译错误，而不是运行错误

引用 3 楼 paschen的回复:这样写吧：   #include<iostream> #include<string.h> using namespace std; template<class A> A sum(A *array,int size=0) { 	A total=0; 	for(int i=0;i<size;i++) 		total+=array[i]; 	return total; };   char* sum(char *array,int size=0) { 	array[size] = '\0'; 	return array; };   int main() { 	int n,int_array[100]; 	double double_array[100]; 	float float_array[100]; 	char char_array[100]; 	cout<<"int :"<<endl; 	cin>>n; 	for(int i=0;i<n;i++) 		cin>>int_array[i]; 	int itotal=sum(int_array,n); 	cout<<"int sum:"<<itotal<<endl;  	cout<<"double :"<<endl; 	cin>>n; 	for(int j=0;j<n;j++) 		cin>>double_array[j]; 	double dtotal=sum(double_array,n); 	cout<<"double sum:"<<dtotal<<endl;  	cout<<"float :"<<endl; 	cin>>n; 	for(int k=0;k<n;k++) 		cin>>float_array[k]; 	double ftotal=sum(float_array,n); 	cout<<"float sum:"<<ftotal<<endl;  	cout<<"char :"<<endl; 	cin>>n; 	for(int l=0;l<n;l++) 		cin>>char_array[l]; 	char* ctotal=sum(char_array,n); 	cout<<"char sum:"<<ctotal<<endl;  	return 0; }  运行出错好像是char*sum和模板sum重复了

引用 1 楼 user-2的回复:char类型本来就和int没差别，只有库类型std::string的operator+才有你要的效果 如何实现这个效果？

引用 1 楼 user-2的回复:char类型本来就和int没差别，只有库类型std::string的operator+才有你要的效果 那我要进行运算符重载吗？


Question: 关于寄存器保存值的问题

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

是汇编代码转换成的机器码指令


Question: 为什么程序每个函数都出现同样的错误，missing ')' before identifier 'st'

经过前面几个大神的提醒帮助，我找出所有问题了，主要是变量声明放错位置了,以及struct关键字缺漏，下面是我改完后完整的代码 #include "stdio.h" #include "string.h" #include "stdlib.h" #define N 7 struct student { 	char name[20];//姓名 	char no[10];//学号 	int math;//数学分数 	int english;//英语分数 	int computer;//计算机分数 	int score;//交换用分数 	int eveave;//个人平均分 };   struct student st[N];         //定义学生结构体 void subject(struct student st[],int n)//选定某个学科进行分析 { 	  	int number; 	int temp; 	int i=0; 	int j; 	float sum=0; 	float courseave; 	int max=st[0].score; 	int min=st[0].score; 	int bjg=0; 	int jg=0; 	int zd=0;  	int lh=0; 	int yx=0; 	printf("        请选择要分析的学科: "); 	scanf("%d",&number); 	 	switch(number) 	{ 		case 1: 			printf("       ★★★★★★★★★以下是关于数学的成绩分析：★★★★★★★★★★\n"); 			for(i=0;i<n;i++) 			st[i].score=st[i].math; 			break; 		case 2: 			printf("       ★★★★★★★★★以下是关于英语的成绩分析：★★★★★★★★★★\n"); 			for(i=0;i<n;i++) 			st[i].score=st[i].english;  			break; 		case 3: 			printf("       ★★★★★★★★★以下是关于计算机成绩分析：★★★★★★★★★★\n"); 			for(i=0;i<n;i++) 			st[i].score=st[i].computer; 			break; 	} 		 		printf("        按学号每个人的原始数据为:\n"); 		for(i=0;i<n;i++) 			printf("        %d\n",st[i].score); 		printf("        排序后的数据为\n"); 		for(i=0;i<n-1;i++) 		{ 			 			for(j=0;j<n-i;j++) 				if(st[j+1].score<st[j].score) 				{ 					temp=st[j].score; 					st[j].score=st[j+1].score; 					st[j+1].score=temp; 				} 		} 		for(i=0;i<n;i++) 			printf("        %d\n",st[i].score); 		printf("        该门课的平均成绩为：\n");  		for(i=0;i<n;i++) 		{ 			sum=sum+st[i].score; 		} 		courseave=sum/7; 		printf("        %f\n",courseave); 		printf("        该门课的最高分为：\n");  		for(i=0;i<n;i++) 		{ 			if(st[i].score>max) 			{ 				max=st[i].score; 			} 		} 		printf("        %d\n",max);//最高分 		printf("        该门课的最低分为：\n");  		for(i=0;i<n;i++) 		{ 			if(st[i].score<min) 			{ 				min=st[i].score; 			} 		} 		printf("        %d\n",min);//最低分  		for(i=0;i<n;i++) 		{ 			if(st[i].score<60)    //计算不及格人数 			{ 				bjg++; 			} 			if(st[i].score>=60&&st[i].score<70)//计算60~69人数 			{ 				jg++; 			} 			if(st[i].score>=70&&st[i].score<80)//计算70~79人数 			{ 				zd++; 			} 			if(st[i].score>=80&&st[i].score<90)//计算80~89人数 			{ 				lh++; 			} 			if(st[i].score>=90)//计算90分以上人数 			{ 				yx++; 			} 		} 		printf("        该门课的不及格人数为：\n        %d\n        60~69人数：\n        %d\n        70~79人数：\n        %d\n        80~89人数：\n        %d\n        90分以上人数：\n        %d\n",bjg,jg,zd,lh,yx); 		  	 } void studentave(struct student st[],int n)//计算每个人的平均成绩并排序 { 	int i; 	int j; 	int temp; 	for(i=0;i<n;i++) 	{ 		st[i].eveave=(st[i].math+st[i].english+st[i].computer)/4; 	} 	printf("        每个人平均成绩为：\n"); 	for(i=0;i<n;i++)		 	printf("        %d\n",st[i].eveave);  	for(i=0;i<n-1;i++) 	{ 		for( j=0;j<n-1-i;j++) 			if(st[j].eveave>st[j+1].eveave) 				{ 					temp=st[j].eveave; 					st[j].eveave=st[j+1].eveave; 					st[j+1].eveave=temp; 				} 	} 	printf("        平均成绩排序为：\n"); 	for(i=0;i<n;i++) 		printf("        %d\n",st[i].eveave); }  void nosearch(struct student st[],int n)//按学号查找学生的各门成绩 { 	int i=0; 	char no[10]; 	n=7; 	 	printf("        请输入要查找的学生号:"); 		scanf("%s",&no); 		while(strcmp(no,st[i].no)==0&&i<n) 			i++; 		if(i==n) 		{ 			printf("        meizhaodao\n"); 		} 		else 			printf("        %s\t%s\t%d\t%d\t%d\n",st[i].no,st[i].name,st[i].math,st[i].english,st[i].computer); } void namesearch(struct student st[],int n)//按姓名查找学生的各门成绩 { 	char name[20]; 	int i=0; 	n=7; 	 	printf("        请输入要查找的姓名:"); 		scanf("%s",&name); 		while(strcmp(name,st[i].name)==0&&i<7) 		i++; 		if(i==n) 		{ 			printf("        meizhaodao\n"); 		} 		else 			printf("        %s\t%s\t%d\t%d\t%d\n",st[i].no,st[i].name,st[i].math,st[i].english,st[i].computer); } void cunchu(struct student st[],int n)    //存盘 { 	int i; 	FILE *fp; 	fp=fopen("G:\\input.dat","wb");//以"写"方式打开一个二进制文件 	if(fp==NULL) 	{ 		printf("Can't open!\n"); 		exit(0); 	} 	 	for(i=0;i<n;i++) 	{ 		fwrite(&st[i],sizeof(struct student),1,fp);//一次写入一个学生的成绩 	} 	fclose(fp); } void duqu(struct student st[],int n)      //读取数据 { 	int i; 	FILE *fp; 	fp=fopen("G:\\input.dat","rb");//以"读"方式打开一个二进制文件 	if(fp==NULL)	 	{ 		printf("Can't open!\n"); 		exit(0); 	} 	for(i=0;i<7;i++) 	{ 		fread(&st[0],sizeof(struct student),1,fp);//一次读取一个学生的成绩 		printf("                  %s\t%s\t%d\t%d\t%d\n",st[i].no,st[i].name,st[i].math,st[i].english,st[i].computer); 	} 	fclose(fp); }  void main() { 	struct student st[7]={  {"01","王芳",78,77,90}, 							{"02","张强",89,67,88}, 							{"03","李浩",56,66,78}, 							{"04","黄鹏",89,86,85}, 							{"05","尚校",67,88,76}, 							{"06","赵鹏",45,54,67}, 							{"07","蒋泽",78,76,70}}; 	printf("   ★★★★★★★★★★★★本题的实验数据为数据：★★★★★★★★★★★★★★\n"); 	cunchu(st,7);//存盘input.dat 	duqu(st,7);//读取数据 	printf("   ★★★★★★★★★★★★对各科的成绩分析如下：★★★★★★★★★★★★★★\n"); 	printf("        本实验采取switch()语句，分别1~3中的表示不同的学科\n        输入1表示计算关于数学方面的成绩；\n        输入2表示计算关于英语方面的成绩；\n        输入3表示计算关于计算机方面的成绩；\n"); 	subject(st,7);//按各科成绩排序 	subject(st,7);//按各科成绩排序 	subject(st,7);//按各科成绩排序 	printf("   ★★★★★★★★★★★★关于个人平均成绩分析：★★★★★★★★★★★★★★\n"); 	studentave(st,7);//计算每个人的平均成绩并排序 	printf("   ★★★★★★★★★★★★按照不同条件查询分析：★★★★★★★★★★★★★★\n"); 	nosearch(st,7);//按学号查找学生的各门成绩 	namesearch(st,7);//按姓名查找学生的各门成绩  }

void subject(student st[],int n)  改成：  void subject(struct student st[],int n)  C语言要求加上struct关键字  同理其他地方的

引用 4 楼 l357630798 的回复:你使用的是C++编译器还是C编译器？  如果是C++编译器，你的代码是没问题的。  如果是C编译器，那么就是有问题的。 void subject(struct student st[],int n) 函数参数前也要加struct关键字 for(int j=0;j<n-1-i;j++)  不能这样定义变量j ;   要int j = 0; 单独定义。 nosearch  函数里面的变量n与参数重名了。  问题很多，你自己找一下吧。  补充，我的意思是如果C++编译器，void subject(struct student st[],int n) 函数参数前不需要加struct关键字。

#if 0 #include "stdio.h" #include "string.h" #include "stdlib.h" #endif #include <stdio.h> #include <stdlib.h> #include <string.h>  #define N 7 #define MAX_STU_NUM 7  struct student {     char name[20];  //姓名     char no[10];    //学号     int math;       //数学分数     int english;    //英语分数     int computer;   //计算机分数     int score;      //交换用分数     int eveave;     //个人平均分 }; struct student st[N];         //定义学生结构体 void subject(struct student st[],int n)//选定某个学科进行分析 {      int number;     int temp;     printf("        请选择要分析的学科: ");     scanf("%d", &number);     int i=0;     switch(number)     {         case 1:             printf("     以下是关于数学的成绩分析：\n");             for(i=0;i<n;i++)                 st[i].score=st[i].math;             break;         case 2:             printf("       以下是关于英语的成绩分析：\n");             for(i=0;i<n;i++)                 st[i].score=st[i].english;              break;         case 3:             printf("      以下是关于计算机成绩分析：\n");             for(i=0;i<n;i++)                 st[i].score=st[i].computer;             break;     }     int j;     printf("        按学号每个人的原始数据为:\n");     for(i=0;i<n;i++)         printf("        %d\n",st[i].score);     printf("        排序后的数据为\n");     for(i=0;i<n-1;i++)     {          for(j=0;j<n-i;j++)             if(st[j+1].score<st[j].score)             {                 temp=st[j].score;                 st[j].score=st[j+1].score;                 st[j+1].score=temp;             }     }     for(i=0;i<n;i++)         printf("        %d\n",st[i].score);     printf("        该门课的平均成绩为：\n");     float sum=0;     float courseave;     for(i=0;i<n;i++)     {         sum=sum+st[i].score;     }     courseave=sum/7;     printf("        %f\n",courseave);     printf("        该门课的最高分为：\n");     int max=st[0].score;     for(i=0;i<n;i++)     {         if(st[i].score>max)         {             max=st[i].score;         }     }     printf("        %d\n",max);//最高分     printf("        该门课的最低分为：\n");     int min=st[0].score;     for(i=0;i<n;i++)     {         if(st[i].score<min)         {             min=st[i].score;         }     }     printf("        %d\n",min);//最低分     int bjg=0;     int jg=0;     int zd=0;     int lh=0;     int yx=0;     for(i=0;i<n;i++)     {         if(st[i].score<60)    //计算不及格人数         {             bjg++;         }         if(st[i].score>=60&&st[i].score<70)//计算60~69人数         {             jg++;         }         if(st[i].score>=70&&st[i].score<80)//计算70~79人数         {             zd++;         }         if(st[i].score>=80&&st[i].score<90)//计算80~89人数         {             lh++;         }         if(st[i].score>=90)//计算90分以上人数         {             yx++;         }     }     printf("该门课的不及格人数为：\n %d\n60~69人数：\n%d\n70~79人数：\n%d\n80~89人数：\n %d\n90分以上人数：\n%d\n",bjg,jg,zd,lh,yx);    } void studentave(struct student st[],int n)//计算每个人的平均成绩并排序 {     int i, j;     int temp;     for(i = 0; i < n; i++) {         st[i].eveave=(st[i].math+st[i].english+st[i].computer)/4;     }     printf("        每个人平均成绩为：\n");     for(i=0;i<n;i++)         printf("        %d\n",st[i].eveave);      for(i = 0; i < n-1; i++)     {         for(j = 0; j < n-1-i; j++)             if(st[j].eveave > st[j+1].eveave)             {                 temp=st[j].eveave;                 st[j].eveave=st[j+1].eveave;                 st[j+1].eveave=temp;             }     }     printf("        平均成绩排序为：\n");     for(i=0;i<n;i++)         printf("        %d\n",st[i].eveave); }  void nosearch(struct student st[],int n)//按学号查找学生的各门成绩 {     int i=0;     n=7;     char no[10];     printf("        请输入要查找的学生号:");     scanf("%s",no);     while(strcmp(no,st[i].no)==0&&i<n)         i++;     if(i==n)     {         printf("        meizhaodao\n");     }     else         printf("        %s\t%s\t%d\t%d\t%d\n",st[i].no,st[i].name,st[i].math,st[i].english,st[i].computer); } void namesearch(struct student st[],int n)//按姓名查找学生的各门成绩 {     int i=0;     n=7;     char name[20];     printf("        请输入要查找的姓名:");     scanf("%s", name);     while(strcmp(name,st[i].name)==0&&i<7)         i++;     if(i==n)     {         printf("        meizhaodao\n");     }     else         printf("        %s\t%s\t%d\t%d\t%d\n",st[i].no,st[i].name,st[i].math,st[i].english,st[i].computer); } void cunchu(struct student st[],int n)    //存盘 {     int i;     FILE *fp;     fp=fopen("C:\\RJ\\input.dat","wb");//以"写"方式打开一个二进制文件     if(fp==NULL)     {         printf("Can't open!\n");         exit(0);     }      for(i=0;i<n;i++)     {         fwrite(&st[i],sizeof(struct student),1,fp);//一次写入一个学生的成绩     }     fclose(fp); } void duqu(struct student st[],int n)      //读取数据 {     int i;     FILE *fp;     fp=fopen("C:\\RJ\\input.dat","rb");//以"读"方式打开一个二进制文件     if(fp==NULL)     {         printf("Can't open!\n");         exit(0);     }     for(i=0;i<7;i++)     {         fread(&st[0],sizeof(struct student),1,fp);//一次读取一个学生的成绩         printf("                  %s\t%s\t%d\t%d\t%d\n",st[i].no,st[i].name,st[i].math,st[i].english,st[i].computer);     }     fclose(fp); }  int main(int argc, const char *argv[]) {     struct student st[7]={  {"01","王芳",78,77,90},         {"02","张强",89,67,88},         {"03","李浩",56,66,78},         {"04","黄鹏",89,86,85},         {"05","尚校",67,88,76},         {"06","赵鹏",45,54,67},         {"07","蒋泽",78,76,70}};     printf(" 本题的实验数据为数据：\n");     cunchu(st,7);//存盘input.dat     duqu(st,7);//读取数据     printf("  对各科的成绩分析如下：\n");     printf("        本实验采取switch()语句，分别1~3中的表示不同的学科\n        输入1表示计算关于数学方面的成绩；\n        输入2表示计算关于英语方面的成绩；\n        输入3表示计算关于计算机方面的成绩；\n");     subject(st,7);//按各科成绩排序     subject(st,7);//按各科成绩排序     subject(st,7);//按各科成绩排序     printf("   关于个人平均成绩分析：\n");     studentave(st,7);//计算每个人的平均成绩并排序     printf("   按照不同条件查询分析：\n");     nosearch(st,7);//按学号查找学生的各门成绩     namesearch(st,7);//按姓名查找学生的各门成绩     return 0; }   主要是两个问题: 1)函数参数没有类型, student不是类型,所以需要加上struct;2) scanf的第二个参数如果是数组,不需要再加&； 以上是我改后的代码,你对比一下吧

不对呀大兄弟

struct student st[7];  把struct去掉； student 已经是一种数据类型了，不需要再使用struct关键字，谢谢！


Question: 求大神找找这个程序错误的原因

最后一个for循环的循环条件改成 i < 4

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

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

懂了懂了懂了

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

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

手速慢了一下，2楼的兄弟就赶上了我。

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

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

#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; }


Question: 手机敲代码

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

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

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

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

拿双筷子喝汤效率能高?

有。叫c4啥来着。可以编c/c++。亲测可用。

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

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

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

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

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

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

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

最后手机安装上后就再也没用过了。

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

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

可以用CppDroid  不过想好好学用电脑吧

编程还是用电脑有感觉

手机上还不如看点别的更好

敲代码用什么手机，效率又低又不好用。


Question: while ，do while，for，循环的区别，求解答

引用 25 楼 qq_36639412 的回复:[quote=引用 19 楼 hongwenjun 的回复:] char* csTrim_v2(char* cs) {     char* ret = cs;     char* pc = new char[strlen(cs) + 1];      int pos = strspn(cs , "\t \n");     // 查找非空白处pos     strcpy(pc , cs + pos);      char* end = pc;     while (*end++)     // 找到字符串末位的'\0'，         ;              // 因为上面 end++，实际指针在 '\0'的后一个     end -= 2;          // 所以退2格，回到字符串最后一个字母      while (*end == ' ' || *end == '\t' ||  *end == '\n') {         *end-- = '\0';     }     strcpy(cs , pc);      delete[] pc;     return ret; }   char* cs_strrev(char* string) {     char* start = string;     char* left = string;     char ch;      while (*string++) // 找到string 末位的'\0'，         ;             // 因为上面 string++，实际指针在 '\0'的后一个     string -= 2;      // 所以退2格，回到字符串最后一个字母     while (left < string) {         ch = *left;    // 通过临时变量 ch 进行交换         *left++ = *string;         *string-- = ch;     }     return(start); } 使用 while 可以把代码写的简短。  /*-----------------------------------------------*/ 使用  for  可以方便表示一个区间 遍历    // iterate foo: inserting into bar   for (auto it = std::begin(foo); it!=std::end(foo); ++it)     bar.push_back(*it);    // iterate bar: print contents:   std::cout << "bar contains:";   for (auto it = std::begin(bar); it!=std::end(bar); ++it)     std::cout << ' ' << *it;   std::cout << '\n';  while，do whil是不是先算表达式如果为真再执行语句，最后I++?还是i++在哪就算哪？[/quote]  while先计算 do while最后算 是的

引用 19 楼 hongwenjun 的回复:char* csTrim_v2(char* cs) {     char* ret = cs;     char* pc = new char[strlen(cs) + 1];      int pos = strspn(cs , "\t \n");     // 查找非空白处pos     strcpy(pc , cs + pos);      char* end = pc;     while (*end++)     // 找到字符串末位的'\0'，         ;              // 因为上面 end++，实际指针在 '\0'的后一个     end -= 2;          // 所以退2格，回到字符串最后一个字母      while (*end == ' ' || *end == '\t' ||  *end == '\n') {         *end-- = '\0';     }     strcpy(cs , pc);      delete[] pc;     return ret; }   char* cs_strrev(char* string) {     char* start = string;     char* left = string;     char ch;      while (*string++) // 找到string 末位的'\0'，         ;             // 因为上面 string++，实际指针在 '\0'的后一个     string -= 2;      // 所以退2格，回到字符串最后一个字母     while (left < string) {         ch = *left;    // 通过临时变量 ch 进行交换         *left++ = *string;         *string-- = ch;     }     return(start); } 使用 while 可以把代码写的简短。  /*-----------------------------------------------*/ 使用  for  可以方便表示一个区间 遍历    // iterate foo: inserting into bar   for (auto it = std::begin(foo); it!=std::end(foo); ++it)     bar.push_back(*it);    // iterate bar: print contents:   std::cout << "bar contains:";   for (auto it = std::begin(bar); it!=std::end(bar); ++it)     std::cout << ' ' << *it;   std::cout << '\n';  while，do whil是不是先算表达式如果为真再执行语句，最后I++?还是i++在哪就算哪？

引用 20 楼 zhu339111520 的回复:看楼上长篇大论的，实际上有个叼区别，毛区别都没得，随便你用啥，具体看业务  一般情况下线程执行的时候用while循环，遍历固定的数的时候用for循环，do...while写了这么多年代码从来没用过 先算表达式、语句、再I++？是不是这种顺序

引用 22 楼 paschen 的回复:[quote=引用 21 楼 qq_36639412 的回复:] [quote=引用 17 楼 paschen 的回复:] [quote=引用 16 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 I++怎么算，for比较好理解是固定表达式，最后算i++，while， do while怎么算过程顺序，I++什么时候算，  引用 15 楼 paschen 的回复:[quote=引用 11 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？[/quote]  while，do while中你把i++放哪就在哪计算啦[/quote] 比如int i=0,j=1,sum; while (i<=100；i++) { sum=i+j; printf("%d\n",j); 这个位置的j++怎么算的？[/quote]  没有while (i<=100；i++)这种用法，建议楼主先把基础打好了[/quote] 意思就是说这些i++最后算还是左到右，上到下顺序，[/quote]  没有while (i<=100；i++)这种用法，你可以写成：  while (i<=100) {   //.........   i++; }[/quote] 先算表达式然后语句再i++?

引用 21 楼 qq_36639412 的回复:[quote=引用 17 楼 paschen 的回复:] [quote=引用 16 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 I++怎么算，for比较好理解是固定表达式，最后算i++，while， do while怎么算过程顺序，I++什么时候算，  引用 15 楼 paschen 的回复:[quote=引用 11 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？[/quote]  while，do while中你把i++放哪就在哪计算啦[/quote] 比如int i=0,j=1,sum; while (i<=100；i++) { sum=i+j; printf("%d\n",j); 这个位置的j++怎么算的？[/quote]  没有while (i<=100；i++)这种用法，建议楼主先把基础打好了[/quote] 意思就是说这些i++最后算还是左到右，上到下顺序，[/quote]  没有while (i<=100；i++)这种用法，你可以写成：  while (i<=100) {   //.........   i++; }

引用 17 楼 paschen 的回复:[quote=引用 16 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 I++怎么算，for比较好理解是固定表达式，最后算i++，while， do while怎么算过程顺序，I++什么时候算，  引用 15 楼 paschen 的回复:[quote=引用 11 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？[/quote]  while，do while中你把i++放哪就在哪计算啦[/quote] 比如int i=0,j=1,sum; while (i<=100；i++) { sum=i+j; printf("%d\n",j); 这个位置的j++怎么算的？[/quote]  没有while (i<=100；i++)这种用法，建议楼主先把基础打好了[/quote] 意思就是说这些i++最后算还是左到右，上到下顺序，

引用 11 楼 qq_36639412 的回复:[quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？[/quote]  while，do while中你把i++放哪就在哪计算啦

理解和讨论之前请先学会如何观察！

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  计算机组成原理→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执行停在该断点处的时候。

使用 while 可以把代码写的简短。 使用  for  可以方便表示一个区间 遍历 do  好像不太好看

引用 16 楼 qq_36639412 的回复:[quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 I++怎么算，for比较好理解是固定表达式，最后算i++，while， do while怎么算过程顺序，I++什么时候算，  引用 15 楼 paschen 的回复:[quote=引用 11 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？[/quote]  while，do while中你把i++放哪就在哪计算啦[/quote] 比如int i=0,j=1,sum; while (i<=100；i++) { sum=i+j; printf("%d\n",j); 这个位置的j++怎么算的？[/quote]  没有while (i<=100；i++)这种用法，建议楼主先把基础打好了

引用 2 楼 paschen 的回复:for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 I++怎么算，for比较好理解是固定表达式，最后算i++，while， do while怎么算过程顺序，I++什么时候算，  引用 15 楼 paschen 的回复:[quote=引用 11 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？[/quote]  while，do while中你把i++放哪就在哪计算啦[/quote] 比如int i=0,j=1,sum; while (i<=100；i++) { sum=i+j; printf("%d\n",j); 这个位置的j++怎么算的？

引用 6 楼 zhao4zhong1 的回复:for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }  不要使用 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;  //... } 类似的例子还可以举很多。  整数I++表达式的类型怎么算，for是固定表达式，最后算I++,for比较好理解，那while ，do while怎么算I++的顺序

引用 2 楼 paschen 的回复:for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？

引用 1 楼 shihengzhen101 的回复:给你写个等价的语句吧，你对比一下就明白了，执行顺序是一样的，就是求1到10的和，结果放到变量sum中  while循环  	int num = 1; 	int sum = 0; 	while(num <= 10) 	{ 		sum = sum + num;                 ++num； 	} 	printf("%d\n", sum);   do while循环  	int num = 1; 	int sum = 0; 	do 	{ 		sum = sum + num; 		++num; 	}while(num <= 10)  	printf("%d\n", sum);   for循环  	int num = 1; 	int sum = 0; 	for (num = 1; num <= 10; ++num) 	{ 		sum = sum + num; 	} 	printf("%d\n", sum);   执行步骤都是一样的，你对比一下就好 那关于I++，for比较好理解是固定表达式1，2表达式，语句，3就是最后算I++,                    while，do while，怎么算I++的？

引用 8 楼 qq_36639412 的回复:[quote=引用 1 楼 shihengzhen101 的回复:] 给你写个等价的语句吧，你对比一下就明白了，执行顺序是一样的，就是求1到10的和，结果放到变量sum中  while循环  	int num = 1; 	int sum = 0; 	while(num <= 10) 	{ 		sum = sum + num;                 ++num； 	} 	printf("%d\n", sum);   do while循环  	int num = 1; 	int sum = 0; 	do 	{ 		sum = sum + num; 		++num; 	}while(num <= 10)  	printf("%d\n", sum);   for循环  	int num = 1; 	int sum = 0; 	for (num = 1; num <= 10; ++num) 	{ 		sum = sum + num; 	} 	printf("%d\n", sum);   执行步骤都是一样的，你对比一下就好 谢了，现在分类比之前清晰一些了，while先执行循环控制条件表达式，在执行循环体语句，do while就是反过来，先循环体语句，所以至少执行一次，再执行条件表达式，for就是表达式1、2、3，循环初始化、循环条件、循环赋值，[/quote]  嗯嗯，就是这个意思

引用 1 楼 shihengzhen101 的回复:给你写个等价的语句吧，你对比一下就明白了，执行顺序是一样的，就是求1到10的和，结果放到变量sum中  while循环  	int num = 1; 	int sum = 0; 	while(num <= 10) 	{ 		sum = sum + num;                 ++num； 	} 	printf("%d\n", sum);   do while循环  	int num = 1; 	int sum = 0; 	do 	{ 		sum = sum + num; 		++num; 	}while(num <= 10)  	printf("%d\n", sum);   for循环  	int num = 1; 	int sum = 0; 	for (num = 1; num <= 10; ++num) 	{ 		sum = sum + num; 	} 	printf("%d\n", sum);   执行步骤都是一样的，你对比一下就好 谢了，现在分类比之前清晰一些了，while先执行循环控制条件表达式，在执行循环体语句，do while就是反过来，先循环体语句，所以至少执行一次，再执行条件表达式，for就是表达式1、2、3，循环初始化、循环条件、循环赋值，

本质上没区别，不同写法。


Question: 请问C语言头文件加了#pramga once后, 对应的实现文件还需要加吗？

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

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

不需要

不需要了

不需要，你都不会去“包含”实现文件，又怎么会出现重复呢


Question: 编写程序，实现对索引顺序表的查找。（即分块查找）

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

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

scanf("%d",key);  改成：  scanf("%d",&key);  同理其他的scanf


Question: 【请教】VC中输入的数字变成“*”怎么无法判断

你把gets(password);换成password[j]='\0';就OK了

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   比较结果相等


Question: 关于函数的递归调用的问题

修改后变成无限循环。

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

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

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

pasw(pointer_pw,po[7]);  改成：  pasw(pointer_pw,po);


Question: 扑克牌

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]; 		} 	} }   大致思路便是这样

用一个数组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高级编程实例精解》（刘滨 编著）都是较大的实用的程序。


Question: C语言，fgets（）函数使用，文件结尾判断

已经解决了，原来是用null判断的


Question: 一道c语言选择题~~~

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

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

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

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

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

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

没有人吗。。。

说反了是选C，D没有'\0'


Question: 从网上下了一个基于散列通讯录的数据结构课程设计   用C语言的  求大神给解释一下

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


Question: 凯撒密码出现的问题

感谢楼上所有的回复，问题已经解决了，小白感谢大佬们

注意,把infile outfile在打开文件的地方将其的双引号去掉,因为infile和outfile是字符数组,输入字符串后在打开时不需要在加上双引号；

#include<stdio.h> #include<stdlib.h> #include<windows.h> char encrypt(char ch,int n)/*加密函数，把字符向右循环移位n*/ { while(ch>='A'&&ch<='Z') {   return ('A'+(ch-'A'+n)%26); } while(ch>='a'&&ch<='z') {   return ('a'+(ch-'a'+n)%26); } return ch; } void menu()/*菜单，1.加密，2.解密，3.暴力破解，密码只能是数字*/ { system("cls"); printf("\n========================================================="); printf("\n1.Encrypt the file"); printf("\n2.Decrypt the file"); printf("\n3.Force decrypt file"); printf("\n4.Quit\n"); printf("=========================================================\n"); printf("Please select a item:"); return; } main() { int i,n; char ch0,ch1; FILE *in,*out; char infile[20],outfile[20]; system("cls"); Sleep(3);/*等待3秒*/ menu(); ch0=getchar(); while(ch0!='4') {   if(ch0=='1')   {   system("cls");/*清屏*/   printf("\nPlease input the infile:");   scanf("%s",infile);/*输入需要加密的文件名*/   if((in=fopen("infile","r"))==NULL) /*注意此处*/   {   printf("Can not open the infile!\n");           printf("Press any key to exit!\n");           getchar();           exit(0);   }   printf("Please input the key:");   scanf("%d",&n);/*输入加密密码*/    printf("Please input the outfile:");    scanf("%s",outfile);/*输入加密后文件的文件名*/    if((out=fopen("outfile","w"))==NULL) /*注意此处*/    {     printf("Can not open the outfile!\n");     printf("Press any key to exit!\n");     fclose(in);     getchar();     exit(0);    }    while(!feof(in))/*加密*/    {     fputc(encrypt(fgetc(in),n),out);/*如果in文件可以继续读取数据.                                        那么                                        fputc(fgetc(in),out)                                        读取in文件的一个字符然后文件指针in后移一个char长度,                                        然后输出到out文件中out文件指针后移一个char长度.*/    }    printf("\nEncrypt is over!\n");    fclose(in);    fclose(out);    Sleep(1);   }   if(ch0=='2')   {   system("cls");       printf("\nPlease input the infile:");       scanf("%s",infile);/*输入需要解密的文件名*/       if((in=fopen("infile","r"))==NULL)    /*注意此处*/    {     printf("Can not open the infile!\n");     printf("Press any key to exit!\n");     getchar();     exit(0);    }    printf("Please input the key:");    scanf("%d",&n);/*输入解密密码（可以为加密时候的密码）*/    n=26-n;    printf("Please input the outfile:");    scanf("%s",outfile);/*输入解密后文件的文件名*/    if((out=fopen("outfile","w")) == NULL)  /*注意此处*/    {     printf("Can not open the outfile!\n");     printf("Press any key to exit!\n");     fclose(in);     getchar();     exit(0);    }    while(!feof(in))    {     fputc(encrypt(fgetc(in),n),out);    }    printf("\nDecrypt is over!\n");    fclose(in);    fclose(out);    Sleep(1);   }   if(ch0=='3')   {    system("cls");    printf("\nPlease input the infile:");    scanf("%s",infile);/*输入需要解密的文件名*/    if((in=fopen("infile","r")) == NULL)   /*注意此处*/    {     printf("Can not open the infile!\n");     printf("Press any key to exit!\n");     getchar();     exit(0);    }    printf("Please input the outfile:");    scanf("%s",outfile);/*输入解密后文件的文件名*/    if((out=fopen("outfile","w")) == NULL)    /*注意此处*/    {     printf("Can not open the outfile!\n");     printf("Press any key to exit!\n");     fclose(in);     getchar();     exit(0);    }    for(i=1;i<=25;i++)/*暴力破解过程，在察看信息正确后，可以按'Q'或者'q'退出*/    {     rewind(in);     rewind(out);     system("cls");     printf("==========================================================\n");     printf("The outfile is:\n");     printf("==========================================================\n");     while(!feof(in))     {      ch1=encrypt(fgetc(in),26-i);      putchar(ch1);      fputc(ch1,out);     }     printf("\n========================================================\n");     printf("The current key is: %d \n",i);/*显示当前破解所用密码*/     printf("Press 'Q' to quit and other key to continue......\n");     printf("==========================================================\n");     ch1=getchar();     if(ch1=='q'||ch1=='Q')/*按'Q'或者'q'时退出*/     {      system("cls");      printf("\nGood Bye!\n");      fclose(in);      fclose(out);      Sleep(3);      exit(0);     }    }    printf("\nForce decrypt is over!\n");    fclose(in);    fclose(out);    Sleep(1);   }   menu();   ch0=getchar(); } system("cls");         printf("\nGood Bye!\n"); Sleep(3); return 0; }    注意你打开文件处的错误

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


Question: C语言作业的问题

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

int flag1 = 0, flag2, mode;    c  后面多了一个c   while (betmoney>money)  这里money没有定义


Question: 请问VS2015自己定义的C语言头文件，声明和实现分别应该放在哪个路径？假设VS2015装在C盘

引用 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]   好了，感谢！

引用 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，不是只放到目录下，项目上右键——添加——现有项

放在你Project所在路径，而不是VS安装路径

引用 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]       添加了，编译的时候通过，但是执行就报错，是我代码写错了吗？

引用 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

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

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

防尘补丁安装中。。。。

引用 1 楼 user-1 的回复:放在你Project所在路径，而不是VS安装路径  我是想像stdio,stdarg这些头文件这样，可以重复使用的


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

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


Question: 为什么两次找出的单词不一样？

找到了，刚刚看了很久就是找不出来，蒙了

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

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

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


Question: c语言

++k表示计算但不显示结果而k++是计算显示结果

先取值，打印，最后再加1

为什么要是6？！！

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

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

怎么我看不到我的图！

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

#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;的区别。

k++ 是输出k之后k才加1  如果要输出6，改成++k

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

后++, 先取值，再移动指针


Question: c语言

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

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

#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); }

#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); }

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

printf("请输入6位同学的成绩\n"); scanf("%f",&a[i]);  这儿只读入了一个数据吧，应该加个循环 for(i=0;i<6;i++) scanf("%f",&a[i]);


Question: C语言考试编程题求助

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

scanf("%c",*p);  改成；  scanf("%c",p);  scanf("%c",m);  改成  scanf("%c",&m);


Question: 编程小白问题

谢谢谢谢~~~~

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


Question: C语言错误怎么解决

char  name[20];改成char  *name;也可以

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

strcpy(b.name, "李四");


Question: C语言中带有3个循环的流程图

摒弃使用流程图辅助学习编程。

摒弃使用耨跟流程图辅助学习编程。


Question: 在for循环里的if语句，不进入if语句，希望大神帮帮忙，谢谢；

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

break 跳出循环!

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

你都没有定义i这个变量·


Question: c语言,数据结构,出错

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

已经注意到了,但为什么

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

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

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


Question: c语言结构体成员指针

引用 1楼qq_36409192 的回复:#include <stdio.h>  typedef struct { 	int data; }qwe;   typedef struct { 	int *a; 	int data; }asd;  int main () { 	asd p; 	qwe q; 	q.data=1; 	p.a=&q.data; 	printf("%d",(*p.a)); 	return 0; }我想在结构体中就直接指向另一结构体    读取多个数据

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！ //C++ Operators //  Operators specify an evaluation to be performed on one of the following: //    One operand (unary operator) //    Two operands (binary operator) //    Three operands (ternary operator) //  The C++ language includes all C operators and adds several new operators. //  Table 1.1 lists the operators available in Microsoft C++. //  Operators follow a strict precedence which defines the evaluation order of //expressions containing these operators.  Operators associate with either the //expression on their left or the expression on their right;    this is called //“associativity.” Operators in the same group have equal precedence and are //evaluated left to right in an expression unless explicitly forced by a pair of //parentheses, ( ). //  Table 1.1 shows the precedence and associativity of C++ operators //  (from highest to lowest precedence). // //Table 1.1   C++ Operator Precedence and Associativity // The highest precedence level is at the top of the table. //+------------------+-----------------------------------------+---------------+ //| Operator         | Name or Meaning                         | Associativity | //+------------------+-----------------------------------------+---------------+ //| ::               | Scope resolution                        | None          | //| ::               | Global                                  | None          | //| [ ]              | Array subscript                         | Left to right | //| ( )              | Function call                           | Left to right | //| ( )              | Conversion                              | None          | //| .                | Member selection (object)               | Left to right | //| ->               | Member selection (pointer)              | Left to right | //| ++               | Postfix increment                       | None          | //| --               | Postfix decrement                       | None          | //| new              | Allocate object                         | None          | //| delete           | Deallocate object                       | None          | //| delete[ ]        | Deallocate object                       | None          | //| ++               | Prefix increment                        | None          | //| --               | Prefix decrement                        | None          | //| *                | Dereference                             | None          | //| &                | Address-of                              | None          | //| +                | Unary plus                              | None          | //| -                | Arithmetic negation (unary)             | None          | //| !                | Logical NOT                             | None          | //| ~                | Bitwise complement                      | None          | //| sizeof           | Size of object                          | None          | //| sizeof ( )       | Size of type                            | None          | //| typeid( )        | type name                               | None          | //| (type)           | Type cast (conversion)                  | Right to left | //| const_cast       | Type cast (conversion)                  | None          | //| dynamic_cast     | Type cast (conversion)                  | None          | //| reinterpret_cast | Type cast (conversion)                  | None          | //| static_cast      | Type cast (conversion)                  | None          | //| .*               | Apply pointer to class member (objects) | Left to right | //| ->*              | Dereference pointer to class member     | Left to right | //| *                | Multiplication                          | Left to right | //| /                | Division                                | Left to right | //| %                | Remainder (modulus)                     | Left to right | //| +                | Addition                                | Left to right | //| -                | Subtraction                             | Left to right | //| <<               | Left shift                              | Left to right | //| >>               | Right shift                             | Left to right | //| <                | Less than                               | Left to right | //| >                | Greater than                            | Left to right | //| <=               | Less than or equal to                   | Left to right | //| >=               | Greater than or equal to                | Left to right | //| ==               | Equality                                | Left to right | //| !=               | Inequality                              | Left to right | //| &                | Bitwise AND                             | Left to right | //| ^                | Bitwise exclusive OR                    | Left to right | //| |                | Bitwise OR                              | Left to right | //| &&               | Logical AND                             | Left to right | //| ||               | Logical OR                              | Left to right | //| e1?e2:e3         | Conditional                             | Right to left | //| =                | Assignment                              | Right to left | //| *=               | Multiplication assignment               | Right to left | //| /=               | Division assignment                     | Right to left | //| %=               | Modulus assignment                      | Right to left | //| +=               | Addition assignment                     | Right to left | //| -=               | Subtraction assignment                  | Right to left | //| <<=              | Left-shift assignment                   | Right to left | //| >>=              | Right-shift assignment                  | Right to left | //| &=               | Bitwise AND assignment                  | Right to left | //| |=               | Bitwise inclusive OR assignment         | Right to left | //| ^=               | Bitwise exclusive OR assignment         | Right to left | //| ,                | Comma                                   | Left to right | //+------------------+-----------------------------------------+---------------+

引用 3楼赵4老师 的回复:#include <stdio.h> struct _Y { 	int	d1; 	int	d2; } Y={1,2}; struct _X { 	struct _Y *pY; } X; int main() {     X.pY=&Y;     printf("(X.pY)->d1,(X.pY)->d2:%d,%d\n",(X.pY)->d1,(X.pY)->d2); 	return 0; } //(X.pY)->d1,(X.pY)->d2:1,2 // 可以这样吗 struct ＿x *p； printf（＂%d",p->pY->d1）；


Question: 萌新求助啊，找了半天不知道错在哪

引用 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); }  谢谢各位大佬

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


Question: C语言返回一个数组时，输入数组初始化方式对程序正确性的影响

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

两个程序最后输出的不都是5 1 吗

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

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

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