Question: 求大神帮助 输出最大值 函数部分无法完全执行

#include<stdio.h>  int max(int a,int b,int c);  int main () {      int d,e,f,g;     scanf("%d,%d,%d",&d,&e,&f);     printf("d = %d, e = %d, f = %d\n", d, e, f);     g=max(d,e,f);     printf("%d\n",g);      return 0; }  int max(int a,int b,int c) {     int z,m;     //{     if(a > b)         z = a;     else         z = b;     if(z > c)         m = z;     else         m = c;     //}     return (m); }  代码逻辑没什么问题。无法完全执行是什么意思？ 注意你的输入格式，另外通过一条输出语句检查输入的内容是否正确。

什麽叫做“無法完全執行”呢？輸出最大值的算法不是這樣的，冒泡法、插入排序、選擇排序等等，你總要選擇一種。

楼主可以重新贴下代码吗？太乱了

给楼主提几条建议： 1、楼主你的习惯不好，代码没有达到最基本的美观，可以说让人无法阅读； 2、if语句中不论有几条语句，建议使用{}，因为当{}很多时，可以增强阅读感； 3、问题问的不够详细，太模糊； 总而言之，编程也需要美观，编程规范化，可以使自己与他人在阅读时赏心悦目。

1 #include<stdio.h>                                                                                2    3 int max(int a,int b,int c){   4         int z,m;   5         if(a>b){   6                 z=a;   7         }   8         else{   9                 z=b;  10         }  11         if(z>c){  12                 m=z;  13         }  14         else{  15                 m=c;  16         }  17         return (m);  18 }  19   20 int main(){  21   22         int d,e,f,g;  23         scanf("%d,%d,%d",&d,&e,&f);  24         g=max(d,e,f);  25         printf("%d\n",g);  26         return 0;  27 } ~                                                                                ~                                                                                ~             完全按照你的逻辑编译没有问题啊

没明白什么意思，没问题啊，可以加个断点试试，哪一步出问题

函数部分只能执行第一个 if语句 无法执行第二个 if语句

注意你的scanf函数输入要加逗号，另外养成int main()返回return 0; 的好习惯


Question: 求修改代码求懂Linux下c语言的大神帮忙修改一下代码

你可以通过当前时间初始化随机种子 #include <time.h>  在主函数里生成字符串之前加一句 srand (time(NULL));  红包就不用了，我也是闲着无事，逛逛论坛，在解决别人问题的同时，自己也学习学习

qq: 1060211273

引用 7 楼 ant2012 的回复:generateLettersOrNumbers 中的 int letterCount = rand() % (MAX_COUNT - 1) + 1;	// 为满足至少有一个数字，字母数最多为 MAX_COUNT - 1 int numCount = rand() % (MAX_COUNT - letterCount) + 1; 可以删掉，没用  大神您好，我刚刚按您说的 可以了。但是我把 main 函数里面的循环去掉后。 int main(int argc, char* argv[]) { char* str = generateLettersOrNumbers(); printf("%s\r\n", str); free(str); getchar(); return 0; }  然后关闭程序，在打开程序，每一次运行的结果都是一样的。 只有加上循环语句才会不一样。请问要怎么修改成。不用循环语句。我关闭程序后，在打开结果又不一样。 您能方便留下联系方式吧。想发个红包表示感谢

这个就是你要求的（长度不能超过20个字符串）

在include下，加一个#define MAX_COUNT 20

引用 2 楼 ant2012 的回复:这是在cpp环境中运行的，可能会有定义变量必须在函数体前面的问题，你稍微改下就好  能留下您的qq或者其他联系吗 表示想感谢一下

引用 2 楼 ant2012 的回复:这是在cpp环境中运行的，可能会有定义变量必须在函数体前面的问题，你稍微改下就好  大神您好，我使用您代码，他显示 error C2065: 'MAX_COUNT' : undeclared identifier  这个我要怎么修改呢

char generateLetter() { 	return rand() % 26 + 'a'; }  char generateNum() { 	return rand() % 10 + '0'; }  char* generateLettersOrNumbers() { 	int letterCount = rand() % (MAX_COUNT - 1) + 1;	// 为满足至少有一个数字，字母数最多为 MAX_COUNT - 1 	int numCount = rand() % (MAX_COUNT - letterCount) + 1; 	int totalCount = rand() % MAX_COUNT + 1; 	bool existLetter = false; 	bool existNum = false; 	char* str = (char*)malloc(totalCount + 1);  	// 随机生成totalCount-1个字母或数字 	int i = 0; 	for (; i < totalCount - 1; i++) { 		if (rand() % 2 == 0) { 			existLetter = true; 			str[i] = generateLetter(); 		} else { 			existNum = true; 			str[i] = generateNum(); 		} 	}  	// 如何前面生成的字符中没有字母或数字，则补齐 	if (existLetter && existNum) { 		// 字母和数字都有 		if (rand() % 2 == 0) { 			str[i] = generateLetter(); 		} else { 			str[i] = generateNum(); 		} 	} else if (!existLetter) { 		// 没有字母 		str[i] = generateLetter(); 	} else { 		// 没有数字 		str[i] = generateNum(); 	}  	str[totalCount] = '\0';  	return str; }  int main(int argc, char* argv[]) { 	for (int i = 0; i < 10; i++) { 		char* str = generateLettersOrNumbers(); 		printf("%s\r\n", str); 		free(str); 	} 	getchar(); }


Question: 求大神赐教 不知道哪里错了    使用函数 冒泡法排序   输入的时候只能由大到小才能输出正确的

if 后面为什么不加{}?

if(i[t]>i[t+1])       h=i[t];       i[t]=i[t+1];       i[t+1]=h;  改为  if(i[t]>i[t+1]) {       h=i[t];       i[t]=i[t+1];       i[t+1]=h; }

#include <stdio.h> void sort(int i[], int n) { 	int w, t; 	for (w = 0; w < n - 1; w++) 	{ 		for (t = 0; t<n - 1 - w; t++) 		{ 			if (i[t] > i[t + 1]) 			{ 				int temp = i[t]; 				i[t] = i[t + 1]; 				i[t + 1] = temp; 			} 		} 	} } int main() { 	int w, a[4]; 	for (w = 0; w<4; w++) 		scanf("%d", &a[w]); 	sort(a, 4); 	for (w = 0; w<4; w++) 		printf("%5d", a[w]); 	printf("\n"); 	return 0; } 注意加括号

排序的那一段，if语句附近的花括号用错了，所以作用域出现了一些错误，正确语句如下 for(i=0;i<9;i++)  for(j=0;j<9-i;j++)  if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } 翻了上学期的C语言书，复习了一遍才找到可能的错误，希望你能参考，然后表示下有用。。。

按照你写的算法，如果在if之前加的大括号，是提供给for作为作用域标注的，而不是if的作用域。 按照if的语法，只有在if判断过后，加上大括号，才能表明那一块区域的语句是if的作用域。

为什么不能在if之前加括号？


Question: error C2601: 'f1' : local function definitions are illegal 出现这个错误是为什么啊？

程序里有些空格是特殊符号  打不出来

太乱了 可能是哪里没加} 括号 检查一下吧

你程序那几个f开头的函数，每个函数只有两个return, 还少了一个，比如说f1, 假如x, y，不满足那两个if判断，即两个if表示式返回都为false，就没有返回值，if，for里的逻辑最好用{}括起来，这样代码逻辑看得比较清楚


Question: 结构体

去掉number和name前面的&;因为这两个本身就是字符串，字符串名就是地址，因此不需要再加&.如果加了&就会有问题了。

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

谢谢，还想问一个问题 就是书上说学生管理系统要建立三个文件，分别是 smssmain.c  stulist.c  stulist.h  是不是这样建的？？

inputa调用有问题，你在input函数里调用inputa时，已经通过pstu+i的方式将指针指向了某个student对象，为何还要在inputa里再对pstu偏移一次。 解决办法，要么将inputa(pstu + i, i) 改成 inputa(pstu, i)。要么将inputa的第二个参数i，去掉。从代码规范来讲，建议采用第二种

烫烫烫明显就是 char 数组这里的问题了


Question: 怎么用VC6写界面，拜托各位大佬，论坛我已经搜索过了

学一下C++  然后直接下一个QT5，MFC太老了。。。做出来的界面你自己瞅瞅

可以看一下孙鑫的VC++变成详解

建议不要去看MFC的东西了，直接上QT吧，并不难

用vs2010，我只修改了1行代码，浏览器就做好了，而且还是office2003风格的（当然你也可以用vs风格，office2007风格等）  下载：https://download.csdn.net/download/caozhy/10411311 https://download.csdn.net/download/caozhy/10411383

百度深入浅出MFC，有你想要的

MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl MSDN98\SAMPLES\VC98\MFC\TUTORIAL\SCRIBBLE\STEP1～7\*.*

做界面还是直接面向对象吧。。。

别进坑了....

现在嗨哟弄VC6，why？这么多不兼容的东西

建议先学C++和windows。然后看看《windows 程序设计》和mfc相关书籍

刚学完C语言基础，就学MFC。 建议先学C++和windows。

新建VC++6.0的菜单栏中选择“文件->新建"，之后选择“MFC AppWizard（exe）”  在输入了项目名称之后，选择“确定” 之后选择应用程序类型，基于对话框、基于单文档和基于多文档  一般选择基于对话框就可以了。 剩下的就可以在工具箱里面拖拽控件，即可完成界面设计

楼主是想自己用c语言画界面？那这个有些难度。需要自己构建 GUI系统，然后调用显卡api。 如果这些都实现了，楼主就是高手了，可以去某某著名公司。

printf无法写界面。要是不借助其他库，那就是直接用Windows API写，包含windows.h就行。这个可以参考《Windows程序设计（第五版）》。

mfc的工程就可以了啊

个人觉得SDK纯API方式编写GUI程序已经过时了，效率太低，了解一下原理就可以了，主要是消息机制。  图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  　　C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面，利用可视的组件/控件像“搭积木”一样，以“所见即所得”的方式搭建应用程序的界面，这也是C++ Builder这个名字中Builder的概念。这样，只需要用C++语言编写业务逻辑代码，类似于DOS下文本界面编程，只要专注于实现业务逻辑功能就可以了，代码非常简洁。数据的输入和表现，都在图形用户界面，非常直观、易用。这就是RAD开发（Rapid Application Development，快速应用程序开发）。  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。  仅供参考： 初学者学习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/

api,,,,不过刚开始有点烦

不用第三方库，那就只有MFC或者windows API了。MFC比较简单一些。但你学的是“C语言基础”，不是C++，所以基本上使用WIndows API是唯一选择。 windows下，C的界面库原生的就是API，若是用mingw编译器，应该还有一些可以用。学完C++，则Qt是最棒的。

别建控制台  新建一个MFC工程 百度VC6.0 MFC


Question: 求助！大一字符数组排序！

引用 1 楼 ant2012 的回复:楼主你想问什么，你那几个txt文件的数据是什么，不过你的代码有些问题，如s1和s2的大小都是N，而且都从各自的文本里读取最多N个字符，但假如真实读取的字符strlen(s1)+strlen(s2) >= N就会导致strcat时s1越界，一但发生这种情况，得到的结果是不可预料的，而且，你在冒泡排序时（即你那两个for循环）for(j=0;j<2*N-1-i;j++)，j可能取到 2*N - 1的值，已经超过你给s1分配的N。 修改方案参考如下： #include <stdio.h> #include <conio.h> #include <stdlib.h> #include<string.h>  #define N 20  int main(int argc, char* argv[]) { 	FILE *fp1, *fp2, *fp3; 	char s1[2 * N], s2[N], temp; 	int i, j; 	if ((fp1 = fopen("D:\\6.13\\A.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	if ((fp2 = fopen("D:\\6.13\\B.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fgets(s1, N, fp1); 	fgets(s2, N, fp2); 	fclose(fp1); 	fclose(fp2);  	strcat(s1, s2); 	int totalCount = strlen(s1);	// s1和s2实际读取字符的总个数 	for (i = 0; i < totalCount; i++) 	{ 		if (s1[i] >= 'A' && s1[i] <= 'Z') s1[i] += 32; 	} 	puts(s1);  	for (i = 0; i < totalCount - 1; i++) 	{ 		for (j = 0; j < totalCount - 1 - i; j++) 		{ 			if (s1[j] > s1[j + 1]) 			{ 				temp = s1[j]; 				s1[j] = s1[j + 1]; 				s1[j + 1] = temp; 			} 		} 	}  	puts(s1); 	if ((fp3 = fopen("D:\\6.13\\C.txt", "w")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fputs(s1, fp3); 	fputs("\n", fp3); 	return 0; }  引用 1 楼 ant2012 的回复:楼主你想问什么，你那几个txt文件的数据是什么，不过你的代码有些问题，如s1和s2的大小都是N，而且都从各自的文本里读取最多N个字符，但假如真实读取的字符strlen(s1)+strlen(s2) >= N就会导致strcat时s1越界，一但发生这种情况，得到的结果是不可预料的，而且，你在冒泡排序时（即你那两个for循环）for(j=0;j<2*N-1-i;j++)，j可能取到 2*N - 1的值，已经超过你给s1分配的N。 修改方案参考如下： #include <stdio.h> #include <conio.h> #include <stdlib.h> #include<string.h>  #define N 20  int main(int argc, char* argv[]) { 	FILE *fp1, *fp2, *fp3; 	char s1[2 * N], s2[N], temp; 	int i, j; 	if ((fp1 = fopen("D:\\6.13\\A.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	if ((fp2 = fopen("D:\\6.13\\B.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fgets(s1, N, fp1); 	fgets(s2, N, fp2); 	fclose(fp1); 	fclose(fp2);  	strcat(s1, s2); 	int totalCount = strlen(s1);	// s1和s2实际读取字符的总个数 	for (i = 0; i < totalCount; i++) 	{ 		if (s1[i] >= 'A' && s1[i] <= 'Z') s1[i] += 32; 	} 	puts(s1);  	for (i = 0; i < totalCount - 1; i++) 	{ 		for (j = 0; j < totalCount - 1 - i; j++) 		{ 			if (s1[j] > s1[j + 1]) 			{ 				temp = s1[j]; 				s1[j] = s1[j + 1]; 				s1[j + 1] = temp; 			} 		} 	}  	puts(s1); 	if ((fp3 = fopen("D:\\6.13\\C.txt", "w")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fputs(s1, fp3); 	fputs("\n", fp3); 	return 0; }  引用 1 楼 ant2012 的回复:楼主你想问什么，你那几个txt文件的数据是什么，不过你的代码有些问题，如s1和s2的大小都是N，而且都从各自的文本里读取最多N个字符，但假如真实读取的字符strlen(s1)+strlen(s2) >= N就会导致strcat时s1越界，一但发生这种情况，得到的结果是不可预料的，而且，你在冒泡排序时（即你那两个for循环）for(j=0;j<2*N-1-i;j++)，j可能取到 2*N - 1的值，已经超过你给s1分配的N。 修改方案参考如下： #include <stdio.h> #include <conio.h> #include <stdlib.h> #include<string.h>  #define N 20  int main(int argc, char* argv[]) { 	FILE *fp1, *fp2, *fp3; 	char s1[2 * N], s2[N], temp; 	int i, j; 	if ((fp1 = fopen("D:\\6.13\\A.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	if ((fp2 = fopen("D:\\6.13\\B.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fgets(s1, N, fp1); 	fgets(s2, N, fp2); 	fclose(fp1); 	fclose(fp2);  	strcat(s1, s2); 	int totalCount = strlen(s1);	// s1和s2实际读取字符的总个数 	for (i = 0; i < totalCount; i++) 	{ 		if (s1[i] >= 'A' && s1[i] <= 'Z') s1[i] += 32; 	} 	puts(s1);  	for (i = 0; i < totalCount - 1; i++) 	{ 		for (j = 0; j < totalCount - 1 - i; j++) 		{ 			if (s1[j] > s1[j + 1]) 			{ 				temp = s1[j]; 				s1[j] = s1[j + 1]; 				s1[j + 1] = temp; 			} 		} 	}  	puts(s1); 	if ((fp3 = fopen("D:\\6.13\\C.txt", "w")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fputs(s1, fp3); 	fputs("\n", fp3); 	return 0; } 谢谢！我写错了这么多也帮我改正过来了，我运行了一下没有问题了，谢谢！

for(i=0;i<2*N-1;i++)     {         for(j=0;j<2*N-1-i;j++)         {             if(s1[j]>s1[j+1])             {                 temp=s1[j];                 s1[j]=s1[j+1];                 s1[j+1]=temp;             }         }     } 这个地方已经越界访问了，因为s1的长度是N，而循环的次数是2N - 1

另外 fgets(); 第二参数表示读取的最大字符数（包括\0），也就是说实际读取到的字符数要小于等于你设定的值


Question: 关于VS运行出现 Runtime Libary 错误问题

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

do     {         ch[i] = getchar();         i += 1;     } while (ch[i - 1] != '\n');     while (isalpha(ch[i2]) == 0)     {         i2 += 1;         continue;     } 原因应该是这儿while (isalpha(ch[i2]) == 0)这个循环导致的。因为这个逻辑是找到ch中的字母字符，若没找到会一直找。实际上这个是有问题，因为ch是局部数据，且没有初始化，里面的元素是随机值。通过这个while逻辑，会导致ch越界访问，程序出现对话框的错误； 解决办法如下： while (isalpha(ch[i2]) == 0 && i2 < i)     {         i2 += 1;         continue;     } 这个办法能解决ch越界的逻辑问题。通过i2 < i这样可以保证输入了几个字符就检查几个字符；当然也要对输入的逻辑加上防止越界的操作，如下： do     {         ch[i] = getchar();         i += 1;     } while (ch[i - 1] != '\n' && i < 40);  对于第二次直接接收到'\n'的问题。可以这样改动一下：  while ((choice = algorithm_choice()) != 'q')     {         printf("Enter first number: \n");         input_num1 = number_input1();         printf("Enter second number: \n");         input_num2 = number_input2();         getchar();   //for '\n'     }

这个是 scanf 的一个坑，scanf 会把回车、空格、Tab或一些非法输入的字符当作此次输入的结束标志，并且这些字符会存入输入缓冲区，当下一次想要从标准输入中读取一个字符时，这个遗留的字符就正好充当了此次的输入字符。但下次读的不是字符，就会把前面那些字符仍掉。 所以解决办法： 在algorithm_choice的 getchar()之前调用 fflush(stdin);  楼主有兴趣可以测试下，调用两条scanf，第一条输入任一类型数据，第二条用scanf输入一个字符，会发现第二句的scanf得到的字符是\n

补充一下，函数已经声明的了。同时我把函数float number_input2(void) 取出来单独测试则不会出现该问题


Question: 大一C语言作业求教

名字输入用gets 试试

number越界了，你输了12个字符，加上结尾的\0，你最少要有13个的大小，越界导致其他内存被你修改到了  平均分那里最后一个是score[2]

引用 4 楼 ant2012 的回复:那是因为你的number越界了，你输入了12个字符，刚好填充了number的12个字符，不过还有\0呢，字符串以\0结尾，它就会填充到下一个字节，也就是name的第一个字节，这样读出的name肯定是一个空串，即 name 等于 ""   把这个空间放大一点就行了

计算平均分的时候，最后一个加的students.scre[3]；英语成绩获取放在students.scre[2]里。两个地方改成一致即可。

字符串赋值这样的，strcpy(student.name,"李晓晨");

平均分那里我知道了是我把2写成了3


Question: 一元稀疏多项式计算器   输出多项式  只能输出两项   求解!!!1!!!!1

明白了，谢谢！！

仅供参考：//链表实现一元多项式的加法减法乘法 #include <stdio.h> #include <stdlib.h> typedef struct node {     float coef;   //系数     int expn;     //指数     struct node *next; } PolyNode;      //多项式节点 polynomial node typedef PolyNode* Polynomial; Polynomial createPolynomial() {  //创建多项式     PolyNode *p, *q, *head = (PolyNode *)malloc(sizeof(PolyNode));   //头节点     head->next = NULL;     float coef;     int expn;     printf("输入该多项式每一项的系数和指数，每项一行，输入0 0结束！\n");     while (scanf("%f %d", &coef, &expn) && coef) {   // 默认，按指数递减排列         if (head->next) {             p = head;             while (p->next && expn < p->next->expn)                 p = p->next;             if (p->next) {                 if (expn == p->next->expn) { //有相同指数的直接把系数加到原多项式                     p->next->coef += coef;                     if (p->next->coef > -0.000001 && p->next->coef < 0.000001) { //若是相加后系数为0，则舍弃该节点                         q = p->next;                         p->next = q->next;                         free(q);                     }                 } else {                     q = (PolyNode*)malloc(sizeof(PolyNode));                     q->coef = coef;                     q->expn = expn;                     q->next = p->next;                     p->next = q;                 }             } else {                 p->next = (PolyNode*)malloc(sizeof(PolyNode));                 p = p->next;                 p->coef = coef;                 p->expn = expn;                 p->next = NULL;             }         } else {             head->next = (PolyNode*)malloc(sizeof(PolyNode));             head->next->coef = coef;             head->next->expn = expn;             head->next->next = NULL;         }     }     return head; } Polynomial multiply(Polynomial poly, float coef, int expn) {  //多项式与指定单项式相乘，该单项式为 coefx^expn     PolyNode *p, *q, *Poly = (PolyNode*)malloc(sizeof(PolyNode));     p = Poly;     q = poly->next;     while (q) {         p->next = (PolyNode*)malloc(sizeof(PolyNode));         p = p->next;         p->coef = (q->coef*coef);         p->expn = (q->expn + expn);         q = q->next;     }     p->next = NULL;     return Poly; } void add(Polynomial poly1, Polynomial poly2) {  //把 poly2 加到 poly1 上     PolyNode *p, *q, *r;     r = poly1;     p = poly1->next;  //指向第一个节点     q = poly2->next;     poly2->next = NULL;     while (p && q) {         if (p->expn > q->expn) {             r->next = p;             p = p->next;             r = r->next;         } else if (p->expn < q->expn) {             r->next = q;             q = q->next;             r = r->next;         } else {             PolyNode *t;             p->coef += q->coef;             if (!(p->coef > -0.000001 && p->coef < 0.000001)) //系数不为0             {                 r->next = p;                 r = r->next;                 p = p->next;             } else {                 t = p;                 p = p->next;                 free(t);             }             t = q;             q = q->next;             free(t);         }     }     if (p)         r->next = p;     if (q)         r->next = q; } Polynomial polySubtract(Polynomial poly1, Polynomial poly2) {  //多项式减法 poly1-poly2形成一个新的多项式     //把poly2的系数取相反数，形成一个新的多项式     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode)); //构造头节点     PolyNode *p, *q;     p = poly;     q = poly2->next;     while (q) {         p->next = (PolyNode*)malloc(sizeof(PolyNode));         p = p->next;         p->coef = -(q->coef);  //系数取反         p->expn = q->expn;         q = q->next;     }     p->next = NULL;     add(poly, poly1);  //利用加法     return poly; } Polynomial polyAdd(Polynomial poly1, Polynomial poly2) { //多项式相加 poly1+poly2形成一个新的多项式     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //和多项式的头节点     poly->next = NULL;     PolyNode *p, *q, *r;     r = poly;     p = poly1->next;     q = poly2->next;     while (p&&q) {         if (p->expn > q->expn) {             r->next = (PolyNode*)malloc(sizeof(PolyNode));             r = r->next;             r->coef = p->coef;             r->expn = p->expn;             p = p->next;         } else if (p->expn < q->expn) {             r->next = (PolyNode*)malloc(sizeof(PolyNode));             r = r->next;             r->coef = q->coef;             r->expn = q->expn;             q = q->next;         } else {             float m = p->coef + q->coef;             if (!(m > -0.000001 && m < 0.000001)) {                 r->next = (PolyNode*)malloc(sizeof(PolyNode));                 r = r->next;                 r->coef = m;                 r->expn = p->expn;             }             q = q->next;             p = p->next;         }     }     while (p) {         r->next = (PolyNode*)malloc(sizeof(PolyNode));         r = r->next;         r->coef = p->coef;         r->expn = p->expn;         p = p->next;     }     while (q) {         r->next = (PolyNode*)malloc(sizeof(PolyNode));         r = r->next;         r->coef = q->coef;         r->expn = q->expn;         q = q->next;     }     r->next = NULL;     return poly; } Polynomial polyMultiply(Polynomial poly1, Polynomial poly2) {  //多项式相乘     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //创建多项式和的头节点     poly->next = NULL;     PolyNode *p;     p = poly2->next;     while (p) {         add(poly, multiply(poly1, p->coef, p->expn));         p = p->next;     }     return poly; } void printPoly(Polynomial poly) {  //打印多项式     if (poly && poly->next) {         PolyNode *p = poly->next;  //p指向第一个节点         while (p->next) {             printf("%gx^%d", p->coef, p->expn);             p = p->next;             if (p && (p->coef > 0))                 printf("+");         }         if (p->expn == 0)             printf("%g", p->coef);   //打印常数项         else             printf("%gx^%d", p->coef, p->expn);         printf("\n");     } } void freePoly(Polynomial poly) {  //释放内存     if (poly && poly->next) {         PolyNode *p, *q;         p = poly;         while (p) {             q = p->next;             free(p);             p = q;         }     }     poly = NULL; } int main() {     printf("用链表实现多项式的加减法\n");     Polynomial poly1, poly2, poly3;     printf("创建多项式一\n");     poly1 = createPolynomial();     printf("多项式一：\n");     printPoly(poly1);     printf("创建多项式二\n");     poly2 = createPolynomial();     printf("多项式二：\n");     printPoly(poly2);     printf("两多项式相加，和为：\n");     poly3 = polyAdd(poly1, poly2);     printPoly(poly3);     freePoly(poly3);     printf("两个多项式相乘，积为：\n");     poly3 = polyMultiply(poly1, poly2);     printPoly(poly3);     freePoly(poly3);     printf("两多项式相减，差为：\n");     poly3 = polySubtract(poly1, poly2);     printPoly(poly3);     freePoly(poly1);     freePoly(poly2);     freePoly(poly3);     system("pause");     return 0; }

另外，释放链表空间不是     free(List1);     free(List2); 这么简单。而是遍历链表一个个的释放。

#include<stdio.h> #include<stdlib.h> #include<math.h>  typedef struct LNode {     float coef;            //系数     int expn;               //指数     struct  LNode *next; } LNode,*Linklist;  Linklist List1=NULL; Linklist List2=NULL;  Linklist in(Linklist L) {   //多项式的建立     Linklist p;     float a;     int b;     Linklist head=(Linklist)malloc(sizeof(LNode));     L=head;     head->expn=0;//头结点放的是多项式的项数     p=head;     p->next=NULL;     printf("请输入一个多项式：\n");     //while(scanf("%f%d",&a,&b) && (a||b)){     while (scanf("%f%d", &a,&b) == 2 && (fabs(a) > 1e-6 || b != 0)) {         //printf("+++++%f %d\n", a, b);         (head->expn)++;         //printf("%3d\n",L->expn);         Linklist q=(Linklist)malloc(sizeof(LNode));          q->coef=a;         q->expn=b;         q->next = NULL;          if(head->next == NULL){             head->next = q;             //q->next=NULL;             //p=head;         } else {             p = head;             while (p->next) {                 if (p->next->expn <= q->expn) {                     q->next = p->next;                     p->next = q;                     break;                 }                 p = p->next;             }             if (p->next == NULL)                 p->next = q; #if 0             if(p->next->expn <= q->expn){                 q->next=p->next;                 p->next=q;                 p=head;             }             else{                 p=p->next;             } #endif         }         printf("end\n");     }     printf("您已成功输入一个多项式！！\n");     return L; } void Input(){           //输入多项式     List1=in(List1);     List2=in(List2); } void Out(Linklist L){     //输出多项式     Linklist p;     p=L->next;     printf("共有%3d项  ",L->expn);     while(p!=NULL)//按指数由大到小输出     {         printf("%0.1f%3d  ",p->coef,p->expn);         p=p->next;}     printf("\n"); } void Output(){     printf("多项式a为：\n");     Out(List1);     printf("多项式b为：\n");     Out(List2); } void Add(){     Linklist p1,p2;     p1=List1->next;     p2=List2->next;     printf("相加后的多项式为：\n");     while(p1&&p2){         if(p1->expn>p2->expn){             printf("%0.1f%3d  ",p1->coef,p1->expn);             p1=p1->next;         }         else if(p1->expn<p2->expn){             printf("%0.1f%3d  ",p1->coef,p2->expn);             p2=p2->next;         }         else{             printf("%0.1f%3d  ",p1->coef+p2->coef,p1->expn);             p1=p1->next;             p2=p2->next;         }     }     if(p1==NULL){         while(p2){             printf("%0.1f%3d  ",p2->coef,p2->expn);             p2=p2->next;         }     }     else{         while(p1){             printf("%0.1f%3d  ",p1->coef,p1->expn);             p1=p1->next;         }     }     printf("\n"); } void Sub(){     Linklist p1,p2;     p1=List1->next;     p2=List2->next;     printf("相减后的多项式为：\n");     while(p1&&p2){         if(p1->expn>p2->expn){             printf("%0.1f%3d  ",p1->coef,p1->expn);             p1=p1->next;         }         else if(p1->expn<p2->expn){             printf("%0.1f%3d  ",p1->coef,p2->expn);             p2=p2->next;         }         else{             if(p1->coef-p2->coef!=0)                 printf("%0.1f%3d  ",p1->coef-p2->coef,p1->expn);             p1=p1->next;             p2=p2->next;         }     }     if(p1==NULL){         while(p2){             printf("%0.1f%3d  ",p2->coef,p2->expn);             p2=p2->next;         }     }     else{         while(p1){             printf("%0.1f%3d  ",p1->coef,p1->expn);             p1=p1->next;         }     }     printf("\n"); } void Calc(){     int x;     double sum=0;     Linklist p;     printf("请输入x的值：");     scanf("%d",&x);     p=List1->next;     while(p){         sum+=p->coef*pow(x,p->expn);         p=p->next;     }     printf("多项式a在x处的值为：%0.1lf",sum);     printf("\n"); } int main(){       int num;     while(1){          printf("------------------------------------------\n");         printf("1---------输入并建立多项式(格式为：系数 指数,以0 0结束)\n");         printf("2---------输出多项式\n");         printf("3---------多项式相加\n");         printf("4---------多项式相减\n");         printf("5---------计算多项式在x处的值\n");         printf("0---------退出\n");         printf("-------------------------------------------\n");         printf("请输入您要选择的功能：");         scanf("%d",&num);         switch(num){             case 1:Input();break;             case 2:Output();break;             case 3:Add();break;             case 4:Sub();break;             case 5:Calc();break;             case 0:{                        printf(" 谢谢使用!!!\n");                        exit(1);                    }             default:printf("输入错误，请重新输入");         }     }     free(List1);     free(List2);     return 0; }  参考一下吧  in函数内的逻辑有问题。尤其是在新节点加入时。建议对比代码看一下自己的问题。


Question: 在win下编译linux下的c程序

引用 7 楼 weixin_40810615 的回复:[quote=引用 3 楼 mstlq 的回复:] 楼主用win10吗？ win10自带Ubuntu,可以访问win上的目录。你就尽管用你自己熟悉编辑器写代码，写完进Ubuntu用gcc编译就好了…… win10 什么时候自带ubuntu, 我在网上查了一下win10只是自带虚拟机Hyper-V，不知道这个跟在windows电脑上装一个vmware 有什么区别？这同样需要，我在windows下编辑代码，还是要拖到虚拟机下编译运行才可以。我想做的是 win下编辑和编译，服务器或虚拟机直接跑程序。 [/quote] https://www.jianshu.com/p/bc38ed12da1d 早就有了……

引用 9 楼 weixin_40810615 的回复:[quote=引用 8 楼 yiyefangzhou24 的回复:] 在window上生成可执行文件拿到linux下执行？？？链接的库都不一样怎么执行，在Windows上写好再拿到Linux上编译还有可能，用c/c++不要调用win api，这也有点费劲 可以做的，就是跨平台编译。 你想在win下用keil可以完成单片机程序的编译。那keil肯定有安装好单片机链接的库，以及编译工具。 所以在win下搭配一个linux的编译环境也是可行的。 [/quote] 这当然可以，关键看你怎么链接，最简单的比方，链接qt的库，因为库本身是跨平台的，当然可以在linux上运行，在不使用跨平台的库，直接链接windows原生api你放到linux里面跑跑？

引用 8 楼 yiyefangzhou24 的回复:在window上生成可执行文件拿到linux下执行？？？链接的库都不一样怎么执行，在Windows上写好再拿到Linux上编译还有可能，用c/c++不要调用win api，这也有点费劲 可以做的，就是跨平台编译。 你想在win下用keil可以完成单片机程序的编译。那keil肯定有安装好单片机链接的库，以及编译工具。 所以在win下搭配一个linux的编译环境也是可行的。

引用 3 楼 mstlq 的回复:楼主用win10吗？ win10自带Ubuntu,可以访问win上的目录。你就尽管用你自己熟悉编辑器写代码，写完进Ubuntu用gcc编译就好了…… win10 什么时候自带ubuntu, 我在网上查了一下win10只是自带虚拟机Hyper-V，不知道这个跟在windows电脑上装一个vmware 有什么区别？这同样需要，我在windows下编辑代码，还是要拖到虚拟机下编译运行才可以。我想做的是 win下编辑和编译，服务器或虚拟机直接跑程序。

在windows 下用cygwin, 用gcc,或者g++编译， 安装cygwin的方法见以下地址：(英文的，中文没找到相关的) http://preshing.com/20141108/how-to-install-the-latest-gcc-on-windows/

用qtcreator 生成makefile后，在linux下make

为什么不在win10下的虚拟机里的linux中编译呢？

你可以写QT认识的代码,然后拷贝代码到linux上编译

楼主，可以在windows下使用VSCODE编写linux c代码，都编译通过后，把代码移到linux系统上，再用gcc或者g++重新编译一次，生成linux下的执行文件。这样就避免了使用vim来编辑代码了。


Question: 求助！c primer plus 中程序15.4

引用 3 楼 hdt 的回复:c 没有bool c++才有 有的。c11有。

引用 1 楼 cfjtaishan 的回复:bool是int类型。而不是unsigned int 谢谢！

c 没有bool c++才有

bool是int类型。而不是unsigned int

因为你把unsigned int改为bool，struct box_props结构体的大小已经改变了，在我测试的编译器中是变大了，由原来的4个字节变为16个字节了，这可能涉及到位域的概论了，所以你代码中union Views组合类型的占用的内存字节数就变大了，而不是原来的4个字节了。即之前每个字段位对应的值可能就改变了。所以在结构体中使用位域时，最好每个字段的类型都一致，这样就简单点。


Question: 跪求C语言代码纠错,急~~~，克鲁斯卡尔算法

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

真的很着急，有大神科知道怎么回事的话，加我微信：15511986910

问题大概在这里


Question: 新手求大神帮忙，进程的三个调度，不知道哪里出问题了。短作业和响应比里面的循环进不去。求大神解答。如果能顺便帮我优化下就更好了。

百度搜相关关键字。


Question: c语言指针问题.

理解和讨论之前请先学会如何观察！  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

for (_uint i = 0; i < 6; i++) 你的第一个输出是无符号整数 for (int i = 0; i < 6; i++) 　第二个输出的是有符号整数 所有输出结果　不一样

引用 3 楼 cfjtaishan 的回复:int* ptr = malloc(4 * 3); *ptr = 1000; *(ptr + 4) = 8000; *(ptr + 8) = 7000; //========================== ptr[0] = 1000; ptr[1] = 8000; ptr[2] = 7000; 这两种形式是有区别的。 第一种*(ptr + 4)即ptr[4];同理*(ptr + 8)即ptr[8];很明显越界访问了。因为总共申请了12个字节， ptr + 4是基于ptr向后偏移4 * sizeof(int)个字节，若是32位系统，则偏移16个字节。 第二种形式，若是在32位系统上，是没问题的。但若是64位系统，也是会越界。因为总共申请12个字节，&ptr[2]是相对ptr向后偏移2 * sizeof(int)；即2 × 8 = 16; 谢谢解答，看来我理解错了， 原来ptr+1代表偏移4个字节， 初学菜鸟一只... 一直以为ptr+1偏移一个字节

正如3楼所说的那样。 因为ptr是指向int的指针，所以ptr+1表示在ptr的基础上加上一个“单位”，这个“单位”就是表示一个int的大小，即4个字节。  如上图所示，ptr的值是0x00EFAD28，而ptr+4的值是0x00EFAD38=0x00EFAD28+4*4而不是0x00EFAD2C 实际上ptr+1与ptr[1]的值相同。 请参考《C++数组地址偏移》 《C++中对数组名的运算》 希望能够帮到你


Question: 求解 这个段比较大小为什么比较不了

程序的代码本身并没有错误，问题出在输入的内容，估计你可能是输入时漏掉了两个数之间的逗号。 1.用逗号   2.用空格   总之scanf语句“”之间内容符号输入时也要原原本本的输入，否则会出现错误

程序无错，运行的时候加上逗号就可以了

我感觉你是输入错误，你可以试试 10,100 11,3 注意中间的逗号一定要有，还要和你程序"%d,%d"中的一样

scanf("%d,%d",&a,&b); 建议在这句后面加一条调试语句： printf("a = %d, b = %d\n", a, b); 这句用于验证输入的内容是否和自己的预期一样。在保证输入和预期一样后，再分析后面的逻辑。   后面的逻辑没发现问题。

输入 10,9 回车 在测试10,100 回车   是不是你输入有问题 记得要输入,号

描述一下你的输入和输出

请检查scanf的返回值。


Question: 请问怎么解决在debug的时候在transfer函数 p->node[i]->firstarc=NULL卡住了的问题

if(p->node[i]->firstarc==NULL)                 {                     p->node[j]->firstarc=m;                 }                 else                 {                     n->nextarc=m;                 } 注意p->node[j],node[j]是野指针，需要为其分配空间才能进行这句操作p->node[j]->firstarc=m;否则会出现段错误； while (1)             if (t->nextarc!=NULL)             {                 printf ("%d\t",t->adivex);                 t=t->nextarc;             }             else             {                 printf ("%d\n",t->adivex);                 //continue;                 break;             }     } 这里的continue应改成break,否则这是一个死循环。   以下是我做的稍微修改，参考一下吧：  #include <stdio.h> #include <stdlib.h> #include <time.h>  typedef struct st_arc {     int adivex;     struct st_arc *nextarc; } starc;   typedef struct head_node {     int vexdata;     starc *firstarc; }hnode;   typedef struct  hnode_array {     int num;     hnode node [6]; }hnarry;   void transfer (int (*A)[6],hnarry *p); void output (hnarry *p);  int main () {     int i,j;     int A[6][6];     hnarry *p;     p=(hnarry *)malloc(sizeof (hnarry));     printf ("Please input the adjacency list:\n");     srand(time(NULL));     for (i=0;i<6;i++)     {         for (j=0;j<6;j++)         {             //scanf ("%d",&A[i][j]);             A[i][j] = rand() % 1000;             printf("%d\t", A[i][j]);         }     }     transfer (A,p);     output (p);     return 0; }    void transfer (int (*A)[6],hnarry *p) {     int i,j;     starc *m,*n;     p->num=0;     for (i=0;i<6;i++)     {         p->node[i].vexdata=i;         p->node[i].firstarc=NULL;         p->num++;     }     for (i=0;i<6;i++)     {         for (j=0;j<6;j++)         {             if(A[i][j]!=0)             {                 m = (starc*)malloc(sizeof (starc));                 m->adivex = A[i][j];                 if(p->node[i].firstarc==NULL)                 {                     p->node[j].firstarc = m;                 }                 else                 {                     n->nextarc = m;                 }                 n=m;                 n->nextarc=NULL;             }         }     } }    void output (hnarry *p) {     int i;     starc *t;     for (i=0;i<6;i++)     {         printf ("%d\n",p->node[i].vexdata);         if(p->node[i].firstarc!=NULL)             t = p->node[i].firstarc;         else             continue;         while (1)             if (t->nextarc!=NULL)             {                 printf ("%d\t",t->adivex);                 t=t->nextarc;             }             else             {                 printf ("%d\n",t->adivex);                 //continue;                 break;             }     } }

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


Question: 小白学c语言，无向图邻接链表，求大佬帮忙改改

百度搜相关关键字。

来个大佬帮帮忙啊


Question: 怎么求两个大于100位的整数的和，求解决

使用开源GNU高精度库GMP，支持整形、浮点  #include <gmpxx.h> #include <iostream> using namespace std; int main () {   mpz_class a, b, c;     a = 1234;   b = "-5678845738956723096583057390673675";   c = a*b;   cout << "a*b is " << c << "\n";   cout << "absolute value is " << abs(c) << "\n";     return 0; }   输出  a*b is -7007695641872596301183492820091314950 absolute value is 7007695641872596301183492820091314950

#include <stdio.h> #include <vector> using namespace std; #define MAX_LEN   10000  int main() { 	vector<int> vecA; 	vector<int> vecB; 	char c;  	printf("Please input the first number:\n");  	while(1) 	{ 		scanf("%c", &c); 		if ((c == '\n')||(c == '\r')) 			break; 		if ((c>'9')||(c<'0')) 		{ 			printf("Format Error\n"); 			return -1; 		} 		vecA.push_back(c-'0'); 	} 	/*for (int i =0; i<vecA.size(); i++) 	{ 		printf("%d", vecA[i]); 	}*/ 	printf("Please input the second number:\n"); 	while(1) 	{ 		scanf("%c", &c); 		if ((c == '\n')||(c == '\r')) 			break; 		if ((c>'9')||(c<'0')) 		{ 			printf("Format Error\n"); 			return -1; 		} 		vecB.push_back(c-'0'); 	} 	vector<int> vecSum; 	int Len = vecA.size()>vecB.size()? vecB.size():vecA.size(); 	int tempRes = 0; 	int tempGo = 0; 	for(int i = 0; i<Len; i++) 	{ 		tempRes = (vecA[vecA.size()-i-1]+vecB[vecB.size()-i-1]+tempGo)%10; 		tempGo = (vecA[vecA.size()-i-1]+vecB[vecB.size()-i-1]+tempGo)/10; 		vecSum.insert(vecSum.begin(), tempRes); 	} 	if (vecA.size() == Len) 	{ 		if (vecB.size() == Len) 		{ 			if (tempGo !=0) 			{ 				vecSum.insert(vecSum.begin(), tempGo); 			} 		} 		else 		{ 			for(int j=0; j<vecB.size()-Len; j++) 			{ 				tempRes = (vecB[vecB.size()-j-Len-1]+tempGo)%10; 				tempGo = (vecB[vecB.size()-j-Len-1231]+tempGo)/10; 				vecSum.insert(vecSum.begin(), tempRes);  			} 		}  	} 	else 	{ 		for(int j=0; j<vecA.size()-Len; j++) 			{ 				tempRes = (vecA[vecA.size()-j-Len-1]+tempGo)%10; 				tempGo = (vecA[vecA.size()-j-Len-1]+tempGo)/10; 				vecSum.insert(vecSum.begin(), tempRes);  			} 	}  	printf("Sum is:\n");     for (int i =0; i<vecSum.size(); i++) 	{ 		printf("%d", vecSum[i]); 	}   }

#include <stdio.h> #include <stdlib.h> #include <string.h>  #define MAX_NUM_LEN 2048  int cal_factorial(unsigned char *num_list, int num_size, int n);  int cal_val(unsigned char *num_list, int num_size, int base, int num) {     int i = 0, j;     int len = 1, tmp, carry_bit;      num_list[1] = 1;      while (i < num) {         carry_bit = 0;         for (j = 1; j <= len; j++) {             tmp = num_list[j] * base + carry_bit;             num_list[j] = tmp % 10;             carry_bit = tmp / 10;             if (j >= len && carry_bit != 0)                 len++;             if (num_size-1 < len) {/* overflow */                 printf("Overflow!\n");                 return num_size-1;             }         }         i++;     }      return len; }   int main(void) {     unsigned char num_list[MAX_NUM_LEN];     int num_len, i;     int base, power;      memset(num_list, 0, sizeof(num_list));     printf("Please input two numbers: ");     scanf("%d%d", &base, &power);      if (base < 0 && power % 2)         num_list[0] = 1; /* negative number */     else         num_list[0] = 0;     base = abs(base);      num_len = cal_val(num_list, MAX_NUM_LEN, base, power);     printf("len = %d\n", num_len);     if (num_list[0])         putchar('-');     for (i = num_len; i >= 1; i--)         printf("%d", num_list[i]);     printf("\n");     return 0; }   int cal_factorial(unsigned char *num_list, int num_size, int n) {     int carry_bit, i, j, len = 1;     int tmp;      num_list[1] = 1;     for (i = 2; i <= n; i++)     {         carry_bit = 0;         for (j = 1; j <= len; j++) {             tmp = num_list[j] * i + carry_bit;             num_list[j] = tmp % 10;             carry_bit = tmp / 10;             if (j >= len && carry_bit != 0)                 len++;             if (num_size -1 < len) { /* overflow */                 printf("Overflow!\n");                 return num_size-1;             }         }      }      /*     for (i = len; i >= 1; i--)//逆序输出数组就是结果         printf("%d", a[i]);     printf("\n");     */     return len; } 这个是大数乘法的算法，建议在这个基础上可以改成加法。

仅供参考：#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110

这个你得学会运用rand函数和srand函数: 这是我们C语言课本上的关于这两个函数的运用方法（附上一张图片 懒得拼QAQ）  这是我编译的代码和运行结果；挺简单的，你自己运行看看； #include<stdio.h> #include<stdlib.h> #include<time.h> int main() {     int i;     int a[2];     printf("请输入两个超过100位的数\n");     srand((int)time(0));     for(i=0;i<2;i++){     	a[i]=(int)(100+400*rand()/RAND_MAX);     	printf("%5d",a[i]); 	} 	printf("\n"); 	printf("请输入两个数之和\n"); 	int sum=0; 	for(i=0;i<2;i++){ 		sum=sum+a[i];  	} 	printf("%5d\n",sum); 	return 0; }

我这个只能求同位的整数的和，怎么求随机位数整数的和


Question: 求大神看一下为什么不能录入，帮忙改一下

没发现问题，可以正常输入。建议加上数量判断，防止数组越界：  void input() {     char flag[20];     do{         printf("请输入你的商品信息:\n");         printf("商品编号:");         scanf("%s",goods[count].goods_id);         printf("商品名字:");         scanf("%s",goods[count].goods_name);         printf("商品价格:");         scanf("%s",goods[count].goods_price);         printf("商品折扣:");         scanf("%s",goods[count].goods_discount);         printf("商品总数目:");         scanf("%d",&goods[count].goods_amount);         printf("商品剩余数目:");         scanf("%d",&goods[count].goods_remain);         count++;         if (cout >= MAX)   //判断数量，防止越界             break;         printf("是否继续输入数据 y是  n否 : ");         scanf("%s",flag);     }while(strcmp(flag,"y")==0||strcmp(flag,"Y")==0);     output(); }

#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX 10 void start(); void output(); void input(); void change(); void dele(); void search(); void insert(); struct  GOODS{ char goods_id[30];     char goods_name[30]; char goods_price[20]; char goods_discount[20]; int goods_amount; int goods_remain; }; struct  GOODS goods[MAX],goodsinsert[MAX],G[MAX]; int count=0; void main() {     while(1) start();  } void start() { int ch; printf("\n\t\t\t\t超市商品信息管理系统\n"); printf("\t\t\t****************************\n");         printf("\t\t\t1.商品的录入\n"); printf("\t\t\t2.修改某个商品的信息\n"); printf("\t\t\t3.删除某个商品的信息\n"); printf("\t\t\t4.查找某个商品的信息\n"); printf("\t\t\t5.插入某个商品的信息\n");       printf("\t\t\t6.退出系统\n"); printf("\t\t\t****************************\n");    printf("\n\n输入你的选择（1-6）:");         scanf("%d",&ch);         switch(ch)         {         case 1:{input(); break;} case 2:{change(); break;} case 3:{dele(); break;} case 4:{search(); break; } case 5:{insert();   break;} default :{printf("\n退出系统并按任意键退出系统"); exit(EXIT_SUCCESS);}         }   }   void input() {      char flag[20];    do{    printf("请输入你的商品信息:\n");    printf("商品编号:");    scanf("%s",goods[count].goods_id);    printf("商品名字:");    scanf("%s",goods[count].goods_name);    printf("商品价格:");    scanf("%s",goods[count].goods_price);    printf("商品折扣:");    scanf("%s",goods[count].goods_discount);    printf("商品总数目:");    scanf("%d",&goods[count].goods_amount);    printf("商品剩余数目:");    scanf("%d",&goods[count].goods_remain);    count++;    printf("是否继续输入数据 y是  n否 : ");    scanf("%s",flag);    }while(strcmp(flag,"y")==0||strcmp(flag,"Y")==0);     output(); } void change() {      char ch[20],a[20]; int i,t,m=0;       printf("\n是否根据商品的编号进行修改 (y/n): ");        scanf("%s",ch);        if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)     { printf("\n输入商品的编号:");      scanf("%s",a);     for(i=0;i<count;i++)    {if(strcmp(goods[i].goods_id,a)==0) { m++;t=i;} } if(m==0)printf("\n对不起，你输入的商品不存在。请检查！！！\n"); else if(m==1){ printf("\n\n是否改变商品的名字(y/n):"); scanf("%s",ch);     if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)   { printf("\n商品的名字:"); scanf("%s",goods[t].goods_name);}     printf("\n是否改变商品的价格(y/n): "); scanf("%s",ch);     if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)   { printf("\n商品的价格:"); scanf("%s",goods[t].goods_price);}     printf("\n是否改变商品的折扣(y/n): ");     scanf("%s",ch);     if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)   { printf("\n商品的折扣:"); scanf("%s",goods[t].goods_discount);}     printf("\n是否改变商品的数量(y/n): ");     scanf("%s",ch);     if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)   { printf("\n商品的数量:"); scanf("%d",&goods[t].goods_amount);} printf("\n是否改变商品的剩余数目(y/n): ");     scanf("%s",ch); if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)   { printf("\n商品的剩余数目"); scanf("%d",&goods[t].goods_remain);} output();} else printf("\n商品的编号错误，不能重复编号。请选择删除商品！！！\n");  } else printf("\n*********请继续选择**********\n"); } void output() {    int i; for(i=0;i<count;i++) { printf("\n商品编号:%s商品名字:%s商品价格:%s商品折扣:%s商品数目:%d商品剩余数目:%d", goods[i].goods_id,goods[i].goods_name,goods[i].goods_price,goods[i].goods_discount, goods[i].goods_amount,goods[i].goods_remain); } } void dele() { int i,j,t,m=0; char c[20];   printf("\n输入商品的编号来删除商品:");    scanf("%s",c);    for(i=0;i<count;i++){    if(strcmp(c,goods[i].goods_id)==0)    {m++;t=i;}    }    if(m==0)printf("对不起，你输入的商品没找到。请检查！！！\n");    else    {printf("********删除的商品是*********\n:"); printf("商品编号:%s商品名字:%s商品价格:%s商品折扣:%s商品数目:%d商品剩余数目:%d", goods[t].goods_id,goods[t].goods_name,goods[t].goods_price,goods[t].goods_discount, goods[t].goods_amount,goods[t].goods_remain);   for(j=t;j<count-1;j++)     goods[j]=goods[j+1]; count--;    printf("\n\t\t\t*********请检查是否删除正确********\n");     output();}       }   void search() { int i,t=0,b,j,number,m=0; char a[20],num[20];           printf("\n1.按商品的名字来查找选1:");           printf("\n2.按商品的折扣来查找选2:");           printf("\n3.按商品的价格来查找选3:\n");    scanf("%d",&b);    switch(b)    { case 1:{ printf("\n请输入商品的名字:");    scanf("%s",a);    for(i=0;i<count;i++)    {if(strcmp(goods[i].goods_name,a)==0)  {m++;num[t++]=i;}    }    if(m==0)printf("对不起，你输入的商品不在其范围里。请检查！！！\n");    else  for(j=0;j<t;j++) {  number=num[j];    printf("************已查到商品信息****************\n"); printf("商品编号:%s商品名字:%s商品价格:%s商品折扣:%s商品数目:%d商品剩余数目:%d\n\n", goods[number].goods_id,goods[number].goods_name,goods[number].goods_price, goods[number].goods_discount,goods[number].goods_amount,goods[number].goods_remain);}break;}    case 2:{printf("\n请输入商品的折扣:");    scanf("%s",a);    for(i=0;i<count;i++)    {if(strcmp(goods[i].goods_discount,a)==0)  {m++;num[t++]=i;}    }    if(m==0)printf("对不起，你输入的商品不在其范围里。请检查！！！\n");    else  for(j=0;j<t;j++) {  number=num[j];    printf("************已查到商品信息****************\n"); printf("商品编号:%s商品名字:%s商品价格:%s商品折扣:%s商品数目:%d商品剩余数目:%d\n\n", goods[number].goods_id,goods[number].goods_name,goods[number].goods_price, goods[number].goods_discount,goods[number].goods_amount,goods[number].goods_remain);}break;}    case 3:{printf("\n请输入商品的价格:");    scanf("%s",a);    for(i=0;i<count;i++)    {if(strcmp(goods[i].goods_price,a)==0)  {m++;num[t++]=i;}    }    if(m==0)printf("对不起，你输入的商品不在其范围里。请检查！！！\n");    else  for(j=0;j<t;j++) {  number=num[j];    printf("************已查到商品信息****************\n"); printf("商品编号:%s商品名字:%s商品价格:%s商品折扣:%s商品数目:%d商品剩余数目:%d\n\n", goods[number].goods_id,goods[number].goods_name,goods[number].goods_price, goods[number].goods_discount,goods[number].goods_amount,goods[number].goods_remain);}break;}    }   } void  insert() {int i,j,m,n; printf("\n你想要插入的位置:"); scanf("%d",&i);count++; printf("\n输入要插入的商品编号:");scanf("%s",goodsinsert[i-1].goods_id); printf("\n输入要插入的商品名字:");scanf("%s",goodsinsert[i-1].goods_name); printf("\n输入要插入的商品价格:");scanf("%s",goodsinsert[i-1].goods_price); printf("\n输入要插入的商品折扣:");scanf("%s",goodsinsert[i-1].goods_discount); printf("\n输入要插入的商品数目:");scanf("%d",&goodsinsert[i-1].goods_amount); printf("\n输入要插入的商品剩余数目:");scanf("%d",&goodsinsert[i-1].goods_remain); for(j=0;j<i-1;j++) G[j]=goods[j]; G[j]=goodsinsert[i-1]; for(m=j+1;m<count;m++) G[m]=goods[m-1]; for(n=0;n<count;n++) goods[n]=G[n]; printf("\n\t\t\t*********请检查是否插入正确********\n");   output(); }


Question: 大一新人求C语言错误解决方法,各位大佬们帮帮忙

return(main()); 返回的是地址  一个程序main是入口 你为什么不直接返回呢？

return;     //return(main()); 函数定义的是void类型返回值，因此return (main());这是返回函数首地址。很明显是类型冲突；  建议花时间学习一下函数的声明，定义。


Question: 一个c编译器比如gcc，里面都是写什么东西？

红书《编译原理》

或许我该，查一查编译器的工作机制。

“GNU编译器套件（GNU Compiler Collection）包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端，也包括了这些语言的库（如libstdc++、libgcj等等）。GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处，‘自由’的含义是它尊重用户的自由。”

提醒：gcc是开源的。


Question: fread有问题求大神帮助

count=fread(&t, sizeof(struct Goods), 1, ifp); 问一下，写入的是用fwrite的吗？若不是，那么用fread去读，格式就不对了。

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

楼主会不会一开始生成的data.dat文件就错误了，所以后续读取的数据就错误了，把data.dat文件删除重生试试看看。把你上面读写文件的操作整理代码如下： int AddRecord(Goods* goods) { 	FILE* fp = fopen("data.dat", "ab"); 	if (fp) 	{ 		fwrite(goods, sizeof(struct Goods), 1, fp); 		fclose(fp); 	} 	return 1; }  int ReadRecord() { 	Goods t; 	FILE* ifp = fopen("data.dat", "rb"); 	if (ifp) 	{ 		while (1) 		{ 			int nCount = fread(&t, sizeof(struct Goods), 1, ifp); 			if (nCount != 1) 				break; 		} 		fclose(ifp); 	} 	return 1; }  void Test() { 	struct Goods sGoods; 	sGoods.count = 10; 	sGoods.goodn = 2; 	sGoods.posn = 3; 	sGoods.price = 20; 	AddRecord(&sGoods); 	ReadRecord(); } 能正常的写入数据和读取数据的。

&t.posn=-85893460,&t.goodn=-85893460,&t.price=-107374176,&t.count=-85893460 &t.posn在哪输出的。

Good = (LinkList *)malloc(sizeof(LinkList));     if (Good == NULL){         printf("申请空间失败!\n");         return 0;     }     for (i = 0; i < m; i++){         Good[i] = NULL;     }  这个地方有问题。Good是一个指针变量，并不是m个指针变量。 是不是应该这样呢？ Good = (LinkList *)malloc(m * sizeof(LinkList));

是用fwrite int AddRecord(Goods *goods){ 	FILE *fp; 	 	if (goods == NULL) return 0;  	//以二进制的append方式打开文件 	fp = fopen("data.dat", "ab"); 	if (fp == NULL){ 		printf("error1!\n"); 		return 0; 	} 	//把记录写在文件中 	fwrite(goods, sizeof(struct Goods), 1, fp);  	fclose(fp); 	return 1; 	  }RR


Question: 邻接矩阵输入输出

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


Question: 萌新求助，算二维数组学生的平均分不知道哪里错了

void pjf(float *p) { int i; int y=0; for(i=0;i<4;i++) y=y+(*(p+5*i)); y=y/4; printf("%d",y); }

void pjf(float *p) {     int i;     //int y=0;     float y=0.0;     for(i=0;i<4;i++)         y=y+(*(p+5*i));     y=y/4;     //printf("%f",&y);     printf("%f", y); } 参考一下吧

上面发错了，这才是结果

这是运行结果


Question: 自己做的C语言小游戏，找不出问题出在哪里，求大神

void show() //函数：显示画面 {     for(i=0;i<high;i++)         for(j=0;j<=width;j++)    //这儿的j <= width应改成j < width         {             sky[i][j]=0;             sky[high][j]=2;         }      for(i=0;i<high;i++)         for(j=0;j<=width;j++)    //这儿的j <= width应改成j < width         {             if(i<pipex_up||i>pipex_down)                 sky[i][pipey]=3;         }      sky[birdx][birdy]=1;      gotoxy(0,0);     for(i=0;i<high;i++)     {         for(j=0;j<width;j++)         {             if(sky[i][j]==0)                 printf(" "); // 0 输出空格             else if(sky[i][j]==1)                 printf("@"); // 1 输出小鸟             else if(sky[i][j]==2)                 printf("_"); // 2 输出边界             else if(sky[i][j]==3)                 printf("|"); // 3 输出管道          }         printf("\n");     }     printf("得分:%d\n",score);     printf("按空格使小鸟上升，穿过管道间的缝隙"); }  注意加注释的地方是不是会导致数组越界呢。  分数的问题，逻辑很简单没发现什么问题，建议找一下自己其他逻辑，尤其跟分数相关的逻辑。

刚才试了一下，把分数从0改到1就正常了，不知道为什么

是分数的更新，不知道哪出错了


Question: 用任意编译器打印中文都出现了打一个字中间隔两个字不打印如此循环直至打印结束。

引用 8 楼 qq_42428486 的回复:引用 4楼早打大打打核战争 的回复:使用wprintf无用  wprintf(L"有用\n");

引用 16 楼 DelphiGuy 的回复:[quote=引用 15 楼 zhao4zhong1 的回复:] [quote=引用 14 楼 DelphiGuy 的回复:] 应该不是win10的问题吧，windows的基本I/O部分，可以说20年以来都没1什么变化。 win10的终端和windows之前的各个版本比，变化大了去了！[/quote]  请举例说明  [/quote] 比如win10家庭教育版和win10专业版在终端鼠标支持上就不一样。

我更喜欢全屏幕字符模式终端，可惜从win7开始不支持

引用 15 楼 zhao4zhong1 的回复:[quote=引用 14 楼 DelphiGuy 的回复:] 应该不是win10的问题吧，windows的基本I/O部分，可以说20年以来都没1什么变化。 win10的终端和windows之前的各个版本比，变化大了去了！[/quote]  请举例说明

引用 14 楼 DelphiGuy 的回复:应该不是win10的问题吧，windows的基本I/O部分，可以说20年以来都没1什么变化。 win10的终端和windows之前的各个版本比，变化大了去了！

引用 12 楼 qq_42428486 的回复:解帖了，是系统的问题，我用的是内测win10，今天更新了，打印就好了，谢谢大家的回答，么么哒 win10害死人！

引用 9楼dark9527 的回复:你printf后面加个\n,或者printf语句下面加fflush();试一下。无用.

使用wprintf

在Linux下测试没有问题。可以正常输出。

#include <locale.h> ... setlocale(LC_ALL,"chs"); ...

引用 4楼早打大打打核战争 的回复:使用wprintf无用

引用 6楼user-5 的回复:引用 5 楼 qq_42428486 的回复:引用 3楼自信男孩 的回复:在Linux下测试没有问题。可以正常输出。所以说我的有问题啊，怎么解决呢重新建个工程试试。图中似乎有干扰试过无用，重建项目，用其他编辑器编译器都无用，只要是打印中文都会出错

顶一下！！！！


Question: 关于float型数据的一点疑问

所有的整数都可以表示成科学计数法，比如 10000002289=1.0000002289e10，有效数字只能保证 1.0000002289 这部分，与后面是10的几次方没关系。

引用 4 楼 qq_42203883 的回复:[quote=引用 2 楼 jianwen0529 的回复:] 1：不是有效位数，是有效的小数位数 2：%e %f等默认打印的小数位数是6，即等同于%0.6e %0.6f，使用如 %0.10f %0.10e (表示小数位数打印10位） 你的意思是这个有效位数是指的小数位的有效数字，但是整数位的有效数字是多少呢！[/quote] 一共有效位6位。包括整数和小数部分。你的例子不也是这样吗？你说的第8位开始随机是偶然吧。  输出numeric_limits<float>::digits10看看几位

有效数字位数一定能保证7位是准确的，但是8位有一部分数字也是准确的，和尾数位的字节数有关系， 可以参考一下https://blog.csdn.net/a4454541115/article/details/52079108立即前往

引用 2 楼 jianwen0529 的回复:1：不是有效位数，是有效的小数位数 2：%e %f等默认打印的小数位数是6，即等同于%0.6e %0.6f，使用如 %0.10f %0.10e (表示小数位数打印10位） 你的意思是这个有效位数是指的小数位的有效数字，但是整数位的有效数字是多少呢！

浮点数x（float)小数后面是6个0，浮点数一点会关注小数点后几位。float一般是小数点后6位。

浮点数格式 http://bbs.csdn.net/topics/390676437


Question: 新手求助改错题

#include<stdio.h>  #include<string.h>  struct student  {        char num[8];      //学号     float  score;    //C语言成绩 }; float average(student s[], int n)   //-------- 这行改了  {   int  j;  float  aver=0.0;  for (j=0; j<n; j++)  aver = aver+s[j].score;  aver = aver/n;  return aver;                        //-------- 这行改了   }  void main()  {   struct student b[8]={ {"201",80},{"202",90},{"203",95},{"204",60},                           {"205",63},{"206",74},{"207",80},{"208",76}};  int i;  float aver;  aver = average( b, 8); 改了       //-----------这行改了    printf("\t学号\tC语言成绩\n");  for (i=0; i<8; i++)  printf("\t%s%12.2f\n",b[i].num,b[i].score);  printf("班级平均成绩为%.2f\n",aver);  }

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


Question: 向一个char字节里写数据 操作符问题

引用 6 楼 weixin_41986620 的回复:[quote=引用 5 楼 shihengzhen101 的回复:] 位域赋值或者位操作都能达到目的 位操作我清楚了，位域赋值肿么破=。=[/quote] 参考代码  struct SBit { 	unsigned char a : 2; 	unsigned char b : 2; 	unsigned char c : 2; 	unsigned char d : 2; };  union NewBit { 	SBit s; 	unsigned char a; };  int main(int argc, char* argv[]) { 	NewBit n; 	n.s.a = 1; 	n.s.b = 2; 	n.s.c = 1; 	n.s.d = 2;  	printf("%d", n.a);  	return 0; }  运行结果

引用 5 楼 shihengzhen101 的回复:位域赋值或者位操作都能达到目的 位操作我清楚了，位域赋值肿么破=。=

位域赋值或者位操作都能达到目的

a &= 0x3f; a |= (0x01 << 6);  a &= 0xcf; a |= (0x02 << 4);  a &= 0xf3; a |= (0x01 << 2);  a &= 0xfc; a |= (0x02 << 0);

使用位域定义试试

不清楚楼主想问什么，如果只是想通过位运算表达 01100110这个值，只需要 a  = 0; a |= 0x66; 可是为何不直接 a = 102呢

听说可以用位操作符写进去，求问各路大神具体怎么写。。。


Question: 为甚播放不了背景音乐？

？什么意思？

参考： C语言（C++）Win32控制台下播放声音 http://blog.163.com/tab_98/blog/static/1192409720164156552991/

老师很热心，到处都能看到老师的解答

SetCurrentDirectory GetLastError


Question: 求众数

#include<stdio.h> #include<stdlib.h>  struct num { 	int number; 	int cnt; }; int main(void) { 	int n, tmp; 	int i, j, k, max;  	scanf("%d", &n);  	struct num *list = (struct num *)calloc(n, sizeof(struct num)); 	if (!list) 		exit(0);  	k = 0; 	for (i = 0; i < n; i++) { 		scanf("%d", &tmp); 		for (j = 0; j < i; j++) 			if (tmp == list[j].number) { 				list[j].cnt++; 				break; 			} 		if (j >= i) { 			list[k].number = tmp; 			list[k].cnt++; 			k++; 		} 	}  	max = 0; 	for (i = 1; i < k; i++) 		if (list[max].cnt < list[i].cnt) 			max = i;  	printf("max number is %d, counter is %d\n", 			list[max].number, list[max].cnt); }  参考一下吧，若众数有多个，再遍历一次，输出和最大次数相同的数和出现的次数

你这种写法，时间复杂度为0(n2)，且当输入一个数比较大时，数组可能会越界，而且数据稀疏时，很浪费空间，你先排序，在遍历一遍，时间复杂度为nlog2n  快速排序代码： int partition(int arr[], int left, int right) {     int i = left, j = right;     int key = arr[left];     while (i < j) {         while (i < j && arr[j] > key)             j--;         if (i < j) {             arr[i] = arr[j];             i++;         }         while (i < j && arr[i] < key)             i++;         if (i < j) {             arr[j] = arr[i];             j--;         }     }     arr[i] = key;     return i; } void quickSort(int arr[], int left, int right) {     if(left >= right)         return;     int j = partition(arr, left, right);     quickSort(arr, left, j - 1);     quickSort(arr, j + 1, right); }  然后在遍历排序好的数组，求连续相同最多的数


Question: 实在看不出来哪里错了呀

记得把代码格式化后再发上来，看着晕啊

astyle自动整理c,c++,java源代码格式命令行工具源代码。 用astyle --help查看使用帮助。 http://download.csdn.net/detail/zhao4zhong1/5605415

我刚刚自己搞定啦

忘记了equal函数了：  int  equal(User u1,User u2,int condition) { 	if(condition==1) 	return u1.num==u2.num; 	else  	return 1; }

struct tm *local;/*读取系统时间*/   time_t t;    struct tm *locall;   time_t tt;    struct tm *localll;   time_t ttt;  int cars[13][6];  int x;/*车类型大小判断*/  个人不建议定义这么多全局变量，能用局部变量的尽量使用局部变量。全局变量多了对于代码可读性会起反作用


Question: Linux C 段错误（核心已转储）

进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

#include<stdio.h> //写端 #include<signal.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<string.h> #include<errno.h>  #define MYFIFO  "/tmp/myfifo"   //有名管道文件名 #define SIZE 1024   //缓冲区大小  int main() {     int fd1; //写端文件描述符~     char str[SIZE];     //缓冲区     FILE *fp = NULL;     int len;     char name[20];    //拷贝文件名      printf("in(copy like ./*.txt)>");     fgets(name, 20, stdin); //if((len = strlen(name)) < 20-1)	name[len-1] = '\0'; //remove '\n'     name[strlen(name)-1]='\0';     printf("Confirm the name of the file:%s\n",name);      //以只读方式打开需要拷贝的文件“file”     if((fp = fopen(name,"r")) == NULL){		//         printf("file is not exist");         exit(1);     }      if((mkfifo(MYFIFO, 0666)) == -1) //创建管道，权限rw 	    printf("mkfifo error\n");     else 	    printf("mkfifo success\n");       fd1 = open(MYFIFO,O_WRONLY);    //以只写阻塞方式打开FIFO管道  //	if(fd1 == -1){ //	printf("open fifo error\n"); //	exit(1); //	}      while(fgets(str, 1024, fp) != NULL){         write(fd1, str, strlen(str));   //写入管道         printf("copy: %s",str);     }      close(fd1);     fp = NULL;     fclose(fp);     unlink(MYFIFO); //删除MYFIFO     return 0; } //读端 //读端 #include<stdio.h> #include<signal.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<string.h> #include<errno.h>   #define MYFIFO  "/tmp/myfifo"   //有名管道文件名 #define SIZE 1024   //缓冲区大小   int main() {     int fd0;    //管道     int file;        char name[20];//粘贴文件     char str[SIZE]; //缓冲区      //判断有名管道是否已经存在，若尚未创建，则以相应的权限创建     if(access(MYFIFO, F_OK) == -1)     {         if((mkfifo(MYFIFO, 0666) < 0) && (errno != EEXIST))         {             printf("Cannot create fifo file!\n");             exit(1);         }     }     //fd0 = open(MYFIFO,O_RDONLY);        //以只读阻塞方式打开有名管道     if((fd0 = open(MYFIFO,O_RDONLY)) == -1)     {         printf("Open fifo file error!\n");         exit(1);     }      printf("in(paste like ./*.txt)>");     fgets(name, 20, stdin);      //创建粘贴文件     //file = open(name, O_CREAT|O_WRONLY);     if((file = open(name, O_CREAT|O_WRONLY)) < 0){         printf("Open paste file error!\n");         exit(1);     }      memset(str, 0, SIZE);   //清空刚创建的粘贴文件     //写入     while(read(fd0, str, SIZE) > 0){         printf("paste: %s", str);         write(file, str, strlen(str));     }      close(file);     close(fd0);     return 0; }

引用 3 楼 cfjtaishan 的回复:注意1：fgets使用时，若输入的字符小于20 - 1个字符，即小于19个字符时，会将'\n'加入到name中。 注意2：fopen的返回值是NULL或非NULL，若为NULL则表示打开失败，否则位打开成功。因此不是和0比较大小； 注意3：注意判断fd1的值，确保管道是打开成功，否则应退出程序  你好，我把fges和fopen的错都改正了，在打开管道部分也正常能打开。配合我写的读端出现的错误在mkfifo(MYFIFO,0666)，这里报错了，我把fifo的路径也改成"/tmp/myfifo",卡在这后运行读端并在读端创建成功管道，能读到，但写端还是提示段错误

#include<stdio.h> #include<signal.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<string.h> #include<errno.h>  #define MYFIFO  "/myfifo"   //有名管道文件名  #define SIZE 128   //缓冲区大小  int main() {     int fd1; //写端文件描述符~     char str[SIZE];     //缓冲区     FILE *fp;      char name[20];    //拷贝文件名     printf("in(copy like ./*.txt)>");     fgets(name, 20, stdin);      if ((len = strlen[name]) < 20 - 1)     	name[len] = 0;    //remove '\n'      //以只读方式打开需要拷贝的文件“file”     if((fp = fopen(name,"r")) == NULL){         printf("file is not exist");         //printf("%c is not exist",file);         exit(1);     }     mkfifo(MYFIFO, 0666);   //创建管道，权限rw     fd1 = open(MYFIFO,O_WRONLY);    //以只写阻塞方式打开FIFO管道     while(fgets(str, 1024, fp) != NULL){         write(fd1, str, strlen(str));   //写入管道         printf("copy: %s",str);     }     close(fd1);     fclose(fp);     unlink(MYFIFO); //删除MYFIFO     return 0; }  注意1：fgets使用时，若输入的字符小于20 - 1个字符，即小于19个字符时，会将'\n'加入到name中。 注意2：fopen的返回值是NULL或非NULL，若为NULL则表示打开失败，否则位打开成功。因此不是和0比较大小； 注意3：注意判断fd1的值，确保管道是打开成功，否则应退出程序

打开文件是失败的，在if语句上面加上这条语句试下  name[strlen(name)-1]='\0';

GDB -rdynamic 调试的结果是 Program received signal SIGSEGV, Segmentation fault. _IO_fgets (buf=0x7fffffffdca0 "", n=1024, fp=0x0) at iofgets.c:47                                                                        ^^^^^^^^ 47	iofgets.c: 没有那个文件或目录.  注意，fp是0。检查下前面文件真的open成功了吗


Question: 跪求大神指导二进制文件读取

感谢大神，考虑到是问题2造成的

struct prolink *Read()/*将试卷从文件以链表的形式读到内存*/ {     FILE *fp;     char filename[20];     struct prolink *Head=NULL, *la, *lb;     int i=0;     printf("请输入试题库所在的文件名：");     //scanf("%s", &filename);     scanf("%s", filename);     fp = fopen(filename, "rb"); /* 试题从二进制文件读入内存 */     if (!fp)         exit(0);     while (!feof(fp))     {         if (i == 0) /* 将数据读入链表的第一个结点 */         {             la = lb = (struct prolink *)malloc(sizeof(struct prolink));             fread(la, sizeof(struct problem), 1, fp);             Head = la;         }         else /* 将数据读入链表的非第一结点 */         {             la = (struct prolink *)malloc(sizeof(struct prolink));             fread(la, sizeof(struct problem), 1, fp);             lb->next = la;             la->next = NULL;             lb = la;         }         printf("* * * *\n");         printf(" 第%d题：\n", i+1); /* 在屏幕上显示结点中所包含的数据 */         printf(" 知识点：%s\n", la->point);         printf(" 难度：%d\n", la->degree);         printf(" 分值：%d\n", la->fenzhi);         printf(" 题干：%s\n", la->words);         printf(" 选项：%s %s %s %s\n", la->ansA, la->ansB, la->ansC, la->ansD);         printf(" 正确答案：%s\n", la->right);         i++;     }     fclose(fp);     return Head; } 问题1：文件内容是通过fwrite方式写入的吗？如果不是，就可能会出现乱码； 问题2：若是通过fwrite方式写的文件，写文件时是否将next内容也写入了，若没有，读取时却带next，肯定会导致乱码； 问题3：struct problem和struct prolink类型一样吗？若不一样，程序也会有异常。  //scanf("%s", &filename);     scanf("%s", filename); filenmame是数组，因此本身就是地址，所以去掉&


Question: 字节内高低位互换

#define HALFBYTE_SWAP(x) (((unsigned int)(x) >> 4) & 0x0f0f0f0f | ((x) << 4) & 0xf0f0f0f0)

#include <iostream> #include <cstdio> #include <cstring>  using namespace std;  int main() {     unsigned int    a = 0xAE007845, b, i;      char buf[16], ch;     snprintf(buf, sizeof(buf), "%X", a);      for (i = 0; i < strlen(buf) - 1; i += 2) {         ch = buf[i];         buf[i] = buf[i+1];         buf[i+1] = ch;     }      cout<<buf<<endl;     sscanf(buf, "%X", &b);      printf("%X --> %X\n", a, b);     cout<<a<<b<<endl;      return 0; }  作为一个参考吧 方法可能多种，具体用哪种要根据实际使用场景。

#include<stdio.h>  unsigned int myswap(unsigned int x);  int main() {     unsigned int	a = 0xAE007845, b;     b = myswap(a);     printf("a=%x, b=%x\n", a, b);     return 0; }  unsigned int myswap(unsigned int x) { 	int		i, size = sizeof(x); 	unsigned int	result; 	char	*px = (char *)&x, *pr = (char *)&result; 	for (i = 0; i < size; i++) 		pr[i] = (px[i] & 0x0f) << 4 | (px[i] & 0xf0) >> 4; 	return result; }


Question: C语言程序椭圆，寻求帮助，互帮互助，现在此谢过大家了

引用 4 楼 jiht594 的回复:[quote=引用 3 楼 sd990620 的回复:] 楼主如果想用C玩玩图形、小游戏编程，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。EasyX既可以绘图，也支持图像显示和处理。  椭圆应该不能用int main(void)，应该改为main（） int main是标准形式。没听说不行的[/quote] 谢谢指正，很抱歉记错了，int main(void)才是标准写法。十分感谢

引用 3 楼 sd990620 的回复:楼主如果想用C玩玩图形、小游戏编程，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。EasyX既可以绘图，也支持图像显示和处理。  椭圆应该不能用int main(void)，应该改为main（） int main是标准形式。没听说不行的

楼主如果想用C玩玩图形、小游戏编程，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。EasyX既可以绘图，也支持图像显示和处理。  椭圆应该不能用int main(void)，应该改为main（） 你的  ellipse函数部分也有点问题 应该改为 #include "stdio.h"  #include "graphics.h"  #include "conio.h"  main()  {  int x=360,y=160,driver=VGA,mode=VGAHI;  int num=20,i;  int top,bottom;  initgraph(&driver,&mode,"");  top=y-30;  bottom=y-30;  for(i=0;i<num;i++)  {  ellipse(250,250,0,360,top,bottom);  top-=5;  bottom+=5;  }  getch();  }    如果要用int main(void)来定义，应该要使用fillellipse函数 #include <graphics.h>  #include <conio.h>     int main(void)  {      int gdriver = DETECT, gmode;      int xcenter, ycenter, i;         initgraph(&gdriver,&gmode,"");      xcenter = getmaxx() / 2;      ycenter = getmaxy() / 2;         for (i=0; i<13; i++)      {          setfillstyle(i,WHITE);          fillellipse(xcenter,ycenter,100,50);          getch();      }         closegraph();      return 0;  }   如果不用系统函数自己画的话,椭圆的定义:到两个焦点的距离和为定值. 假设焦点为(-F, 0), (F, 0), 定值为S, 则最左边的点为-S/2, 所以x的坐标可以从-S/2循环到S/2 #include<stdio.h> #include<math.h> struct Ellipse {     short x1;     short y1;     short x2;     short y2;     short span; }; int main() {     short right,bottom,i,idx;     struct Ellipse myEllipse;     printf("输入焦点1坐标，用逗号隔开：");     scanf("%d,%d",&myEllipse.x1,&myEllipse.y1);     printf("输入焦点2坐标，用逗号隔开：");     scanf("%d,%d",&myEllipse.x2,&myEllipse.y2);     do     {         printf("输入椭圆上的点离两个焦点的距离之和（应大于两个焦点间的距离）：");         scanf("%d",&myEllipse.span);     }while(myEllipse.span<=sqrt((myEllipse.x1-myEllipse.x2)*(myEllipse.x1-myEllipse.x2)+(myEllipse.y1-myEllipse.y2)*(myEllipse.y1-myEllipse.y2)));     right=myEllipse.span+myEllipse.x1;bottom=myEllipse.span+myEllipse.y1;     for(i=0;i<=right;i++)     {         for(idx=0;idx<=bottom;idx++)         {             if((short)(sqrt((idx-myEllipse.x1)*(idx-myEllipse.x1)+(i-myEllipse.y1)*(i-myEllipse.y1))+sqrt((idx-myEllipse.x2)*(idx-myEllipse.x2)+(i-myEllipse.y2)*(i-myEllipse.y2)))==myEllipse.span)                 printf("*");             else                 printf(" ");         }         printf("\n");     }     return 0; } 希望对你有帮助

在VC中使用Sleep带上头文件  #include <windows.h>  S大写

Ellipse函数 函数功能 该函数用于画一个椭圆，椭圆的中心是限定矩形的中心，使用当前画笔画椭圆，用当前的画刷填充椭圆。 函数原型 BOOL Ellipse(HDC hdc,int nLeftRect,int nTopRect,nRightRect,int nBottomRect). 参数 hdc：设备环境句柄。 nLeftRect：指定限定椭圆左上角的X坐标。 nTopRect：指定限定椭圆左上角的Y坐标。 nRightRect：指定限定椭圆右下角的X坐标。 nBottomRect：指定限定椭圆右下角的Y坐标。 [3]  返回值 如果函数调用成功，返回值非零；如果函数调用失败，返回值是0。


Question: 求助 基于马尔科夫链的文本生成器数据过多导致崩溃如何解决

codes定义那么多变量，难道看着不乱吗？

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


Question: 请教:怎么把整数,变为 unsigned char 字符串,谢谢!

引用 10 楼 lsh9982010 的回复:还有个问题  snprintf((char *)rdbuf, 8, "%d", a);  为什么不是 snprintf((char *)rdbuf, sizeof(rdbuf), "%d", a); 用sizeof()更好。但是注意前提是rdbuf是数组而不是指针（地址）。

谢谢各位，可以了

引用 7 楼 cfjtaishan 的回复:[quote=引用 3 楼 lsh9982010 的回复:] snprintf((char *)rdbuf, 8, "%d", a);  这里是 char 要 unsigned char 额，这个char *是防止有警告的，最终字符串"1234"是放在rdbuf中的，rdbuf是unsigned char类型的。。你试一下输出的rdbuf是不是字符串"1234“;[/quote]     error C2664: “sprintf”: 不能将参数 2 从“int”转换为“const char *”

引用 3 楼 lsh9982010 的回复:snprintf((char *)rdbuf, 8, "%d", a);  这里是 char 要 unsigned char 额，这个char *是防止有警告的，最终字符串"1234"是放在rdbuf中的，rdbuf是unsigned char类型的。。你试一下输出的rdbuf是不是字符串"1234“;

作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

提示 , unsigned char 不能转换为 char

引用 2 楼 lsh9982010的回复:[quote=引用 1 楼 cfjtaishan 的回复:] snprintf((char *)rdbuf, 8, "%d", a); 有个问题，unsigned char a能表示1234;一个字节能表示的最大无符号数为256   我错了，应该是 unsigned char rdbuf[8]; uint16_t a = 1234;  void myIntToStr(rdbuf , a) { ; }  希望结果:rdbuf 为字符串 "1234"  [/quote] 直接itoa(a, (char*)rdbuf, 10);就可以了  需要包含stdlib.h头文件

引用 1 楼 cfjtaishan 的回复:snprintf((char *)rdbuf, 8, "%d", a); 有个问题，unsigned char a能表示1234;一个字节能表示的最大无符号数为256   我错了，应该是 unsigned char rdbuf[8]; uint16_t a = 1234;  void myIntToStr(rdbuf , a) { ; }  希望结果:rdbuf 为字符串 "1234"


Question: 求助！！！C语言版的贪吃蛇问题，谢谢。

学习一下#3楼的代码。

我大概看了下，就结果而言，我还是不懂。 通过调试我发现不管两次按键时间多么接近，在循环的时候中间总是会出现一次按键识别不了， 比如我一打开就输入 左 下。 _getchar() 两次循环的值：75、80 可是实际上是：75、-32、80 中间多了一次是-32，然后多走了一步。 我简单修改了下RunGame()  void RunGame() { 	while (1) 	{ 		/////////////////////////////// 		COORD pos_1 = { Wid + 2,4 }; 		char a = 0; 		if (_kbhit()) 		{ 			a = _getch(); 			if (a == -32) 			{ 				continue; 			}  		}  		switch (a) 		{ 		case 72: 			if (HeadPos.dir != 1) 			{ 				HeadPos.dir = 0;//上 			} 			break; 		case 80: 			if (HeadPos.dir != 0) 			{ 				HeadPos.dir = 1;//下 			} 			break; 		case 75: 			if (HeadPos.dir != 3) 			{ 				HeadPos.dir = 2;//左 			} 			break; 		case 77: 			if (HeadPos.dir != 2) 			{ 				HeadPos.dir = 3;//右 			} 			break; 		case 'a': 			pos_1.Y = 8; 			GetPosition(pos_1); 			system("pause"); 			GetPosition(pos_1); 			printf("                "); 			GetPosition(pos_1); 			printf("按a键暂停游戏"); 			break; 		case '5': 			speed = 50; 			GetPosition(pos_1); 			printf("当前模式：噩梦"); 			break; 		case '4': 			speed = 100; 			GetPosition(pos_1); 			printf("当前模式：困难"); 			break; 		case '3': 			speed = 150; 			GetPosition(pos_1); 			printf("当前模式：一般"); 			break; 		case '2': 			speed = 200; 			GetPosition(pos_1); 			printf("当前模式：简单"); 			break; 		case '1': 			speed = 1000; 			GetPosition(pos_1); 			printf("当前模式：蜗牛"); 			break; 		}  		switch (HeadPos.dir) 		{ 		case 0: 			HeadPos.pos.Y--; 			break; 		case 1: 			HeadPos.pos.Y++; 			break; 		case 2: 			HeadPos.pos.X -= 2; 			break; 		case 3: 			HeadPos.pos.X += 2; 			break; 		} 		/////////////////////////////// 		 		if (GameOver()) 		{ 			break; 		} 		else if (HeadPos.pos.X == Food.X&&HeadPos.pos.Y == Food.Y) 		{ 			AddSnakeBody(HeadPos.pos); 			InitFood(); 		} 		else 		{ 			MoveSnake(HeadPos.pos); 		}  		Sleep(speed); 	} 	COORD pos = { 0,Hei }; 	GetPosition(pos); 	printf("很遗憾，你撞墙了或者自食自己，游戏结束!\n"); }  判断并把-32的值跳过， 然后效果差不多了。  我原以为是_kbhit()和_getch()这两个函数的特点， 可是我新建了一个项目，简单地搭建了类似的场景，测试结果却没有上面那种问题。 这个问题……搞不懂了。 我也是有点好奇，请路过的高手回答吧。

总的来说，要考虑按键的时序和Sleep在主循环中的位置的关系。

仅供参考：#include <conio.h> #include <windows.h>  void ConPrintAt(int x, int y, char *CharBuffer, int len) {    DWORD count;    COORD coord = {x, y};    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleCursorPosition(hStdOut, coord);    WriteConsole(hStdOut, CharBuffer, len, &count, NULL); } void HideTheCursor() {    CONSOLE_CURSOR_INFO cciCursor;    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if(GetConsoleCursorInfo(hStdOut, &cciCursor))    {       cciCursor.bVisible = FALSE;       SetConsoleCursorInfo(hStdOut, &cciCursor);    } }  void ShowTheCursor() {    CONSOLE_CURSOR_INFO cciCursor;    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if(GetConsoleCursorInfo(hStdOut, &cciCursor))    {       cciCursor.bVisible = TRUE;       SetConsoleCursorInfo(hStdOut, &cciCursor);    } } void GetWH(int *w,int *h) {     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     CONSOLE_SCREEN_BUFFER_INFO csbi;     if (GetConsoleScreenBufferInfo(hStdOut, &csbi)) {         *w=csbi.srWindow.Right;         *h=csbi.srWindow.Bottom;     } else {         *w=80;         *h=25;     } } void ClearConsole() {    //Get the handle to the current output buffer...    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    //This is used to reset the carat/cursor to the top left.    COORD coord = {0, 0};    //A return value... indicating how many chars were written    //   not used but we need to capture this since it will be    //   written anyway (passing NULL causes an access violation).    DWORD count;    //This is a structure containing all of the console info    // it is used here to find the size of the console.    CONSOLE_SCREEN_BUFFER_INFO csbi;    //Here we will set the current color    if(GetConsoleScreenBufferInfo(hStdOut, &csbi))    {       //This fills the buffer with a given character (in this case 32=space).       FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);       FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);       //This will set our cursor position for the next print statement.       SetConsoleCursorPosition(hStdOut, coord);    } }  int main() {     unsigned short k;     int x,y,w,h;     char d;      SetConsoleOutputCP(437);     ClearConsole();     GetWH(&w,&h);     x=w/2;y=h/2;     HideTheCursor();     ConPrintAt(x,y,"O",1);     d='o';     while (1) {         Sleep(50);         if (kbhit()) {             k=getch();             if (27==k) break;//按Esc键退出             if (0==k||0xe0==k) k|=getch()<<8;//非字符键             switch (k) {                 case 0x48e0:case 0x04800://上                     d='u';                     if (y>0) {                         ConPrintAt(x,y," ",1);                         y--;                         ConPrintAt(x,y,"O",1);                     }                 break;                 case 0x50e0:case 0x05000://下                     d='d';                     if (y<h) {                         ConPrintAt(x,y," ",1);                         y++;                         ConPrintAt(x,y,"O",1);                     }                 break;                 case 0x4be0:case 0x04b00://左                     d='l';                     if (x>0) {                         ConPrintAt(x,y," ",1);                         x--;                         ConPrintAt(x,y,"O",1);                     }                 break;                 case 0x4de0:case 0x04d00://右                     d='r';                     if (x<w-1) {                         ConPrintAt(x,y," ",1);                         x++;                         ConPrintAt(x,y,"O",1);                     }                 break;             } //          cprintf("%04x pressed.\r\n",k);         } else {             switch (d) {                 case 'u':                     if (y>0) {                         ConPrintAt(x,y," ",1);                         y--;                         ConPrintAt(x,y,"O",1);                     }                 break;                 case 'd':                     if (y<h) {                         ConPrintAt(x,y," ",1);                         y++;                         ConPrintAt(x,y,"O",1);                     }                 break;                 case 'l':                     if (x>0) {                         ConPrintAt(x,y," ",1);                         x--;                         ConPrintAt(x,y,"O",1);                     }                 break;                 case 'r':                     if (x<w-1) {                         ConPrintAt(x,y," ",1);                         x++;                         ConPrintAt(x,y,"O",1);                     }                 break;             }         }     }     ClearConsole();     ShowTheCursor();     return 0; }

单步调试是程序员的基本技能，转弯的时候下个断点看一下


Question: 寻找android平台的视频会议客户端的开源项目

自己顶一个，别石沉大海！


Question: 求助，QT如何读取http服务器上文件内容，不需要下载

求各位大佬相助


Question: 年历输出问题

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

引用 1 楼 自信男孩的回复:void function2(int y,int m,int d) {     FILE*fp;     int date[24][21];     int day[]={31,28,31,30,31,30,31,31,30,31,30,31};     const char *month[12]={ "Jan", "Feb", "Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};     const char *wday[7]={"Sun","Mon","Tuc","Wed","Tur","Fri","Sat"};     int w[12];     int i,j,k,year,n;     printf("\n\t请输入查询年份：");     scanf("%d",&year);     for(i=0;i<24;i++)         for(j=0;j<21;j++)             date[i][j]=0;     //if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)     if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))         day[1]=29;     else         day[1]=28;     w[0]=getWeekDay(year,1,1); //这个是求出这一年第一个月是周几。     for(i=1;i<12;i++)         w[i]=(w[i-1]+day[i-1])%7;     for(j=0;j<12;j++)     {         n=0;         for(i=1;i<=day[j];i++)         {             date[(j/3)*6+n][(j%3)*7+w[j]]=i ;             w[j]++;             if(w[j]==7)             {w[j]=0; n++; }         }     }     fp = fopen("cal.txt","w");     //if(fopen("cal.txt","w") == NULL)     if (!fp)     {         printf("文件打不开");         return;     }     fprintf(fp,"\n***********************************%d",year);     fprintf(fp,"\n***********************************");     for(i=0;i<4;i++)     {         for(j=0;j<3;j++)         {             fprintf(fp,"%4s",month[i*3+j]);             fprintf(fp,"%28s"," ");         }         fprintf(fp,"\n");         for(j=0;j<3;j++)         {             for(k=0;k<7;k++)                 fprintf(fp,"%4s",wday[k]);             fprintf(fp," ");         }         fprintf(fp,"\n");         for(j=0;j<6;j++)         {             for(k=0;k<21;k++)             {                 if(date[i*6+j][k]==0)                     fprintf(fp," ");                 if(k==6||k==13)                     fprintf(fp," ");             }         }     } }  代码逻辑有些问题，一个地方是判断闰年，一个地方时文件打开（文件打开一次即可，没必要打开两次）。 一张是我的程序图，一张是我的运行结果图，格式乱了。最后一张是要求的格式。能帮我看一下我的输出格式哪里错了嘛？

引用 2 楼 zhao_miao的回复:我只会一次输出一个月的https://blog.csdn.net/zhao_miao/article/details/80566106不知道对你有没有用。 一个月的比较简单，我会。这个是三个月一行，用到了数组。我的算法是对的，但是输入之后，格式乱了。

引用 1 楼 自信男孩的回复:void function2(int y,int m,int d) {     FILE*fp;     int date[24][21];     int day[]={31,28,31,30,31,30,31,31,30,31,30,31};     const char *month[12]={ "Jan", "Feb", "Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};     const char *wday[7]={"Sun","Mon","Tuc","Wed","Tur","Fri","Sat"};     int w[12];     int i,j,k,year,n;     printf("\n\t请输入查询年份：");     scanf("%d",&year);     for(i=0;i<24;i++)         for(j=0;j<21;j++)             date[i][j]=0;     //if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)     if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))         day[1]=29;     else         day[1]=28;     w[0]=getWeekDay(year,1,1); //这个是求出这一年第一个月是周几。     for(i=1;i<12;i++)         w[i]=(w[i-1]+day[i-1])%7;     for(j=0;j<12;j++)     {         n=0;         for(i=1;i<=day[j];i++)         {             date[(j/3)*6+n][(j%3)*7+w[j]]=i ;             w[j]++;             if(w[j]==7)             {w[j]=0; n++; }         }     }     fp = fopen("cal.txt","w");     //if(fopen("cal.txt","w") == NULL)     if (!fp)     {         printf("文件打不开");         return;     }     fprintf(fp,"\n***********************************%d",year);     fprintf(fp,"\n***********************************");     for(i=0;i<4;i++)     {         for(j=0;j<3;j++)         {             fprintf(fp,"%4s",month[i*3+j]);             fprintf(fp,"%28s"," ");         }         fprintf(fp,"\n");         for(j=0;j<3;j++)         {             for(k=0;k<7;k++)                 fprintf(fp,"%4s",wday[k]);             fprintf(fp," ");         }         fprintf(fp,"\n");         for(j=0;j<6;j++)         {             for(k=0;k<21;k++)             {                 if(date[i*6+j][k]==0)                     fprintf(fp," ");                 if(k==6||k==13)                     fprintf(fp," ");             }         }     } }  代码逻辑有些问题，一个地方是判断闰年，一个地方时文件打开（文件打开一次即可，没必要打开两次）。 判断闰年那个是另外一个函数判断的，现在我的是输出格式不对，我给你看一下我整理完之后的代码吧。  每个月的日期输出格式出错了，我本来写了一个语句把数组中等于0的变为空格，但是那个语句好像并没有运行。    //功能二  void function2(int y,int m,int d) {FILE*fp;  int date[24][21]; int day[]={31,28,31,30,31,30,31,31,30,31,30,31}; char *month[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};  char *wday[7]={"Sun","Mon","Tuc","Wed","Tur","Fri","Sat"}; int w[12]; int i,j,k,year,n;    printf("\n\t请输入查询年份："); scanf("%d",&year);  for(i=0;i<24;i++)  for(j=0;j<21;j++)  date[i][j]=0; if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) day[1]=29; else day[1]=28; w[0]=getWeekDay(year,1,1); for(i=1;i<12;i++) w[i]=(w[i-1]+day[i-1])%7; for(j=0;j<12;j++) {   n=0;        for(i=1;i<=day[j];i++)           {                   date[(j/3)*6+n][(j%3)*7+w[j]]=i ;                    w[j]++;                   if(w[j]==7)                    {w[j]=0; n++; }                                  }  }    fp=fopen("cal.txt","w"); if((fopen("cal.txt","w")==NULL)) {printf("文件打不开"); }  fprintf(fp,"\n***********************************%d",year); fprintf(fp,"***********************************\n"); for(i=0;i<4;i++) {       for(j=0;j<3;j++)        { 	      fprintf(fp,"%4s",month[i*3+j]); 	      fprintf(fp,"%28s"," "); 	             }            fprintf(fp,"\n");            for(j=0;j<3;j++)             {             	for(k=0;k<7;k++)             	fprintf(fp,"%4s",wday[k]);             	fprintf(fp," ");                }                fprintf(fp,"\n");                for(j=0;j<6;j++)                {                	for(k=0;k<21;k++)                	{                  	   if(date[i*6+j][k]==0)                	   fprintf(fp," ");                	   if(k==6||k==13)                	   fprintf(fp," ");                    fprintf(fp, “%2d”,date[i*6+j][k]);                   }                                      }                                                    } fclose(fp);  again(y,m,d); }


Question: 怎样定义较大的整数，比如1亿

可以定义长整型，用long

定义longlong a,b,c. unsigned long long的最大值：1844674407370955161 long long的最大值：9223372036854775807 最小取值则是负数

解决方案： 1：gmp 2：Long unsigned long 3：再大，就用字符串代替

仅供参考：#include <iostream> #include <string> using namespace std; inline int compare(string str1,string str2) {//相等返回0，大于返回1，小于返回-1          if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数     else if (str1.size()<str2.size()) return -1;     else                              return str1.compare(str2); //若长度相等，则头到尾按位比较 } string SUB_INT(string str1,string str2); string ADD_INT(string str1,string str2) {//高精度加法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         if (str2[0]=='-') {             sign=-1;             str=ADD_INT(str1.erase(0,1),str2.erase(0,1));         } else {             str=SUB_INT(str2,str1.erase(0,1));         }     } else {         if (str2[0]=='-') {             str=SUB_INT(str1,str2.erase(0,1));         } else { //把两个整数对齐，短整数前面加0补齐             string::size_type L1,L2;             int i;             L1=str1.size();             L2=str2.size();             if (L1<L2) {                 for (i=1;i<=L2-L1;i++) str1="0"+str1;             } else {                 for (i=1;i<=L1-L2;i++) str2="0"+str2;             }             int int1=0,int2=0; //int2 记录进位             for (i=str1.size()-1;i>=0;i--) {                 int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;                 int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;                 str=char(int1+'0')+str;             }             if (int2!=0) str=char(int2+'0')+str;         }     }     //运算后处理符号位     if ((sign==-1)&&(str[0]!='0')) str="-"+str;     return str; } string SUB_INT(string str1,string str2) {//高精度减法     int sign=1; //sign 为符号位     string str;     int i,j;     if (str2[0]=='-') {         str=ADD_INT(str1,str2.erase(0,1));     } else {         int res=compare(str1,str2);         if (res==0) return "0";         if (res<0) {             sign=-1;             string temp =str1;             str1=str2;             str2=temp;         }         string::size_type tempint;         tempint=str1.size()-str2.size();         for (i=str2.size()-1;i>=0;i--) {             if (str1[i+tempint]<str2[i]) {                 j=1;                 while (1) {//zhao4zhong1添加                     if (str1[i+tempint-j]=='0') {                         str1[i+tempint-j]='9';                         j++;                     } else {                         str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);                         break;                     }                 }                 str=char(str1[i+tempint]-str2[i]+':')+str;             } else {                 str=char(str1[i+tempint]-str2[i]+'0')+str;             }         }         for (i=tempint-1;i>=0;i--) str=str1[i]+str;     }     //去除结果中多余的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str ="-"+str;     return str; } string MUL_INT(string str1,string str2) {//高精度乘法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         sign*=-1;         str1 =str1.erase(0,1);     }     if (str2[0]=='-') {         sign*=-1;         str2 =str2.erase(0,1);     }     int i,j;     string::size_type L1,L2;     L1=str1.size();     L2=str2.size();     for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式         string tempstr;         int int1=0,int2=0,int3=int(str2[i])-'0';         if (int3!=0) {             for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;             for (j=L1-1;j>=0;j--) {                 int1=(int3*(int(str1[j])-'0')+int2)%10;                 int2=(int3*(int(str1[j])-'0')+int2)/10;                 tempstr=char(int1+'0')+tempstr;             }             if (int2!=0) tempstr=char(int2+'0')+tempstr;         }         str=ADD_INT(str,tempstr);     }     //去除结果中的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str="-"+str;     return str; } string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商；flag==0时,返回余数     string quotient,residue; //定义商和余数     int sign1=1,sign2=1;     if (str2 == "0") {  //判断除数是否为0         quotient= "ERROR!";         residue = "ERROR!";         if (flag==1) return quotient;         else         return residue ;     }     if (str1=="0") { //判断被除数是否为0         quotient="0";         residue ="0";     }     if (str1[0]=='-') {         str1   = str1.erase(0,1);         sign1 *= -1;         sign2  = -1;     }     if (str2[0]=='-') {         str2   = str2.erase(0,1);         sign1 *= -1;     }     int res=compare(str1,str2);     if (res<0) {         quotient="0";         residue =str1;     } else if (res == 0) {         quotient="1";         residue ="0";     } else {         string::size_type L1,L2;         L1=str1.size();         L2=str2.size();         string tempstr;         tempstr.append(str1,0,L2-1);         for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式             tempstr=tempstr+str1[i];             tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加             if (tempstr.empty()) tempstr="0";//zhao4zhong1添加             for (char ch='9';ch>='0';ch--) { //试商                 string str;                 str=str+ch;                 if (compare(MUL_INT(str2,str),tempstr)<=0) {                     quotient=quotient+ch;                     tempstr =SUB_INT(tempstr,MUL_INT(str2,str));                     break;                 }             }         }         residue=tempstr;     }     //去除结果中的前导0     quotient.erase(0,quotient.find_first_not_of('0'));     if (quotient.empty()) quotient="0";     if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;     if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;     if (flag==1) return quotient;     else         return residue ; } string DIV_INT(string str1,string str2) {//高精度除法,返回商     return DIVIDE_INT(str1,str2,1); } string MOD_INT(string str1,string str2) {//高精度除法,返回余数     return DIVIDE_INT(str1,str2,0); } int main() {     char ch;     string s1,s2,res;      while (cin>>s1>>ch>>s2) {         switch (ch) {             case '+':res=ADD_INT(s1,s2);break;             case '-':res=SUB_INT(s1,s2);break;             case '*':res=MUL_INT(s1,s2);break;             case '/':res=DIV_INT(s1,s2);break;             case '%':res=MOD_INT(s1,s2);break;             default :                   break;         }         cout<<res<<endl;     }     return(0); }

引用 3 楼 goldenhawking 的回复:gmp例子：  #include <gmpxx.h> #include <iostream> using namespace std; int main () {   mpz_class a, b, c;    a = 1234;   b = "-5678845738956723096583057390673675";   c = a*b;   cout << "a*b is " << c << "\n";   cout << "absolute value is " << abs(c) << "\n";    return 0; }    输出：  a*b is -7007695641872596301183492820091314950 absolute value is 7007695641872596301183492820091314950  之前没有用过，我要去试试哈

用int定义三个变量，较大的正整型变量会溢出的可能。解决办法是定义无符号类型的较大类型的变量；  如果要定义更大的变量，大到long long或unsigned long long都无法表示，那就用字符串表示和进行运算；  #include <stdio.h>  int main() {     unsigned long a, b, c;     printf("请依次输入a，b，c三个整数：\n");     scanf("%lu %lu %lu", &a, &b, &c);      printf("%lu, %lu, %lu\n", a, b, c);     unsigned long max = 0;      if ( a>b ){         if ( a>c ){             max = a;         }else {             max = c;         }     }else {         if ( b>c ){             max = b;         }         else{             max = c;         }     }     printf("The max is %lu\n", max);      return 0; }

GNU MP libgmp是开源的库


Question: 新手关于scanf()的问题

感谢，确实如此

输入的c 2 3；c是通过getchar()给ch, 2, 3赋值给rows和cols 因为输入是行缓冲，即只有回车后c 2 3才会分别存放到ch , rows, cols内存里。 scanf返回值是2，但是换行符'\n'还在输入缓存里，因此最后'\n'赋值给ch，跳出while循环

仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }


Question: 求助,怎么通过函数，把一个字符串，赋值给另一个字符串，谢谢!

引用 3 楼 lsh9982010 的回复:能不能这样  void f1(int id, unsigned char  *data) {   Data1[id] = data; }   然后这样调用 f1(2,data2);  谢谢！ 不可以的，需要使用strcpy或者strncpy或者memcpy，具体使用楼上有好的例子

strcpy((char*)Data1[id], (const char*)data);  需要加上#include <string.h> 头文件  不能直接Data1[id] = data;，因为这是在赋值指针，而不是拷贝指针指向的字符串

引用 10 楼 cfjtaishan 的回复:void mystrcpy(unsigned char *dst, unsigned char *src) {     unsigned char *tmp = dst;      while((*tmp++ = *src++))        ; } 这样试试  一样出现这个警告 谢谢！

while((*tmp++ = *src++) != 0)        ; 那就不偷懒了。

引用 7 楼 lsh9982010 的回复://¿½±´ void mystrcpy(unsigned char *dst, unsigned char *src) { 	unsigned char *tmp = dst;  	while(*tmp++ = *src++) 	{ 		; 	} }   编译  在  while(*tmp++ = *src++)   提示 warning:  #1293-D: assignment in condition  这是什么原因阿？ 谢谢！  while((*tmp++ = *src++) != '\0')  这样就没有warning了。其实跟原来一样

引用 7 楼 lsh9982010 的回复://¿½±´ void mystrcpy(unsigned char *dst, unsigned char *src) { 	unsigned char *tmp = dst;  	while(*tmp++ = *src++) 	{ 		; 	} }   编译  在  while(*tmp++ = *src++)   提示 warning:  #1293-D: assignment in condition  这是什么原因阿？ 谢谢！ 这个警告可以忽略。不影响使用

引用 3 楼 lsh9982010 的回复:能不能这样  void f1(int id, unsigned char  *data) {   Data1[id] = data; }   然后这样调用 f1(2,data2);  谢谢！ 不能，因为Data1是字符串数组，不是指针数组。

strcpy  memcpy

void f1(int id, unsigned char  *data) {    strcpy(Data1[id-1], data);    //若id是对应的Data1的行数； } f1(1, Data2);   //调用f1实现Data2拷贝到Data1中。

引用 4 楼 lsh9982010 的回复:void f1(int id, unsigned char  *data) {    strcpy(Data1[id-1], data);    //若id是对应的Data1的行数； }   好像单片机的 C51 ，没有 strcpy  这怎么办？  谢谢！ 那就自己写一个strcpy或memcpy吧 或者从库里找到strcpy或memecpy的源码；  找一下网上别人写的strcpy或memcpy源码；自己改一改或者不用改弄明白就可以拿来用。


Question: 关于i++和++i

引用 9 楼 qq_42324974 的回复:谢谢各位。大致明白了，可能我经验不够，等以后多加实践应该会理解更透彻 我没怎么明白，什么情况，为什么结果是３，１，３，我还是没明白

谢谢各位。大致明白了，可能我经验不够，等以后多加实践应该会理解更透彻

引用 7 楼 goldenhawking 的回复:进入实验室第一课，禁止学生使用连体++运算——只准出现在for语句里。所有移位、位运算全部按照自己的逻辑用括号，不要猜测优先级。 这是为了大工程的稳定性考虑。 这个有道理，也减低了维护的成本

未定义行为  https://blog.csdn.net/shenqixiaozi1234/article/details/11876219

别处看到的，貌似挺有道理的： 在写代码中，如非必需，尽量避免后置形式，因为：前置形式避免了不必要的工作，它把值加1（或减1）后直接返回改变了的运算对象，而后置形式需要将原始值存储下来，以便返回这个未修改的原始值。如果我们不需要未修改的原始值时，那么后置形式的写法就是一种浪费。   对于正数和指针类型来说，编译器可能对这种额外的工作进行了一定的优化，但是对于相对复杂的迭代器来说，这种额外的工作就消耗巨大了。所以养成前置形式的好习惯，不仅不需要担心性能问题，而且写出的代码也符合编程的初衷。

引用 2 楼 qq_42324974 的回复:感谢！ 对于下面这个问题还是不太理解。 不是说 i++ 是先赋值在 +1 吗 为啥这里就和 i=i+1 一样了呢 这个需要了解++的原理了。建议查一下书本找到介绍自增，自减的描述和实例。或者直接从网上查找一下；

printf("%d,%d,%d\n",++i,i++,++i); 对于这种的自增，建议不要研究了。也不用纠结了。因为跟参数入栈顺序有关，也就跟编译器有关。 if(ch>='0' && ch<='9')             cnt[ch-'0']++; 这个自增就是加1的意思；这儿cnt[ch - '0']++；等价cnt[ch-'0'] = cnt[ch -'0'] + 1;


数组中形象的排列是这样的 0 1 2 3 4 5 6 7 8 9 关于楼上自信男孩所说的，p = a;类型不匹配，我感觉也是这样的，你既然能编译通过，那么说明p指向了数组中最开始的元素0，因为p是一个指向整型的指针，++p向后移动一个数字指向了1，所以第一个数字是1  p2通俗的来讲是一个行指针，一开始指向1行，也就是数字2这个位置，++p2向下移动一行，指向了4这个位置，所以第二个数字是4  最后一个输出是通过p2输出的，实际上就是通过p2来进行偏移得到的，p2指向4这个位置，向后偏移的距离为1*2+2=4.也就是向后取出p2位置向后移动4个整型的指针的所指向的数字，也就是8的位置，所以最后一个数字是8

printf("%d\n", p2[1][2]); [1]向下移动一行， [2]越界到下一行。 都是一组连续的内存块，画个图就明白了。

#include <stdio.h>  int main()  {      int a[5][2] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};      int* p = &a[0][0];      int (*p2)[2] = &a[1];      ++p;      ++p2;      printf("%d\n", *p);      printf("%d\n", **p2);      printf("%d\n", p2[1][2]);      return 0;  } p 不能直接p = a;因为类型不匹配。a是二维数组名，类型是 int (*)[2];而p是int类型。所以不匹配。如果你的编译器可以编译通过，说明编译器检查不严格；  p是int *所以p++是向后移动一个sizeof(int)字节。因此是向后移动一个元素，即1；  由于p2是指向a[1]的地址，即p2指向的内容是从元素2开始的。由于p2是int (*)[2]；所以p2++即向后移动2 * sizeof(int)个字节，即元素4的位置。 p2[1][2]其实对于p2第三行（注意前面有一个p2++, 即向后移动了一行，p2[1]即第三行，p[0]是第二行，p2的第一行是从a[1]开始的，即元素2开始的）已经“越界”了，因为下表只能是0， 1； 所以越界就是编程第四行的第一个元素。也就是a的第五行第一个元素，即8

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


Question: long long int 溢出问题，求指导

引用 7 楼 zhao4zhong1 的回复:pow函数的参数是double类型，double类型的有效数字个数是15 而 2^63=9223372036854775807 其有效数字个数已经超过15  谢谢！祝你明天没有BUG！

引用 4 楼 zhao4zhong1 的回复:浮点数格式 http://bbs.csdn.net/topics/390676437  好像不是有关浮点数的问题，整型溢出。 long long int bytes_of_long_long_int; long long int bits_of_long_long_int; long long int biggest_of_long_long_int; bytes_of_long_long_int = sizeof(long long int); bits_of_long_long_int = bytes_of_long_long_int * 8; biggest_of_long_long_int = pow(2, bits_of_long_long_int - 1) - 1; 好像是这段代码没有取得long long int的上限值。并且直接产生了溢出，biggest_of_long_long_int = pow(2, bits_of_long_long_int - 1) - 1;最后的-1好像没有生效。

引用 3 楼 user-2 的回复:编译器老点了吧？  新下载的VS2017，应该不会出问题吧？

编译器老点了吧？

图片倒数第四行，long long int 上限出了问题。同样的代码，用在short int ，int， long int，上没有出现问题，请问这个错误的结果是出在了哪里？


Question: 动态通讯录，结构体这样排序为什么不对？？？？？？

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

#define _CRT_SECURE_NO_WARNINGS 1  #include<stdio.h> #include<stdlib.h> #include<string.h>  struct S {     char name[20];     //int num[12];     char num[12];     int age;     char sex[2];     struct S *next; };  //展示联系人 void show(struct S *head) {     struct S*cur = head;     while (cur != NULL)     {         printf("%s %s %d %s\n", cur->name, cur->num, cur->age, cur->sex);         cur = cur->next;     } }  //排序 void sort(struct S *head) {     struct S*pre = head;     struct S*cur = head;     for (pre = head; pre != NULL; pre = pre->next)     {         for (cur = pre; cur != NULL; cur = cur->next)         {             if ((*pre).age > (*cur).age)             { #if 1                 struct S tmp;                 strcpy(tmp.name, pre->name);                 strcpy(tmp.num, pre->num);                 tmp.age = pre->age;                 strcpy(tmp.sex, pre->sex);                  strcpy(pre->name, cur->name);                 strcpy(pre->num, cur->num);                 pre->age = cur->age;                 strcpy(pre->sex, cur->sex);                  strcpy(cur->name, tmp.name);                 strcpy(cur->num, tmp.num);                 cur->age = tmp.age;                 strcpy(cur->sex, tmp.sex); #else                 struct S tmp;                 tmp = (*pre);                 (*pre) = (*cur);                 (*cur) = tmp; #endif             }         }     }     show(head); }  //查找联系人 void find(struct S *head) {     //int arr[20];     char arr[20];     struct S*cur = head;     printf("请输入你要查找的联系人姓名：");     scanf("%s", arr);     while (cur != NULL)     {         if (strcmp(cur->name, arr) == 0)         {             printf("%s %s %d %s\n", cur->name, cur->num, cur->age, cur->sex);             break;         }         cur = cur->next;     }     if (cur == NULL)     {         printf("没有找到！\n");     } } //删除联系人 void erase(struct S**head) {     struct S *cur = *head;     struct S *pre = NULL;     char arr[32] = { 0 };     printf("请输入你要删除的联系人姓名：");     scanf("%s", arr);     while (cur!= NULL)     {         if (strcmp(cur->name, arr) == 0)         {             if (cur == *head)    //如果被删除的元素是头指针             {                 *head = cur->next;             }             else             {                 pre->next = cur->next;             }         }         else             pre = cur;         cur = cur->next;     }     show(*head); } //添加联系人 void insert(struct S **head) {     //创建一个链表     struct S *p=(struct S*)malloc(sizeof(struct S));     printf("姓名：>");     scanf("%s", p->name);     printf("电话：>");     scanf("%s", p->num);     printf("年龄：>");     scanf("%d", &p->age);     printf("性别：>");     scanf("%s", p->sex);     p->next = NULL;    //最后一 个元素指向下一个结构体     if (*head == NULL)  //插入首元素     {         *head = p;     }     else               // 插入其他元素     {         struct S *cur = *head;         while (cur->next != NULL)         {             cur = cur->next;         }         cur->next = p;     }     show(*head); } void menu() {     printf("****************************************\n");     printf("*1   添加联系人*******2   删除联系人****\n");     printf("*3   查找联系人*******4   联系人排序****\n");     printf("****************************************\n"); } int main() {     int input;     struct S *head = NULL; //定义一个结构体变量person     do     {         menu();         printf("Enter your choice:");         scanf("%d", &input);         switch (input)         {             case 1:insert(&head); break;             case 2:erase(&head); break;             case 3:find(head); break;             case 4:sort(head); break;             case 0:printf("退出\n"); break;             default:printf("输入错误，请重新输入\n"); break;         }     } while (input);     system("pause");     return 0; } 参考一下吧  排序选择只交换数据部分，指针（地址）部分不要移动。若按照你的交换是数据和地址都交换了。 另外，num若是指电话号码，就不要定义成int类型了。当然还有局部变量arr


Question: if多重嵌套结构程序运行问题

scanf("%1f",&flowerprice); 改为 scanf("%lf",&flowerprice); %和f之间是一个字母l，不是数字1 lf表示接收双浮点 1f表示接收一位浮点数， 如果你输入很大的，但是只接受1位数字，那还是很小的，这种情况一般单步调试，或者打印中间结果就可以发现问题了

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

//需要录入鲜花的价格     //scanf("%1f",&flowerprice);     scanf("%f",&flowerprice);  不是if else的问题。验证不是if else的问题很简单，就是把输入的flowerprice打出来，看看你输入的和输出的flowerprice是否一致，然后再找原因。      //需要录入鲜花的价格     scanf("%1f",&flowerprice);     printf("%f\n", flowerprice); 像这样打出来

scanf("%1f",&flowerprice); 改成 scanf("%f",&flowerprice);，因为1f 表示只是取地一个数字。


Question: 关于在C中的类似于" \u8fd4\u56de"字串转化为可识别的utf-8符串"返回"

引用 1 楼 user-1 的回复:其实不用转，输出来的内容就是UTF-8的中文编码，只是不知道你想要显示的终端用的是什么编码。例如我用Ubuntu 16.04来编译运行下面的程序，在我的终端下面显示的就是你需要的内容。 #include <stdio.h> #include <stdlib.h>  int main() { 	const char *str ="# \u8fd4\u56de\u662f\u5426\u627e\u5230 package\n<PREFIX>_LIBRARIES "; 	printf("%s", str); 	return 0; }  输出  # 返回是否找到 package <PREFIX>_LIBRARIES  如果你的终端显示是用GBK或者GB18030之类的，那么你就需要转换编码到对应的编码。C语言常用的库是iconv，函数使用方法http://man7.org/linux/man-pages/man3/iconv.3.html  谢谢你。。原来这也很简单啊， 看来不用去研究编码的问题的。。


Question: 怎么让输入的数字出现在输出的提示文字中？

两个%d对应一个end，另外，通过你的输出你也能看出其实已经得到了逆序数。只需稍微改动一下；  以下是一个简单的针对多位数的逆序： #include <stdio.h>  int main(void) {     unsigned int n, rn, tmp;     int digit;      scanf("%u", &n);     tmp = n;      rn = 0;     while (n) {         digit = n % 10;         rn = (rn * 10) + digit;         n /= 10;     }       printf("%u's revers number is %u\n", tmp, rn);      return 0; } 参考一下吧  当然最简单的就是字符串处理。即把输入的数字串以字符串的形式输入，最后输出也是逆序后的字符串。

printf("%d.....%d\n", n, end);