Question: 如何删除数组里的元素？

结帖时，鼠标放在分配给指定楼多少分的红色输入框里，会显示还剩多少分，参考其值填写想给多少分。

不好意思啊，我电脑结帖一直结帖不成功，弄了半小时还是结帖不成功。。只有弄个无满意结帖了。。  谢谢你们的回答

必须依次前移  void erase(int arr[], int arr_size, int which) {     if (arr || which>=0)     {          for (int i=which; i<arr_size-1; ++i)               arr[i] = arr[i+1];     }  }

引用 6 楼 赵4老师的回复:仅供参考：#include <stdio.h> #include <string.h> char s[256]; char *p; int r,n,i; int main() {     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //    我想问下怎么结贴的。。。新手。。。不会结贴，比如说有40分分配了半天都过不了。。。

引用 1 楼 user-3的回复:删除元素可以将要删除元素之后的所有元素向前移动，然后递减记录数组大小的变量 就是下标也给递减了对吗？

删除元素可以将要删除元素之后的所有元素向前移动，然后递减记录数组大小的变量

引用 3 楼 user-3的回复:循环中从要删除元素的下一个开始，一直到最后，依次将后一个元素前移，下标应该是从前往后，所以是递增 好的


Question: 求问用递归方法打印菱形的经典题目，找bug

仅供参考：//输入1 //输出 //* * // * //* * //输入2 //输出 //* *   * * // *     * //* *   * * //   * * //    * //   * * //* *   * * // *     * //* *   * * //输入3 //输出 //* *   * *         * *   * * // *     *           *     * //* *   * *         * *   * * //   * *               * * //    *                 * //   * *               * * //* *   * *         * *   * * // *     *           *     * //* *   * *         * *   * * //         * *   * * //          *     * //         * *   * * //            * * //             * //            * * //         * *   * * //          *     * //         * *   * * //* *   * *         * *   * * // *     *           *     * //* *   * *         * *   * * //   * *               * * //    *                 * //   * *               * * //* *   * *         * *   * * // *     *           *     * //* *   * *         * *   * * //最大输入8 #include <stdio.h> char m[6561][6561];//==3^8 void fractalx(int cy,int cx,int L) {     int N,i;      if (1==L) {         m[cy  ][cx  ]='*';         m[cy-1][cx-1]='*';         m[cy-1][cx+1]='*';         m[cy+1][cx+1]='*';         m[cy+1][cx-1]='*';     } else {         N=1;for (i=0;i<L-1;i++) N=N*3;         fractalx(cy  ,cx  ,L-1);         fractalx(cy-N,cx-N,L-1);         fractalx(cy-N,cx+N,L-1);         fractalx(cy+N,cx+N,L-1);         fractalx(cy+N,cx-N,L-1);     } } int main() {     int L,N,i,y,x;      while (1) {         while (1) {             printf("\nInput 1..8,0 for Exit:");             fflush(stdout);             if (1==scanf("%d",&L)) {                 if (0<=L && L<=8) break;             } else rewind(stdin);         }         if (0==L) break;         N=1;for (i=0;i<L;i++) N=N*3;         for (y=3280-(N-1)/2;y<=3280+(N-1)/2;y++) {             for (x=3280-(N-1)/2;x<=3280+(N-1)/2;x++) {                 m[y][x]=' ';             }         }         fractalx(3280,3280,L);         for (y=3280-(N-1)/2;y<=3280+(N-1)/2;y++) {             for (x=3280-(N-1)/2;x<=3280+(N-1)/2;x++) {                 printf("%c",m[y][x]);             }             printf("\n");         }     }     return 0; }

问题出在第二行第六列 这里的flag变量仍为1 你改成colNum>=lineNum就对了


Question: 数据结构图的创建及应用。写出来的程序总是出错，求指正，万分感谢

scanf_s("%c %c", &v1, &v2);应该改成scanf_s("%c %c", &v1, 1, &v2, 1); 如果不能保证输入缓冲区为空的话（包括回车符），在scanf_s前面加一句fflush(stdin)  单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

那应该怎么改呢？

printf("%d ", G.arcs[i][j]);  %d需要的是一个整数，但你的G.arcs[i][j]是struct ArcCell类型


Question: 找人帮我修改一个课程设计，已经写好，存在问题。就是整体功能可以实现，但是无法将学生的系别分开，分系别分别处理相应系别的学生成绩信息，求修改。

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

引用 1 楼 xuyulong1234 的回复:如果想帮忙的我有完整的程序可以发给你，上面的程序因为太长我删除了一部分代码。  给出能重现你问题的完整程序，删除不必要的功能，别人没时间给你一句句看

如果想帮忙的我有完整的程序可以发给你，上面的程序因为太长我删除了一部分代码。

在加一个 系别的结构体 struct 系别 {      int count;    // 当前学生数组中学生的个数      struct student stu[MAX];   // 学生数组      char name[maxbyte] 系名字 }

看着确实比较累，建议题主把代码用编辑栏中的插入代码功能贴上来。


Question: 程序赋值问题

你malloc了一维的当然不行了，写成下面这样才行  MCU_data = (JBLOCKROW**)malloc(sizeof(JBLOCKROW*)* 2); for (i = 0; i < 2; i++) 	MCU_data[i] = (JBLOCKROW*)malloc(sizeof (JBLOCKROW));

赋值对象时 = 号左边的对象需要是一个左值  你的[]运算符应该返回一个引用

看JBLOCK的结构定义


Question: 求满足符合这个条件的三角形

首先，楼主您代码里面的【a*a+b*b<=c】这块，应该是（c*c）而非单纯一个c吧，其次，您应该用 long而非int，因为最大斜边10000000的平方大于int所能表示的最大值。。。


Question: 因子数

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

边界条件 输入输出格式 ……

参考下别人AC的代码。 1.看看输入和输出的格式是不是和别人一样（自己理解错了） 2.是不是有些边界的测试数据没有考虑到

就是看能不能整除嘛。

每组数据一个整数n(n<=1000000)，n为0时输入结束。

你的程序没有在      n为0时结束


Question: WINSOCK的启动SOCKET

感谢两位大神的回复。  引用 1 楼 user-3 的回复:没毛病，是初始化 socket 啊。  你初始化后，还需要创建socket，绑定端口，监听端口，等待连接。。  但是我在编译器DEV C++中出错了。我采用的是C语言，而非C++. 见以下附图。劳请你们再次赐教。

原来是我的编译器不支持WINSOCK的库。

项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项


Question: 关于字符串输出问题

栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

除了上面的问题，还有一个问题就是，字符串是以'\0'为结尾标志的，没有'\0'不叫做字符串。（你的substring后面必须得加上）

未定义行为，返回一个局部变量的地址，没必要花太多时间在这个上面

你的char substring[100] 是一个局部数组，函数结束时就销毁了，你不应返回一个局部变量的地址，否则是一个未定义行为

不要近观回局部变量


Question: 求助一道考研题

我的运行结果是： -6784 -24 1 0 13 24 45 456 6784 3 54 -19 11 11 3 53  6784 456 54 53 45 24 13 11 11 3 3 1 0 -19 -24 -6784  0 1 3 3 11 11 13 24 45 53 54 -19 -24 456 6784 -6784   我的理解是： 第一行输出就是读取的data.txt文件的输出，每一项都是一个字符串a[i]（虽然字符串都是数字）。 第一次快排，比较函数是： return atoi((char(*)[80])b)-atoi((char(*)[80])a); 就是把每一个字符串都转换为整数，而且b在前面，a在后面，所以是降序，所以输出结果就是第二行。 第二次快排，比较函数先比较字符串长度，长度相等的情况下，按strcmp比较，升序，所以先是长度为1的字符串，长度为1又按照ASCII值升序，然后长度为2。要注意长度为3的有：-19 -24 456，'-'负号字符的ASCII值小于数字'0'——'9'的ASCII值，所以字符串-19和-24排在字符串456前面，这个真的要对ASCII表比较注意的才不会丢分。

考研题都缩水成这副模样了。

qsort最后一个参数是一个函数指针  指向这种类型的函数： int cmp(const void *a, const void *b);  相等返回0，参数1大于参数2返回正数，否则返回负数


Question: 鬼畜的程序。。。。

对楼主的代码略作修改。  #include <stdio.h> int main() {     unsigned int a = 1;     unsigned short b = 1;     char c = -1;     int d;     printf("a = %d,c = %d\n",a,c);//a=1,c=-1     d = (a > c) ? 1 : 0;     printf("unsigned int is %d\n",d);//结果为0     d = (1 > c) ? 1 : 0; //同样的代码，a用实际值1代进去     printf("unsigned int is %d\n",d);//结果却变成了1     d = (b > c) ? 1 : 0; //使用如下代码： //    printf("a_d = %d, a_u = %u\n",(char)-1,(char)-1); //    结果：a_d = -1, a_u = 4294967295 //    所以上述代码中，a和c比较=>（大家一起隐式转换成unsigned int）1和4294967295比较，结果显然是c大，结果为0 //                 1和c比较=>（大家一起隐式转换成int）1和－1比较，显然是1大，结果是1     printf("unsigned short is %d\n",d);//结果为1     return 0; }

楼上正解。

正常啊  第一个比较： c转换成unsigned int后，unsigned int可表示的最大值，所以d的值是0 你比较的不是-1 与1，而是类型转换后的结果  第二个比较： b和c都会被转换为int，转换后他们的值仍然是1和-1，所以d为1 如果类型比int小，会都转换成int来比较


Question: 为什么我这个在vc++上运行答案都正确 在oj上运行就是wronganswer啊 求解答

都对？ 你把所有数据都测试过了？就敢说“都”对？……

弱弱地问一句。。。oj 是啥？

边界条件 输入输出格式 ……


Question: C语言二级菜单

dasdasd

#include <stdio.h> #include <conio.h> #include <ctype.h> #include <locale.h> int main() {     char a,b;      setlocale(LC_ALL,"chs");     printf("A:糖类  B:饮料  C:肉类\n");     a=toupper(getche());     if (a=='A') {         printf("A:白糖  B:红糖  C:奶糖\n");         b=toupper(getche());         if (b=='A') {             printf("你选择了白糖\n");         } else if (b=='B') {             printf("你选择了红糖\n");         } else if (b=='C') {             printf("你选择了奶糖\n");         }     } else if (a=='B') {         printf("A:牛奶  B:可乐  C:果汁\n");         b=toupper(getche());         if (b=='A') {             printf("你选择了牛奶\n");         } else if (b=='B') {             printf("你选择了可乐\n");         } else if (b=='C') {             printf("你选择了果汁\n");         }     } else if (a=='C') {         printf("A:牛肉  B:猪肉  C:羊肉  D:鱼肉  E:香肠  F:火腿  G:腊肉  H:腌肉\n");         b=toupper(getche());         if (b=='A') {             printf("你选择了牛肉\n");         } else if (b=='B') {             printf("你选择了猪肉\n");         } else if (b=='C') {             printf("你选择了羊肉\n");         } else if (b=='D') {             printf("你选择了鱼肉\n");         } else if (b=='E') {             printf("你选择了香肠\n");         } else if (b=='F') {             printf("你选择了火腿\n");         } else if (b=='G') {             printf("你选择了腊肉\n");         } else if (b=='H') {             printf("你选择了腌肉\n");         }     }      return 0; }

#include <stdio.h> #include <conio.h> #include <ctype.h> #include <locale.h> int main() {     char a,b;      setlocale(LC_ALL,"chs");     printf("A:糖类  B:饮料  C:肉类\n");     a=toupper(getche());     if (a=='A') {         printf("A:白糖  B:红糖  C:奶糖\n");         b=toupper(getche());         if (b=='A') {             printf("你选择了白糖\n")         } else if (b=='B') {             printf("你选择了红糖\n")         } else if (b=='C') {             printf("你选择了奶糖\n")         }     } else if (a=='B') {         printf("A:牛奶  B:可乐  C:果汁\n");         b=toupper(getche());         if (b=='A') {             printf("你选择了牛奶\n")         } else if (b=='B') {             printf("你选择了可乐\n")         } else if (b=='C') {             printf("你选择了果汁\n")         }     } else if (a=='C') {         printf("A:牛肉  B:猪肉  C:羊肉  D:鱼肉  E:香肠  F:火腿  G:腊肉  H:腌肉\n");         b=toupper(getche());         if (b=='A') {             printf("你选择了牛肉\n")         } else if (b=='B') {             printf("你选择了猪肉\n")         } else if (b=='C') {             printf("你选择了羊肉\n")         } else if (b=='D') {             printf("你选择了鱼肉\n")         } else if (b=='E') {             printf("你选择了香肠\n")         } else if (b=='F') {             printf("你选择了火腿\n")         } else if (b=='G') {             printf("你选择了腊肉\n")         } else if (b=='H') {             printf("你选择了腌肉\n")         }     }      return 0; }

初学者，下面就不会做了，求指引，谢谢，

#include<stdio.h> int main() { 	char a,b; 	 	  printf("A:糖类  B:饮料  C:肉类\n"); 	  scanf("%c",&a); 	  if(a=='A') 	  { 		printf("A:白糖  B:红糖  C:奶糖\n"); 	  } 	  if(a=='B') 	  { 		printf("A:牛奶  B:可乐  C:果汁\n"); 	  } 	  if(a=='C') 	  { 		printf("A:牛肉  B:猪肉  C:羊肉  D:鱼肉  E:香肠  F:火腿  G:腊肉  H:腌肉\n"); 	  }   	 return 0;	 }

switch...case 嵌套

判断输入值打印二级菜单

按照你说的实现就好了，没啥难度啊


Question: AC问题

oj的题目一般都懒得看，自己和别人ac的代码比较一下差别。 多测试一些数据。

scanf("%s",&a);  建议写成：  scanf("%s",a);  虽然两种写法效果看似是一样的，但含义不同的  对于程序逻辑问题就没帮你看

楼主看清楚题目，题目要你先输入一个整数n，然后底下接着输入n行对应的字符串，输出n行运算以后的字符串。不是你这样输入一个字符串然后输出结果，再继续输入。


Question: printf("kuaifan");

就是我 哈哈哈哈


Question: printf("lishiyuan");

泥猴 kuai神


Question: 着急！求解神帮我看看我改怎么改正这个程序

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

题主，我贴一个我以前实现的程序吧： #include <stdio.h> #include <stdlib.h> int binany[64], temp[64]; int integer; int printf(char *s) { 	return 0; } void binany_to_integer(int p[]) { 	int value=0, temp=1, i; 	for ( i = 0; i <= 31; i++) 	{ 		if (1 == binany[i]) value += temp; 		temp *= 2; 	} 	printf("The value is %d\n", value); } void integer_to_binany(int *p) { 	int demo = 1, i; 	for (i = 31; i >= 0; i--) binany[i] = 0;  	for (demo = 1; demo <= *p; demo *= 2,i++) ;  	demo /= 2; 	 	printf("demo is %d\n", demo); 	for ( ; i >= 0; i--) 	{ 		if (*p >= demo) 		{ 			binany[i] = 1; 			*p -= demo; 		} 		demo = demo / 2; 	} 	for (i = 31; i >= 0; i--) printf("%d", binany[i]); } int main(void) { 	int i,j,k=0; 	void(*funp[2])(int *); 	funp[0] = binany_to_integer; 	funp[1] = integer_to_binany; 	printf("%d\n", (int)(funp[0])); 	printf("%d\n", *funp[0]); start: 	printf("请输入您需要的类型转换，0表示二进制到十进制，1表示十进制到二进制！：\n"); 	scanf("%d", &i); 	printf("请输入您的原始数值(如果是二进制到十进制，最后请加上字符“e”！:\n"); 	if (1==i) { 		scanf("%d", &integer); 		(*funp[i])(&integer); 	} 	else 	{ 		getchar(); 		for (j = 0; j < 64; j++) 		{ 			temp[k] = getchar(); 			if ('e'==temp[k]||'\n'==temp[k]) break; 			k++; 		} 		for (k--,j=0; k >= 0; k--,j++) 		{ 			binany[j] = temp[k] - '0'; 		} 		(*funp[0])(binany); 	} 	goto start; 	return 0; }

这个人人品有问题，回答他问题居然还骂人

顶！！！！！！！！！！！！

为什么没人呀~~~


Question: 用scanf为数组赋值的问题（如何提前跳出循环？）（c语言）

用while可能会比你的for更好  int a[30] = {0}, i = 0; 	do{ 		scanf("%d", &a[i++]); 	} while (getchar() != '\n');

引用 2 楼 sinat_36461027 的回复:那请问（问题有点儿多，非常感谢！）， 1.我能不能设定一个判断在输入回车的时候结束循环呢？ 2.如果我只输入一个回车（回车前不输入任何其他东西），getchar（）也会从缓冲区内读走‘\n'么？ 3.如果我写 for（i=0;i<N&&getchar()!='\n';i++) {            scanf("%d",&a[i]); } 是不是scanf（）就不能从缓冲区里读到任何东西？  可以通过回车判断结束输入

通过判断最后一个输入的数据,比如你可以定义输入-1时,循环退出；或者判断输入很大的数据然后退出循环,比如(>10000),前提是这个大数据不是你想要的；

不判断scanf函数返回值的c程序员都在走钢丝。

按CTRL+Z结束输入，然后通过scanf返回值（EOF）判断是否是用户提前结束的  scanf返回值含义：http://en.cppreference.com/w/c/io/fscanf

你输入的都是字符串，scanf中的f代表格式转换，就是把字符串转成指定的类型， 结果循环你可以在输入时按ctrl+z, 代码中判断scanf返回值是否为EOF


Question: 关于vc无缘无故消失

引用 1 楼 paschen 的回复:没遇到过，试下使用高版本VS 安装vs2013一样，重新安装完全版系统，解决

没遇到过，试下使用高版本VS

做开发不要用阉割版的windows


Question: 发现一个能把DLL转换成可编译的C代码的工具

ReadProcessMemory

都是高手啊，厉害厉害。 可以用peload的方式把dll或者com dll,ocx控件，直接放到资源文件里面加密也可以，然后动态加载，不需要注册。可以在一个窗口上面添加加一个或者多个相同类名的控件。 并且支持事件。  我现在在研究的事，比如一个excel上面的表格，还有某个软件上面的web控件。 用代码直接把这个对象取出来，就像是你自己程序里面的一个控件一样，直接操作了这才是真正的爽。  而且这个呢？不需要在同个进程内部。 其他类型的控件不知道行不行，比如listview等等。 假如可以提取任何控件作为对象。 就算是需要注入到其他进程也可以呀！ 这样就可以读出股票软件上面的表格，或者是网银控件的密码了。

引用 31 楼 mLee79 的回复:[quote=引用 29 楼 LazyCoder000 的回复:] [quote=引用 28 楼 mLee79 的回复:] 我觉得这东西完全不如一个好用的通用的  PE loader ..  那我请教一下，哪点不如了?[/quote]  那这个又哪里更强了, 不都干一件事情么,   用PE loader还通用, 使用方便,  不用看到写的稀奇古怪, 乱七八糟的代码 .[/quote]  有需求的人自然就觉得它有用，没需求那当然就没用了

引用 29 楼 LazyCoder000 的回复:[quote=引用 28 楼 mLee79 的回复:] 我觉得这东西完全不如一个好用的通用的  PE loader ..  那我请教一下，哪点不如了?[/quote]  那这个又哪里更强了, 不都干一件事情么,   用PE loader还通用, 使用方便,  不用看到写的稀奇古怪, 乱七八糟的代码 .

发现这个软件又升级了，竟然可以直接生成数据结构! 最新版本v2.32增加了一个选项“Generate data structures for all data sections”，可以生成各Section的数据结构。   下面是生成的部分数据结构：  #include "stdafx.h" #include "Win32Dll.h"  #pragma pack(push) #pragma pack(1)  #ifdef __cplusplus extern "C"  #endif __declspec(align(16))  _st_Win32Dll_rdata Win32Dll_rdata = { 	//FARPROC m0_GetTickCount, 0x10008000 	(FARPROC)0x99CE, 	//FARPROC m4_GetCurrentThreadId, 0x10008004 	(FARPROC)0x9736, 	//FARPROC m8_GetCommandLineA, 0x10008008 	(FARPROC)0x974C, 	//FARPROC mC_TerminateProcess, 0x1000800C 	(FARPROC)0x975E, 	//FARPROC m10_GetCurrentProcess, 0x10008010 	(FARPROC)0x9772, 	//FARPROC m14_UnhandledExceptionFilter, 0x10008014 	(FARPROC)0x9786, 	//FARPROC m18_SetUnhandledExceptionFilter, 0x10008018 	(FARPROC)0x97A2, 	//FARPROC m1C_IsDebuggerPresent, 0x1000801C 	(FARPROC)0x97C0, 	//FARPROC m20_GetModuleHandleW, 0x10008020 	(FARPROC)0x97D4, 	//FARPROC m24_GetProcAddress, 0x10008024 	(FARPROC)0x97E8, 	//FARPROC m28_TlsGetValue, 0x10008028 	(FARPROC)0x97FA, 	//FARPROC m2C_TlsAlloc, 0x1000802C 	(FARPROC)0x9808, 	//FARPROC m30_TlsSetValue, 0x10008030 	(FARPROC)0x9814, 	//FARPROC m34_TlsFree, 0x10008034 	(FARPROC)0x9822, 	//FARPROC m38_InterlockedIncrement, 0x10008038 	(FARPROC)0x982C, 	//FARPROC m3C_SetLastError, 0x1000803C 	(FARPROC)0x9844, 	//FARPROC m40_GetLastError, 0x10008040 	(FARPROC)0x9854, 	//FARPROC m44_InterlockedDecrement, 0x10008044 	(FARPROC)0x9864, 	//FARPROC m48_HeapFree, 0x10008048 	(FARPROC)0x987C, 	//FARPROC m4C_Sleep, 0x1000804C 	(FARPROC)0x9888, 	//FARPROC m50_ExitProcess, 0x10008050 	(FARPROC)0x9890, 	//FARPROC m54_SetHandleCount, 0x10008054 	(FARPROC)0x989E, 	//FARPROC m58_GetStdHandle, 0x10008058 	(FARPROC)0x98B0, 	//FARPROC m5C_GetFileType, 0x1000805C 	(FARPROC)0x98C0, 	//FARPROC m60_GetStartupInfoA, 0x10008060 	(FARPROC)0x98CE, 	//FARPROC m64_DeleteCriticalSection, 0x10008064 	(FARPROC)0x98E0, 	//FARPROC m68_GetModuleFileNameA, 0x10008068 	(FARPROC)0x98F8, 	//FARPROC m6C_FreeEnvironmentStringsA, 0x1000806C 	(FARPROC)0x990E, 	//FARPROC m70_GetEnvironmentStrings, 0x10008070 	(FARPROC)0x9928, 	//FARPROC m74_FreeEnvironmentStringsW, 0x10008074 	(FARPROC)0x9940, 	//FARPROC m78_WideCharToMultiByte, 0x10008078 	(FARPROC)0x995A, 	//FARPROC m7C_GetEnvironmentStringsW, 0x1000807C 	(FARPROC)0x9970, 	//FARPROC m80_HeapCreate, 0x10008080 	(FARPROC)0x998A, 	//FARPROC m84_HeapDestroy, 0x10008084 	(FARPROC)0x9998, 	//FARPROC m88_VirtualFree, 0x10008088 	(FARPROC)0x99A6, 	//FARPROC m8C_QueryPerformanceCounter, 0x1000808C 	(FARPROC)0x99B4, 	//FARPROC m90_GetCurrentProcessId, 0x10008090 	(FARPROC)0x99DE, 	//FARPROC m94_GetSystemTimeAsFileTime, 0x10008094 	(FARPROC)0x99F4, 	//FARPROC m98_LeaveCriticalSection, 0x10008098 	(FARPROC)0x9A0E, 	//FARPROC m9C_EnterCriticalSection, 0x1000809C 	(FARPROC)0x9A26, 	//FARPROC mA0_GetCPInfo, 0x100080A0 	(FARPROC)0x9A3E, 	//FARPROC mA4_GetACP, 0x100080A4 	(FARPROC)0x9A4A, 	//FARPROC mA8_GetOEMCP, 0x100080A8 	(FARPROC)0x9A54, 	//FARPROC mAC_IsValidCodePage, 0x100080AC 	(FARPROC)0x9A60, 	//FARPROC mB0_HeapAlloc, 0x100080B0 	(FARPROC)0x9A72, 	//FARPROC mB4_VirtualAlloc, 0x100080B4 	(FARPROC)0x9A7E, 	//FARPROC mB8_HeapReAlloc, 0x100080B8 	(FARPROC)0x9A8E, 	//FARPROC mBC_WriteFile, 0x100080BC 	(FARPROC)0x9A9C, 	//FARPROC mC0_LoadLibraryA, 0x100080C0 	(FARPROC)0x9AA8, 	//FARPROC mC4_InitializeCriticalSectionAndSpinCount, 0x100080C4 	(FARPROC)0x9AB8, 	//FARPROC mC8_RtlUnwind, 0x100080C8 	(FARPROC)0x9AE0, 	//FARPROC mCC_GetLocaleInfoA, 0x100080CC 	(FARPROC)0x9AEC, 	//FARPROC mD0_GetStringTypeA, 0x100080D0 	(FARPROC)0x9AFE, 	//FARPROC mD4_MultiByteToWideChar, 0x100080D4 	(FARPROC)0x9B10, 	//FARPROC mD8_GetStringTypeW, 0x100080D8 	(FARPROC)0x9B26, 	//FARPROC mDC_LCMapStringA, 0x100080DC 	(FARPROC)0x9B38, 	//FARPROC mE0_LCMapStringW, 0x100080E0 	(FARPROC)0x9B48, 	//FARPROC mE4_HeapSize, 0x100080E4 	(FARPROC)0x9B58, 	//UCHAR mE8[0x4], 0x100080E8 	{0x00,}, 	//FARPROC mEC_MessageBoxA, 0x100080EC 	(FARPROC)0x971C, 	//UCHAR mF0[0x10], 0x100080F0 	{0x00,}, 	//LPVOID m100_ptr, 0x10008100 	&Win32Dll_text[0x263A], 	//LPVOID m104_ptr, 0x10008104 	&Win32Dll_text[0x39BE], 	//LPVOID m108_ptr, 0x10008108 	&Win32Dll_text[0x5948], 	//UCHAR m10C[0x34], 0x1000810C 	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x10,0xE7,'R',0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,'^',0x00,0x00,0x00,0xD8,0x92,0x00,0x00,0xD8,'z',}, 	//LPVOID m140_ptr, 0x10008140 	Win32Dll_data.mC78_buf, 	//LPVOID m144_ptr, 0x10008144 	Win32Dll_data.mCD0_buf, 	//CHAR m148_str[14], 0x10008148 	"EncodePointer", 	//UCHAR m156[0x1E], 0x10008156 	{0x00,0x00,'K',0x00,'E',0x00,'R',0x00,'N',0x00,'E',0x00,'L',0x00,'3',0x00,'2',0x00,'.',0x00,'D',0x00,'L',0x00,'L',}, 	//CHAR m174_str[14], 0x10008174 	"DecodePointer", 	//UCHAR m182[0x2], 0x10008182 	{0x00,}, 	//CHAR m184_str[8], 0x10008184 	"FlsFree", 	//CHAR m18C_str[12], 0x1000818C 	"FlsSetValue", 	//CHAR m198_str[12], 0x10008198 	"FlsGetValue", 	//CHAR m1A4_str[9], 0x100081A4 	"FlsAlloc", 	//UCHAR m1AD[0x3], 0x100081AD 	{0x00,}, 	//CHAR m1B0_str[15], 0x100081B0 	"CorExitProcess", 	...

引用 28 楼 mLee79 的回复:我觉得这东西完全不如一个好用的通用的  PE loader ..  那我请教一下，哪点不如了?

引用 33 楼 DelphiGuy 的回复:IDA Pro里确实有一个反编译插件，是真正的反编译，不过也不可能反编译得和源程序一模一样。  那插件我用过，生成的代码比较乱，有些函数反不了，还不如直接复制汇编代码

我觉得这东西完全不如一个好用的通用的  PE loader ..

引用 26 楼 mLee79 的回复:[quote=引用 25 楼 LazyCoder000 的回复:] [quote=引用 24 楼 mLee79 的回复:] [quote=引用 21 楼 LazyCoder000 的回复:] [quote=引用 20 楼 luciferisnotsatan 的回复:] [quote=引用 19 楼 LazyCoder000 的回复:] [quote=引用 18 楼 mLee79 的回复:] 好像是一个生成源码版本的PE loader, 为什么不干脆用个真正的PE loader, 把dll当资源放进去不更方便么...  别人的DLL，如果没有授权你使用的话，直接当成资源放进去，这样太明目张胆了[/quote] 那你提取出二进制编码，直接用不一样有授权问题？[/quote]  都被分割成几块了，再稍微加密一下就很难看出了[/quote] 放资源里不一样的加密么, 跟你这样弄有啥不一样么. [/quote]  放资源里通常需要先生成临时文件，然后再LoadLibrary。生成临时文件太容易被发现了[/quote]  我说用个 PE loader 加载, 就是自己写个 LoadLibrary, 为什么要生成临时文件,  你这个不过就是个 C 版本的 PE loader .[/quote]  我觉得思想最好还是不要总是停留在PE loader的水平，我认为这软件很有潜力，进一步改进之后可能变得非常强大。

看起来不错，但是好像没有说的那么好。

引用 21 楼 LazyCoder000 的回复:[quote=引用 20 楼 luciferisnotsatan 的回复:] [quote=引用 19 楼 LazyCoder000 的回复:] [quote=引用 18 楼 mLee79 的回复:] 好像是一个生成源码版本的PE loader, 为什么不干脆用个真正的PE loader, 把dll当资源放进去不更方便么...  别人的DLL，如果没有授权你使用的话，直接当成资源放进去，这样太明目张胆了[/quote] 那你提取出二进制编码，直接用不一样有授权问题？[/quote]  都被分割成几块了，再稍微加密一下就很难看出了[/quote]  当年那个 驴霸滑稽护航 被发现抄袭是因为，盗版的代码里有把数据（log）往服务器发的部分，然后发到对方服务器了

引用 20 楼 luciferisnotsatan 的回复:[quote=引用 19 楼 LazyCoder000 的回复:] [quote=引用 18 楼 mLee79 的回复:] 好像是一个生成源码版本的PE loader, 为什么不干脆用个真正的PE loader, 把dll当资源放进去不更方便么...  别人的DLL，如果没有授权你使用的话，直接当成资源放进去，这样太明目张胆了[/quote] 那你提取出二进制编码，直接用不一样有授权问题？[/quote]  都被分割成几块了，再稍微加密一下就很难看出了

引用 19 楼 LazyCoder000 的回复:[quote=引用 18 楼 mLee79 的回复:] 好像是一个生成源码版本的PE loader, 为什么不干脆用个真正的PE loader, 把dll当资源放进去不更方便么...  别人的DLL，如果没有授权你使用的话，直接当成资源放进去，这样太明目张胆了[/quote] 那你提取出二进制编码，直接用不一样有授权问题？

引用 25 楼 LazyCoder000 的回复:[quote=引用 24 楼 mLee79 的回复:] [quote=引用 21 楼 LazyCoder000 的回复:] [quote=引用 20 楼 luciferisnotsatan 的回复:] [quote=引用 19 楼 LazyCoder000 的回复:] [quote=引用 18 楼 mLee79 的回复:] 好像是一个生成源码版本的PE loader, 为什么不干脆用个真正的PE loader, 把dll当资源放进去不更方便么...  别人的DLL，如果没有授权你使用的话，直接当成资源放进去，这样太明目张胆了[/quote] 那你提取出二进制编码，直接用不一样有授权问题？[/quote]  都被分割成几块了，再稍微加密一下就很难看出了[/quote] 放资源里不一样的加密么, 跟你这样弄有啥不一样么. [/quote]  放资源里通常需要先生成临时文件，然后再LoadLibrary。生成临时文件太容易被发现了[/quote]  我说用个 PE loader 加载, 就是自己写个 LoadLibrary, 为什么要生成临时文件,  你这个不过就是个 C 版本的 PE loader .

引用 18 楼 mLee79 的回复:好像是一个生成源码版本的PE loader, 为什么不干脆用个真正的PE loader, 把dll当资源放进去不更方便么...  别人的DLL，如果没有授权你使用的话，直接当成资源放进去，这样太明目张胆了

引用 24 楼 mLee79 的回复:[quote=引用 21 楼 LazyCoder000 的回复:] [quote=引用 20 楼 luciferisnotsatan 的回复:] [quote=引用 19 楼 LazyCoder000 的回复:] [quote=引用 18 楼 mLee79 的回复:] 好像是一个生成源码版本的PE loader, 为什么不干脆用个真正的PE loader, 把dll当资源放进去不更方便么...  别人的DLL，如果没有授权你使用的话，直接当成资源放进去，这样太明目张胆了[/quote] 那你提取出二进制编码，直接用不一样有授权问题？[/quote]  都被分割成几块了，再稍微加密一下就很难看出了[/quote] 放资源里不一样的加密么, 跟你这样弄有啥不一样么. [/quote]  放资源里通常需要先生成临时文件，然后再LoadLibrary。生成临时文件太容易被发现了

引用 21 楼 LazyCoder000 的回复:[quote=引用 20 楼 luciferisnotsatan 的回复:] [quote=引用 19 楼 LazyCoder000 的回复:] [quote=引用 18 楼 mLee79 的回复:] 好像是一个生成源码版本的PE loader, 为什么不干脆用个真正的PE loader, 把dll当资源放进去不更方便么...  别人的DLL，如果没有授权你使用的话，直接当成资源放进去，这样太明目张胆了[/quote] 那你提取出二进制编码，直接用不一样有授权问题？[/quote]  都被分割成几块了，再稍微加密一下就很难看出了[/quote] 放资源里不一样的加密么, 跟你这样弄有啥不一样么.

奉劝大家不要把有限的生命浪费在无限的加密解密死循环中！

引用 4 楼 YapingXin的回复:看上去还不错。。。就是价格太贵 自己实现起来也不难，只是没必要


Question: 第二个字符为什么不能显示？

引用 2 楼 wokaoyan1981 的回复:编译错误了，提示6	16	C:\Users\smile\Desktop\test.c	[Error] lvalue required as increment operand  你的pt不是指针类型，而是数组类型，你不能修改一个数组的地址   #include <stdio.h> int main(void) { 	char pt[81]="Hello World! 1981"; 	const char* p = pt; 	printf("%c\n",*p); 	printf("%c",*++p); 	return 0; }

pt++返回的还是pt,改成++pt


Question: 麻烦大家帮我看一下我的代码哪里出问题了

引用 3 楼 user-3的回复:n最大是100000，楼主你int number[20]= {0};这一句开辟的空间太少了，只有20个，不足以保存那么多数，所以越界了 你好 方便留个联系方式吗？扣扣或者微信的我想以后有问题百度不到的时候请教你

引用 2 楼 playinend的回复:我也运行了几次 编译器连警告都没给 输出结果也对着呢 代码看了两遍 也看不出错误 这里说一下我认为可以改进的地方吧 首先你这里用固定数组 用户输入的n过大内存就会溢出 可以改成动态分配内存 另外你的二重循环还可以优化一下 效率会更高 哈哈水平有限 希望对你有用 你好 方便留个联系方式吗？扣扣或者微信的我想以后有问题百度不到的时候请教你

#include <stdio.h> int main () { 	int n,i,j,temp,max=0; 	scanf("%d",&n); 	int a[n]; 	for(i=0;i<n;i++) 	{ 		scanf("%d",&a[i]); 	} 	for(i=0;i<n;i++) 	{ 		for(j=i;j<n;j++) 		{ 			if(a[j]>max) 			{ 				temp=max; 				max=a[j]; 				a[j]=temp; 			} 		} 		a[i]=max; 		max=0; 	} 	for(i=0;i<n;i++) 		printf("%d ",a[i]); 	return 0; } 试试这个。

引用 16 楼 playinend的回复:for(p= n; p > 0; p-- )         for(q=0; q < p - 1; q++)             if(pn[q]<pn[q+1])             {                 zanshi=pn[q];                 pn[q]=pn[q+1];                 pn[q+1]=zanshi;             } 对比一下你原来那个二重循环（不知道你后来改了没有），我这个循环次数少了一半 OK  我懂了   谢谢啊

引用 14 楼 qq_36409192的回复:[quote=引用 12 楼 NDFour 的回复:] [quote=引用 10 楼 qq_36409192 的回复:] 代码出问题，如果没报错，有两种解决方案，一种是调试，一种是在每一截语句后面加输出，看看你语句中的变量值是否和你所想要的结果一样，不一样就说明你这截代码有问题，否则就继续往下，直到你找出问题来为止。  你好  我是在本地试完了所有题目给出的数据之后  发现没错  才提交的   但是online judge 就报错了    具体也不说是用哪个数据时结果错了， 所以想找错误有点难。。。。[/quote] 题目考的就是让你动态分配数组大小，你直接定义一个20大小的数组，就算你程序没问题也是通过不了的。可以这样改下： int n; scanf("%d",&n); int a[n];[/quote] 谢谢提醒啊  不过那个我已经修改过了  我用的malloc函数  动态分配内存  但是提示时间超限   应该是哪里的循环出问题了  上面的评论里有一位说是我算法可能效率太低导致的   正在尝试修改

引用 12 楼 NDFour 的回复:[quote=引用 10 楼 qq_36409192 的回复:] 代码出问题，如果没报错，有两种解决方案，一种是调试，一种是在每一截语句后面加输出，看看你语句中的变量值是否和你所想要的结果一样，不一样就说明你这截代码有问题，否则就继续往下，直到你找出问题来为止。  你好  我是在本地试完了所有题目给出的数据之后  发现没错  才提交的   但是online judge 就报错了    具体也不说是用哪个数据时结果错了， 所以想找错误有点难。。。。[/quote] 题目考的就是让你动态分配数组大小，你直接定义一个20大小的数组，就算你程序没问题也是通过不了的。可以这样改下： int n; scanf("%d",&n); int a[n];

引用 9 楼 playinend 的回复: 100000个数据 我用的冒泡排序 比你这个二重循环效率还要高些 排序循环部分的运行时间用了39s 上万的数据你这种循环效率太低了 建议改个算法  你好  我用的就是在书上看到的 起泡 法  排序， 不就是用 2个  for 循环么？ 为什么我和你的效率会差别很大呢？可以解释一下吗，谢谢！

引用 10 楼 qq_36409192 的回复:代码出问题，如果没报错，有两种解决方案，一种是调试，一种是在每一截语句后面加输出，看看你语句中的变量值是否和你所想要的结果一样，不一样就说明你这截代码有问题，否则就继续往下，直到你找出问题来为止。  你好  我是在本地试完了所有题目给出的数据之后  发现没错  才提交的   但是online judge 就报错了    具体也不说是用哪个数据时结果错了， 所以想找错误有点难。。。。

引用 9 楼 playinend 的回复: 100000个数据 我用的冒泡排序 比你这个二重循环效率还要高些 排序循环部分的运行时间用了39s 上万的数据你这种循环效率太低了 建议改个算法  嗯嗯  谢谢建议   我试一下

引用 2 楼 playinend 的回复:我也运行了几次 编译器连警告都没给 输出结果也对着呢 代码看了两遍 也看不出错误 这里说一下我认为可以改进的地方吧 首先你这里用固定数组 用户输入的n过大内存就会溢出 可以改成动态分配内存 另外你的二重循环还可以优化一下 效率会更高 哈哈水平有限 希望对你有用   不好意思哈  我改了一下 用刚学的number=(int*)malloc(n*sizeof(int)); 动态分配内存，使用完后也free了   但是提示 “时间超限 ”  麻烦能再帮忙看一下吗？  时间超限   引用 7 楼 playinend 的回复:唔 这种程序检测平台我也没用过 我想时间超限可能是指你程序运行时间过长 也就是使用的算法效率太低了 不过这种问题只有输入大量数据时才能看出来的 你知道它输入的n是多大吗 在上面的题目截图中有的  是 1到 100000

引用 3 楼 shihengzhen101 的回复:n最大是100000，楼主你int number[20]= {0};这一句开辟的空间太少了，只有20个，不足以保存那么多数，所以越界了  不好意思哈  我改了一下 用刚学的number=(int*)malloc(n*sizeof(int)); 动态分配内存，使用完后也free了   但是提示 “时间超限 ”  麻烦能再帮忙看一下吗？  时间超限

引用 3 楼 shihengzhen101 的回复:n最大是100000，楼主你int number[20]= {0};这一句开辟的空间太少了，只有20个，不足以保存那么多数，所以越界了  谢谢啊   我马上修改一下再提交

引用 2 楼 playinend 的回复:我也运行了几次 编译器连警告都没给 输出结果也对着呢 代码看了两遍 也看不出错误 这里说一下我认为可以改进的地方吧 首先你这里用固定数组 用户输入的n过大内存就会溢出 可以改成动态分配内存 另外你的二重循环还可以优化一下 效率会更高 哈哈水平有限 希望对你有用 谢谢提醒  我马上试一下

看起来很简单   但是就是不知道自己哪里 出错了


Question: 这种情况有其他方法替代goto语句吗？

引用 4 楼 wokaoyan1981 的回复:也就是说循环嵌套比较深的时候还是可以用goto。楼上修改的代码只执行完一次功能就退出了，貌似没有解决问题。  是的，如果你不用goto，就检查一个变量判断是否继续循环

状态机式写法适合一切字符扫描，而且逻辑清晰，不容易出错

从来没人说要禁用goto。在容易理解的前提下使用goto，比用一些机械的标志更高效

continue接在while((ch=getchar())!='q')循环体后面。

switch (ch)            {                case 'a' :output(ptstr,ct); break;                case 'b' :asc_output(ptstr,ct); output(ptstr,ct);break;                case 'c' :len_output(ptstr,ct); output(ptstr,ct);break;                case 'd' :word_len_output(ptstr,ct);output(ptstr,ct); break;                default : printf("only a,b,c or d is available, please try again!\n");                          continue;            }   continue;

如果循环比较深，用goto也可以，如果要替换，就这样写吧；  #include <stdio.h> #include <string.h> #define LIM 10 #define SIZE 81  void output(char * strings[], int num);  void asc_output(char * strings[], int num); void len_output(char * strings[], int num); void word_len_output(char * strings[], int num); int first_word_len(char * strings); char * s_gets(char * st, int n); int main(void) { 	int ct; 	char input[LIM][SIZE]; 	char * ptstr[LIM]; 	char ch; 	while(1) 		  { 			  printf("Options:\n"); 			  printf("a)original strings;              b)ASCII;\n"); 			  printf("c)lengths of lines;              d)length of first word;\n"); 			  printf("q)quit.\n"); 			  bool flag = true; 			  while(flag && (ch=getchar())!='q') 			  { 				  ct=0; 				  printf("Input up to %d lines.\n",LIM); 				  while( ct<LIM&&s_gets(input[ct],SIZE)!=NULL&&input[ct][0]!=EOF) 				  {  					  ptstr[ct]=input[ct]; 					  ct++; 				  } 				  switch (ch) 				  { 				  case 'a' :output(ptstr,ct); flag = false; break; 				  case 'b' :asc_output(ptstr,ct); output(ptstr,ct); flag = false; break; 				  case 'c' :len_output(ptstr,ct); output(ptstr,ct); flag = false; break; 				  case 'd' :word_len_output(ptstr,ct);output(ptstr,ct);  flag = false; break; 				  default : printf("only a,b,c or d is available, please try again!\n"); 					  continue; 				  }   			  } 			  return 0;   		 		  } }  void output(char * strings[], int num) { 	int i; 	for(i=0;i<num;i++) 	{ 		fputs(strings[i],stdout); 		printf("\n"); 	} 	return; }  void asc_output(char * strings[], int num) { 	char * temp; 	int i; 	int top,seek; 	for(top=0;top<num-1;top++) 		for(seek=top+1;seek<num;seek++) 			if(strcmp(strings[top],strings[seek])>0) 			{ 				temp=strings[top]; 				strings[top]=strings[seek]; 				strings[seek]=temp; 			} }


Question: 使用malloc开辟空间时候出错，含泪跪求各位指点指点。

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

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

引用 7 楼 paschen的回复:sizeof(len) 改成 len  否则 申请到的空间只是一个 len变量的大小，你后面的操作就越界了，把堆空间破坏了，再次申请时就出错了 申请到的只是一个对吧？

引用 4 楼 luciferisnotsatan的回复:[quote=引用 3 楼 alinzihao 的回复:] [quote=引用 1 楼 振翅高飞的回复:]你是不是笔误啊？  v1=(struct stu *)malloc(sizeof(len));  前面都是 p1=(struct stu * )malloc(len);   仔细看这两句的等号右边的差别。瞪大眼睛仔细看。 sizeof(len)和len原来不是一样的东西的啊。。不过他们不都是表示大小么。。为什么一个行一个不行呢[/quote] sizeof(len)是这个结构的大小。你这个len八成是个长度吧，一个整型变量int之类的[/quote] 所以sizeof(len)表示的是整数的大小么？

引用 4 楼 luciferisnotsatan的回复:[quote=引用 3 楼 alinzihao 的回复:] [quote=引用 1 楼 振翅高飞的回复:]你是不是笔误啊？  v1=(struct stu *)malloc(sizeof(len));  前面都是 p1=(struct stu * )malloc(len);   仔细看这两句的等号右边的差别。瞪大眼睛仔细看。 sizeof(len)和len原来不是一样的东西的啊。。不过他们不都是表示大小么。。为什么一个行一个不行呢[/quote] sizeof(len)是这个结构的大小。你这个len八成是个长度吧，一个整型变量int之类的[/quote] 对啊对啊，我定义的是define len sizeof(结构体)

引用 3 楼 alinzihao 的回复:[quote=引用 1 楼 振翅高飞的回复:]你是不是笔误啊？  v1=(struct stu *)malloc(sizeof(len));  前面都是 p1=(struct stu * )malloc(len);   仔细看这两句的等号右边的差别。瞪大眼睛仔细看。 sizeof(len)和len原来不是一样的东西的啊。。不过他们不都是表示大小么。。为什么一个行一个不行呢[/quote] sizeof(len)是这个结构的大小。你这个len八成是个长度吧，一个整型变量int之类的

引用 1 楼 振翅高飞的回复:你是不是笔误啊？  v1=(struct stu *)malloc(sizeof(len));  前面都是 p1=(struct stu * )malloc(len);   仔细看这两句的等号右边的差别。瞪大眼睛仔细看。 sizeof(len)和len原来不是一样的东西的啊。。不过他们不都是表示大小么。。为什么一个行一个不行呢

引用 1 楼 振翅高飞的回复:你是不是笔误啊？  v1=(struct stu *)malloc(sizeof(len));  前面都是 p1=(struct stu * )malloc(len);   仔细看这两句的等号右边的差别。瞪大眼睛仔细看。 啊啊啊啊啊啊啊！！！！！改过来了。。真的对了。。 不过为什么第一次运行的时候可以啊。。第二次才报错。。喵的。。


Question: c语言 strcat()函数

小心驶得万年船！ #include <stdio.h> #include <string.h> #include <locale.h> int main() {     char receive_date[11];     char str_t[5];     char str_m[3],str_d[3];      setlocale(LC_ALL,"chs");      printf(" \n请输入年份（yyyy）： ");fflush(stdout);     rewind(stdin);scanf("%4s",receive_date);      printf(" \n请输入收文日期的月、日（mmdd）： ");fflush(stdout);     rewind(stdin);scanf("%4s",str_t);      strncpy(str_m,str_t  ,2);str_m[2]=0;     strncpy(str_d,str_t+2,2);str_d[2]=0;     strncat(receive_date,"-"  ,10-strlen(receive_date));     strncat(receive_date,str_m,10-strlen(receive_date));     strncat(receive_date,"-"  ,10-strlen(receive_date));     strncat(receive_date,str_d,10-strlen(receive_date));      printf("[%s]\n",receive_date);      return 0; } // //请输入年份（yyyy）： 12345678 // //请输入收文日期的月、日（mmdd）： abcdefgh //[1234-ab-cd] //  如果想校验输入年月日的合法性，参考下面： #include <afxdisp.h> #include <stdio.h> COleDateTime t; int main(int argc, char **argv) {     if (argc<2) {         printf("Usage:%s \"DateTimeStr\"\n",argv[0]);         return 2;     }     if (t.ParseDateTime(argv[1])) {         printf("\"%s\" is a valid DateTimeStr.\n",argv[1]);         printf("%s\n",t.Format("%Y-%m-%d %H:%M:%S"));         return 0;     } else {         printf("\"%s\" is a INVALID DateTimeStr!\n",argv[1]);         return 1;     } }

printf("\n%c",receive_date[0]);	 	      printf("\n%c",receive_date[1]); 	      printf("\n%c",receive_date[2]);  	      printf("\n%c",receive_date[3]); 	      printf("\n%c",receive_date[4]); 	      printf("\n%c",receive_date[5]);   	      printf("\n%c",receive_date[6]);	  		  		   	      printf("\n%c",receive_date[7]); 	      printf("\n%c",receive_date[8]); 	      printf("\n%c",receive_date[9]); 	      printf("\n%c",receive_date[10]); 	      printf("\n%c",receive_date[11]);               printf("\n%c",receive_date[12]);        	      printf("\n%c",receive_date[13]); 按paschen 给出的代码，最后用以上语句显示的结果是："2000-08-12a 1a"， 在末尾仍多出4 个字符：“a 1a”。 如果不用strcat函数，改用例如 receive_date[4]='-'; receive_date[5]=str_m[0]; ...... 这样的赋值语句，结果还是多出4 个字符。

缓冲区不够并且没有初始化 试试把下列代码  char receive_date[10]; char str_t[4]; char str_m[2],str_d[2];   改为   char receive_date[16] = {0}; char str_t[8] = {0}; char str_m[4] = {0},str_d[4] = {0};

为什么不改用strncat呢？

这样改吧：   	char receive_date[11]={0}; 	char str_t[4]; 	char str_m[3]={0},str_d[3]={0}; 	strcat(receive_date,"-");  	printf(" \n请输入年份（yyyy）： ");              		scanf("%s",&receive_date);  	printf(" \n请输入收文日期的月、日（mmdd）： ");      		scanf("%s",str_t);  	strncpy(str_m,str_t,2); 	strncpy(str_d,str_t+2,2);  	strcat(receive_date,"-"); 	strcat(receive_date,str_m); 	strcat(receive_date,"-"); 	strcat(receive_date,str_d);

因为strcat操作的是要以\0结尾的字符串，你的str_m与str_d并没有与\0结尾  char str_m[2],str_d[2];  改成 char str_m[3],str_d[3];  然后在strncpy之后将最后一个字符设置成\0

多分配一个字符存储'\0',结果也完全一样。 似乎是每执行一次strcat就要在后面增加一个(不显示)的"\0"。执行4次增加了4个"\0",有多余3个。怎么避免或去掉多余的"\0"?

注意，strxxx都是字符串操作的函数，函数要求它的参数都是字符串，即： 都是以'\0'结尾的。 '\0’是这类函数处理参数的结束标志。

要多分配一个字符存储'\0'表示字符串结束


Question: 杭电ACM2034不知道错哪里，调试过了，就是WA

结果还是WA，求帮助下

1 1 16777217 16777216

ac代码参考下 #include <iostream> using namespace std; int main() {     int m,n;     while(scanf("%d%d",&m,&n)!=EOF)     {         if(m==0&&n==0)          break;          else          {              int i,j,g,s,d=0,k=0;              int a[100],b[100],c[100];              for(i=0;i<m;i++)                  cin>>a[i];              for(j=0;j<n;j++)                  cin>>b[j];              for(i=0;i<m;i++)              {                   g=a[i];                   s=0;                   for(j=0;j<n;j++)                                     {                       if(b[j]==g)                       s++;            }                                                          if(s==0)                   {                        c[k]=a[i];                        k++;                        d++;                      }                 }              if(d==0)                  cout<<"NULL";              else              {                  int temp;                  for(i=1;i<d;i++)                    for(j=d-1;j>=i;j--)                    {                         if(c[j]<c[j-1])                         {                             temp=c[j];                             c[j]=c[j-1];                             c[j-1]=temp;                                    }                                  }              }              for(i=0;i<d;i++)                  cout<<c[i]<<" ";              cout<<endl;          }     }     //system("pause");     return 0; }

引用 5 楼 l6shee 的回复:我是循环出错了吗，为什么自己测试的数据不会出错，这个会，数据类型？

引用 4 楼 FancyMouse 的回复:1 1 16777217 16777216是我循环错了？

我是循环出错了吗，

找到问题所在了


Question: 一道考试的大题，到现在都读不懂题目是想让我做什么，请大家帮忙参考一下，谢谢了！

引用 6 楼 u010165006 的回复:[quote=引用 5 楼 zwei1993 的回复:] [quote=引用 3 楼 u010165006 的回复:] 仅供参考： C++ Builder模拟数字双时钟（带秒表）示例 http://blog.163.com/tab_98/blog/static/11924097201611324819376/ 谢谢你如此耐心的回复，我会仔细研读的。 这是往年研究生考试的最后一道真题，业务课二《课程设计》，由于是本科教育，大纲要求也基本上是c\c++\数据结构，前面还都是简单的常规题，问问你数据的逻辑结构，c语言基本的类型什么的，最后出现这么一道大题实在是有点想不明白，还占了25分的分值。卷子不给标准答案，所以根本不知道怎么回答。若如4楼所说的写文档什么的，也根本不会啊。[/quote]  研究生考试，本科教育？还是说你现在本科，找的往年考研试题？ 考试是在考场纸面作答，还是可以上机编写呢？[/quote] 是往年的考研试题，就在纸面作答。

引用 5 楼 zwei1993 的回复:[quote=引用 3 楼 u010165006 的回复:] 仅供参考： C++ Builder模拟数字双时钟（带秒表）示例 http://blog.163.com/tab_98/blog/static/11924097201611324819376/ 谢谢你如此耐心的回复，我会仔细研读的。 这是往年研究生考试的最后一道真题，业务课二《课程设计》，由于是本科教育，大纲要求也基本上是c\c++\数据结构，前面还都是简单的常规题，问问你数据的逻辑结构，c语言基本的类型什么的，最后出现这么一道大题实在是有点想不明白，还占了25分的分值。卷子不给标准答案，所以根本不知道怎么回答。若如4楼所说的写文档什么的，也根本不会啊。[/quote]  研究生考试，本科教育？还是说你现在本科，找的往年考研试题？ 考试是在考场纸面作答，还是可以上机编写呢？

引用 3 楼 u010165006 的回复:仅供参考： C++ Builder模拟数字双时钟（带秒表）示例 http://blog.163.com/tab_98/blog/static/11924097201611324819376/ 谢谢你如此耐心的回复，我会仔细研读的。 这是往年研究生考试的最后一道真题，业务课二《课程设计》，由于是本科教育，大纲要求也基本上是c\c++\数据结构，前面还都是简单的常规题，问问你数据的逻辑结构，c语言基本的类型什么的，最后出现这么一道大题实在是有点想不明白，还占了25分的分值。卷子不给标准答案，所以根本不知道怎么回答。若如4楼所说的写文档什么的，也根本不会啊。

第2题画图也可以使用EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。  下载一个EasyX包，里面有完整的函数手册。EasyX官网有实例。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/

图形用户界面可以学习C++ Builder，入门比较容易。 仅供参考： 初学者学习C++ Builder第一个程序（模拟聊天室），经典！ http://blog.163.com/tab_98/blog/static/11924097201693033057497/ 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/  C++ Builder写的《ZEC 纸牌游戏21点》 http://blog.163.com/tab_98/blog/static/119240972016115113039304/ C++ Builder写的《ZEC 僵尸版打地鼠》 http://blog.163.com/tab_98/blog/static/11924097201601084117748/   书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社） 《C++Builder6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。

不是写代码，写文档：怎么实现题目中的需求？要有什么样的界面？界面怎样同步？用户怎样操作？对用户操作怎么反应？内部怎么保存数据？大体上的流程是什么样的？


Question: 一道OJ上的题

引用 7 楼 qq_36409192 的回复:[quote=引用 6 楼 qq_33046541 的回复:] [quote=引用 5 楼 qq_36409192 的回复:] [quote=引用 4 楼 qq_33046541 的回复:] [quote=引用 2 楼 qq_36409192 的回复:] 应该是符号问题，你的符号可能是中文状态下输入的。 我本机运行可以，提交上去显示答案错误[/quote] 你的符号有问题，不能在中文输入的状态下输入符号，英文和中文这两种状态输出的符号是不同的。我帮你重新打了一遍，你再试试我这个打的。#include <cstdio> #include <cstring> int main() { 	char szA[120]; 	int nLen; 	int j; 	while(gets(szA)!=NULL) 	{ 		j=0; 		nLen=strlen(szA); 		if(szA[0]>=97&&szA[0]<=122) 			szA[0]-=32; 		for(int i=0;i<nLen;i++) 		{ 			if(szA[i]==' '||szA[i]=='\t'||szA[i]=='\r'||szA[i]=='\n') 				j=i; 			else if(j==i-1) 			if(szA[i]>=97&&szA[i]<=122) 				szA[i]-=32; 			puts(szA); 		} 		 	} 	return 0; } PS：如果符号的位置有问题，你自己稍微改下。[/quote]还是错误。。 [/quote] 程序有问题，我稍微改了下。 #include <cstdio> #include <cstring> #include <cctype>  int main() { 	char szA[120]; 	int nLen; 	int j; 	while(gets(szA)!=NULL) 	{ 		nLen=strlen(szA); 		if(szA[0]>=97&&szA[0]<=122) 			szA[0]-=32; 		for(int i=0;i<nLen;i++) 		{ 			if(szA[i]==' '||szA[i]=='\t'||szA[i]=='\r'||szA[i]=='\n') 			{ 				if(szA[i+1]>=97&&szA[i+1]<=122) 				szA[i+1]-=32; 			} 		} 		puts(szA); 	} 	return 0; }[/quote]我原来的写法为什么错了呀？

引用 6 楼 qq_33046541 的回复:[quote=引用 5 楼 qq_36409192 的回复:] [quote=引用 4 楼 qq_33046541 的回复:] [quote=引用 2 楼 qq_36409192 的回复:] 应该是符号问题，你的符号可能是中文状态下输入的。 我本机运行可以，提交上去显示答案错误[/quote] 你的符号有问题，不能在中文输入的状态下输入符号，英文和中文这两种状态输出的符号是不同的。我帮你重新打了一遍，你再试试我这个打的。#include <cstdio> #include <cstring> int main() { 	char szA[120]; 	int nLen; 	int j; 	while(gets(szA)!=NULL) 	{ 		j=0; 		nLen=strlen(szA); 		if(szA[0]>=97&&szA[0]<=122) 			szA[0]-=32; 		for(int i=0;i<nLen;i++) 		{ 			if(szA[i]==' '||szA[i]=='\t'||szA[i]=='\r'||szA[i]=='\n') 				j=i; 			else if(j==i-1) 			if(szA[i]>=97&&szA[i]<=122) 				szA[i]-=32; 			puts(szA); 		} 		 	} 	return 0; } PS：如果符号的位置有问题，你自己稍微改下。[/quote]还是错误。。 [/quote] 程序有问题，我稍微改了下。 #include <cstdio> #include <cstring> #include <cctype>  int main() { 	char szA[120]; 	int nLen; 	int j; 	while(gets(szA)!=NULL) 	{ 		nLen=strlen(szA); 		if(szA[0]>=97&&szA[0]<=122) 			szA[0]-=32; 		for(int i=0;i<nLen;i++) 		{ 			if(szA[i]==' '||szA[i]=='\t'||szA[i]=='\r'||szA[i]=='\n') 			{ 				if(szA[i+1]>=97&&szA[i+1]<=122) 				szA[i+1]-=32; 			} 		} 		puts(szA); 	} 	return 0; }

引用 10 楼 qq_33046541 的回复:[quote=引用 9 楼 qq_36409192 的回复:] [quote=引用 8 楼 qq_33046541的回复:][quote=引用 7 楼 qq_36409192 的回复:] [quote=引用 6 楼 qq_33046541 的回复:] [quote=引用 5 楼 qq_36409192 的回复:] [quote=引用 4 楼 qq_33046541 的回复:] [quote=引用 2 楼 qq_36409192 的回复:] 应该是符号问题，你的符号可能是中文状态下输入的。 我本机运行可以，提交上去显示答案错误[/quote] 你的符号有问题，不能在中文输入的状态下输入符号，英文和中文这两种状态输出的符号是不同的。我帮你重新打了一遍，你再试试我这个打的。#include <cstdio> #include <cstring> int main() { 	char szA[120]; 	int nLen; 	int j; 	while(gets(szA)!=NULL) 	{ 		j=0; 		nLen=strlen(szA); 		if(szA[0]>=97&&szA[0]<=122) 			szA[0]-=32; 		for(int i=0;i<nLen;i++) 		{ 			if(szA[i]==' '||szA[i]=='\t'||szA[i]=='\r'||szA[i]=='\n') 				j=i; 			else if(j==i-1) 			if(szA[i]>=97&&szA[i]<=122) 				szA[i]-=32; 			puts(szA); 		} 		 	} 	return 0; } PS：如果符号的位置有问题，你自己稍微改下。[/quote]还是错误。。 [/quote] 程序有问题，我稍微改了下。 #include <cstdio> #include <cstring> #include <cctype>  int main() { 	char szA[120]; 	int nLen; 	int j; 	while(gets(szA)!=NULL) 	{ 		nLen=strlen(szA); 		if(szA[0]>=97&&szA[0]<=122) 			szA[0]-=32; 		for(int i=0;i<nLen;i++) 		{ 			if(szA[i]==' '||szA[i]=='\t'||szA[i]=='\r'||szA[i]=='\n') 			{ 				if(szA[i+1]>=97&&szA[i+1]<=122) 				szA[i+1]-=32; 			} 		} 		puts(szA); 	} 	return 0; }[/quote]我原来的写法为什么错了呀？ [/quote] 你把你写的自己试试就知道问题在哪里了。。[/quote] 我试过，样例可以通过啊[/quote] 我这边显示你把第一个单词的第二个字母也改成大写了，而且程序是否正确不能只用一组数组验证，你多试试。

引用 9 楼 qq_36409192 的回复:[quote=引用 8 楼 qq_33046541的回复:][quote=引用 7 楼 qq_36409192 的回复:] [quote=引用 6 楼 qq_33046541 的回复:] [quote=引用 5 楼 qq_36409192 的回复:] [quote=引用 4 楼 qq_33046541 的回复:] [quote=引用 2 楼 qq_36409192 的回复:] 应该是符号问题，你的符号可能是中文状态下输入的。 我本机运行可以，提交上去显示答案错误[/quote] 你的符号有问题，不能在中文输入的状态下输入符号，英文和中文这两种状态输出的符号是不同的。我帮你重新打了一遍，你再试试我这个打的。#include <cstdio> #include <cstring> int main() { 	char szA[120]; 	int nLen; 	int j; 	while(gets(szA)!=NULL) 	{ 		j=0; 		nLen=strlen(szA); 		if(szA[0]>=97&&szA[0]<=122) 			szA[0]-=32; 		for(int i=0;i<nLen;i++) 		{ 			if(szA[i]==' '||szA[i]=='\t'||szA[i]=='\r'||szA[i]=='\n') 				j=i; 			else if(j==i-1) 			if(szA[i]>=97&&szA[i]<=122) 				szA[i]-=32; 			puts(szA); 		} 		 	} 	return 0; } PS：如果符号的位置有问题，你自己稍微改下。[/quote]还是错误。。 [/quote] 程序有问题，我稍微改了下。 #include <cstdio> #include <cstring> #include <cctype>  int main() { 	char szA[120]; 	int nLen; 	int j; 	while(gets(szA)!=NULL) 	{ 		nLen=strlen(szA); 		if(szA[0]>=97&&szA[0]<=122) 			szA[0]-=32; 		for(int i=0;i<nLen;i++) 		{ 			if(szA[i]==' '||szA[i]=='\t'||szA[i]=='\r'||szA[i]=='\n') 			{ 				if(szA[i+1]>=97&&szA[i+1]<=122) 				szA[i+1]-=32; 			} 		} 		puts(szA); 	} 	return 0; }[/quote]我原来的写法为什么错了呀？ [/quote] 你把你写的自己试试就知道问题在哪里了。。[/quote] 我试过，样例可以通过啊

引用 8 楼 qq_33046541的回复:[quote=引用 7 楼 qq_36409192 的回复:] [quote=引用 6 楼 qq_33046541 的回复:] [quote=引用 5 楼 qq_36409192 的回复:] [quote=引用 4 楼 qq_33046541 的回复:] [quote=引用 2 楼 qq_36409192 的回复:] 应该是符号问题，你的符号可能是中文状态下输入的。 我本机运行可以，提交上去显示答案错误[/quote] 你的符号有问题，不能在中文输入的状态下输入符号，英文和中文这两种状态输出的符号是不同的。我帮你重新打了一遍，你再试试我这个打的。#include <cstdio> #include <cstring> int main() { 	char szA[120]; 	int nLen; 	int j; 	while(gets(szA)!=NULL) 	{ 		j=0; 		nLen=strlen(szA); 		if(szA[0]>=97&&szA[0]<=122) 			szA[0]-=32; 		for(int i=0;i<nLen;i++) 		{ 			if(szA[i]==' '||szA[i]=='\t'||szA[i]=='\r'||szA[i]=='\n') 				j=i; 			else if(j==i-1) 			if(szA[i]>=97&&szA[i]<=122) 				szA[i]-=32; 			puts(szA); 		} 		 	} 	return 0; } PS：如果符号的位置有问题，你自己稍微改下。[/quote]还是错误。。 [/quote] 程序有问题，我稍微改了下。 #include <cstdio> #include <cstring> #include <cctype>  int main() { 	char szA[120]; 	int nLen; 	int j; 	while(gets(szA)!=NULL) 	{ 		nLen=strlen(szA); 		if(szA[0]>=97&&szA[0]<=122) 			szA[0]-=32; 		for(int i=0;i<nLen;i++) 		{ 			if(szA[i]==' '||szA[i]=='\t'||szA[i]=='\r'||szA[i]=='\n') 			{ 				if(szA[i+1]>=97&&szA[i+1]<=122) 				szA[i+1]-=32; 			} 		} 		puts(szA); 	} 	return 0; }[/quote]我原来的写法为什么错了呀？ [/quote] 你把你写的自己试试就知道问题在哪里了。。

引用 5 楼 qq_36409192 的回复:[quote=引用 4 楼 qq_33046541 的回复:] [quote=引用 2 楼 qq_36409192 的回复:] 应该是符号问题，你的符号可能是中文状态下输入的。 我本机运行可以，提交上去显示答案错误[/quote] 你的符号有问题，不能在中文输入的状态下输入符号，英文和中文这两种状态输出的符号是不同的。我帮你重新打了一遍，你再试试我这个打的。#include <cstdio> #include <cstring> int main() { 	char szA[120]; 	int nLen; 	int j; 	while(gets(szA)!=NULL) 	{ 		j=0; 		nLen=strlen(szA); 		if(szA[0]>=97&&szA[0]<=122) 			szA[0]-=32; 		for(int i=0;i<nLen;i++) 		{ 			if(szA[i]==' '||szA[i]=='\t'||szA[i]=='\r'||szA[i]=='\n') 				j=i; 			else if(j==i-1) 			if(szA[i]>=97&&szA[i]<=122) 				szA[i]-=32; 			puts(szA); 		} 		 	} 	return 0; } PS：如果符号的位置有问题，你自己稍微改下。[/quote]还是错误。。

引用 4 楼 qq_33046541 的回复:[quote=引用 2 楼 qq_36409192 的回复:] 应该是符号问题，你的符号可能是中文状态下输入的。 我本机运行可以，提交上去显示答案错误[/quote] 你的符号有问题，不能在中文输入的状态下输入符号，英文和中文这两种状态输出的符号是不同的。我帮你重新打了一遍，你再试试我这个打的。#include <cstdio> #include <cstring> int main() { 	char szA[120]; 	int nLen; 	int j; 	while(gets(szA)!=NULL) 	{ 		j=0; 		nLen=strlen(szA); 		if(szA[0]>=97&&szA[0]<=122) 			szA[0]-=32; 		for(int i=0;i<nLen;i++) 		{ 			if(szA[i]==' '||szA[i]=='\t'||szA[i]=='\r'||szA[i]=='\n') 				j=i; 			else if(j==i-1) 			if(szA[i]>=97&&szA[i]<=122) 				szA[i]-=32; 			puts(szA); 		} 		 	} 	return 0; } PS：如果符号的位置有问题，你自己稍微改下。

引用 2 楼 qq_36409192 的回复:应该是符号问题，你的符号可能是中文状态下输入的。 我本机运行可以，提交上去显示答案错误

引用 2 楼 qq_36409192 的回复:应该是符号问题，你的符号可能是中文状态下输入的。 什么意思。。。

应该是符号问题，你的符号可能是中文状态下输入的。

while(gets(szA)!=NULL)就意味着你会循环输入szA字符串


Question: 编写一个函数：拷贝字符串前n个字符

没看你的答案，自己找出来了原因。不过还是很感谢！*p指的是一个字符，用%s格式输出当然会出现问题。而指针p遇到格式符号%s，将转化成指针所指向的内容，即字符串。

printf("the copy of s2 is:%s\n",*p); 改成 printf("the copy of s2 is: %s\n", p);


Question: 各位又有一个错误求解

参考下别人AC的代码。 1.看看输入和输出的格式是不是和别人一样（自己理解错了） 2.是不是有些边界的测试数据没有考虑到

没必要malloc，我觉得。

printf("%d\n", sum); 呢

引用 1 楼 user-5 的回复:输出要回车的。。。 试了不行

引用 1 楼 user-5 的回复:输出要回车的。。。 试了不行

最后不要 system("pause");

引用 7 楼 wang0635 的回复:[quote=引用 6 楼 qq_36151474 的回复:] [quote=引用 5 楼 paschen 的回复:] printf("%d\n", sum); 呢 楼上说要回车我就加了\n不行的[/quote] 为什么不把 system("pause"); 去掉呢？[/quote] 一般习惯了加system("pause");要看运行结果 楼上有人说了我去掉了也不行 而且我提交别的程序也都有这行代码没有问题的

引用 6 楼 qq_36151474 的回复:[quote=引用 5 楼 paschen 的回复:] printf("%d\n", sum); 呢 楼上说要回车我就加了\n不行的[/quote] 为什么不把 system("pause"); 去掉呢？

引用 5 楼 paschen 的回复:printf("%d\n", sum); 呢 楼上说要回车我就加了\n不行的

输出要回车的。。。


Question: 使用指向堆的指针，能查出堆的空间有多大码？

_msize Returns the size of a memory block allocated in the heap.  size_t _msize( void *memblock );  Routine Required Header Compatibility  _msize <malloc.h> Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  _msize returns the size (in bytes) as an unsigned integer.  Parameter  memblock  Pointer to memory block  Remarks  The _msize function returns the size, in bytes, of the memory block allocated by a call to calloc, malloc, or realloc.  When the application is linked with a debug version of the C run-time libraries, _msize resolves to _msize_dbg. For more information about how the heap is managed during the debugging process, see Using C Run-Time Library Debugging Support.  Example  /* REALLOC.C: This program allocates a block of memory for  * buffer and then uses _msize to display the size of that  * block. Next, it uses realloc to expand the amount of  * memory used by buffer and then calls _msize again to  * display the new amount of memory allocated to buffer.  */  #include <stdio.h> #include <malloc.h> #include <stdlib.h>  void main( void ) {    long *buffer;    size_t size;     if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )       exit( 1 );     size = _msize( buffer );    printf( "Size of block after malloc of 1000 longs: %u\n", size );     /* Reallocate and show new size: */    if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) ))          ==  NULL )       exit( 1 );    size = _msize( buffer );    printf( "Size of block after realloc of 1000 more longs: %u\n",              size );     free( buffer );    exit( 0 ); }   Output  Size of block after malloc of 1000 longs: 4000 Size of block after realloc of 1000 more longs: 8000   Memory Allocation Routines  See Also   calloc, _expand, malloc, realloc

引用 4 楼 jjj4722 的回复:这个函数确实看不懂，有没有VC里用的函数哦 这个函数就是VC的API函数，微软专有。  SIZE_T WINAPI HeapSize(   _In_ HANDLE  hHeap,   _In_ DWORD   dwFlags,   _In_ LPCVOID lpMem );  第一个参数是申请的对内存所在的内存块的句柄，该句柄由 HeapCreate 或者 GetProcessHeap返回。 第二个参数是一个标识位，如果将该标识位赋值HEAP_NO_SERIALIZE，可以在多线程中提升性能，消除互斥机制。但是有内存溢出的风险。 所以为这个标识位时，请在以下三种情况使用。 1.单线程程序 2.多线程，但是只有一个线程开辟指定堆内存。 3.多线程，但是进程提供自有的基于指定堆内存的互斥机制。 第三个参数是要获得堆内存大小的内存指针（堆内存起始地址），该值可由 HeapAlloc 或者 HeapReAlloc获得。 该指针必须由第一个参数指定。也就是第一和第三参数存在对应关系。  该函数返回成功是返回指定堆内存大小。返回-1代表失败。 如果返回-1，而且没有调用API函数SetLastErrors，无法应用API函数GetLastErrors函数获取进一步的错误信息。

直接malloc很大的空间，然后判断返回值，失败了的话说明没有那么大，然后放小点继续试

检测的是： HeapAlloc 或 HeapReAlloc 申请得到的堆空间大小

HeapSize  https://msdn.microsoft.com/en-us/library/windows/desktop/aa366706(v=vs.85).aspx

这个函数确实看不懂，有没有VC里用的函数哦


Question: 资讯一个 C 获取 REDIS KEY后的问题

C/C++也有json_decode库或json_decode开源代码可供使用啊。

可能我描述得不好 不是我讲所谓的乱码那里  而是我已经得到其他语言（数组） 传过来的字符串后 {0=>"wbs", 1=>99, 2=>"xo", 3=>"ffffffffffffffffffffffffffffavavadsferaersdafsadfiiiiiiiiiiiiiiiiiiiii"}  我如何更方便的运用的问题。、 好像 PHP 有 json_decode 可以回归到数组。但对于 C 呢？这样一个字符串 如何更好的改变模式后 再做使用

对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

求助一下~~~~~~~~~~~~~


Question: C语言十六进制转换成八进制

引用 2 楼 bayhax 的回复:那应该char *strHex[10];       char *strBin[10];       char *strOct[10];   这样吗？但是这样怎么得到每个字符串里的字符啊，？ strbin[i][j]好像会出错  那就  char strHex[][10]  改成  char strHex[3][10]  显示指定出数组的维数

你这个输入的地方就是不对的。 char strHex[][10] = { "0" };这样的写法默认就是1X10的一个数组，也就是char strHex[1][10] = { "0" }; 你之后在根据输入的n来gets字符串，会造成越界的


Question: C语言中

谢谢大神们！！！

引用 1 楼 user-2 的回复:整个控制台的颜色   用 system("color 0A");    其中color后面的0是背景色代号，A是前景色代号。各颜色代码如下：    0=黑色    1=蓝色    2=绿色    3=湖蓝色    4=红色    5=紫色    6=黄色    7=白色    8=灰色    9=淡蓝色    A=淡绿色    B=淡浅绿色    C=淡红色    D=淡紫色    E=淡黄色    F=亮白色 谢谢大神指教！


Question: net-snmp添加的MIB不能识别

执行MIB2C会出现下面这种错误 zrt@ubuntu:~/mib$ env MIBS="+/etc/snmp/mibs/Test-MIB.my" mib2c Test  /etc/snmp/mibs/Test-MIB.my: No such file or directory  You didn't give mib2c a valid OID to start with.  IE, I could not find any information about the mib node "Test".  This could be caused because you supplied an incorrectly node, or by the MIB that you're trying to generate code from isn't loaded.  To make sure your mib is loaded, run mib2c using this as an example:     env MIBS="+MY-PERSONAL-MIB" mib2c Test  You might wish to start by reading the MIB loading tutorial at:     http://www.net-snmp.org/tutorial-5/commands/mib-options.html  And making sure you can get snmptranslate to display information about your MIB node.  Once snmptranslate works, then come back and try mib2c again.


Question: 为什么64位系统默认是8字节对齐

已经找到了原因了  大概是也为了性能考虑，8字节的数据需要8字节对齐和cpu缓冲命中率有关系  http://stackoverflow.com/questions/21219130/is-8-byte-alignment-for-double-type-necessary

《The Intel 64 and IA-32 Architectures Software Developer's Manual》


Question: 【求助】班级信息管理系统设计

c语言+数据库+图形界面应该可以做，

图形用户界面可以学习C++ Builder，入门比较容易。 仅供参考： 初学者学习C++ Builder第一个程序（模拟聊天室），经典！ http://blog.163.com/tab_98/blog/static/11924097201693033057497/ 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/  C++ Builder写的《ZEC 纸牌游戏21点》 http://blog.163.com/tab_98/blog/static/119240972016115113039304/ C++ Builder写的《ZEC 僵尸版打地鼠》 http://blog.163.com/tab_98/blog/static/11924097201601084117748/   书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社） 《C++Builder6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。

百度搜相关关键字。

试试QT，适合新手做界面

只会控制台的肯定不行，要做界面就学GUI编译，先把基础打扎实了，路还长.......


Question: DLL 全局数组赋值及调用

去掉extern后还是无法赋值，仍然是0，不过还是多谢指点：）

引用 4 楼 Lujiafeng0203 的回复:extern double randomarray[100]; 头文件这样声明还是不行：（ 没看见我把extern去掉了吗？

是赋值函数，与回调函数的问题吗？赋值函数必须要调用一次，然后才能给全局数组重新赋值。 如果不调用的话，全局数组里还是初始值，所以不会改变？？？

多谢，试试先：）

在 globalarray.h文件中声明全局数组： double randomarray[100];  在dll .cpp中初始化全局数组，及定义两个函数。 #include "globalarray.h" extern "C" { void get_rand(); int __declspec(dllexport) APIENTRY AnotherFunction(v1,v2); } // get_rand()用于生成一组数字然后存放于全局数组中,然后在另外一个函数AnotherFunction中调用这个全局数组中的值，一直不成功，返回都是0.好像get_rand 函数没有运行赋值给全局数组。 void get_rand() { int i; srand(0); //设置随机数种子 for (i = 0; i <= 99; i++) { randomarray[i] = rand()%1000/1001.0; }  }  int __declspec(dllexport) APIENTRY AnotherFunction(v1,v2);  {   double t; t=randomarray[1]; }

有偿付费咨询，高手们指点一下吧，能写段代码作为参考最好了


Question: 求解一个很无语的bug

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

scanf(m);  ... p = buf; p = p+m;  *p = '\0';//j就是这句  就是注释的那一句，你把第二个值B改成'\0'了，当然输出不出来了

自己单步跟一下吧，

scanf(m); // m == 1 p = buf; p = p+m; // buf+1 *p = '\0';  。。。

引用 5 楼 paschen 的回复:你输入的m是1，p=p+m后，p指向的就是p[1]即 ‘b’那个字符，之后你又*p='\0'把这个字符改了 谢谢啊就是这个我当时大意然后调试时候发现了最后把字符备份了截取过后恢复就好了。


Question: 写了一个表达式计算的程序，出现了一些问题，求大神指导

你在pop函数听head=head->next;是不会对函数调用时的参数operands产生影响的，因为你参数是按值传递的，函数中的head只是一个复制后的指针，你并没有将operands指向一个节点  你需要将参数改为传递指针的地址

代码出问题，如果没报错，有两种解决方案，一种是调试，一种是在每一截语句后面加输出，看看你语句中的变量值是否和你所想要的结果一样，不一样就说明你这截代码有问题，否则就继续往下，直到你找出问题来为止。

谢谢大家的帮助和提示，下面是修改之后的版本，还是有一些问题   #include <string.h> #include <stdio.h> #include <stdlib.h> #define MAX 1000 #define ERROR -987654321  typedef struct stract					//栈类型 { 	char data[MAX]; 	int top; 	struct stract *next; }Stract;  int toData(char s[],int len)			//将字符数组转化为int { 	int a=0; 	int i;  	for(i=0;i<len;i++) 	{ 		a=a*10+(s[i]-'0'); 	} 	return a; }  int prior(char s)					//判断算符优先级 { 	switch (s) 	{ 		case '+':	 		case '-':	return 1; 		case '*': 		case '/':	return 2; 		case '(':	return 3; 	} 	return 0; }  Stract* push(Stract* head,char s[],int len)				//压栈 { 	Stract* p=(Stract*)(malloc(sizeof(Stract))); 	int i;  	for(i=0;i<len;i++) 	{ 		p->data[i]=s[i]; 	} 	p->data[i]='\0'; 	p->top=head->top+1; 	p->next=head; 	return p; }  char* pop(Stract** head)					//出栈 { 	Stract* p=*head; 	char *pStr=p->data;  	*head=(*head)->next; 	free(p); 	return pStr; }  int legal(char s[])					//判断输入是否合法 { 	return 1; }  char *toCharArray(int a)					//转化为字符数组 { 	int i=0; 	char *x=NULL; 	int t=a; 	char s;  	while(t!=0) 	{ 		t/=10; 		i++; 	} 	x=(char*)(malloc(sizeof(char)*(i+1))); 	t=a; 	i=0; 	while(t!=0) 	{ 		*(x+i)=(t%10)+'0'; 		t=t/10; 		i++; 	} 	for(t=0;t<i/2;t++) 	{ 		s=*(x+t); 		*(x+t)=*(x+i-t); 		*(x+i-t)=s; 	} 	return x; }  int calculate(char x[],char y[],char a)						//字符串运算 { 	int val1,val2; 	val1=toData(x,strlen(x)); 	val2=toData(y,strlen(y));  	switch (a) 	{ 	case '+':	return val1+val2; 	case '-':	return val1-val2; 	case '*':	return val1*val2; 	case '/':	return val1/val2; 	} 	return ERROR; }  char read(Stract* head)							//读取栈内元素(一个字符) { 	return head->data[0]; }  int calc(char s[]) { 	unsigned int i,j; 	char *str=NULL; 	char a; 	Stract *operands=(Stract*)(malloc(sizeof(Stract)));			//操作数栈 	Stract *operators=(Stract*)(malloc(sizeof(Stract)));		//运算符栈 	operands=push(operands,s,1); 	operands->next=NULL; 	operands->top=0; 	operators->next=NULL; 	operators->top=0; 	operators->data[0]='0';  	for(i=1;i<strlen(s);i++) 	{ 		j=i; 		while(s[i]>='0' && s[i]<='9') 		{ 			i++; 		} 		operands=push(operands,s+i-j-1,i-j-1); 		if(s[i]!=')') 		{ 			if(prior(s[i])>prior(operands->data[0]))	//判断优先级	 			{ 				operators=push(operators,s+i,1); 			} 			else 			{ 				str=toCharArray(calculate(pop(&operands),pop(&operands),s[i]));			//计算栈顶的两个元素 				operands=push(operands,str,strlen(str));								//将计算值压栈 				free(str); 			} 		} 		else 		{ 			a=read(operators); 			while(a!='(')						//处理括号内的内容 			{ 				a=read(operators); 				str=toCharArray(calculate(pop(&operands),pop(&operands),*(pop(&operators)))); 				operands=push(operands,str,strlen(str)); 				free(str); 			} 			pop(&operators); 		} 	} 	pop(&operators); 	a=read(operators); 	while(a!='#')			//计算其余内容 	{ 		a=read(operators); 		str=toCharArray(calculate(pop(&operands),pop(&operands),*(pop(&operators)))); 		operands=push(operands,str,strlen(str)); 		free(str); 	} 	return toData(operands->data,strlen(operands->data));			//返回计算值 }  int main() { 	int len; 	char s[MAX]; 	int val;  	gets(s); 	len=strlen(s);  	if(legal(s))					//判断输入是否合法 	{ 		val=calc(s); 	} 	else 	{ 		printf("Your input Error\n"); 		return ERROR; 	} 	printf("%d\n",val); 	return 0; }

仅供参考：/*--------------------------------------- 函数型计算器(VC++6.0,Win32 Console) 功能： 目前提供了10多个常用数学函数:     ⑴正弦sin     ⑵余弦cos     ⑶正切tan     ⑷开平方sqrt     ⑸反正弦arcsin     ⑹反余弦arccos     ⑺反正切arctan     ⑻常用对数lg     ⑼自然对数ln     ⑽ｅ指数exp     ⑾乘幂函数^     ⑿向上取整ceil     ⒀向下取整floor     ⒁四舍五入取整round 用法： 如果要求2的32次幂，可以打入2^32<回车> 如果要求30度角的正切可键入tan(Pi/6)<回车> 注意不能打入：tan(30)<Enter> 如果要求1.23弧度的正弦，有几种方法都有效： sin(1.23)<Enter> sin 1.23 <Enter> sin1.23  <Enter> 如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter> 此外两函数表达式连在一起,自动理解为相乘如：sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77) 当然你还可以依据三角变换，再用sin(1.23+0.77)也即sin2验证一下。 本计算器充分考虑了运算符的优先级因此诸如：2+3*4^2 实际上相当于：2+(3*(4*4)) 另外函数名前面如果是数字,那么自动认为二者相乘. 同理，如果某数的右侧是左括号，则自动认为该数与括弧项之间隐含一乘号。 如：3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1) 又如：4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5) 此外，本计算器提供了圆周率 Pi键入字母时不区分大小写,以方便使用。 ----------------------------------------*/ #include <iostream> #include <iomanip> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <stdio.h> #include <string.h> #include <windows.h> using namespace std; const char Tab=0x9; const int  DIGIT=1; const int MAXLEN=16384; char s[MAXLEN],*endss; int pcs=15; double round(double dVal, short iPlaces) {//iPlaces>=0     char s[30];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); } double fun(double x,char op[],int *iop) {     while (op[*iop-1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>         switch (op[*iop-1]) {         case  7: x=sin(x);    (*iop)--;break;         case  8: x=cos(x);    (*iop)--;break;         case  9: x=tan(x);    (*iop)--;break;         case 10: x=sqrt(x);   (*iop)--;break;         case 11: x=asin(x);   (*iop)--;break;         case 12: x=acos(x);   (*iop)--;break;         case 13: x=atan(x);   (*iop)--;break;         case 14: x=log10(x);  (*iop)--;break;         case 15: x=log(x);    (*iop)--;break;         case 16: x=exp(x);    (*iop)--;break;         case 17: x=ceil(x);   (*iop)--;break;         case 18: x=floor(x);  (*iop)--;break;         case 19: x=round(x,0);(*iop)--;break;         }     return x; } double calc(char *expr,char **addr) {     static int deep; //递归深度     static char *fname[]={"sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp","ceil","floor","round",NULL};     double ST[10]={0.0}; //数字栈     char op[10]={'+'}; //运算符栈     char c,*rexp,*pp,*pf;     int ist=1,iop=1,last,i;      if (!deep) {         pp=pf=expr;         do {             c = *pp++;             if (c!=' '&& c!=Tab)                 *pf++ = c;         } while (c!='\0');     }     pp=expr;     if ((c=*pp)=='-'||c=='+') {         op[0] = c;         pp++;     }     last = !DIGIT;     while ((c=*pp)!='\0') {         if (c=='(') {//左圆括弧             deep++;             ST[ist++]=calc(++pp,addr);             deep--;             ST[ist-1]=fun(ST[ist-1],op,&iop);             pp = *addr;             last = DIGIT;             if (*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2)) {//目的是：当右圆括弧的右恻为左圆括弧或函数名字时，默认其为乘法                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }         else if (c==')') {//右圆括弧             pp++;             break;         } else if (isalpha(c)) {             if (!strnicmp(pp,"Pi",2)) {                 if (last==DIGIT) {                     cout<< "π左侧遇）" <<endl;exit(1);                 }                 ST[ist++]=3.14159265358979323846264338328;                 ST[ist-1]=fun(ST[ist-1],op,&iop);                 pp += 2;                 last = DIGIT;                 if (!strnicmp(pp,"Pi",2)) {                     cout<< "两个π相连" <<endl;exit(2);                 }                 if (*pp=='(') {                     cout<< "π右侧遇（" <<endl;exit(3);                 }             } else {                 for (i=0; (pf=fname[i])!=NULL; i++)                     if (!strnicmp(pp,pf,strlen(pf))) break;                 if (pf!=NULL) {                     op[iop++] = 07+i;                     pp += strlen(pf);                 } else {                     cout<< "陌生函数名" <<endl;exit(4);                 }             }         } else if (c=='+'||c=='-'||c=='*'||c=='/'||c=='%'||c=='^') {             char cc;             if (last != DIGIT) {                 cout<< "运算符粘连" <<endl;exit(5);             }             pp++;             if (c=='+'||c=='-') {                 do {                     cc = op[--iop];                     --ist;                     switch (cc) {                     case '+':  ST[ist-1] += ST[ist];break;                     case '-':  ST[ist-1] -= ST[ist];break;                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 } while (iop);                 op[iop++] = c;             } else if (c=='*'||c=='/'||c=='%') { operate:        cc = op[iop-1];                 if (cc=='+'||cc=='-') {                     op[iop++] = c;                 } else {                     --ist;                     op[iop-1] = c;                     switch (cc) {                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 }             } else {                 cc = op[iop-1];                 if (cc=='^') {                     cout<< "乘幂符连用" <<endl;exit(6);                 }                 op[iop++] = c;             }             last = !DIGIT;         } else {             if (last == DIGIT) {                 cout<< "两数字粘连" <<endl;exit(7);             }             ST[ist++]=strtod(pp,&rexp);             ST[ist-1]=fun(ST[ist-1],op,&iop);             if (pp == rexp) {                 cout<< "非法字符" <<endl;exit(8);             }             pp = rexp;             last = DIGIT;             if (*pp == '('||isalpha(*pp)) {                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }     }     *addr=pp;     if (iop>=ist) {         cout<< "表达式有误" <<endl;exit(9);     }     while (iop) {         --ist;         switch (op[--iop]) {         case '+':  ST[ist-1] += ST[ist];break;         case '-':  ST[ist-1] -= ST[ist];break;         case '*':  ST[ist-1] *= ST[ist];break;         case '/':  ST[ist-1] /= ST[ist];break;         case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;         case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;         }     }     return ST[0]; } int main(int argc,char **argv) {     int a;      if (argc<2) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算函数表达式的值。"<<endl<<"支持(),+,-,*,/,%,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round"<<endl;         while (1) {             cout << "请输入表达式：";             gets(s);             if (s[0]==0) break;//             cout << s <<"=";             cout << setprecision(15) << calc(s,&endss) << endl;         }     } else if (argc==2 && 0==strcmp(argv[1],"/?")) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算由≥1个命令行参数给出的函数表达式的值。最后一个参数是.0～.15表示将计算结果保留小数0～15位"<<endl<<"支持(),+,-,*,/,%,^^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round"<<endl;     } else {         strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;         if (argc>2) {             for (a=2;a<argc-1;a++) strncat(s,argv[a],MAXLEN-1);//将空格间隔的各参数连接到s             if (1==sscanf(argv[a],".%d",&pcs) && 0<=pcs && pcs<=15) {//最后一个参数是.0～.15表示将计算结果保留小数0～15位                 printf("%.*lf\n",pcs,calc(s,&endss));             } else {                 strncat(s,argv[a],MAXLEN-1);                 printf("%.15lg\n",calc(s,&endss));             }         } else {             printf("%.15lg\n",calc(s,&endss));         }     }     return 0; }


Question: AC问题

恩恩，学习了。蟹蟹各位大神！

每次外层循环的时候将sum值重置为0

在循环里面，你会把上次累加的结果计算到本次循环中。所以循环里，先把上次累加的结果sum清0

噢噢，原来是这样，但是，我不明白为什么？大神，可以告诉我为什么吗？

while(n--) { gets(a); len=strlen(a); for(int i=0;i<len;i++) { sum+=a[i];	 } 改成 while(n--) { sum = 0; gets(a); len=strlen(a); for(int i=0;i<len;i++) { sum+=a[i];	 }


Question: JPEG中的DCT变换

可不可以提取出库中的熵编码，单独为我所用。或者有人试过吗

dct以后才能做编码。你不想dct那还要jpeg干甚

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


Question: printf()  末尾显示多余乱码

另外，char str_m[2]; 这里应该声明3个元素，还需要存最后的\0  可以申请时直接写成  char str_m[3] = {0};  ，这样先把缓存全用0填充

字符串要以\0结尾，你在 strncpy 时复制的字符数要把结尾的\0也计算进去

使用数组注意: 1.初始化问题 2.边界问题，数组末尾需要放'\0'

你的数组char str_t[4];4个字节空间，但你输入4个字符，记得零终止符号'\0'也是占一位的。 如果你想str_t存储0912正常就至少要开5个字节大小。char str_t[5];同理char str_m[2];类似。   其次数组缓存应用前记得清空一下，  strncpy(str_m,str_t,2);前面要清空一下str_m

字符串结尾要用\0的，你的字符中数据空间小了。


Question: 杭州OJ我为什么过不了啊， 说我time exceed

引用 5 楼 xsklld的回复:[quote=引用 4 楼 qq_36496856 的回复:] [quote=引用 3 楼 user-7的回复:][quote=引用 2 楼 qq_36496856 的回复:] [quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间[/quote] 谢谢，我懂了。。。。。。[/quote] 真的懂了吗？ 为什么只循环48次？ 最后为什么输出arr[n%48]？ 这才是关键。[/quote] 我还是没想出来。为什么会是48，是某种算法?还是数学规律?

mark

1楼装b失败。 终于在3楼挽回装b面子。

不要迷信各种OJ

引用 7 楼 xsklld 的回复:[quote=引用 5 楼 xsklld 的回复:] [quote=引用 4 楼 qq_36496856 的回复:] [quote=引用 3 楼 user-7的回复:][quote=引用 2 楼 qq_36496856 的回复:] [quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间[/quote] 谢谢，我懂了。。。。。。[/quote] 真的懂了吗？ 为什么只循环48次？ 最后为什么输出arr[n%48]？ 这才是关键。[/quote] 另外这个代码也是错的。最明显的错误便是没有定义arr[0]，而当n=48时会输出未定义的arr[0]。 当然算法本身也是错的，一个反例便是a=7, b=3时，a[49]=5≠a[1]。 但这个算法蕴含了解此题的重要思想（参考5楼），楼主可以再想想。[/quote] 刚刚试了下提交这个代码，居然被接受了，可它有明显的错误啊！  引用 7 楼 xsklld 的回复:[quote=引用 5 楼 xsklld 的回复:] [quote=引用 4 楼 qq_36496856 的回复:] [quote=引用 3 楼 user-7的回复:][quote=引用 2 楼 qq_36496856 的回复:] [quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间[/quote] 谢谢，我懂了。。。。。。[/quote] 真的懂了吗？ 为什么只循环48次？ 最后为什么输出arr[n%48]？ 这才是关键。[/quote] 另外这个代码也是错的。最明显的错误便是没有定义arr[0]，而当n=48时会输出未定义的arr[0]。 当然算法本身也是错的，一个反例便是a=7, b=3时，a[49]=5≠a[1]。 但这个算法蕴含了解此题的重要思想（参考5楼），楼主可以再想想。[/quote] 试着提交了一下，居然成功了，可这算法明显有错误，估计网站自己设定的算法有问题。

这个n <= 100,000,000，所你的方法会超时。 由于f(n)只能取0-6，所以f(n)、f(n+1) 只有49种可能组合，所以当序列长度超过50时，必然能找到 n,有f(n)=f(1),f(n+1)=f(2)。 由于f（n）值只取决于前二个数，所以然后有f(n+2)=f(3),f(n+3)=f(4)……f（2n-2）=f（n-1），也就是说，序列是循环的，这个循环序列长度不会超过49。 所以，你可以构造第3-51个数组成的序列，然后查找值1，1出现的位置和f（1）的差，即是循环序列长度，对n取模，然后查数组获取结果。

引用 5 楼 xsklld 的回复:[quote=引用 4 楼 qq_36496856 的回复:] [quote=引用 3 楼 user-7的回复:][quote=引用 2 楼 qq_36496856 的回复:] [quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间[/quote] 谢谢，我懂了。。。。。。[/quote] 真的懂了吗？ 为什么只循环48次？ 最后为什么输出arr[n%48]？ 这才是关键。[/quote] 另外这个代码也是错的。最明显的错误便是没有定义arr[0]，而当n=48时会输出未定义的arr[0]。 当然算法本身也是错的，一个反例便是a=7, b=3时，a[49]=5≠a[1]。 但这个算法蕴含了解此题的重要思想（参考5楼），楼主可以再想想。

这种问题用矩阵快速幂算法

引用 4 楼 qq_36496856 的回复:[quote=引用 3 楼 user-7的回复:][quote=引用 2 楼 qq_36496856 的回复:] [quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间[/quote] 谢谢，我懂了。。。。。。[/quote] 真的懂了吗？ 为什么只循环48次？ 最后为什么输出arr[n%48]？ 这才是关键。

引用 3 楼 user-7的回复:[quote=引用 2 楼 qq_36496856 的回复:] [quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间[/quote] 谢谢，我懂了。。。。。。

引用 2 楼 qq_36496856 的回复:[quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间

引用 1 楼 user-7 的回复:有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码：[code=csharp #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }][/code]

有种东西叫时间复杂度


Question: 字符指针、字符数组与字符串的使用的问题

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


Question: C语言 多个字符串排序的问题

排序＝比较＋交换

引用 2 楼 coding_hello 的回复:实现的就是个冒泡排序算法， 理解清楚这里用到的数据结构。 pProverbs 是字符串数组， pLengths 是字符串数组对应的每个字符串的长度，避免按长度排序时要重复计算长度的开销。 冒泡算法进行比较时发现要调整位置，就要调整pProverbs里面的字符串内容本身的位置，以及对应的长度在pLengths中的位置。 为什么要调整pProverbs里面的内容呢，比如我输入3条字符串，直接用pLengths比较三个的长度就可以排序了啊？您能深入一点嘛

这个程序是完成如下功能：  输入任意个谚语，并将它们存储到执行期间分配的内存中，然后将它们以字长顺序由短到长进行输出。

for (size_t i = 0; i < count-2; ++i)     {         for (size_t j = i+1; j < count-1; ++j)         {             if (*(pLengths+i)>*(pLengths+j))             {                 // Swap the proverb pointers                 pstr = *(pProverbs + i);                 *(pProverbs + i) = *(pProverbs + j);                 *(pProverbs + j) = pstr;                   // Swap corresponding lengths                 length = *(pLengths + i);                 *(pLengths + i) = *(pLengths + j);                 *(pLengths + j) = length;             }         }     }  这个循环不是在遍历二维数组，而是冒泡排序，需要两层循环，具体原理可去网上搜索冒泡排序


Question: c语言static关键字与关于多个.c文件编译问题

引用 6 楼 marco_0631 的回复:[quote=引用 3 楼 paschen 的回复:] .c文件不是用来包含的，需要添加到项目参与编译  static函数只能在该文件中使用，其他文件中可以定义相同名字函数，不会发生冲突  你把static函数放在.c文件里定义  谢谢。我不太清楚c的工作原理，楼上的兄弟说了#include "test1.c"相当于把两个c文件合并在了一起。所以第一种方式相当于把所有内容写在一起所以static看上去不起效果，第二种方式就是相反。还有，static关键字真正起作用的原理是因为编译最后一步链接的时候做的内存限制吗？ 怎么限制的？[/quote]  .c文件加入工程是作为一个编译单元，如果拿去包含，效果就与.h文件相同，只是添加到其他编译单元参与编译  参看：《程序员的自我修养——链接、装载与库》

引用 3 楼 paschen 的回复:.c文件不是用来包含的，需要添加到项目参与编译  static函数只能在该文件中使用，其他文件中可以定义相同名字函数，不会发生冲突  你把static函数放在.c文件里定义  谢谢。我不太清楚c的工作原理，楼上的兄弟说了#include "test1.c"相当于把两个c文件合并在了一起。所以第一种方式相当于把所有内容写在一起所以static看上去不起效果，第二种方式就是相反。还有，static关键字真正起作用的原理是因为编译最后一步链接的时候做的内存限制吗？ 怎么限制的？

引用 2 楼 pengzhixi 的回复:#include "test1.c" 你看这句吧  好的，谢谢。 不太了解c的工作原理，现在清楚了。

引用 1 楼 shangyu0801 的回复:不应该直接包含C文件的。 include的意思是把文件内容直接更当前文件合并！！也就是说，你include了之后其实相当于在一个文件里，static是起作用的。不用怀疑。   按照这个思路在理理看吧。  谢谢。我知道了，也就是第一种include通过gcc编译仅仅相当于一个文件编译成目标文件再和系统库链接成可执行文件。 第二种则是test.o test1.o两个目标文件和系统库文件链接。

#include "test1.c" 你看这句吧


Question: 用strcmp()比较一个数组字符串与 一个常量字符串

scanf("%s",&str_md);  去掉 &  strncpy(str_m, str_md,2);  为什么是 2 ，至少 3 才能正常啊。  或者不用 strcmp ，用 strncmp 。

在strncpy(str_m, str_md,2)一句前，加上一句， memset(str_m,'\0',sizeof(str_m)); 清空一下数组缓存。


Question: 计算幂

想问啥呢

可以直接用函数pow(double x,double y)，表示x的y次方，头文件为math.h。

没问题啊，你要问什么


Question: 关于二叉树创建问题

LeftChild 改为：   struct BiTNode* LeftChild(struct BiTNode *t,struct BiTNode *e) { 	if(t){ 		if((t->rchild == e->rchild) && (t->parent == e->parent) && (t->data == e->data)) 		{ 			return t->lchild; 		}else{ 			if(LeftChild(t->lchild,e) != NULL){ 				return LeftChild(t->lchild,e); 			}else{ 				return LeftChild(t->rchild,e); 			} 		} 	} 	return NULL; }

然后我这要把parent改没 就运行成功了

Assign没有起作用 然后LeftChild出错

仅供参考：#include <iostream> #include <stack> #include <queue> #include <locale.h> using namespace std; typedef struct BiTNode {//二叉树结点     char data;                      //数据     struct BiTNode *lchild,*rchild; //左右孩子指针 } BiTNode,*BiTree; int CreateBiTree(BiTree &T) {//按先序序列创建二叉树     char data;     scanf("%c",&data);//按先序次序输入二叉树中结点的值（一个字符），‘#’表示空树     if (data == '#') {         T = NULL;     } else {         T = (BiTree)malloc(sizeof(BiTNode));         T->data = data;         //生成根结点         CreateBiTree(T->lchild);//构造左子树         CreateBiTree(T->rchild);//构造右子树     }     return 0; } void Visit(BiTree T) {//输出     if (T->data != '#') {         printf("%c ",T->data);     } } void PreOrder(BiTree T) {//先序遍历     if (T != NULL) {         Visit(T);               //访问根节点         PreOrder(T->lchild);    //访问左子结点         PreOrder(T->rchild);    //访问右子结点     } } void InOrder(BiTree T) {//中序遍历     if (T != NULL) {         InOrder(T->lchild);     //访问左子结点         Visit(T);               //访问根节点         InOrder(T->rchild);     //访问右子结点     } } void PostOrder(BiTree T) {//后序遍历     if (T != NULL) {         PostOrder(T->lchild);   //访问左子结点         PostOrder(T->rchild);   //访问右子结点         Visit(T);               //访问根节点     } } void PreOrder2(BiTree T) {//先序遍历(非递归) //访问T->data后，将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，再先序遍历T的右子树。     stack<BiTree> stack;     BiTree p = T;//p是遍历指针     while (p || !stack.empty()) {   //栈不空或者p不空时循环         if (p != NULL) {             stack.push(p);          //存入栈中             printf("%c ",p->data);  //访问根节点             p = p->lchild;          //遍历左子树         } else {             p = stack.top();        //退栈             stack.pop();             p = p->rchild;          //访问右子树         }     } } void InOrder2(BiTree T) {//中序遍历(非递归) //T是要遍历树的根指针，中序遍历要求在遍历完左子树后，访问根，再遍历右子树。 //先将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，访问T->data，再中序遍历T的右子树。     stack<BiTree> stack;     BiTree p = T;//p是遍历指针     while (p || !stack.empty()) {   //栈不空或者p不空时循环         if (p != NULL) {             stack.push(p);          //存入栈中             p = p->lchild;          //遍历左子树         } else {             p = stack.top();        //退栈，访问根节点             printf("%c ",p->data);             stack.pop();             p = p->rchild;          //访问右子树         }     } }  typedef struct BiTNodePost{     BiTree biTree;     char tag; } BiTNodePost,*BiTreePost; void PostOrder2(BiTree T) {//后序遍历(非递归)     stack<BiTreePost> stack;     BiTree p = T;//p是遍历指针     BiTreePost BT;     while (p != NULL || !stack.empty()) {//栈不空或者p不空时循环         while (p != NULL) {//遍历左子树             BT = (BiTreePost)malloc(sizeof(BiTNodePost));             BT->biTree = p;             BT->tag = 'L';//访问过左子树             stack.push(BT);             p = p->lchild;         }         while (!stack.empty() && (stack.top())->tag == 'R') {//左右子树访问完毕访问根节点             BT = stack.top();             stack.pop();//退栈             printf("%c ",BT->biTree->data);         }         if (!stack.empty()) {//遍历右子树             BT = stack.top();             BT->tag = 'R';//访问过右子树             p = BT->biTree;             p = p->rchild;         }     } }  void LevelOrder(BiTree T) {//层次遍历     if (T == NULL) return;     BiTree p = T;     queue<BiTree> queue;//队列     queue.push(p);//根节点入队     while (!queue.empty()) {    //队列不空循环         p = queue.front();      //对头元素出队         printf("%c ",p->data);  //访问p指向的结点         queue.pop();            //退出队列         if (p->lchild != NULL) {//左子树不空，将左子树入队             queue.push(p->lchild);         }         if (p->rchild != NULL) {//右子树不空，将右子树入队             queue.push(p->rchild);         }     } } int main() {     BiTree T;      setlocale(LC_ALL,"chs");     CreateBiTree(T);      printf("先序遍历        ：");PreOrder  (T);printf("\n");     printf("先序遍历(非递归)：");PreOrder2 (T);printf("\n");                                                printf("\n");     printf("中序遍历        ：");InOrder   (T);printf("\n");     printf("中序遍历(非递归)：");InOrder2  (T);printf("\n");                                                printf("\n");     printf("后序遍历        ：");PostOrder (T);printf("\n");     printf("后序遍历(非递归)：");PostOrder2(T);printf("\n");                                                printf("\n");     printf("层次遍历        ：");LevelOrder(T);printf("\n");      return 0; } //ABC##DE#G##F### //先序遍历        ：A B C D E G F //先序遍历(非递归)：A B C D E G F // //中序遍历        ：C B E G D F A //中序遍历(非递归)：C B E G D F A // //后序遍历        ：C G E F D B A //后序遍历(非递归)：C G E F D B A // //层次遍历        ：A B C D E F G //  ///       A ///      / ///     B ///    / \ ///   C   D ///      / \ ///     E   F ///      \ ///       G

嗯，然后呢？相关说明呢？


Question: 数据结构算数表达式有“（）”的时候值就为-858993460

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

仅供参考：/*--------------------------------------- 函数型计算器(VC++6.0,Win32 Console) 功能： 目前提供了10多个常用数学函数:     ⑴正弦sin     ⑵余弦cos     ⑶正切tan     ⑷开平方sqrt     ⑸反正弦arcsin     ⑹反余弦arccos     ⑺反正切arctan     ⑻常用对数lg     ⑼自然对数ln     ⑽ｅ指数exp     ⑾乘幂函数^     ⑿向上取整ceil     ⒀向下取整floor     ⒁四舍五入取整round 用法： 如果要求2的32次幂，可以打入2^32<回车> 如果要求30度角的正切可键入tan(Pi/6)<回车> 注意不能打入：tan(30)<Enter> 如果要求1.23弧度的正弦，有几种方法都有效： sin(1.23)<Enter> sin 1.23 <Enter> sin1.23  <Enter> 如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter> 此外两函数表达式连在一起,自动理解为相乘如：sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77) 当然你还可以依据三角变换，再用sin(1.23+0.77)也即sin2验证一下。 本计算器充分考虑了运算符的优先级因此诸如：2+3*4^2 实际上相当于：2+(3*(4*4)) 另外函数名前面如果是数字,那么自动认为二者相乘. 同理，如果某数的右侧是左括号，则自动认为该数与括弧项之间隐含一乘号。 如：3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1) 又如：4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5) 此外，本计算器提供了圆周率 Pi键入字母时不区分大小写,以方便使用。 ----------------------------------------*/ #include <iostream> #include <iomanip> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <stdio.h> #include <string.h> #include <windows.h> using namespace std; const char Tab=0x9; const int  DIGIT=1; const int MAXLEN=16384; char s[MAXLEN],*endss; int pcs=15; double round(double dVal, short iPlaces) {//iPlaces>=0     char s[30];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); } double fun(double x,char op[],int *iop) {     while (op[*iop-1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>         switch (op[*iop-1]) {         case  7: x=sin(x);    (*iop)--;break;         case  8: x=cos(x);    (*iop)--;break;         case  9: x=tan(x);    (*iop)--;break;         case 10: x=sqrt(x);   (*iop)--;break;         case 11: x=asin(x);   (*iop)--;break;         case 12: x=acos(x);   (*iop)--;break;         case 13: x=atan(x);   (*iop)--;break;         case 14: x=log10(x);  (*iop)--;break;         case 15: x=log(x);    (*iop)--;break;         case 16: x=exp(x);    (*iop)--;break;         case 17: x=ceil(x);   (*iop)--;break;         case 18: x=floor(x);  (*iop)--;break;         case 19: x=round(x,0);(*iop)--;break;         }     return x; } double calc(char *expr,char **addr) {     static int deep; //递归深度     static char *fname[]={"sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp","ceil","floor","round",NULL};     double ST[10]={0.0}; //数字栈     char op[10]={'+'}; //运算符栈     char c,*rexp,*pp,*pf;     int ist=1,iop=1,last,i;      if (!deep) {         pp=pf=expr;         do {             c = *pp++;             if (c!=' '&& c!=Tab)                 *pf++ = c;         } while (c!='\0');     }     pp=expr;     if ((c=*pp)=='-'||c=='+') {         op[0] = c;         pp++;     }     last = !DIGIT;     while ((c=*pp)!='\0') {         if (c=='(') {//左圆括弧             deep++;             ST[ist++]=calc(++pp,addr);             deep--;             ST[ist-1]=fun(ST[ist-1],op,&iop);             pp = *addr;             last = DIGIT;             if (*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2)) {//目的是：当右圆括弧的右恻为左圆括弧或函数名字时，默认其为乘法                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }         else if (c==')') {//右圆括弧             pp++;             break;         } else if (isalpha(c)) {             if (!strnicmp(pp,"Pi",2)) {                 if (last==DIGIT) {                     cout<< "π左侧遇）" <<endl;exit(1);                 }                 ST[ist++]=3.14159265358979323846264338328;                 ST[ist-1]=fun(ST[ist-1],op,&iop);                 pp += 2;                 last = DIGIT;                 if (!strnicmp(pp,"Pi",2)) {                     cout<< "两个π相连" <<endl;exit(2);                 }                 if (*pp=='(') {                     cout<< "π右侧遇（" <<endl;exit(3);                 }             } else {                 for (i=0; (pf=fname[i])!=NULL; i++)                     if (!strnicmp(pp,pf,strlen(pf))) break;                 if (pf!=NULL) {                     op[iop++] = 07+i;                     pp += strlen(pf);                 } else {                     cout<< "陌生函数名" <<endl;exit(4);                 }             }         } else if (c=='+'||c=='-'||c=='*'||c=='/'||c=='%'||c=='^') {             char cc;             if (last != DIGIT) {                 cout<< "运算符粘连" <<endl;exit(5);             }             pp++;             if (c=='+'||c=='-') {                 do {                     cc = op[--iop];                     --ist;                     switch (cc) {                     case '+':  ST[ist-1] += ST[ist];break;                     case '-':  ST[ist-1] -= ST[ist];break;                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 } while (iop);                 op[iop++] = c;             } else if (c=='*'||c=='/'||c=='%') { operate:        cc = op[iop-1];                 if (cc=='+'||cc=='-') {                     op[iop++] = c;                 } else {                     --ist;                     op[iop-1] = c;                     switch (cc) {                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 }             } else {                 cc = op[iop-1];                 if (cc=='^') {                     cout<< "乘幂符连用" <<endl;exit(6);                 }                 op[iop++] = c;             }             last = !DIGIT;         } else {             if (last == DIGIT) {                 cout<< "两数字粘连" <<endl;exit(7);             }             ST[ist++]=strtod(pp,&rexp);             ST[ist-1]=fun(ST[ist-1],op,&iop);             if (pp == rexp) {                 cout<< "非法字符" <<endl;exit(8);             }             pp = rexp;             last = DIGIT;             if (*pp == '('||isalpha(*pp)) {                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }     }     *addr=pp;     if (iop>=ist) {         cout<< "表达式有误" <<endl;exit(9);     }     while (iop) {         --ist;         switch (op[--iop]) {         case '+':  ST[ist-1] += ST[ist];break;         case '-':  ST[ist-1] -= ST[ist];break;         case '*':  ST[ist-1] *= ST[ist];break;         case '/':  ST[ist-1] /= ST[ist];break;         case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;         case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;         }     }     return ST[0]; } int main(int argc,char **argv) {     int a;      if (argc<2) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算函数表达式的值。"<<endl<<"支持(),+,-,*,/,%,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round"<<endl;         while (1) {             cout << "请输入表达式：";             gets(s);             if (s[0]==0) break;//             cout << s <<"=";             cout << setprecision(15) << calc(s,&endss) << endl;         }     } else if (argc==2 && 0==strcmp(argv[1],"/?")) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算由≥1个命令行参数给出的函数表达式的值。最后一个参数是.0～.15表示将计算结果保留小数0～15位"<<endl<<"支持(),+,-,*,/,%,^^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round"<<endl;     } else {         strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;         if (argc>2) {             for (a=2;a<argc-1;a++) strncat(s,argv[a],MAXLEN-1);//将空格间隔的各参数连接到s             if (1==sscanf(argv[a],".%d",&pcs) && 0<=pcs && pcs<=15) {//最后一个参数是.0～.15表示将计算结果保留小数0～15位                 printf("%.*lf\n",pcs,calc(s,&endss));             } else {                 strncat(s,argv[a],MAXLEN-1);                 printf("%.15lg\n",calc(s,&endss));             }         } else {             printf("%.15lg\n",calc(s,&endss));         }     }     return 0; }

懒得解析了，直接上lua


Question: 怎样用C语言实现删除一个文件中的重复的字符窜

引用 2 楼 wuhanlucsdn 的回复:是的,但是后面生成的文件里面有很多相同的内容,不知道怎么把重复的内容删掉? 你要是用纯C语言的话，在原来那个程序基础上，得自己创建一个数据结构（链表什么的）把每一个数据行单独摘出来存进这个数据结构，然后遍历这个数据结构，把相同的只生成一次写入到文本文件中。 具体的代码还要自己组织，我已经把方法告诉你了

是的,但是后面生成的文件里面有很多相同的内容,不知道怎么把重复的内容删掉?

我记得你这个问题不是在另一个帖子里面写过代码给你吗？

@赵4老师 可以用,代码看起来好复杂啊,我得花点时间消化消化

仅供参考：//文件1中的内容排序并去重,结果保存到文件2中 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXCHARS 128      //能处理的最大行宽,包括行尾的\n和字符串尾的\0 int MAXLINES=10000,MAXLINES2; char *buf,*buf2; int c,n,hh,i,L; FILE *f; char ln[MAXCHARS]; int ignore_case=0; int icompare(const void *arg1,const void *arg2) {    return stricmp((char *)arg1,(char *)arg2); } int compare(const void *arg1,const void *arg2) {    return strcmp((char *)arg1,(char *)arg2); } int main(int argc,char **argv) {     if (argc<3) {         printf("Unique line. Designed by zhao4zhong1@163.com. 2012-08-20\n");         printf("Usage: %s src.txt uniqued.txt [-i]\n",argv[0]);         return 1;     }     if (argc>3) ignore_case=1;//若存在命令行参数3，忽略大小写     f=fopen(argv[1],"r");     if (NULL==f) {         printf("Can not find file %s!\n",argv[1]);         return 1;     }     buf=(char *)malloc(MAXLINES*MAXCHARS);     if (NULL==buf) {         fclose(f);         printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);         return 2;     }     n=0;     hh=0;     i=0;     while (1) {         if (NULL==fgets(ln,MAXCHARS,f)) break;//         hh++;         L=strlen(ln)-1;         if ('\n'!=ln[L]) {//超长行忽略后面内容             printf("%s Line %d too long(>%d),spilth ignored.\n",argv[1],hh,MAXCHARS);             while (1) {                 c=fgetc(f);                 if ('\n'==c || EOF==c) break;//             }         }         while (1) {//去掉行尾的'\n'和空格             if ('\n'==ln[L] || ' '==ln[L]) {                 ln[L]=0;                 L--;                 if (L<0) break;//             } else break;//         }         if (L>=0) {             strcpy(buf+i,ln);i+=MAXCHARS;             n++;             if (n>=MAXLINES) {                 MAXLINES2=MAXLINES*2;                 if (MAXLINES2==1280000) MAXLINES2=2500000;                 buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);                 if (NULL==buf2) {                     printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);                     printf("WARNING: Lines >%d ignored.\n",MAXLINES);                     break;//                 }                 buf=buf2;                 MAXLINES=MAXLINES2;             }         }     }     fclose(f);     if (n>1) {         if (ignore_case) qsort(buf,n,MAXCHARS,icompare);         else qsort(buf,n,MAXCHARS,compare);     }     f=fopen(argv[2],"w");     if (NULL==f) {         free(buf);         printf("Can not create file %s!\n",argv[2]);         return 2;     }     fprintf(f,"%s\n",buf);     if (n>1) {         if (ignore_case) {             hh=0;             L=MAXCHARS;             for (i=1;i<n;i++) {                 if (stricmp((const char *)buf+hh,(const char *)buf+L)) {                     fprintf(f,"%s\n",buf+L);                 }                 hh=L;                 L+=MAXCHARS;             }         } else {             hh=0;             L=MAXCHARS;             for (i=1;i<n;i++) {                 if ( strcmp((const char *)buf+hh,(const char *)buf+L)) {                     fprintf(f,"%s\n",buf+L);                 }                 hh=L;                 L+=MAXCHARS;             }         }     }     fclose(f);     free(buf);     return 0; }


Question: 杭电 wrong answer 错误，求大神解答（无向图的邻接矩阵深度优先遍历算法）

《算法精解（C语言描述）》


Question: x86 linux 反汇编问题

我本来也不太懂汇编的，经过与楼主的讨论，加上自己的研究，下面是我的理解： 每个函数开头都会有这几句 pushq   %rbp 上面这句的目的是因为下面这句要使用bp,所以先保存一下 movq    %rsp, %rbp 上面这句是保存sp到bp中，由于push操作会改变sp, 所以保存sp只能用move语句 保存sp的目的是函数中的局部变量都保存在栈上，有新的变量定义sp的值就会改变， sp的原始值保存在bp中，这样函数结束时释放线变量只需令sp = bp即可。 subq    $16, %rsp 然而为了效率，并不是定义几个变量就对sp减几次，而是一次性分配一定空间。 改变sp的目的是为了让里层的函数以最新的sp为基址，所以最里层的函数就不需要改变sp了.  还有一点蛮奇怪的，函数开头有保存bp, sp函数结束时没有还原。 只有最里层函数用pop bp, 但貌似bp根本没变。 我猜测可能调用函数在父函数的最后一句，所以就不需要了

引用 11 楼 ipqtjmqj 的回复:[quote=引用 9 楼 shangyu0801 的回复:] [quote=引用 7 楼 ipqtjmqj 的回复:] 这毕竟是机器产生的，不完美，我仔细看了下，sp寄存器从头到尾都没啥用  sp是栈顶指针，所有的pop和push都是依赖这个的。 我就是看不懂这个逻辑，什么时候给add_x里的局部变量和形参分配的空间。。。咋上来就用bp指针取这些变量了～[/quote] 哦，这样就很好解释了，因为add_X函数里面有pop语句，所以sp不能变[/quote]  我觉得这个不是原因而是结果，因为bsp没有变化(sp == bp)，所以才能用直接用pop bp，否则应该先执行sp = bp.然后在pop bp

引用 5 楼 ipqtjmqj 的回复:疑问三：因为是最里层的函数了 引用 10 楼 pengzhixi 的回复:看了下 即使在add_X 里面return data也不会使用rsp分配空间。  good结合engzhixi的分析应该是这个原因了。因为是最底层，是不用修改esp的，因为不用记录当前的堆栈使用情况，返回该函数退出时直接拿到ebp就OK。 我在add_X里再调用一个函数，就发现有sub xx,%rsp的操作了。  值得一提的是，在vs下，一直都是有sub xx,%rsp的操作的。。

引用 9 楼 shangyu0801 的回复:[quote=引用 7 楼 ipqtjmqj 的回复:] 这毕竟是机器产生的，不完美，我仔细看了下，sp寄存器从头到尾都没啥用  sp是栈顶指针，所有的pop和push都是依赖这个的。 我就是看不懂这个逻辑，什么时候给add_x里的局部变量和形参分配的空间。。。咋上来就用bp指针取这些变量了～[/quote] 哦，这样就很好解释了，因为add_X函数里面有pop语句，所以sp不能变

看了下 即使在add_X 里面return data也不会使用rsp分配空间。

引用 7 楼 ipqtjmqj 的回复:这毕竟是机器产生的，不完美，我仔细看了下，sp寄存器从头到尾都没啥用  sp是栈顶指针，所有的pop和push都是依赖这个的。 我就是看不懂这个逻辑，什么时候给add_x里的局部变量和形参分配的空间。。。咋上来就用bp指针取这些变量了～

引用 6 楼 shangyu0801 的回复:[quote=引用 3 楼 shangyu0801 的回复:] 而且，如果是调用前分配的，那么在call_x里通过bp调用时，肯定是正偏移，而不应该是负的偏移呀。  说错了，我的意思是在add_x里，取值的时候，应该是         movq    %rax, 32(%rbp)         movq    %rdx, -24(%rbp)  引用 5 楼 ipqtjmqj 的回复:疑问三：因为是最里层的函数了 没理解呀！与非里层的函数有什么区别么？[/quote]经楼主提醒 又去看了下，觉得应该是编译器做的优化。没有对rsp做修改，而是直接用rbp来为add_X(struct data_st data)这个参数分配空间，能想到的一个好处就是不用对rsp做进一步的恢复。因为你传递的不是指针，函数调用返回 这个参数所在的空间就不可用。所以优化一下不用rsp分配空间，直接用rhp 减去某个值来使用栈。 返回的时候又不用恢复rsp。还挺好

这毕竟是机器产生的，不完美，我仔细看了下，sp寄存器从头到尾都没啥用

引用 3 楼 shangyu0801 的回复:而且，如果是调用前分配的，那么在call_x里通过bp调用时，肯定是正偏移，而不应该是负的偏移呀。  说错了，我的意思是在add_x里，取值的时候，应该是         movq    %rax, 32(%rbp)         movq    %rdx, -24(%rbp)  引用 5 楼 ipqtjmqj 的回复:疑问三：因为是最里层的函数了 没理解呀！与非里层的函数有什么区别么？

疑问三：因为是最里层的函数了

没准默认被优化了。 http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

引用 1 楼 pengzhixi 的回复:subq    $16, %rsp      #疑问1，这里为啥要减去16 ？而不是 4？ a的size是4呀？ 这个再debug模式下不一定是4，但是这个 不重要 你只需要看movl    $0, -4(%rbp)这个对a进行赋值的时候没有取错就好了。我个人猜测只是出于对齐的考虑。这个和疑问二可以算是同一个问题。  #疑问三，这里咋没有sub ？ 直接就那bp进行取数据了?  这个参数的空间是调用的时候有调用函数分配了。具体你可以调用下add_x就知道了  感谢!! add_x已经在call_x里被调用了。call_x里并没有分配的地方啊？


Question: 大神帮忙看看，获取字母数与名字尾对其，为什么使用strlen(fname)和strlen(name)两次

printf("%*d", i, number); 在这里：%*d告诉printf函数将要使用是一个可变的字段宽度， 该字段宽度由第一个参数指定，即用i代替*。

man 3 printf       |     |     \/  The  arguments must correspond properly (after type promotion) with the        conversion specifier.  By default, the arguments are used in the  order        given,  where  each '*' and each conversion specifier asks for the next        argument (and it is an  error  if  insufficiently  many  arguments  are        given).   One  can  also specify explicitly which argument is taken, at        each place where an argument is required, by writing "%m$"  instead  of        '%'  and  "*m$" instead of '*', where the decimal integer m denotes the        position in the argument list of the desired argument, indexed starting        from 1.  Thus,             printf("%*d", width, num);         and             printf("%2$*1$d", width, num);         are  equivalent.   The  second  style allows repeated references to the        same argument.  The C99 standard does not include the style using  '$',        which comes from the Single UNIX Specification.  If the style using '$'        is used, it must be used throughout for all conversions taking an argu‐        ment  and  all  width and precision arguments, but it may be mixed with        "%%" formats which do not consume an argument.  There may be no gaps in        the numbers of arguments specified using '$'; for example, if arguments        1 and 3 are specified, argument 2 must also be specified  somewhere  in        the format string.

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

printf Width Specification The second optional field of the format specification is the width specification. The width argument is a nonnegative decimal integer controlling the minimum number of characters printed. If the number of characters in the output value is less than the specified width, blanks are added to the left or the right of the values — depending on whether the – flag (for left alignment) is specified — until the minimum width is reached. If width is prefixed with 0, zeros are added until the minimum width is reached (not useful for left-aligned numbers).  The width specification never causes a value to be truncated. If the number of characters in the output value is greater than the specified width, or if width is not given, all characters of the value are printed (subject to the precision specification).  If the width specification is an asterisk (*), an int argument from the argument list supplies the value. The width argument must precede the value being formatted in the argument list. A nonexistent or small field width does not cause the truncation of a field; if the result of a conversion is wider than the field width, the field expands to contain the conversion result.

%-*d告诉printf函数将要使用是一个可变的字段宽度，后面需要根两个参数，第一个是宽度，第二个是你的数值

后面要和前面保持一致，*代表数据的宽度，一般小于或者等于％d的长度，后面的是％d的数据联系，*是一个printf的修饰符。

printf("%*d", 10, 1) 这句话意思是输出最少10位，前面不足的用空格补  相当于长度为10，右对齐 这样理解了吧。。。

题目么有看懂？？？？

"获取字母数与名字尾对齐”  这句话不理解啊。。。


Question: c语言 判断子字符串是否等于常量字符串

用strcmp以后，又有新问题： char str_m[2]; const char* pstr = "123-456"; if (strcmp(str_m,"12")==0)  条件仍然不能满足。  可能因为参数str_m类型是指针，而参数"12"的类型是常量字符串.。 一个数组，一个是常量字符串，怎么比较啊？

大家都知道，在C语言中两上字符串是不能直接进行比较的，我们一般使用<string.h>中的字符串比较函数strcmp()来进行两个字符串的比较。那么，为什么不允许两个字符串直接进行比较呢？可做如下解释：  有如下代码： char s1[] = "abc"; char s2[] = "abc";  如果直接进行比较： if (s1 == s2) { printf("s1等于 s2"); } else { printf("s1 不等于s2"); }  大家想想输出结果会是什么呢？   输出结果永远为：s1 不等于 s2.(不论你换成char s1[] = "abc"; char s2[] = "def"; 还是char s1[] = "def"; char s2[] = "abc";,输出结果都一样）。  为什么呢？ 大家因为这样比较，其实是在把s1和s2当作指针来进行比较，而不是比较两个数组中的内容。因为s1和s2在内存中位置肯定不同，所以s1 == s2的值肯定为0，所以出现上面的结果也就是理所当然了。 这个应该可以追溯到C语言中 数组（字符串也可认为是数组）的访问机制

字符串不能用==比较，否则只是比较两个指针值是否相等  比较字符串需要用strcmp比较，返回0表示相等  if (strcmp(str_m,"12")==0)     ///相等

str_m 是个地址，批向一个数组，“12”是一个常量字符串地址，这个里面存了12和\0,所以 (str_m=="12"）比的一个指向栈内存的地址和一个指向常量的地址，不可能相等的，对于数组、字符这样的，直接看到的是指针，比字符串应该用2L的方法。

字符串在c语言中不能直接比较 需要把 if (str_m=="12")  printf("%s",str_m);system("pause"); 改为 if (0 == strcmp(str_m, "12"))  printf("%s",str_m);system("pause");

C语言应该没有字符串对象  只能用strcmp


Question: 变长数组的问题

把这句int magic_square[n][n];移到scanf("%d", &n);后面 否则你的magic_square的大小已经被固定下来了是0x0的一个二维数组。  #include <stdio.h> #include <stdlib.h>  int main() { 	int i, j, k, n = 0, a = 0, b = 0; 	 	printf("Enter size of magic square: "); 	scanf("%d", &n); 	int magic_square[n][n]; 	for (j = 0, i = 1, k = n / 2; i <= n*n; i++) 	{ 		if (j < 0) j += n; 		if (k == n) k = 0; 		if (magic_square[j][k] != 0) 		{ 			j = a + 2; k = b - 1; 		} 		magic_square[j][k] = i; 		--j; ++k; a = j; b = k; 	} 	printf("\n"); 	for (i = 0; i < n; i++) 	{ 		for (j = 0; j < n; j++) 		{ 			if (j == n - 1)printf("%4d\n", magic_square[i][j]); 			else printf("%4d", magic_square[i][j]); 		} 	}  	return 0; }


Question: 求助keil C中，我接收两个uchar，想把两个uchar中间加个小数点，再把这两个数和小数点组成字符串的形式

谢谢！！！！！！

用strcat把三个字符拼成一个字符串

为字符串分配内存，然后复制第一个uchar到第0个字符，复制'.'到第1个字符，复制第2个uchar到第2个字符，复制'\0'到第3个字符

小白求助呀！！！


Question: c primer plus 这里是不是有个错误啊？

char side_a[] = 'SIDE A' ; 这种用法是错的  应该是char side_a[] = "SIDE A'";  放在双引号里  此时side_a是字符串，SIDE A是字符串的内容

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

这种问题你自己瞧一瞧代码就知道了，我测试结果是编译错误 http://coliru.stacked-crooked.com/a/1803b04c5e496e93


Question: c语言do wile 循环条件用int 变量

通过了，最后少了括号，应为： while ( i);

建议楼主重新表述下问题。 或者自己单步调试。 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

什么叫做调试没有通过？是你看到i被赋值为0，但是循环没有结束吗？