Question: 神奇的sprintf格式

仅供参考：#include <conio.h> #include <math.h> #include <stdio.h> #include <string.h> FILE *f; int i,n,line,st; int n1,n2,n3; int b1,b2,b3; int e1,e2,e3; int w1,w2,w3; int v1,v2,v3; char ln[256]; char fmt[256]; char fmd[6]; char tmp[256]; char *s1,*s2,*s3,*s4; char L,R,D; void main(int argc,char *argv[]) {     if (argc<2) {     PMT:         printf("%s filename.ext [ParenthesesChar] [DelimiterChar]\nParenthesesChar is '(' default or '[' or '{'\nDelimiterChar is ',' default",argv[0]);         return;     }     if (argc==2) {         L='(';R=')';D=',';     } else {         switch (argv[2][0]) {             case '(':L='(';R=')';break;             case '[':L='[';R=']';break;             case '{':L='{';R='}';break;             default:goto PMT;         }         D=',';         if (argc>=4) D=argv[3][0];     }     sprintf(fmd,"%%d%c%%d",D);     if ((f=fopen(argv[1],"rt"))==NULL) {         printf("Can not open %s",argv[1]);         return;     }     line=0;     while (1) {         fgets(ln,255,f);         if (feof(f)) break;//         line++;         n=0;st=0;         for (i=0;i<(int)strlen(ln);i++) {             switch (st) {             case 0:if (ln[i]==L) st=1;break;             case 1:if (ln[i]==D) st=2;break;             case 2:if (ln[i]==R) {st=0;n++;} break;             }         }         switch (n) {             case 0:                 printf("%s",ln);             break;             case 1:                 s1=strchr(ln,L);                 s2=strchr(s1,R);                 if (s2==NULL) {                     cprintf("\a\a\a missing %c in line %d",R,line);                     fclose(f);                     return;                 }                 s1[0]=0;                 s1++;                 s2++;                 v1=sscanf(s1,fmd,&b1,&e1);                 if (v1==2) {                     w1=1+(int)log10((double)e1);                     sprintf(fmt,"%%s%%0%1dd%%s",w1);                     for (n1=b1;n1<=e1;n1++) {                         printf(fmt,ln,n1,s2);                     }                 } else if (s1[1]==D) {                     b1=s1[0];                     e1=s1[2];                     for (n1=b1;n1<=e1;n1++) {                         printf("%s%c%s",ln,n1,s2);                     }                 } else {                     printf("%s",ln);                 }             break;             case 2:                 s1=strchr(ln,L);                 s2=strchr(s1,R);                 if (s2==NULL) {                     cprintf("\a\a\a missing %c in line %d",R,line);                     fclose(f);                     return;                 }                 s1[0]=0;                 s1++;                 s2++;                 v1=sscanf(s1,fmd,&b1,&e1);                 if (v1==2) {                     w1=1+(int)log10((double)e1);                 } else {                     b1=s1[0];                     e1=s1[2];                 }                  s1=strchr(s2,L);                 s3=strchr(s1,R);                 if (s3==NULL) {                     cprintf("\a\a\a missing %c in line %d",R,line);                     fclose(f);                     return;                 }                 s1[0]=0;                 s1++;                 s3++;                 v2=sscanf(s1,fmd,&b2,&e2);                 if (v2==2) {                     w2=1+(int)log10((double)e2);                 } else {                     b2=s1[0];                     e2=s1[2];                 }                  strcpy(fmt,"%s");                 if (v1==2) sprintf(tmp,"%%0%1dd",w1);                 else strcpy(tmp,"%c");                 strcat(fmt,tmp);                 strcat(fmt,"%s");                 if (v2==2) sprintf(tmp,"%%0%1dd",w2);                 else strcpy(tmp,"%c");                 strcat(fmt,tmp);                 strcat(fmt,"%s");                 for (n1=b1;n1<=e1;n1++) {                     for (n2=b2;n2<=e2;n2++) {                         printf(fmt,ln,n1,s2,n2,s3);                     }                 }             break;             case 3:                 s1=strchr(ln,L);                 s2=strchr(s1,R);                 if (s2==NULL) {                     cprintf("\a\a\a missing %c in line %d",R,line);                     fclose(f);                     return;                 }                 s1[0]=0;                 s1++;                 s2++;                 v1=sscanf(s1,fmd,&b1,&e1);                 if (v1==2) {                     w1=1+(int)log10((double)e1);                 } else {                     b1=s1[0];                     e1=s1[2];                 }                  s1=strchr(s2,L);                 s3=strchr(s1,R);                 if (s3==NULL) {                     cprintf("\a\a\a missing %c in line %d",R,line);                     fclose(f);                     return;                 }                 s1[0]=0;                 s1++;                 s3++;                 v2=sscanf(s1,fmd,&b2,&e2);                 if (v2==2) {                     w2=1+(int)log10((double)e2);                 } else {                     b2=s1[0];                     e2=s1[2];                 }                  s1=strchr(s3,L);                 s4=strchr(s1,R);                 if (s4==NULL) {                     cprintf("\a\a\a missing %c in line %d",R,line);                     fclose(f);                     return;                 }                 s1[0]=0;                 s1++;                 s4++;                 v3=sscanf(s1,fmd,&b3,&e3);                 if (v3==2) {                     w3=1+(int)log10((double)e3);                 } else {                     b3=s1[0];                     e3=s1[2];                 }                  sprintf(fmt,"%%s%%0%1dd%%s%%0%1dd%%s%%0%1dd%%s",w1,w2,w3);                 strcpy(fmt,"%s");                 if (v1==2) sprintf(tmp,"%%0%1dd",w1);                 else strcpy(tmp,"%c");                 strcat(fmt,tmp);                 strcat(fmt,"%s");                 if (v2==2) sprintf(tmp,"%%0%1dd",w2);                 else strcpy(tmp,"%c");                 strcat(fmt,tmp);                 strcat(fmt,"%s");                 if (v3==2) sprintf(tmp,"%%0%1dd",w3);                 else strcpy(tmp,"%c");                 strcat(fmt,tmp);                 strcat(fmt,"%s");                  for (n1=b1;n1<=e1;n1++) {                     for (n2=b2;n2<=e2;n2++) {                         for (n3=b3;n3<=e3;n3++) {                             printf(fmt,ln,n1,s2,n2,s3,n3,s4);                         }                      }                 }             break;             default:                 cprintf("\a\a\a > 3 repeat in line %d",line);                 fclose(f);                 return;         }     }     fclose(f); }

两个%是作为一个%字符理解，你这个相当于是用level*4替换了最前面的那个 %d

比如，当 level 为2时，fmt 内容成了 "%-8s%s,  get:%p set:%p refresh:%p" 到后来用它当做函数 cwmp_log_debug 的参数，跟 printf 的第一个参数作用差不多


Question: 为什么这个数组占了96个字节？

引用 4 楼 zhao4zhong1 的回复:谁教你的“一个元素一字节”？把他剁了！ 哈哈，我得把自己剁了

谁教你的“一个元素一字节”？把他剁了！

总共2*3*4=24 个元素，每个元素是 int （大小4字节），一共24*4 = 96

int类型占4个字节 24*4=96 你可以试一下sizeof（int）； 这个语句表示int类型在你电脑里占的字节大小

此处的int是4字节的


Question: C语言一维数组和二维数组问题

引用 6 楼 qq1908625082的回复:[quote=引用 3 楼 paschen的回复:]scanf_s还需要一个参数指定缓冲区有多大：   scanf_s("%s",str[i], 6);   或者用scanf 那个我想问下，我我用scanf_s的原因是因为用不了scanf，那么这个缓冲区是怎么回事呀[/quote] 谢谢，我已经自己查到了

引用 3 楼 paschen的回复:scanf_s还需要一个参数指定缓冲区有多大：   scanf_s("%s",str[i], 6);   或者用scanf 那个我想问下，我我用scanf_s的原因是因为用不了scanf，那么这个缓冲区是怎么回事呀

引用 2 楼 弓长羊羽的回复:修改如下：  #include<stdio.h> #include<string.h> void sort(char s[][6], int n);  //第二个参数n是第一维的信息 int main() { 	int i; 	char str[10][6]; 	printf("input 10 strings:\n"); 	for (i = 0; i < 10; i++) 		scanf("%6s", str[i]); 	sort(str, 10); 	printf("now,the sequence is:\n"); 	for (i = 0; i < 10; i++) 		printf("%s\n", str[i]); 	return 0; } void sort(char s[10][6], int n)//这里的第一个维数10，加与不加都是不加的意思。 { 	int i, j; 	//char *p, temp[10]; 	//p = temp; 	char tmp[6]; 	//冒泡排序 	for (i = 1; i < n; i++) 		for (j = 0; j < n - i; j++) 			if (strcmp(s[j], s[j + 1])>0) 			{ 				strcpy(tmp, s[j]); 				strcpy(s[j], s[j + 1]); 				strcpy(s[j + 1], tmp); 			} }  既然是照着书打的，就不应该打错。 你的代码我试过了，确实是这样子的，能不能解释下之前的[+j+1]是什么意思

另外排序算法的实现也是有问题的

c数组本质 http://blog.csdn.net/zhangxiangdavaid/article/details/38111983


Question: 如何使用nRFgo Studio 生成自定义的 UUID？芯片是nRF51822

仅供参考：#pragma comment(lib,"ole32") #include <objbase.h> #include <stdio.h> union U {     GUID            guid;     unsigned char   b[16]; } u; int i; char s[33]; void main() {     if (S_OK!=CoCreateGuid(&u.guid)) return;     for (i=0;i<16;i++) sprintf(s+i*2,"%02x",u.b[i]);     printf("GUID=%s\n",s);//每次结果都不一样 } //GUID=f5a44443aa5fb1479bf6741fa213d33c


Question: string 分配大空间(10K) 问题

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

引用 2 楼 xionggch 的回复:[quote=引用 1 楼 zhangxiangDavaid 的回复:] 你说的是c语言中的char*还有c++中的string类型。 前者，直接动态分配malloc等，即可。 后者，预分配空间不够，会自动分配，不用你管内存大小问题， 只管用就行了。  	string sz; 	sz = szXML + szBuf;  超过一定长度后面的数据会丢失[/quote]   不可能，你怎么看出他丢失了 你存的字符串是否包括'\0'等不可打印字符 如果你是通过输出到控制台查看的话，可能控制台下一次不能显示那么多字符串

不至于吧，string的长度用的是size_t，现在都int64了，区区10K不在话下。 如果字符串中间有0是有可能被string截断的。 具体代码是怎样的？

引用 1 楼 zhangxiangDavaid 的回复:你说的是c语言中的char*还有c++中的string类型。 前者，直接动态分配malloc等，即可。 后者，预分配空间不够，会自动分配，不用你管内存大小问题， 只管用就行了。  	string sz; 	sz = szXML + szBuf;  超过一定长度后面的数据会丢失

不会的，你把不想关的代码先注释了，一步步排查原因

直接用capacity()函数设置10m容量先试试行不行，还丢失的话就说明你的里边有特殊字符吧

引用 4 楼 paschen 的回复:[quote=引用 2 楼 xionggch 的回复:] [quote=引用 1 楼 zhangxiangDavaid 的回复:] 你说的是c语言中的char*还有c++中的string类型。 前者，直接动态分配malloc等，即可。 后者，预分配空间不够，会自动分配，不用你管内存大小问题， 只管用就行了。  	string sz; 	sz = szXML + szBuf;  超过一定长度后面的数据会丢失[/quote]   不可能，你怎么看出他丢失了 你存的字符串是否包括'\0'等不可打印字符 如果你是通过输出到控制台查看的话，可能控制台下一次不能显示那么多字符串[/quote]  Debug跟踪查看的，szXML，szBuf都是string类型


Question: PRO*C执行一段字符串出问题

int IsInNBR(char *sMsisdn,char *sTable) {     int i=0;     char statement[500];     sprintf(statement,"SELECT COUNT(*) INTO :i FROM %s WHERE MSISDN='%s'",sTable,sMsisdn);     printf("statement:[%s]",statement);     EXEC SQL :statement;     //EXEC SQL COMMIT;     return i; }

高手何在，自己顶啊。。。

帖子就这么沉了吗。。。。


Question: 新手求教

在MSDN里面搜： Initialization  An “initializer” is a value or a sequence of values to be assigned to the variable being declared. You can set a variable to an initial value by applying an initializer to the declarator in the variable declaration. The value or values of the initializer are assigned to the variable.   The following sections describe how to initialize variables of scalar, aggregate, and string types. “Scalar types” include all the arithmetic types, plus pointers. “Aggregate types” include arrays, structures, and unions.

C里面有intialize吗？说的清楚一些

如果是object-c可以参考 http://m.blog.csdn.net/article/details?id=5607257

what? 说详细一点


Question: 为什么所有if-else if结构应该由else子句结束，而单个if就可以没有else?

if(n > 0)    return 1; else if(n == 0)    return 0; else if(n < 0)    return -1; 这个为什么编译器会显示错误呢? 这个不是所有的情况都考虑了吗？ 求指点

有else 一定有if或者else if 有else if 一定有 if 不一定有else 有if  不一定就有else if 或者 else

引用 17 楼 zhao4zhong1 的回复:本铁嘴预言：楼主不出十年，一定会遇到一次找了十几天终于找到是因为少些了一个else的bug。 些→写

这种规则应该是一些公司的内部规则，这种规则一般制定出来就是为了预防出现bug 一般这类规则制定前，必然是出过问题在这个事情上 所以，要不要遵守看你自己 如果你所在公司给了你这个规范，那你必须遵守，不然扣钱没商量 如果你所在公司没给你规范，那你可以遵守可以不遵守，毕竟写代码不是打印，多写点没多大影响  语法正确与否和规范问题，是两码事

如果认为else的情况一定不会出现，那么请在那个else分支打个日志，不知道多少人会死在这种一定不出现的情况．

引用 17 楼 zhao4zhong1 的回复:本铁嘴预言：楼主不出十年，一定会遇到一次找了十几天终于找到是因为少些了一个else的bug。应该都会有的

不要被书误导了，估计书上担心你忘了考虑其他情况，但通常如果确实不需要else，那就不用加

至于比较简短的代码，那是没问题的。  如果没有这种编程规范的话， 没有必要每个路径都去处理。  编程规范，往往是集体行为，个人也可以有。 但是如果跟集体的有冲突，往往要遵守集体的。

这只是一种编程规范，如果你所在的公司，有这个规范，那么就遵守好了 至于原因， 主要是怕有的路径，没有处理， 造成结果是不确定的。  其实，如果if else if  有这个要求， 那么最好 if 也同样处理。  这种，有些路径没有处理的情况， 有时候，也是很难查找的。  尤其是   if,  if else if 这种控制结构，很多的代码段中 。

怕你多条件判断，写多了忘记处理默认情况了。只有一个条件的话，不会忘记，但条件写多了就可能忘记。从语法上是没有任何强制规定的，那个只是建议性的规定，不是强制性的。

引用 10 楼 flyrack 的回复:else{}   这是一个空语句  编译器会无视这样的语句  当它不存在   纯粹消耗时间和键盘而已   中国人就是规矩多  所以才会沦为东亚病夫  这都能扯到一起

引用 2 楼 HeBanBei 的回复:[quote=引用 1 楼 zhangxiangDavaid 的回复:] 也可以：  if else if else if //而没有else   嗯，语法上是可以的。可以编译通过。 但是一楼中还是建议不要这样写。我就不太清楚它的想法。[/quote] 都不满足if条件的情况。。。。怎么进行处理 看需求。需要不需要最后的else。

引用 4 楼 flyrack 的回复:[quote=引用 2 楼 HeBanBei 的回复:] [quote=引用 1 楼 zhangxiangDavaid 的回复:]  if else if else if //而没有else  [/quote] 这种写法是必须的 比如下面这种  int n=9; if(n=m){n=0;} else if(n=l){n=1;} [/quote]  引用 6 楼 zhangxiangDavaid 的回复:有些时候，这种写法是必须的，比如4楼的例子。   这个例子完全可以改写成  int n=9; if(n=m){n=0;} else if(n=l){n=1;} else{}   现在的问题是，一楼中说到最好改成这样的。而我不理解为什么它这么说。 看大家的回复，都认为不需要改成这样子。

switch中同样不要求一定要有最后的default

不需要写，除非有必要考虑这种情况，能保证在每个if都不匹配时不会导致结果的不正确就行了

else if 多了之后，容易搞不清最后剩下的情况是啥。

有些时候，这种写法是必须的，比如4楼的例子。

引用 2 楼 HeBanBei 的回复:[quote=引用 1 楼 zhangxiangDavaid 的回复:]  if else if else if //而没有else  [/quote] 这种写法是必须的 比如下面这种  int n=9; if(n=m){n=0;} else if(n=l){n=1;}


Question: 请大大帮我看看我这段C源码的问题在哪？

for循环的条件应该是 比a小吧，要判断素数不是？

嗯嗯  我知道，你的这个对了，谢谢，我说的是你前面的大大。

引用 4 楼 w1782424840 的回复:3楼大大，你这个和我原来的问题一样，还是输出不对，但是我改了判断行为for (i = 2; i < a; i++)然后就可以了。原来为for (i = 2; ; i++)这个衡成立判断。  请把我写的看仔细，我已经帮你把循环改了

#include<stdio.h> int main() { 	int a, b, i; 	printf("请输入一个数；"); 	scanf("%d", &a); 	for (i = 2; i < a; i++) 		if (a%i == 0) 		{ 		printf("NO!\n"); 		break; 		}  	if (a == i) 	{ 		printf("YES!\n"); 	} 	return 0; }

至少应该改成这样：  #include<stdio.h> int main() { 	int a, b, i; 	printf("请输入一个数:"); 	scanf("%d", &a); 	for (i = 2; ; i++) 		if (a % i == 0) 		{ 			printf("NO!\n"); 			break; 		} 	//if (a == (i - 1)) 	if(a == i) 	{ 		printf("YES!\n"); 	} 	return 0; }

你是想判断素数/


Question: 怎么让指针加上一个数得到的结果是移动这个字节数

int *p; int *p1; p1=((char *)p)+1;

p=(int *)((int)p+1) int *可以是任何类型，1可以是任意数值

void *欢迎你

(char *)(unsigned long)x + 1;    // x 为任意指针 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!! 这样兼容 32位和 64 位的系统!!!!!!

指针可以强制转换类型的，char*就是字节移动的，这是个让人又爱又恨的东西

DWORD_PTR  需要包含上头文件 #include <windows.h>

给你个通用的宏，32位下与64位下均正确   #define MakePtr(cast, ptr, addValue) ((cast)((DWORD_PTR)(ptr) + (DWORD_PTR)(addValue)))   cast是转换后的类型，ptr是你的指针，addValue是字节数

引用 3 楼 zhao4zhong1 的回复:int *p; int *p1; p1=((char *)p)+1; 正解，类型转换，因为char*型的指针每次移动一个字节。


Question: 指针动态分配二维数组内容无故发生变化？

测试过了，原来出错是因为ABCD没有赋值，改正后结果正确。用的是gcc编译器，楼主能否贴出你的运行结果。

仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

引用 1 楼 zhangxiangDavaid 的回复:int (*a)[3], *num[4]; 以上声明，a与num的区别是什么：  a的行数和b的列数都是未知数N

int main() {     int (*a)[3], *num[4];     int N, L, H, A, B, C, D, n, i, j;     scanf("%d %d %d", &N, &L, &H); //指针分配     a=(int (*)[3])malloc(sizeof(int*) *N);     for (i=0; i<4; i++)                                    num[i]=(int *)malloc(sizeof(int) *N);     for (i=0; i<N; i++)         scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]); //调试1     printf("\n");     for (i=0; i<N; i++)         printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]); //执行     A=B=C=D=0;     for (i=0; i<N; i++)     {         if (a[i][1]>=L && a[i][2]>=L)             if (a[i][1]>=H && a[i][2]>=H)                 num[0][A]=i;             else if (a[i][1]>=H && a[i][2]<H)                 num[1][B]=i;             else if (a[i][1]<H && a[i][2]<H && a[i][1]>=a[i][2])                 num[2][C]=i;                else                 num[3][D]=i;     } //调试2        printf("\n");     for (i=0; i<N; i++)         printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]);           return 0; } 引用 2 楼 paschen 的回复:使用了未初始化的局部变量 A B C D  ABCD初始化以后问题仍然存在？

使用了未初始化的局部变量 A B C D

int (*a)[3], *num[4]; 以上声明，a与num的区别是什么：

逐行输入和全部一起输入都可行。每行三个数字，数字之间有空格。

引用 3 楼 tqjxlm 的回复:int main() {     int (*a)[3], *num[4];     int N, L, H, A, B, C, D, n, i, j;     scanf("%d %d %d", &N, &L, &H); //指针分配     a=(int (*)[3])malloc(sizeof(int*) *N);     for (i=0; i<4; i++)                                    num[i]=(int *)malloc(sizeof(int) *N);     for (i=0; i<N; i++)         scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]); //调试1     printf("\n");     for (i=0; i<N; i++)         printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]); //执行     A=B=C=D=0;     for (i=0; i<N; i++)     {         if (a[i][1]>=L && a[i][2]>=L)             if (a[i][1]>=H && a[i][2]>=H)                 num[0][A]=i;             else if (a[i][1]>=H && a[i][2]<H)                 num[1][B]=i;             else if (a[i][1]<H && a[i][2]<H && a[i][1]>=a[i][2])                 num[2][C]=i;                else                 num[3][D]=i;     } //调试2        printf("\n");     for (i=0; i<N; i++)         printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]);           return 0; }  [quote=引用 2 楼 paschen 的回复:] 使用了未初始化的局部变量 A B C D  ABCD初始化以后问题仍然存在？[/quote]  没发现哪不一样，请把问题描述清楚，输入时要怎么输入


Question: C语言二维数组问题

引用 11 楼 qq_33447655 的回复:[quote=引用 1 楼 sdghchj 的回复:] 断点刚好在那句，还没有执行嘛，就是还没有初始化，再往下执行一步就行了，真是的！ 大哥，我执行了下一步. 他的值的确是和数组A一样了。不过下面有个1这个值又什么用啊？[/quote] pA的值就是0x0012fee8，而该地址上存储int变量就是1，也就是数组元素的第1个元素值。

一楼才是正解，请支持一楼

仅供参考：//在堆中开辟一个3×4×5的3维int数组 #include <stdio.h> #include <malloc.h> int ***p; int i,j,k; void main() {     p=(int ***)malloc(3*sizeof(int **));     if (NULL==p) return;     for (i=0;i<3;i++) {         p[i]=(int **)malloc(4*sizeof(int *));         if (NULL==p[i]) return;         for (j=0;j<4;j++) {             p[i][j]=(int *)malloc(5*sizeof(int));             if (NULL==p[i][j]) return;         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 p[i][j][k]=i*20+j*5+k;             }         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 printf(" %2d",p[i][j][k]);             }             printf("\n");         }         printf("---------------\n");     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             free(p[i][j]);         }         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //--------------- // 20 21 22 23 24 // 25 26 27 28 29 // 30 31 32 33 34 // 35 36 37 38 39 //--------------- // 40 41 42 43 44 // 45 46 47 48 49 // 50 51 52 53 54 // 55 56 57 58 59 //---------------

引用 2 楼 qq_20628217 的回复:用指针数组存放A「A(0,0)」,而不是指针存放 引用 3 楼 pkuzhx 的回复:2楼正解 长 1楼才是正解！

这个例子很好展示了多维数组在内存中是连续存放的。

引用 12 楼 qq_33447655 的回复:[quote=引用 11 楼 qq_33447655 的回复:] [quote=引用 1 楼 sdghchj 的回复:] 断点刚好在那句，还没有执行嘛，就是还没有初始化，再往下执行一步就行了，真是的！ 大哥，我执行了下一步. 他的值的确是和数组A一样了。不过下面有个1这个值又什么用啊？[/quote]  引用 11 楼 qq_33447655 的回复:[quote=引用 1 楼 sdghchj 的回复:] 断点刚好在那句，还没有执行嘛，就是还没有初始化，再往下执行一步就行了，真是的！ 大哥，我执行了下一步. 他的值的确是和数组A一样了。不过下面有个1这个值又什么用啊？[/quote] 黄色箭头代表断点在那一句?那也就是说这一句还没有执行咯？[/quote]  引用 12 楼 qq_33447655 的回复:[quote=引用 11 楼 qq_33447655 的回复:] [quote=引用 1 楼 sdghchj 的回复:] 断点刚好在那句，还没有执行嘛，就是还没有初始化，再往下执行一步就行了，真是的！ 大哥，我执行了下一步. 他的值的确是和数组A一样了。不过下面有个1这个值又什么用啊？[/quote]  引用 11 楼 qq_33447655 的回复:[quote=引用 1 楼 sdghchj 的回复:] 断点刚好在那句，还没有执行嘛，就是还没有初始化，再往下执行一步就行了，真是的！ 大哥，我执行了下一步. 他的值的确是和数组A一样了。不过下面有个1这个值又什么用啊？[/quote] 黄色箭头代表断点在那一句?那也就是说这一句还没有执行咯？[/quote] 对！

2楼正解 长

引用 11 楼 qq_33447655 的回复:[quote=引用 1 楼 sdghchj 的回复:] 断点刚好在那句，还没有执行嘛，就是还没有初始化，再往下执行一步就行了，真是的！ 大哥，我执行了下一步. 他的值的确是和数组A一样了。不过下面有个1这个值又什么用啊？[/quote]  引用 11 楼 qq_33447655 的回复:[quote=引用 1 楼 sdghchj 的回复:] 断点刚好在那句，还没有执行嘛，就是还没有初始化，再往下执行一步就行了，真是的！ 大哥，我执行了下一步. 他的值的确是和数组A一样了。不过下面有个1这个值又什么用啊？[/quote] 黄色箭头代表断点在那一句?那也就是说这一句还没有执行咯？

用指针数组存放A「A(0,0)」,而不是指针存放

断点刚好在那句，还没有执行嘛，就是还没有初始化，再往下执行一步就行了，真是的！

引用 1 楼 sdghchj 的回复:断点刚好在那句，还没有执行嘛，就是还没有初始化，再往下执行一步就行了，真是的！ 大哥，我执行了下一步. 他的值的确是和数组A一样了。不过下面有个1这个值又什么用啊？

引用 4 楼 zhangxiangDavaid 的回复:[quote=引用 2 楼 qq_20628217 的回复:] 用指针数组存放A「A(0,0)」,而不是指针存放 引用 3 楼 pkuzhx 的回复:2楼正解 长 1楼才是正解！[/quote] 汗，一楼正解。我还以为楼主是1楼，沙发是2楼呢。。。

还没执行到那句，看到0xcccccccc需要立马想到这个变量还没有初始化，因为在DEBUG上，编译器会先将栈空间用0xcccccccc进行填充

引用 7 楼 yangjian900109 的回复:一楼才是正解，请支持一楼 支持一楼。


Question: openjudge 3394:身份确认

其实我也是一样的思路啊，感觉这道题也玩不出什么花来，可就是不知道错了。 跟你唯一的区别就是计算1的位数的函数不一样： int bits_of_one(int n) { 	int retval = 0; 	while (n) 	{ 		retval += n % 2; 		n /=2; 	} 	return retval; }

引用 2 楼 zhangxiangDavaid 的回复:修改16、17行  V = (unsigned int*)malloc(sizeof(unsigned int)*N); F = (unsigned int*)malloc(sizeof(unsigned int)*M);  额，依然wrong answer

引用 2 楼 zhangxiangDavaid 的回复:修改16、17行  V = (unsigned int*)malloc(sizeof(unsigned int)*N); F = (unsigned int*)malloc(sizeof(unsigned int)*M);  28行应该是if (2 == bitCount(V[i]^F[j])) { 吧？ 不过改了以后还是wa。 代码写的很严谨，值得学习！

参考：  #include <stdio.h> int N, M; unsigned int *V, *F; int i, j; int hasRelation; int bitCount(unsigned int n) { 	int sum = 0; 	while (n) { 		n = n&(n - 1); 		sum++; 	} 	return sum; } int main(void) { 	if (2 == scanf("%d%d", &N, &M)) { 		V = (unsigned int*)malloc(sizeof(int)*N); 		F = (unsigned int*)malloc(sizeof(int)*M); 		if (V && F) { 			for (i = 0; i < N; i++) { 				if (1 != scanf("%u", V + i))return 0; 			} 			for (i = 0; i < M; i++) { 				if (1 != scanf("%u", F + i))return 0; 			} 			hasRelation = 0; 			for (i = 0; i < N; i++) 				for (j = 0; j < M; j++) { 					if (1 == bitCount(V[i]^F[j])) { 						hasRelation++; 					} 				} 			printf("%d\n", hasRelation); 			free(V); 			free(F); 		} 	} 	return 0; }


Question: tcp协议详解 协议 这本书的第2章的几个疑惑

引用 2 楼 user-1 的回复:不是还有4字节的crc检验码吗，那个中是网卡接收后做正确性验证的，如果不正确，数据包丢失。那4个字节wireshark抓不到。wireshark使用的是winpcap，这个在winpcap文档中有说明。  crc是指对整个frame(除了crc自身）外的数据都进行循环冗余校验码 吗？    另外： 问题2，能帮忙看看嘛？

up　起来啊，高手ne ?


Question: 对指针数组采用两种排序方法，结果竟然不一样，求教大神

谢谢大家的帮助，我发现那个错误了，修改了发现是对的，就是问题出现在哪个;上

各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/

修改如下：  #include <stdio.h> #include <string.h> void rankArr(char *pr[], int n); int main(){ 	char *p[] = { "china","japan","tokyo","pairs","narry" }; 	int i; 	printf("排序前\n"); 	for (i = 0; i < 5; i++) 		printf("%s\n", p[i]); 	rankArr(p, 5); 	printf("排序后\n"); 	for (i = 0; i < 5; i++) 		printf("%s\n", p[i]); 	return 0; } void rankArr(char *pr[], int n){ 	char *tmp; 	int i, j, k; 	for (i = 0; i < n; i++){ 		k = i; 		for (j = i + 1; j < n; j++){ 			if (strcmp(pr[j], pr[k]) < 0) { 				k = j; 			} 		} 		if (k != i) { 			tmp = pr[i]; 			pr[i] = pr[k]; 			pr[k] = tmp; 		} 	} }

排序前，请仔细理解各排序方法的原理： 选择排序 http://blog.csdn.net/zhangxiangdavaid/article/details/29844821 冒泡排序 http://blog.csdn.net/zhangxiangdavaid/article/details/30271613

楼上所言极是。

这样这个if相当于是执行了一个空语句，而下面大括号中的内容不管判断结果是什么都会被执行

if(strcmp(pr[i],pr[j])>0);  后面多了一个分号啊


Question: C语言代码求助

引用 8 楼 xiaogang2567 的回复:为什么我在2010下编译没有错误。  因为你是.cpp 不是.c

为什么我在2010下编译没有错误。

是啊，不知道上面的几个都在说什么鬼

我觉得你的是对的，可能微软对此不一样吧 ，建议用新的gets_s来代替（我也遇到过这种问题，最后还是用vs高版本成功的，我也不知道这有什么不一样）

我靠，一大堆人在.........................   c99才只会变量可以随意位置定义

因为这个函数是不安全，可能造成缓冲区溢出，所以现在建议用新的gets_s来代替 如果仍想用可以选择以下任何一种方法： 1、新建项目时不要勾选安全开发生命周期检查 2、在项目属性C/C++命令行中加上 /D _CRT_SECURE_NO_WARNINGS  不过如果是在VS2015上，就得用gets_s了，因为微软直接弃用gets了

将main.c更名为main.cpp 在main.cpp最前面加一行： #pragma warning(disable:4996)

在第一行代码处加上：  #define _CRT_SECURE_NO_WARNINGS

找到问题所在了。VS2010必须在函数开始就定义所有变量，不能在中间定义变量。


Question: 引用

因为已经有指针了,引用多此一举

因为指针完全可以代替引用，C里是少了一些复杂的特性

引用是指针的包装

引用的本质也是指针，所以引用只是一种使用层面的创新

其实，楼主的好奇心挺好的，就应该多问为什么，永远充满好奇心，不懂就问，没什么丢人的。

c语言为什么case后面要加break？

不怎么混论坛，头次见问编程语言的设计问题的

以前BS的书中提及, 引入引用是为了操作符重载 比如c=a-b 就很自然, 如果写成c=&a-&b就呵呵了,c没有操作符重载, 自然不需要这个

因为 C 语言诞生的时候，没有伟大的你。

鸡肋


Question: c字符累加输出，是这么描述么。。。

#include <stdio.h> #define MAXWIDTH 10 #define MAXNUM 19 #define MAXNUMLEN 2 char *bulidStr(int slen) {     static char nowtext[(MAXWIDTH+1)*(MAXNUM+2-1)+1];     int i,w;     w=1;for (i=0;i<slen;i++) w*=10;     if (slen<1     ) slen=1;     if (slen>MAXWIDTH) slen=MAXWIDTH;     for (i=1;i<MAXNUM+2;i++) {         sprintf(nowtext+(slen+1)*(i-1),"%0*d ",slen,i%(MAXNUM+1)%w);     }     return nowtext; } int main() {     for (int bit=1;bit<MAXWIDTH+2;bit++) {         printf("%d:%s\n",bit,bulidStr(bit));     }     return 0; } //1:1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 //2:01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 00 //3:001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 000 //4:0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0000 //5:00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00000 //6:000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000000 //7:0000001 0000002 0000003 0000004 0000005 0000006 0000007 0000008 0000009 0000010 0000011 0000012 0000013 0000014 0000015 0000016 0000017 0000018 0000019 0000000 //8:00000001 00000002 00000003 00000004 00000005 00000006 00000007 00000008 00000009 00000010 00000011 00000012 00000013 00000014 00000015 00000016 00000017 00000018 00000019 00000000 //9:000000001 000000002 000000003 000000004 000000005 000000006 000000007 000000008 000000009 000000010 000000011 000000012 000000013 000000014 000000015 000000016 000000017 000000018 000000019 000000000 //10:0000000001 0000000002 0000000003 0000000004 0000000005 0000000006 0000000007 0000000008 0000000009 0000000010 0000000011 0000000012 0000000013 0000000014 0000000015 0000000016 0000000017 0000000018 0000000019 0000000000 //11:0000000001 0000000002 0000000003 0000000004 0000000005 0000000006 0000000007 0000000008 0000000009 0000000010 0000000011 0000000012 0000000013 0000000014 0000000015 0000000016 0000000017 0000000018 0000000019 0000000000 //

引用 25 楼 animalong 的回复:[quote=引用 24 楼 user-2 的回复:] [quote=引用 23 楼 animalong 的回复:] [quote=引用 16 楼 user-2 的回复:] %s需要以\0结尾的字符串，它会一直输出到找到\0为止  这样吧：printf("%.*s", 长度, nowtext);  对了，我突然觉得 动态分配的时候，输出出现的多余字符是不是可以通过先进行一次初始化操作来清除掉。  又觉得不对。出现这个情况好像是malloc给多分配了数量一样 [/quote]  先把缓冲区全部填0[/quote]  终于找到一个办法： [/quote]  但这个方法似乎只适合在我这个程序里用，而且必需让每个位置都存入英文字符，才能把它们全显示出来，不然就会在输出的时候变成乱码，/0也不能随便放，否则会报错

引用 24 楼 user-2 的回复:[quote=引用 23 楼 animalong 的回复:] [quote=引用 16 楼 user-2 的回复:] %s需要以\0结尾的字符串，它会一直输出到找到\0为止  这样吧：printf("%.*s", 长度, nowtext);  对了，我突然觉得 动态分配的时候，输出出现的多余字符是不是可以通过先进行一次初始化操作来清除掉。  又觉得不对。出现这个情况好像是malloc给多分配了数量一样 [/quote]  先把缓冲区全部填0[/quote]  终于找到一个办法：  int bit = 5; char *nowtext;  nowtext = (char*)malloc(sizeof(char) * (bit+ 1));  // 动态开辟一片内存(开辟bit个char,返回void*,所以强转成char*)，需要多申请一位放'\0'；c++用new char[bit] nowtext[bit] = '\0'; // malloc开辟的内存空间似乎没有给结束标记，因此要多申请一位，并在最后一位上放'\0'  //......  free(nowtext); // 释放malloc开辟的内存；c++用delete[] nowtext; nowtext = NULL; // 虽然释放了，但内存地址还存在这里，为避免误操作，给它置NULL。free完之后，一定要给指针置NULL！

bit = 2; // 指定要输出多少位字符 	nowtext = (char*)malloc(sizeof(char) * bit);  // 动态开辟一片内存 	bulidStr(bit); 	free(nowtext); // 释放   (char*)malloc(sizeof(char) * bit);   我找到了这个，但它输出的时候多了点东西

nowtext = (char*)malloc(sizeof(char)*数量);

我知道了，你这个是C语言，不是C++，应该用malloc

引用 10 楼 animalong 的回复:[quote=引用 9 楼 user-2 的回复:] [quote=引用 8 楼 animalong 的回复:] [quote=引用 6 楼 user-2 的回复:] [quote=引用 5 楼 animalong 的回复:] [quote=引用 2 楼 user-2 的回复:] 有没有为nowtext分配内存 nowtext = new char[bit] 这样吗？ 我这new 和 char下都标红了....[/quote]  可以动态分配，你也可以把nowtext定义成字符数组：  char nowtext[100];[/quote] 直接指定一个大的就可以了吗？  nowtext是全局的，是不是不能动态指定大小了？[/quote]  那就要用动态分配，你5楼的方法可以，不过把那条语句要写在函数里[/quote]  可是它报错了 T T[/quote]  引用 10 楼 animalong 的回复:[quote=引用 9 楼 user-2 的回复:] [quote=引用 8 楼 animalong 的回复:] [quote=引用 6 楼 user-2 的回复:] [quote=引用 5 楼 animalong 的回复:] [quote=引用 2 楼 user-2 的回复:] 有没有为nowtext分配内存 nowtext = new char[bit] 这样吗？ 我这new 和 char下都标红了....[/quote]  可以动态分配，你也可以把nowtext定义成字符数组：  char nowtext[100];[/quote] 直接指定一个大的就可以了吗？  nowtext是全局的，是不是不能动态指定大小了？[/quote]  那就要用动态分配，你5楼的方法可以，不过把那条语句要写在函数里[/quote]  可是它报错了 T T[/quote]

引用 9 楼 user-2 的回复:[quote=引用 8 楼 animalong 的回复:] [quote=引用 6 楼 user-2 的回复:] [quote=引用 5 楼 animalong 的回复:] [quote=引用 2 楼 user-2 的回复:] 有没有为nowtext分配内存 nowtext = new char[bit] 这样吗？ 我这new 和 char下都标红了....[/quote]  可以动态分配，你也可以把nowtext定义成字符数组：  char nowtext[100];[/quote] 直接指定一个大的就可以了吗？  nowtext是全局的，是不是不能动态指定大小了？[/quote]  那就要用动态分配，你5楼的方法可以，不过把那条语句要写在函数里[/quote]  可是它报错了 T T

引用 8 楼 animalong 的回复:[quote=引用 6 楼 user-2 的回复:] [quote=引用 5 楼 animalong 的回复:] [quote=引用 2 楼 user-2 的回复:] 有没有为nowtext分配内存 nowtext = new char[bit] 这样吗？ 我这new 和 char下都标红了....[/quote]  可以动态分配，你也可以把nowtext定义成字符数组：  char nowtext[100];[/quote] 直接指定一个大的就可以了吗？  nowtext是全局的，是不是不能动态指定大小了？[/quote]  那就要用动态分配，你5楼的方法可以，不过把那条语句要写在函数里

引用 6 楼 user-2 的回复:[quote=引用 5 楼 animalong 的回复:] [quote=引用 2 楼 user-2 的回复:] 有没有为nowtext分配内存 nowtext = new char[bit] 这样吗？ 我这new 和 char下都标红了....[/quote]  可以动态分配，你也可以把nowtext定义成字符数组：  char nowtext[100];[/quote] 直接指定一个大的就可以了吗？  nowtext是全局的，是不是不能动态指定大小了？

char * nowtext 改成 char nowtext[3]，是可以了，  但我怎么能在每次程序开始运行的时候指定 nowtext的长度，而不是一次写死在这里？

引用 5 楼 animalong 的回复:[quote=引用 2 楼 user-2 的回复:] 有没有为nowtext分配内存 nowtext = new char[bit] 这样吗？ 我这new 和 char下都标红了....[/quote]  可以动态分配，你也可以把nowtext定义成字符数组：  char nowtext[100];

引用 2 楼 user-2 的回复:有没有为nowtext分配内存 nowtext = new char[bit] 这样吗？ 我这new 和 char下都标红了....

引用 2 楼 user-2 的回复:有没有为nowtext分配内存 呃，刚学，有这么个练习题想做做，怎么分配内存的

给个别的写法也好

有没有为nowtext分配内存

nowtext[bit - slen] = c; 我这句不能运行

引用 23 楼 animalong 的回复:[quote=引用 16 楼 user-2 的回复:] %s需要以\0结尾的字符串，它会一直输出到找到\0为止  这样吧：printf("%.*s", 长度, nowtext);  对了，我突然觉得 动态分配的时候，输出出现的多余字符是不是可以通过先进行一次初始化操作来清除掉。  又觉得不对。出现这个情况好像是malloc给多分配了数量一样 [/quote]  先把缓冲区全部填0

引用 16 楼 user-2 的回复:%s需要以\0结尾的字符串，它会一直输出到找到\0为止  这样吧：printf("%.*s", 长度, nowtext);  对了，我突然觉得 动态分配的时候，输出出现的多余字符是不是可以通过先进行一次初始化操作来清除掉。  又觉得不对。出现这个情况好像是malloc给多分配了数量一样

引用 21 楼 zhao4zhong1 的回复:#include <stdio.h> #define MAXLEN 8 char *text = "0123456789"; #define text_len 10 char *bulidStr(int slen) {     static char nowtext[(MAXLEN+1)*text_len+1];     if (slen<1     ) slen=1;     if (slen>MAXLEN) slen=MAXLEN;     for (int i=0;i<text_len;i++) {         sprintf(nowtext+(slen+1)*i,"%0*c ",slen,text[i]);     }     return nowtext; } int main() {     for (int bit=1;bit<10;bit++) {         printf("%d:%s\n",bit,bulidStr(bit));     }     return 0; } //1:0 1 2 3 4 5 6 7 8 9 //2:00 01 02 03 04 05 06 07 08 09 //3:000 001 002 003 004 005 006 007 008 009 //4:0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 //5:00000 00001 00002 00003 00004 00005 00006 00007 00008 00009 //6:000000 000001 000002 000003 000004 000005 000006 000007 000008 000009 //7:0000000 0000001 0000002 0000003 0000004 0000005 0000006 0000007 0000008 0000009 //8:00000000 00000001 00000002 00000003 00000004 00000005 00000006 00000007 00000008 00000009 //9:00000000 00000001 00000002 00000003 00000004 00000005 00000006 00000007 00000008 00000009 //  抱歉已经结贴了，而且你这个只有最后一位变化啊，比如两位的话应该是： 01 02 03...      11 12 13....  21 22 23... 31 32 33...  ...........  99


Question: 用printf函数打印浮点数

引用 3 楼 user-1 的回复:prinf参数是传值，不是传地址  http://en.cppreference.com/w/c/io/fprintf谢啦版主，我好好看看

引用 1 楼 user-1 的回复:printf那句改成：printf("inch=%lf",inch);为啥这个要去掉&符？还有哪些变量在输出的时候跟整型变量有区别呢？

printf那句改成：printf("inch=%lf",inch);


Question: 新手求助（第一次发帖）

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

格式与内容对应。

printf("name = %s,sex = %d,score = %f\n", pArr[i].name, pArr[i].sex, pArr[i].score);

读入信息，输出时发生错误，什么原因？？？


Question: 蓝桥杯 算法提高 判断名次  求助~!

引用 8 楼 china丶龙少 的回复:#include <iostream> #include <cstring> using namespace std;  int a[5], s1, s2, sum = 0;  bool judge(char *str) {     if(str[1] == '<' && str[2] >= '1' && str[2] <= '9')     {         if(a[str[0]-'A'] < str[2]-'0')             return 1;     }     if(str[1] == '<' && str[2] == '=')     {         if(a[str[0]-'A'] <= str[3]-'0')             return 1;     }     if(str[1] == '=')     {         if(a[str[0]-'A'] == str[2]-'0')             return 1;     }     if(str[1] == '>' && str[2] == '=')     {         if(a[str[0]-'A'] >= str[3]-'0')             return 1;     }     if(str[1] == '>' && str[2] >= '1' && str[2] <= '9')     {         if(a[str[0]-'A'] > str[2]-'0')             return 1;     }     if(str[1] == '!' &&str[2] == '=')     {         if(a[str[0]-'A'] != str[3]-'0')             return 1;     }     return 0; }  /* C<=3 A=1 B=1 E>=4 D!=2 */  int main() { 	char ans[20][10], saying[5][10];  	memset(ans, 0, sizeof(ans)); 	memset(saying, 0, sizeof(saying));  	for(int i = 0; i < 5; i++) 	{ 		cin >> saying[i]; 	}  	for(a[0] = 1; a[0] <= 5; a[0]++) 	{ 		for(a[1] = 1; a[1] <= 5; a[1]++) 		{ 			if(a[1] == a[0]) 				continue; 			for(a[2] = 1; a[2] <= 5; a[2]++) 			{ 				if(a[2] == a[0] || a[2] == a[1]) 					continue; 				for(a[3] = 1; a[3] <= 5; a[3]++) 				{ 					if(a[3] == a[0] || a[3] == a[1] || a[3] == a[2]) 						continue; 					for(a[4] = 1; a[4] <= 5; a[4]++) 					{ 						if(a[4] == a[0] || a[4] == a[1] || a[4] == a[2] || a[4] == a[3]) 							continue; 						//如果没有重复  						s1 = 0, s2 = 0;  						for(int i = 0; i < 5; i++) 						{ 							if(judge(saying[i])) 								s2++; 							else if(a[i] % 2) 								s1++; 						}  						if(s1 == 3 && s2 == 2) 						{ 							for(int i = 0; i < 5; i++) 								if(a[i] == 1) 									ans[sum++][0] = 'A' + i; 							for(int i = 0; i < 5; i++) 								if(a[i] == 2) 									ans[sum-1][1] = 'A' + i; 							for(int i = 0; i < 5; i++) 								if(a[i] == 3) 									ans[sum-1][2] = 'A' + i; 							for(int i = 0; i < 5; i++) 								if(a[i] == 4) 									ans[sum-1][3] = 'A' + i; 							for(int i = 0; i < 5; i++) 								if(a[i] == 5) 									ans[sum-1][4] = 'A' + i; 						} 					} 				} 			} 		} 	}  	char tmp[10]; 	for(int i = 0; i < sum - 1; i++)//字典序排列 		for(int j = 0; j < sum - 1 - i; j++) 		{ 			if(strcmp(ans[j], ans[j+1]) > 0) 			{ 				strcpy(tmp, ans[j]); 				strcpy(ans[j], ans[j+1]); 				strcpy(ans[j+1], tmp); 			} 		}  	for(int i = 0; i < sum; i++) 		cout << ans[i] << endl; 	cout << sum << endl;  	return 0; } 我改了以下，100分了

谢谢各位!!

直接全排列, 5!=120非常小,出来后还不需要排序, 大体框架如下,  void dfs(int d) {     if(d==5){         for(int i=0;i<5;i++){             int x =pos[i]&1,y=judge(i);//judge判断第i个人话为真或假, pos代表i的排名             if(x^y) return;         }         puts(a);         ++cnt;         return;     }     for(int i=0;i<5;i++) if(!vis[i]){         vis[i]=1;         a[d] =i+'A';         pos[i] =d;         dfs(d+1);         vis[i] =0;     } }

引用 2 楼 lm_whales 的回复:假话则取 ，反说话内容 只要调换两个操作数次序即可哦这话说错了，请忽略 另一种方法是3人说谎，两人说实话 根据说话内容 判定名次，求出各种可能的组合。 然后排序输出 这种方法，判定复杂，但是待选情况较少，不需要遍历全排列

穷举法具体做法： 对每个排列按照如下方法处理： 每个人说的话，可以看作表达式 做一个简单的表达式解析程序 ABCDE 作为变量名 12345 名次作为变量值 对A=2 这种关系表达式加以解析。 并根据说话人的身份(即名次，决定说的是真话还是假话)， 对表达式的值加以肯定（值不变）或否定（取反） 对每一个名次的可能组合（一个排列） 测试是否这五句话， 全符合说话人的身份（即上面计算结果是否全真）。  这样，再写一个枚举全排列的函数，即可实现穷举法。

感觉就是个DFS枚举，5种状态枚举也枚举不了多久，而且还有那么多限制条件  根据题设条件直接先框定ABCDE的各自枚举范围 然后直接写递归就好了，最好不要像你这样子写代码，看着挺乱的

假话则取 ，反说话内容 只要调换两个操作数次序即可

最笨的方法穷举法： 枚举所有名次（全排列），假设没有并列名次，根据，说话内容和说话真假的组合，判断该排列是否是一个可能的名次。


Question: 从TXT中读取固定格式的数据

你就不能换个方法存数据吗?使用xml将你的数据保存,然后利用现有的工具,比如tinyxml读取(tinyxml是几个读取xml格式的类),这样方便存取,效率还高.同时你还可以掌握一个新的工具,何乐不为? 我就说个建议,要是你的需求规定一定要txt那就没办法了.

模仿赵4老师的做法：  groupNumber     = 2; attData_00  =  {    timeCode   = 331294814.750000;    timeString = "2014 07 01 10:20:14.750000";    roll       = 0.000000;    pitch      = 0.000000;    yaw        = 0.000000; } attData_01  =  {    timeCode   = 331294806.750000;    timeString = "2014 07 01 10:20:06.750000";    roll       = 0.000000;    pitch      = 0.000000;    yaw        = 0.000000; }   #include <stdio.h> typedef struct { 	double att_timeCode; 	char   att_timeString[30]; 	double att_roll; 	double att_pitch; 	double att_yaw; }AttDataStruct; AttDataStruct *data; FILE *f; char ln[256]; int st, i, n; int main(void) { 	f = fopen("data.txt", "r"); 	if (f) { 		//先把groupNumber数据读出 		if (NULL == fgets(ln, 256, f))return 0; 		if (1 != sscanf(ln, "groupNumber     = %d", &n))return 0; 		//动态分配空间 		data = (AttDataStruct*)malloc(sizeof(AttDataStruct)*n); 		i = st = 0; 		//正式读入数据 		while (1) { 			if (0 == st) { 				//读入attData_xx 				if (NULL == fgets(ln, 256, f))break; 				//读入{ 				if (NULL == fgets(ln, 256, f))break; 				st = 1; 			} 			else if (1 == st) { 				if (NULL == fgets(ln, 256, f))break; 				if (1 == sscanf(ln, "   timeCode   = %lf", &data[i].att_timeCode)) st = 2; 			} 			else if (2 == st) { 				if (NULL == fgets(ln, 256, f))break; 				if (1 == sscanf(ln, "   timeString = \"%30[^\"]s", data[i].att_timeString)) st = 3; 			} 			else if (3 == st) { 				if (NULL == fgets(ln, 256, f))break; 				if (1 == sscanf(ln, "   roll       = %lf", &data[i].att_roll)) st = 4; 			} 			else if (4 == st) { 				if (NULL == fgets(ln, 256, f))break; 				if (1 == sscanf(ln, "   pitch      = %lf", &data[i].att_pitch)) st = 5; 			} 			else { 				if (NULL == fgets(ln, 256, f))break; 				if (1 == sscanf(ln, "   yaw        = %lf", &data[i].att_yaw)) { 					//读入} 					if (NULL == fgets(ln, 256, f))break; 					st = 0; 					if (++i == n)break; 				} 			} 		} 		fclose(f); 		//打印 		printf("groupNumber     = %d;\n", n); 		for (i = 0; i < n; i++) { 			printf("attData_%02d  =\n", i); 			printf("{\n"); 			printf("   timeCode   = %.6f;\n", data[i].att_timeCode); 			printf("   timeString = \"%s\";\n", data[i].att_timeString); 			printf("   roll       = %f;\n", data[i].att_roll); 			printf("   pitch      = %f;\n", data[i].att_pitch); 			printf("   yaw        = %f;\n", data[i].att_yaw); 			printf("}\n"); 		} 		free(data); 	} 	return 0; }

伪代码: fscanf(fp, "groupNumber=%d ", &groupNumber); for () { fscanf(fp, "attData_%d={", &i); fscanf(fp, "timeCode=%d;", &attData[i].att_timeCode); fscanf(fp, "timeString=\"%d%d%d%d:%d:%d.%d\";", &year, &mon, &day, &hour, &min, &sec, &ssec); sprintf(attData[i].att_timeString, "%04d %02d %02d %02d:%02d:%02d.%06d", year, mon, day, hour, min, sec, ssec); fscanf(fp, "roll=%lf;", &attData[i].att_roll); fscanf(fp, "pitch=%lf;", &attData[i].att_pitch); fscanf(fp, "yaw=%lf;}", &attData[i].att_yaw); }

fscanf

仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8


Question: 一道c语言的简单题

仅供参考： //输出第n个不含l这个数字的数，比如n是10，l是1的时候 //十个数应该依次是 2,3,4,5,6,7,8,9,20,22，所以输出数就应该是22 #include <stdio.h> #include <string.h> int n,l,i,k; char s[30]; int main() {     scanf("%d%d",&n,&l);     if (n<1 || n>100000000 || l<0 || l>9) return 1;     k=1;     for (i=1;i<200000000;i++) {         sprintf(s,"%d",i);         if (NULL==strchr(s,'0'+l)) {             if (k==n) {                 printf("%d\n",i);                 break;             }             k++;         }     }     return 0; }

引用 1 楼 user-2 的回复:#include <iostream> #include<stdio.h> int main() {     int n,l,i,y,count=0,a;    	scanf("%d%d",&n,&l); 	{         for(i=1;i<=1000000;i++) 		{ 			int flag=0; 			a=i; 			while(a) 			{ 				y=a%10; 				a/=10; 				if(y==l) 					flag=1; 			} 			if(flag==0) 			{ 				printf("%d\n",i); 				count++; 			} 			if(count==n) 				break; 		} 		 	}     return 0; } 不是要输出所有的数，只需要输出第n个数，而且要多组数据测试啊_(:з」∠)_


Question: 一个c语言的题……写错了求助！

引用 1 楼 user-1 的回复:你的 while 会把 i 搞成 0 ，然后 for 循环永远不能结束。 然后我又改了一下，如果有多组数据输入，只有第一组是对的其他的都不对了！怎么改啊_(:з」∠)_ #include<stdio.h> int main() {     int n,l,i,y,count=0,a;     while(scanf("%d%d",&n,&l)!=EOF)     {         for(i=1;i<=1000000;i++)     {         int flag=0;         a=i;         while(a)         {             y=a%10;             a/=10;             if(y==l)                 flag=1;         }         if(flag==0)         {             count++;         }         if(count==n)             break;     }     printf("%d\n",i);     }     return 0; }

引用 1 楼 user-1 的回复:你的 while 会把 i 搞成 0 ，然后 for 循环永远不能结束。 谢谢！！！！我找了一个上午了QAQ终于弄对了

你的 while 会把 i 搞成 0 ，然后 for 循环永远不能结束。


Question: VS2010 调试时出现“wifi.exe”: 已加载“C:\WINDOWS\SysWOW64\ntdll.dll”，已加载符号(去除源信息)。

请问你是怎么解决的？谢谢

好的，谢谢你们，已经解决。

只是提示你程序运行过程中需要用到的本地类库

和你不相干的东西，忽略掉 加载dll..

眼不见为净！

忽略这些消息


Question: 杭电p2023  不知道在哪有问题有时候是Time Limit Exceeded有时是runtime error (access_violation)

哦哦。找到错的地方了！！ 1.   double a[m] ;    double b[n] ;    数组长度不匹配 应该改为    double a[n] ;    double b[m] ; 2.if(sum[i][j] >= a[i])    比较的不对改为    if(sum[j][i] >= b[i])

把sum移到外面作全局变量试试, 不确定oj对变长数组支持怎么样, 把a,b也移出试试

第一次发帖  代码格式  没弄整齐  真心不好意识。。。

自己顶下先！！！！


Question: 函数指针解释

引用 3 楼 yyang0514 的回复:[quote=引用 2 楼 paschen 的回复:] 你的运算直接在calc函数里完成 主函数传入(a, b, '+') calc中先通过calc_func函数获取到对应的函数指针 下面int (*s_fp)(int,int) = s_calc_func(op); 这句没什么用 然后调用fp(a,b)得到结果 谢谢你的回复。 你说 “int (*s_fp)(int,int) = s_calc_func(op); 这句没什么用” 是什么意思？ 我将它换为int (*s_fp)(int,int) =calc_func(op)  仍然能够正确运行。  我始终没有明白的是：calc_func(op)只返回了函数的首地址，如何将主调函数传给来a,b参数放进去的。[/quote]  calc_func只负责返回首地址了，我上面已经说了：在fp(a,b)这句这里才是调用 上面说的那句没用，就是你删了也可以

引用 4 楼 yyang0514 的回复:[quote=引用 1 楼 akirya 的回复:] int (*s_calc_func(char op)) (int , int)   {       return calc_func(op);   }  等价 FP_CALC s_calc_func(char op) {       return calc_func(op);   } 谢谢你的回复。 我始终没有明白的是：calc_func(op)只返回了函数的首地址，如何将主调函数传给来a,b参数放进去的。[/quote]  fp(a,b); 这就是调用

引用 2 楼 paschen 的回复:你的运算直接在calc函数里完成 主函数传入(a, b, '+') calc中先通过calc_func函数获取到对应的函数指针 下面int (*s_fp)(int,int) = s_calc_func(op); 这句没什么用 然后调用fp(a,b)得到结果 引用 2 楼 paschen 的回复:你的运算直接在calc函数里完成 主函数传入(a, b, '+') calc中先通过calc_func函数获取到对应的函数指针 下面int (*s_fp)(int,int) = s_calc_func(op); 这句没什么用 然后调用fp(a,b)得到结果 明白了。就是被那句int (*s_fp)(int,int) = s_calc_func(op);

引用 1 楼 akirya 的回复:int (*s_calc_func(char op)) (int , int)   {       return calc_func(op);   }  等价 FP_CALC s_calc_func(char op) {       return calc_func(op);   } 谢谢你的回复。 我始终没有明白的是：calc_func(op)只返回了函数的首地址，如何将主调函数传给来a,b参数放进去的。

引用 2 楼 paschen 的回复:你的运算直接在calc函数里完成 主函数传入(a, b, '+') calc中先通过calc_func函数获取到对应的函数指针 下面int (*s_fp)(int,int) = s_calc_func(op); 这句没什么用 然后调用fp(a,b)得到结果 谢谢你的回复。 你说 “int (*s_fp)(int,int) = s_calc_func(op); 这句没什么用” 是什么意思？ 我将它换为int (*s_fp)(int,int) =calc_func(op)  仍然能够正确运行。  我始终没有明白的是：calc_func(op)只返回了函数的首地址，如何将主调函数传给来a,b参数放进去的。


Question: 一个简单的代码问题，求救！！

输入的时候不能加空格

...不需要...我错咯

不需要数据转换咩 -_-

请检查scanf的返回值。

#include<stdio.h> #include<windows.h> main() {     char c1,c2,c3;     int d1,d2,d3,sum;     scanf("%c %c %c",&c1,&c2,&c3);     d1=c1-65;     d2=c2-65;     d3=c3-65;     sum=d1*100+d2*10+d3;     printf("%d",sum);     system("pause"); }  A的ASCII为41(16进制)

1#的解释是对的。  楼主，你原来的程序也是没有问题。只要你输入的数据之间不要写空格。 要连续输入几个字符。 如 （输入）123 （则会显示）123 是正常的。 或者你就按照1#的说法修改。。

分别输入3，2，1三个数字字符时，d2为什么会等于-16？

scanf这句改成这样吧； scanf("%c %c %c",&c1,&c2,&c3); 输入的时候每个数字间用一个空格分开  你之前的代码会把空格也当一个字符保存到变量


Question: 关于VS2010创建DLL工程的问题，请教大神们。

DLL不能直接运行，需要有宿主EXE程序，但你的DLL文件应该已经生成了

在MSDN里面搜“调试DLL”

dll 文件不能直接调试，必须以一个可执行文件来调试。


Question: C语言写的换算时区的代码，不知道错在哪，请大神指教！

switch后面需要一个大括号：   #include<stdio.h> int main() { 	int time,hour,minutes; 	printf_s("input BJT:\n"); 	scanf_s("%d",&time); 	minutes=time%100; 	hour=time/100-8; 	switch(hour) 	{     case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8': 	case'9':case'10':case'11':case'12':case'13':case'14':case'15':case'16': 		printf_s("UTC:%d%d",hour,minutes); 		break ; 	case '0': 		printf_s("UTC:%d",minutes); 		break ; 	case '-1':case '-2':case '-3':case '-4': 	case '-5':case '-6':case '-7':case '-8': 		hour=24+hour; 		printf_s("UTC:previous day %d%d",hour,minutes); 		break ; 	} 	return 0; }


Question: 进制转换问题？？？

观察：  int main(void) { 	int i, n; 	char str[] = "0123d"; 	sscanf(str, "%d%n", &i, &n); 	printf("i=%d,n=%d\n", i, n); 	return 0; } //i=123,n=4  结果： %n用于获取读到的字符数

演示如何处理保存在一个字符串中的任意间隔字符间隔的，且事先不知道共有几组的一组数。

引用 7 楼 vshuo7013 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] 仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);          ？？？//%n         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 ？？？？ //k,v,n=0,123,3 ？？？？ //skip char[ ] //k,v,n=0,123,3 ？？？？ //skip char[a] //k,v,n=0,123,3 ？？？？ //skip char[b] //k,v,n=1,4,2  ？？？？ //k,v,n=-1,4,2  ？？？？ //End.  赵4老师，%n是什么意思啊！还有不明白您的意思！！！ [/quote] 多搜索！

引用 6 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);          ？？？//%n         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 ？？？？ //k,v,n=0,123,3 ？？？？ //skip char[ ] //k,v,n=0,123,3 ？？？？ //skip char[a] //k,v,n=0,123,3 ？？？？ //skip char[b] //k,v,n=1,4,2  ？？？？ //k,v,n=-1,4,2  ？？？？ //End.  赵4老师，%n是什么意思啊！还有不明白您的意思！！！

仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

int main(void) { 	int i; 	char *AD = "00030020010005a"; 	sscanf(AD, "%x", &i); 	printf("%d", i); 	return 0; } //1048666

引用 2 楼 zhangxiangDavaid 的回复:char *AD = "0003,002,0010,005a"; 字符串中一共几个数啊 这是一个数

参考一下吧！ int convert(char* data) { 	int Res = 0; 	char* p = data; 	while (*p != '\0') 	{ 		if (*p >= '0' && *p <= '9') 			Res = Res * 16 + *p - '0'; 		else if (*p >= 'a' && *p <= 'f') 			Res = Res * 16 + *p - 'a' + 10; 		else if (*p == ','){} 		else 			return -1; 		p++; 	} 	return Res; }


Question: 请教一个小问题

strcpy不允许dest为空

可以是空字符串，如""，但不能是空指针  另外strcpy具体讲解可以看：http://en.cppreference.com/w/c/string/byte/strcpy

char* strcpy(char* des,const char* source)  {  	char* r=des;     	_ASSERT((des != NULL) && (source != NULL));   	while((*des++ = *source++)!='\0');   	return r; 	  strcpy函数原型，你会发现while((*des++ = *source++)!='\0');这一句很有意思

试试：  #include <stdio.h> #include <stdlib.h> #include <string.h> void main() { 	char *p = "abc"; 	//char *q = NULL; 	char q[20]; 	strcpy(q, p); 	printf("p=%s   q=%s \n", p, q); }

引用 楼主 NotSimpleEasy 的回复:#include <stdio.h> #include <stdlib.h> #include <string.h> void main() {   	char *p="abc"; 	char *q=NULL; 	strcpy(q,p); 	printf("p=%s   q=%s \n",p,q); }  这段程序运行之后为什么会挂掉？ 好久没用strcpy哪里出错了？ 需要动态申请么？还是去掉“NULL”？都不行啊

q没有分配地址


Question: 刚学请教一个小问题

有一个主函数，现在刚学一般都只用主函数，等看到函数调用就有很多函数啦

你可以把视频中创建工程的画面截个图，视频应该是创建的MFC，而你创建的是win32控制台程序。 如果想系统的学习C语言，建议从黑框框开始，如果只是想快速的写些小程序的话，不如直接去学易语言

没有入口函数，写个入口函数，然后把你的代码放进去

需要写在函数里面，放在全局区是错的

C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

#include <stdlib.h> int main() {     system("calc");     return 0; }

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

引用 9 楼 xnini632d 的回复:不放在main()里也成？求放上个视频截图来，膜拜下 没准C++11111标准出来后就真成了！

不放在main()里也成？求放上个视频截图来，膜拜下

视频里也没放，直接调试了，要做一个按钮，出计算器，可我就不对。

这个语句应放在函数中。

视频里没放那个，但就好使了，是要做一个按钮，按了出计算器。

你没放在 int main() { …… } 中。


Question: 关于 注册与登录 功能的问题，求解释；

我知道了，问题出现在这里： if(strcmp(users[i].mageraccount,ac)==0)         {             if(strcmp(users[i].magerpassword,pw)==0)                 break;        当我第一次密码或账号输错时，选择返回输入，程序执行magerlogin(即函数调用自身)，输入正确的账号和密码时，就会break，但此时只是break出了被调函数的magerlogin的while循环，而没有break出主调函数中的while循环（break只能跳出一层循环），此时主调函数的while循环已经完成了一次循环，由于在被调函数magerlogin后没有break，因此程序继续执行while循环，此时主调函数magerlogin中的ac与pw没有被重新赋值，因此会显示出与之前相同的结果。        解决方法： 一丶 if(strcmp(users[i].mageraccount,ac)==0)         {             if(strcmp(users[i].magerpassword,pw)==0)                 mager(); 即调用其他函数； 二丶  将  if(f==1)                     magerlogin(); 改成  if(f==1){                     magerlogin();                     break;               }

仅供参考 。 #include<stdio.h> #include<stdlib.h> #include<string.h>  void magerlogin() {     char ac[20], pw[20]; 	typedef struct users { 		char mageraccount[20]; 		char magerpassword[20]; 	} User; 	User users[100];     int i, f, count = 0, loginOK = 0; 	 	FILE *fp = fopen("userdata.dat", "rb+"); 	if(!fp) { 		printf("无法打开文件\n");		 		exit(0); 	}  	i = 0;     while(fread(&users[i++], sizeof(User), 1, fp) == 1); 	fclose(fp); 	count = i; 	     system("cls");     printf("             登录\n");     printf("------------------------------\n");     printf("    账号：");     scanf("%s", ac);	     printf("    密码：");     scanf("%s", pw);	     printf("------------------------------\n");	     	     i = 0; 	while(1) { 		while(i < count) { 			loginOK = (strcmp(users[i].mageraccount, ac) == 0) && (strcmp(users[i].magerpassword, pw) == 0); 			if(loginOK) break; 			i++; 		} 		if(loginOK) break; 		printf("账号或密码错误!\n"); 		printf("0.返回主菜单  1.返回输入\n请选择序号：\n"); 		scanf("%d", &f); 		if(f == 1) { 		    i = 0; 			coutinue; 		} 		break; 	} }

单步跟踪调试，观察每一步变量怎么变化的

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


Question: 急急急！！！大神们 求助 段错误

1，在分配内存处加错误处理if(NULL == q) ...。 2，用GDB或其他调试工具，检查是否有其他地方有越界访问。

将一个比如100GB的文件当作一个100GB的数组操作。 FILE *fb; fb=fopen("A100GB.bin","rb+");  读数组 unsigned char Value=BigArray[Index]; 对应 _fseeki64(fb,Index,SEEK_SET); fread(&Value,1,1,fb);  写数组 BigArray[Index]=Value; 对应 _fseeki64(fb,Index,SEEK_SET); fwrite(&Value,1,1,fb);  fclose(fb);

建议在每次malloc动态申请内存之后判断下q的值，先看下是否申请成功，如果因为异常情况，某一次内存申请失败了，那么q的值就是NULL了，但是你却当做正常情况去使用了，那么也会导致段错误。另外while循环外和循环内都有q=()malloc();看着感觉好重复，建议改成do...while循环

可能你电脑内存不够存那20万行数据

我是新手不太懂 能给我写一下代码吗？？

用文件读写模拟内存读写。

我用的虚拟机 有60个G的内存 应该怎么改呢

会不会是内存不够, 20万行就是200K行,就是0.2M行, 如果sizeof(word)为1K, 就是0.2G了.


Question: 这个是 刚刚发错了  为什么最后可以用buffer输出去除空格和标点的字符串数组

char *input = buffer; char *output = buffer; 去除空格和标点，是在buffer上直接修改的，就是常说的原址进行。处理完后，buffer由输入的字符串，变成了处理后的字符串了

你代码中的这段就实现了在相同的缓冲区中去掉了空格：   	while(*input != '\0') 	{ 		if(ispunct(*input) || isspace(*input)) 		{ 			++input; 			continue; 		} 		else 			*output++ = *input++;  	} 	*output = '\0';

除去字符串中标点或空格：  #include <stdio.h> #include <ctype.h> char *fun(char *str) { 	int i, j; 	i = j = 0; 	while (str[i] = str[j++]) { 		if (!(ispunct(str[i]) || isspace(str[i]))) { 			i++; 		} 	} 	return str; } int main(void) { 	char str[] = "zh,a.ng x'iang"; 	printf("%s\n", fun(str)); 	return 0; } //zhangxiang

第二个while里面的if    else  有两个指针访问数组。一个指针input负责遍历数组找异常字符，另一个指针output负责纠正异常字符

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


Question: c里面的字符串常量

#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

c[0] = ... ; c[1] = ... ; 都没有改字符串，只是把另一个字符串常量的首地址存入指针数组元素中了，或者说，给指针变量赋值了

常量区的数据不可更改  你两次编译的程序没有任何可经性

理解 char *c[5]; 的含义：c是一数组，数组元素个数是5，每一个元素的类型是char *，对吗？ 而c[1] = "cccc"; 改变的不是什么常量区，改变的只不过是元素c[1]的值。  至于&c[i]和c[i] ? &c[i]是元素c[i]的地址，数组不变，元素地址自然不会变，对吗？

&c[i]和c[i]是不一样的 c是一个数组，数组存储的是char* 指针，对于&c[i]这个指的是数组c第i个元素的地址，    printf("%p\n",c[0]);     printf("%p\n",c[1]);     printf("%p\n",c[2]); 而上面指的是，数组c中第i个元素指向的指针，改变了c中元素的值，上面的数据自然会发生变化


引用 1 楼 user-2 的回复:消息分同步消息和异步消息， 异步消息是放到消息列队中，GetMessage就是循环处理消息队列中的异步消息，如果没有Get并remove，消息自然是还在队列里的，怎么可能会执行不到？ 而同步消息不走消息队列，而是直接调用窗口事件处理回调函数。 至于WM_CREATE到底是同步还是异步，我不记得了，反正不会丢失就是。 刚才我也看到了，getmessage是针对用户输入的

在《Windows环境下32位汇编语言程序设计》这本书中专门说到了这个问题，并不是所有的消息都是经过消息循环的，你注释了DispatchMessage后，窗口过程仍能接收到一些消息，他们是WINDOWS直接调用的  具体内容我帮你搜索到了，可以看：http://www.docin.com/p-1017074976.html， 只用看链接中实验二的部分

引用 2 楼 agfav12 的回复:[quote=引用 1 楼 user-2 的回复:] 消息分同步消息和异步消息， 异步消息是放到消息列队中，GetMessage就是循环处理消息队列中的异步消息，如果没有Get并remove，消息自然是还在队列里的，怎么可能会执行不到？ 而同步消息不走消息队列，而是直接调用窗口事件处理回调函数。 至于WM_CREATE到底是同步还是异步，我不记得了，反正不会丢失就是。 刚才我也看到了，getmessage是针对用户输入的[/quote] 那可不一定，WM_PAINT也是异步的。


Question: 求教，链表出现问题，本人实在想不出什么原因了

p1 = scanf_s(...) 这句中把 p1 = 去掉

是不是链表的next指针没有赋空，如果这样的话，可能会有越界的异常

malloc失败了，再试试呗

谢谢楼上两位，还是自己粗心，错的真多


Question: 大家来挑错

就程序本身来说没看出什么错误。如果按功能说，也请楼主说明目的。

#include<stdio.h> void main() { 	int a, b, c; 	int i; 	for (i = 100; i<1000; i++) 	{ 		a = i % 10; 		b = (i / 10) % 10; 		c = (i / 100) % 10; 		if (a*a*a + b*b*b + c*c*c == i) 			printf("%d\t\n", i); 	} }

c～ i/100，嘻嘻，在这里也能找到你

楼上正确！

c = i / 100;

这个是水仙花吧


Question: 请问怎么用C编写一个记事本,一定要用其他的东西才能完成吗?单独用C可以完成吗?具体的思路是怎么样的呢?求高手指点!

参考Notepad++源代码。

刚在你那个帖子里面回了下，这里就提到API了。  可以查下windows api的资料 XD

看来是不懂，找本windows程序设计的书看吧，里面有现成的

熟悉系统API就行, Edit控件从底层开始写那是相当费时间。 lz看来是几乎没有基础就来找建议的，不过这东西，多练练自然就会了

你涉及到窗口等东西就和平台有关，就需要用平台提供的API等来实现


Question: 第一次在这发帖，有循环结构的问题，求解释，急！！

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

在Dedug后，我发现了原来问题在  if(strcmp(users[i].mageraccount," ")==0) 上，users[i].mageraccount不应该与空格字符相等，而是应该 写成  if(strcmp(users[i].mageraccount,"")==0) ，这样循环问题就解决了，可是出现了新的问题，不过，还是谢谢大家给我解答。

引用 16 楼 ysmz555 的回复:fread()函数用于读取实型，整型等数据块，读结构型中的字符串成员会出现一定的乱码。你用fgets()函数读就能正常。 用fread也可以读字符型的吧，之前我用fread读字符型的学生姓名时，也出现了乱码，后来问老师才知道，应该把结构体中的字符型学生姓名定义为字符数组，而不是字符指针，定义为字符指针时，在读取文件时，系统不知道指针的具体内存大小，所以会出现乱码，但定义为数组，就必须要指定数组的大小，也就是说在读取文件时，系统可以知道数组的内存大小，就不会出现乱码了；感觉在读取结构体数据时，用fgets不太好用

在调试下运行，出错了点中断，通过调用堆栈定位到出错位置，观察分析原因

看不清代码？

引用 12 楼 grtorange 的回复:我怀疑是两点：  1.fread语句后面少了逗号； 2.fread(&users[i],sizeof(User),1,fp)是不是应该改成fread(&users[i], 1, sizeof(User), fp) 我学的是把1放在前面的。 1.分号；加上去也会有同样的问题； 2.但我学的是 1 放后面，我想是都可以的，因为编译器没有报错，那就是都可以的，语法上没有问题，关键就是逻辑思路上的问题

引用 11 楼 ysmz555 的回复:你登录是要输入帐号的，也就是与你从文件中读出来的数据对比，如果对上了就停止循环，关闭文件是不？可每读一次文件数据存放到users中，再用strcmp函数比较users中的mageraccount 成员是否为空，如果空则结束。帐号是空格字符？有点不明白。 我试着按照你的思路去写，但依然出现了同样的问题，代码在下面； void magerlogin() {     char ac[20];     char pw[20];     int i=0;     int f;     system("cls");     printf("             登录\n");     printf("------------------------------\n");     printf("    账号：");     scanf("%s",ac);     printf("    密码：");     scanf("%s",pw);     printf("------------------------------\n");      FILE*fp=fopen("userdata.dat","rb+");     //for(i=0; i<100; i++)     while(1)     {          fread(&users[i],sizeof(User),1,fp);//userdata.dat里有数据；         if(strcmp(users[i].mageraccount,ac)==0)//users[i].mageraccount已定义；         {             if(strcmp(users[i].magerpassword,pw)==0)                 break;             else             {                 getchar();                 printf("密码输入错误!!请重新输入\n\n");                 printf("0.返回主菜单  1.返回输入\n\n");                 printf("请选择序号：");                 scanf("%d",&f);                 if(f==0)                     vice_main();                 if(f==1)                     magerlogin();                 //getchar();              }         }          else if(strcmp(users[i].mageraccount," ")==0)                 //else if(users[i].mageraccount==0)             {                 getchar();                 printf("   账号不存在!!请重新输入\n\n");                 printf("0.返回主菜单  1.返回输入\n\n");                 printf("请选择序号：");                 scanf("%d",&f);                 if(f==0)                     vice_main();                 if(f==1)                     magerlogin();              }             else             {                 i++;                 continue;             }      }         fclose(fp);

引用 11 楼 ysmz555 的回复:你登录是要输入帐号的，也就是与你从文件中读出来的数据对比，如果对上了就停止循环，关闭文件是不？可每读一次文件数据存放到users中，再用strcmp函数比较users中的mageraccount 成员是否为空，如果空则结束。帐号是空格字符？有点不明白。 我的思路是先把二进制文件中的数据全部读取出来，当users[i].mageraccount与空格字符相等时，就意味着文件里已经没有已写入的数据了，这时就BREAK，然后在进行比较，我的比较函数写在后面，如下图

引用 9 楼 ysmz555 的回复:fread(&users[i],sizeof(User),1,fp)    这条语句没加分号吧 匆忙之间忘加了，但这不是主要问题，我是出了编译器无法检测出的问题，也就是程序语法上没问题，但运行程序时会停止，如图二所示，也就是出了逻辑问题

引用 7 楼 wang0635 的回复:[quote=引用 6 楼 qq_33819764 的回复:] [quote=引用 3 楼 wang0635 的回复:] 怀疑： while循环中，一直没有break出来，一直往下读文件，却早已读到文件尾了，仍坚持循环读。 我也觉得是这个原因，但不懂为什么break不出来；我的 if 条件是 users[i].mageraccount 与 " " 相等时就break,也就是读到文件里 users[i].mageraccount等于空时就break ，应该可以的，不懂为什么不行，之前 换了 条件 ，改成 if (0== fread(&users[i],sizeof(User),1,fp)),就break ,但也不行，换了 很多条件都不行， 将 mageraccount 改成了 Int 型，条件改成 if (users[i].mageraccount==0),就break，也不行，很多方法都试过了，不行，所以来求助了(⊙v⊙)(⊙v⊙)[/quote] 要看你的userdata.dat文件中到底是怎么存的，存的什么样的内容[/quote] 使用二进制的方式存的，用记事本打开会显示乱码，我目前就存了两组数据，一个账号和密码是都625，另一个账号和密码都是123  之前我写注册的代码时也遇到了和 登录功能 类似的问题，于是我就直接把 注册 代码 用 FILE*fp=fopen("userdata.dat","ab+"); 这种形式 写了  但现在 登录 不能这样写，所以我就不懂 了

引用 6 楼 qq_33819764 的回复:[quote=引用 3 楼 wang0635 的回复:] 怀疑： while循环中，一直没有break出来，一直往下读文件，却早已读到文件尾了，仍坚持循环读。 我也觉得是这个原因，但不懂为什么break不出来；我的 if 条件是 users[i].mageraccount 与 " " 相等时就break,也就是读到文件里 users[i].mageraccount等于空时就break ，应该可以的，不懂为什么不行，之前 换了 条件 ，改成 if (0== fread(&users[i],sizeof(User),1,fp)),就break ,但也不行，换了 很多条件都不行， 将 mageraccount 改成了 Int 型，条件改成 if (users[i].mageraccount==0),就break，也不行，很多方法都试过了，不行，所以来求助了(⊙v⊙)(⊙v⊙)[/quote] 要看你的userdata.dat文件中到底是怎么存的，存的什么样的内容

引用 3 楼 wang0635 的回复:怀疑： while循环中，一直没有break出来，一直往下读文件，却早已读到文件尾了，仍坚持循环读。 我也觉得是这个原因，但不懂为什么break不出来；我的 if 条件是 users[i].mageraccount 与 " " 相等时就break,也就是读到文件里 users[i].mageraccount等于空时就break ，应该可以的，不懂为什么不行，之前 换了 条件 ，改成 if (0== fread(&users[i],sizeof(User),1,fp)),就break ,但也不行，换了 很多条件都不行， 将 mageraccount 改成了 Int 型，条件改成 if (users[i].mageraccount==0),就break，也不行，很多方法都试过了，不行，所以来求助了(⊙v⊙)(⊙v⊙)

引用 2 楼 paschen 的回复:在调试下运行，出错了点中断，通过调用堆栈定位到出错位置，观察分析原因 调试是指Debug吧，但不会调用堆栈(⊙v⊙)(⊙v⊙)

引用 1 楼 zhangxiangDavaid 的回复:看不清代码？ void magerlogin() {     char ac[20];     char pw[20];     int i=0;     int f;     system("cls");     printf("             登录\n");     printf("------------------------------\n");     printf("    账号：");     scanf("%s",ac);     printf("    密码：");     scanf("%s",pw);     printf("------------------------------\n");      FILE*fp=fopen("userdata.dat","rb+");     while(1)     {          fread(&users[i],sizeof(User),1,fp)//userdata.dat里有数据；         if(strcmp(users[i].mageraccount," ")==0)//users[i].mageraccount已定义；             break;            i++;         }     fclose(fp);


Question: 一个非常小的C程序，却找不出错误在哪里？帮帮我吧

引用 7 楼 zhangxiangDavaid 的回复:读入两个整数，直接  scanf("%d%d\n",&a,&b);  即可 个人觉得还是不要再scanf语句里用上\n尾号，不然输入的时候其实很大程度上会忘记末尾\n

scnaf里面多了一个回车\n

scanf("   \n");这个\n去掉，不去掉系统无法判断你是否输入的数字完整了，然后你再输入你个数字，系统检测到了这个数字就判定你前面的输完了。

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

引用 8 楼 grtorange 的回复:[quote=引用 7 楼 zhangxiangDavaid 的回复:] 读入两个整数，直接  scanf("%d%d\n",&a,&b);  即可  直接%d%d怎么判断输入的是一个数还是两个数……[/quote] 依据scanf的返回值

引用 7 楼 zhangxiangDavaid 的回复:读入两个整数，直接  scanf("%d%d\n",&a,&b);  即可  直接%d%d怎么判断输入的是一个数还是两个数……

读入两个整数，直接  scanf("%d%d\n",&a,&b);  即可

1.从缓冲区读走一个字符，相当于清除缓冲区 2.前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'（输入完s[i]的值后按回车键所致），所以如果不在此加一个getchar()把这个回车符取走的话，gets(）就不会等待从键盘键入字符，而是会直接取走这个“无用的”回车符，从而导致读取有误 3. getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab) getchar()使用不方便,解决方法： （1）使用下面的语句清除回车： while(getchar()!='\n'); （2）用getche()或getch()代替getchar()，其作用是从键盘读入一个字符（不用按回车），注意要包含头文件<conio.h> 4. getchar()是stdio.h中的库函数，它的作用是从stdin流中读入一个字符，也就是说，如果stdin有数据的话不用输入它就可以直接读取了，第一次getchar()时，确实需要人工的输入，但是如果你输了多个字符，以后的getchar()再执行时就会直接从缓冲区中读取了。 实际上是 输入设备->内存缓冲区->程序getchar 你按的键是放进缓冲区了,然后供程序getchar 你有没有试过按住很多键然后等一会儿会滴滴滴滴响,就是缓冲区满了,你后头按的键没有存进缓冲区. 键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到'\n'.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符.如果需要取消'\n'的影响,可以用getchar();来清除,这里getchar();只是取得了'\n'但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符.还要注意的是这里你在键盘上输入ssss看到的回显正是来自于getchar的作用,如果用getch就看不到你输入了什么.

Scanf中尽量不要使用非输入控制符，尤其是不要用\n

去掉scanf里的\n 因为用空白符结尾时，scanf会跳过空白符去读下一个字符，所以你必须再输入一个数   #include<stdio.h> int main() { 	int a,b; 	printf("please input number by accident:\n"); 	scanf("%d,%d",&a,&b);/*此处容易忘记a.b前的&，取值符*/   	printf("the result is:%d.\n",(a>=b)?a:b); }

scanf("%d,%d",&a,&b);中的%d,%d中的逗号去掉为最好。

scanf("%d,%d",&a,&b);

scanf("%d,%d",&a,&b);


Question: tm  time_t 转化的问题

因为和你时区有关

了解一下。。。。

学习这些Windows Time相关的API的用法。

或者参考这个：#include <afxdisp.h> #include <stdio.h> #include <stdlib.h> int main(int argc, TCHAR* argv[]) {     COleDateTime t;     COleDateTimeSpan ts;     CString s,fmt;     int nYear;     int nMonth;     int nDay;     int nHour;     int nMin;     int nSec;     int lDays;     int nHours;     int nMins;     int nSecs;     int i,N;     // initialize MFC and print and error on failure     if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {         printf("Fatal Error: MFC initialization failed\n");         return 1;     }     if (argc<13) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 2;     }     if (stricmp(argv[12],"SQL")==0) fmt="%Y-%m-%d %H:%M:%S";     else if (stricmp(argv[12],"YYYY")==0) fmt="%Y%m%d %H%M%S";     else if (stricmp(argv[12],"YY")==0) fmt="%y%m%d %H%M%S";     else {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 3;     }     nYear =atoi(argv[ 1]);     nMonth=atoi(argv[ 2]);     nDay  =atoi(argv[ 3]);     nHour =atoi(argv[ 4]);     nMin  =atoi(argv[ 5]);     nSec  =atoi(argv[ 6]);     lDays =atoi(argv[ 7]);     nHours=atoi(argv[ 8]);     nMins =atoi(argv[ 9]);     nSecs =atoi(argv[10]);     N     =atoi(argv[11]);     if (N<=0) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 4;     }     t=COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec);     ts=COleDateTimeSpan( lDays, nHours, nMins, nSecs );     for (i=1;i<=N;i++) {         s=t.Format(fmt);         printf("%08d %s\n",i,s);         t=t+ts;     }     return 0; }

引用 1 楼 paschen 的回复:返回的是从1970年1月1日的秒数  另外需要考虑一个问题，如果返回很早前到现在的秒数，在32位时（__time32_t）是否会溢出  是返回从1970年1月1日的秒计数，所以上述代码得到的应该是一天的秒计数为3600 * 24 = 86400， 请问为什么不是？

引用 2 楼 zhao4zhong1 的回复:FILETIME The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601.   typedef struct _FILETIME { // ft      DWORD dwLowDateTime;      DWORD dwHighDateTime;  } FILETIME;    Members dwLowDateTime  Specifies the low-order 32 bits of the file time.  dwHighDateTime  Specifies the high-order 32 bits of the file time.  Remarks It is not recommended that you add and subtract values from the FILETIME structure to obtain relative times. Instead, you should   Copy the resulting FILETIME structure to a LARGE_INTEGER structure.  Use normal 64-bit arithmetic on the LARGE_INTEGER value.  QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in winbase.h.  See Also Time Overview, Time Structures, CompareFileTime, GetFileTime, LARGE_INTEGER      Time Functions The following functions are used with time.        CompareFileTime   DosDateTimeToFileTime   FileTimeToDosDateTime   FileTimeToLocalFileTime   FileTimeToSystemTime   GetFileTime   GetLocalTime   GetSystemTime   GetSystemTimeAdjustment   GetSystemTimeAsFileTime   GetTickCount   GetTimeZoneInformation   LocalFileTimeToFileTime   SetFileTime   SetLocalTime   SetSystemTime   SetSystemTimeAdjustment   SetTimeZoneInformation   SystemTimeToFileTime   SystemTimeToTzSpecificLocalTime  老师你想说明啥？


Question: 今天因为不是很懂gets用法和strlen然后就破天荒想了一种东西

要确定前面输入的回车会不会被赋值到c

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

引用 8 楼 弓长羊羽的回复:[quote=引用 6 楼 KEYboarderQQ 的回复:] [quote=引用 4 楼 弓长羊羽的回复:]gets()会在最后加上结束符， 而你这里没有这个操作。 还是wa......zoj 2851那样的输入[/quote] gets()以换行作为结束标志，空格不行，所以wa......zoj 2851会被一次性读入。[/quote] 我的那个循环也是以换行作为标志，把一个字符串塞进一个数组。

引用 6 楼 KEYboarderQQ 的回复:[quote=引用 4 楼 弓长羊羽的回复:]gets()会在最后加上结束符， 而你这里没有这个操作。 还是wa......zoj 2851那样的输入[/quote] gets()以换行作为结束标志，空格不行，所以wa......zoj 2851会被一次性读入。

引用 5 楼 花海_的回复:你用gets(s[i])的话，编译器会自动在最后加一个'\0'，表示字符串终止。你要是用上面那循环的话，就没有这个。 赞同，需要你加上最后的结束标志

引用 4 楼 弓长羊羽的回复:gets()会在最后加上结束符， 而你这里没有这个操作。 还是wa......zoj 2851那样的输入

gets()会在最后加上结束符， 而你这里没有这个操作。

至少  s[i][j]=c;  改为  s[i][k]=c;

引用 1楼花海_ 的回复:你for循环的判断条件都没有，你确定程序没报错吗那里不是有个break么……

你for循环的判断条件都没有，你确定程序没报错吗


Question: if, else if, else中，else下面的scanf函数为什么不执行？

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

引用 6 楼 qq_31984717 的回复:1.从缓冲区读走一个字符，相当于清除缓冲区 2.前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'（输入完s[i]的值后按回车键所致），所以如果不在此加一个getchar()把这个回车符取走的话，gets(）就不会等待从键盘键入字符，而是会直接取走这个“无用的”回车符，从而导致读取有误 3. getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab) getchar()使用不方便,解决方法： （1）使用下面的语句清除回车： while(getchar()!='\n'); （2）用getche()或getch()代替getchar()，其作用是从键盘读入一个字符（不用按回车），注意要包含头文件<conio.h> 4. getchar()是stdio.h中的库函数，它的作用是从stdin流中读入一个字符，也就是说，如果stdin有数据的话不用输入它就可以直接读取了，第一次getchar()时，确实需要人工的输入，但是如果你输了多个字符，以后的getchar()再执行时就会直接从缓冲区中读取了。 实际上是 输入设备->内存缓冲区->程序getchar 你按的键是放进缓冲区了,然后供程序getchar 你有没有试过按住很多键然后等一会儿会滴滴滴滴响,就是缓冲区满了,你后头按的键没有存进缓冲区. 键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到'\n'.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符.如果需要取消'\n'的影响,可以用getchar();来清除,这里getchar();只是取得了'\n'但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符.还要注意的是这里你在键盘上输入ssss看到的回显正是来自于getchar的作用,如果用getch就看不到你输入了什么. 大致明白是怎么回事了。我又试了下scanf("%d", &number);这种情况下就不存在自动跳过的情况，是不是因为'\n'是%c型而不能转换成%d型的缘故啊？

引用 4 楼 qq_31984717 的回复:你是else的那个scanf被跳过了吗 对的，整个else都执行就是不执行scanf()。

后面的那个可以这样写 scanf(" %c", &character_command); 就把前面的回车跳过去了

你是else的那个scanf被跳过了吗

引用 2 楼 zhangxiangDavaid 的回复:在每个scanf前加上 rewind(stdin); 可以了，非常感谢。 查了下百科，没看明白，能通俗的解释下是怎么回事吗？

在每个scanf前加上 rewind(stdin);

这个是运行的结果：


Question: 研究RSA的时候发现的一个BUG，很有意思，希望大家帮忙找找这个BUG是什么原因

哎  试过了 看不出什么东西 在调试内存的时候 发现realloc会多覆盖两个字节 估计是这个原因 当主函数 tmp分配的空间大的时候 则不会出现这个问题 我在想 估计是realloc覆盖造成的

点最左边那个中断按钮，然后通过调用堆栈、变量窗口等观察分析原因


Question: c 考虑每个月实际天数及闰年

不同情况不同判断，把28天（29天）、30天、31天的月分别运行不同分支

帮你改成如下，测试了几个没问题，但可能有些情况我没考虑到，楼主可以再在上面进行改进   #include <stdio.h> struct date_rec { 	int day ; 	int month ; 	int year ; } ;  struct date_rec current_date ;  int main() { 	int flag = 1 ; //闰年为1 平年为0 	printf("输入日期: "); 	scanf("%d",¤t_date.day); 	printf("输入月份: "); 	scanf("%d",¤t_date.month); 	printf("输入年份: "); 	scanf("%d",¤t_date.year);  	current_date.day += 1 ;  	//判断闰年 	if( ( current_date.year % 4 == 0 && ( current_date.year % 100 ) != 0 ) || current_date.year % 400 == 0 ) 		flag = 1; 	else 		flag = 0;  start: 	if( current_date.month == 2  ) 	{ 		if( current_date.day > (flag == 1 ? 29 : 28) ) 		{ 			current_date.day -= (flag == 1 ? 29 : 28); 			current_date.month++ ; 			goto start; 		} 	} 	else if( (current_date.month == 1 || current_date.month == 3 || current_date.month == 5 || current_date.month == 7 || current_date.month == 8 || current_date.month == 10 || current_date.month == 12) && current_date.day > 31) 	{ 		if( current_date.day > 31 ) 		{ 			current_date.day -= 31 ; 			current_date.month++ ; 			goto start; 		} 	} 	else if ( current_date.month == 4 || current_date.month == 6 || current_date.month == 9 || current_date.month == 11) 	{ 		if( current_date.day > 30 ) 		{ 			current_date.day -= 30 ; 			current_date.month++ ; 			goto start; 		} 	} 	while( current_date.month > 12 ) 	{ 		current_date.month -= 12 ; 		current_date.year++ ; 	}   	if( flag == 1 ) 	{ 		printf("%d 年%d 月 %d 号(闰年)\n",current_date.year,current_date.month,current_date.day); 	} 	else 	{ 		printf("%d 年%d 月 %d 号(平年)\n",current_date.year,current_date.month,current_date.day); 	} }

引用 3 楼 user-1 的回复:[quote=引用 2 楼 qq_33341459 的回复:] 这年月日 是要自己输入进去的，加一天再将结果输出。   比如输入2008年2月29号，加一天输出应该是2008年3月1号  你就分几种请问讨论不就行了，按月有几天来分，其中二月这种情况又继续分为是否是闰年[/quote] #include <stdio.h> struct date_rec { 	int day ; 	int month ; 	int year ; } ;  struct date_rec current_date ;  int main() { 	int flag = 1 ; //闰年为1 平年为0 	printf("输入日期: "); 	scanf("%d",¤t_date.day); 	printf("输入月份: "); 	scanf("%d",¤t_date.month); 	printf("输入年份: "); 	scanf("%d",¤t_date.year);  	current_date.day += 1 ;  	//判断闰年 	if( ( current_date.year % 4 == 0 && ( current_date.year % 100 ) != 0 ) || current_date.year % 400 == 0 ) 	{ 		if( current_date.month == 2 && current_date.day > 29 ) 		{ 			current_date.day -= 29 ; 			current_date.month++ ; 		} 		if( current_date.month == 1 || current_date.month == 3 || current_date.month == 5 || current_date.month == 7 || current_date.month == 8 || current_date.month == 10 || current_date.month == 12) 		{ 			while( current_date.day > 31 ) 			{ 				current_date.day -= 31 ; 				current_date.month++ ; 			} 		} 		else if ( current_date.month == 4 || current_date.month == 6 || current_date.month == 9 || current_date.month == 11) 		{ 			while( current_date.day > 30 ) 			{ 				current_date.day -= 30 ; 				current_date.month++ ; 			} 		} 		while( current_date.month > 12 ) 		{ 			current_date.month -= 12 ; 			current_date.year++ ; 		} 	}  	else 	{ 		if( current_date.month == 2 && current_date.day > 28 ) 		{ 			current_date.day -= 28 ; 			current_date.month++ ;  		} 		if( current_date.month == 1 || current_date.month == 3 || current_date.month == 5 || current_date.month == 7 || current_date.month == 8 || current_date.month == 10 || current_date.month == 12) 		{ 			while( current_date.day > 31 ) 			{ 				current_date.day -= 31 ; 				current_date.month++ ; 			} 		} 		else if ( current_date.month == 4 || current_date.month == 6 || current_date.month == 9 || current_date.month == 11) 		{ 			while( current_date.day > 30 ) 			{ 				current_date.day -= 30 ; 				current_date.month++ ; 			} 		} 		while( current_date.month > 12 ) 		{ 			current_date.month -= 12 ; 			current_date.year++ ; 		} 		flag = 0 ; 	} 	 	if( flag == 1 ) 	{ 		printf("%d 年%d 月 %d 号(闰年)\n",current_date.year,current_date.month,current_date.day); 	} 	else 	{ 		printf("%d 年%d 月 %d 号(平年)\n",current_date.year,current_date.month,current_date.day); 	} } 请问哪里出问题了

#include <stdio.h> struct date_rec { 	int day ; 	int month ; 	int year ; } ;  struct date_rec current_date ;  int main() { 	int flag = 1 ; //闰年为1 平年为0 	printf("输入日期: "); 	scanf("%d",¤t_date.day); 	printf("输入月份: "); 	scanf("%d",¤t_date.month); 	printf("输入年份: "); 	scanf("%d",¤t_date.year);  	current_date.day += 1 ;  	//判断闰年 	if( ( current_date.year % 4 == 0 && ( current_date.year % 100 ) != 0 ) || current_date.year % 400 == 0 ) 	{ 		if( current_date.month == 2 && current_date.day > 29 ) 		{ 			current_date.day -= 29 ; 			current_date.month++ ; 		} 		if( current_date.month == 1 || current_date.month == 3 || current_date.month == 5 || current_date.month == 7 || current_date.month == 8 || current_date.month == 10 || current_date.month == 12 && current_date.day > 31 ) 		{ 			current_date.day -= 31 ; 			current_date.month++ ; 		} 		else if ( current_date.month == 4 || current_date.month == 6 || current_date.month == 9 || current_date.month == 11 && current_date.day > 30 ) 		{ 			current_date.day -= 30 ; 			current_date.month++ ; 		} 		while( current_date.month > 12 ) 		{ 			current_date.month -= 12 ; 			current_date.year++ ; 		} 	}  	else 	{ 		if( current_date.month == 2 && current_date.day > 28 ) 		{ 			current_date.day -= 28 ; 			current_date.month++ ;  		} 		if( current_date.month == 1 || current_date.month == 3 || current_date.month == 5 || current_date.month == 7 || current_date.month == 8 || current_date.month == 10 || current_date.month == 12 && current_date.day > 31 ) 		{ 			current_date.day -= 31 ; 			current_date.month++ ; 		} 		else if ( current_date.month == 4 || current_date.month == 6 || current_date.month == 9 || current_date.month == 11 && current_date.day > 30 ) 		{ 			current_date.day -= 30 ; 			current_date.month++ ; 		} 		while( current_date.month > 12 ) 		{ 			current_date.month -= 12 ; 			current_date.year++ ; 		} 		flag = 0 ; 	} 	 	if( flag == 1 ) 	{ 		printf("%d 年%d 月 %d 号(闰年)\n",current_date.year,current_date.month,current_date.day); 	} 	else 	{ 		printf("%d 年%d 月 %d 号(平年)\n",current_date.year,current_date.month,current_date.day); 	} }

引用 2 楼 qq_33341459 的回复:这年月日 是要自己输入进去的，加一天再将结果输出。   比如输入2008年2月29号，加一天输出应该是2008年3月1号  你就分几种请问讨论不就行了，按月有几天来分，其中二月这种情况又继续分为是否是闰年


Question: 求教？各位大神怎么用C语言实现试凑法？

仅供参考：/*--------------------------------------- 函数型计算器(VC++6.0,Win32 Console)程序由 yu_hua 于2007-07-27设计完成 功能： 目前提供了10多个常用数学函数:     ⑴正弦sin     ⑵余弦cos     ⑶正切tan     ⑷开平方sqrt     ⑸反正弦arcsin     ⑹反余弦arccos     ⑺反正切arctan     ⑻常用对数lg     ⑼自然对数ln     ⑽ｅ指数exp     ⑾乘幂函数∧ 用法： 如果要求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 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;         }     return x; } double calc(char *expr,char **addr) {     static int deep; //递归深度     static char *fname[]={ "sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp",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=='^') {             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] = pow(ST[ist-1],ST[ist]);break;                     }                 } while (iop);                 op[iop++] = c;             } else if (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] = 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] = pow(ST[ist-1],ST[ist]);break;         }     }     return ST[0]; } int main(int argc,char **argv) {     //1 2 3 4 5 6 7 8 9 ＝110 中间可以挿＋ － 或者不挿 如果1 2 不挿的话 就是12     char op[4]=" +-";     int g1;     int g2;     int g3;     int g4;     int g5;     int g6;     int g7;     int g8;      for (g1=0;g1<3;g1++)     for (g2=0;g2<3;g2++)     for (g3=0;g3<3;g3++)     for (g4=0;g4<3;g4++)     for (g5=0;g5<3;g5++)     for (g6=0;g6<3;g6++)     for (g7=0;g7<3;g7++)     for (g8=0;g8<3;g8++) {         strcpy(s,"1 2 3 4 5 6 7 8 9");         s[ 1]=op[g1];         s[ 3]=op[g2];         s[ 5]=op[g3];         s[ 7]=op[g4];         s[ 9]=op[g5];         s[11]=op[g6];         s[13]=op[g7];         s[15]=op[g8];         if (110.0==calc(s,&endss)) printf("%s=110\n",s);     }     /*     if (argc<=1) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算函数表达式的值。"<<endl<<"支持(),+,-,*,/,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp"<<endl;         while (1) {             cout << "请输入表达式：";             gets(s);             if (s[0]==0) break;//             cout << s <<"=";             cout << setprecision(15) << calc(s,&endss) << endl;         }     } else {         strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;         if (argc>=3) {             pcs=atoi(argv[2]);             if (pcs<0||15<pcs) pcs=15;             printf("%.*lf\n",pcs,calc(s,&endss));         } else {             printf("%.15lg\n",calc(s,&endss));         }     }     */     return 0; } //123+4+5+67-89=110 //123+4-5-6-7-8+9=110 //123-4+5-6-7+8-9=110 //123-4-5+6+7-8-9=110 //12+34+56+7-8+9=110 //12+3+45+67-8-9=110 //12-3+4-5+6+7+89=110 //1+234-56-78+9=110 //1+2+34+5+67-8+9=110 //1-2+3+45-6+78-9=110

枚举呗，把所有的都对比一遍就行了

枚举法，应该就可以了吧 如果是逻辑推理，或者，自然语言处理 那需要规则 否则，只是一些条件数据的罗列，枚举法就好

实现“试凑法”？


Question: Linux下thread,fork, 直接调用速度比较，为什么直接调用快好多阿？

pthread_create 创建线程 fork 创建进程

计时时间开始在循环里的

很简单，创建线程或进程也是需要时间的嘛


Question: （1 3 2 17 6 5 4 18 19 10）帮我构建平衡二叉树

平衡树的插入算法，根据数据结构与算法写的 http://blog.csdn.net/liehu232/article/details/50577243

参看《算法导论》中红黑树部分


Question: C语言 小数用乘法变成整数小问题

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

浮点不能精确表示,不能重复乘10,这样会造成累积误差,如下处理试一下        long long i;         for(i=1;;i*=10){             double z =a*i;             if(z-(int)z<1e-12)                 break;         }        z=a*i;

#include<stdio.h> int main() { float a; int z; while(scanf("%f",&a)!=EOF) { do { a=a*10; } while((int)a!=a); z=(int)a;//强制转换一下吧 printf("%d\n",z); } return 0; }

用完scanf记得加getchar（）或者fflush（stdin）清空字符流

浮点数在内存中是有误差的，所以比较浮点数不要直接比较是否相等，应该比较两数相减后绝对值是否足够小  单步跟踪你程序就会发现，程序比较：2345与2345.0000000000005得出不相等，所以循环一直继续

一种“偷懒”的做法：  #include <stdio.h> #include <string.h> char str[50]; double d; int r; char *removePoint(char *s) { 	if (NULL == s)return s; 	int i = 0; 	while (s[i] && s[i] != '.') { 		i++; 	} 	if (s[i]) { 		memmove(s + i, s + i + 1, strlen(s) - i + 1); 	} 	return s; } int main(void){ 	while (1) { 		r = scanf("%lf", &d); 		if (r != 1)break; 		sprintf(str, "%g", d); 		printf("%s\n", removePoint(str)); 	} 	return 0; } //1.2345 //12345 //123.456 //123456


Question: 简单的helloworld程序，gcc链接出错

应该是编译器问题，你重新转gcc，不然就找别人的系统来编一下 不然就重新找个linux系统来装起试试看

后面写错，argv

int  main (int argc,char** argc )试试

gcc是编译汇编链接的一脚本，链接阶段出现的crash是因为编译阶段出现了异常，传递给链接器的地址存在问题，是编译器的问题，请重新安装gcc，设置一下再试试

这哥们跟你一样的错误，看看吧http://zhidao.baidu.com/link?url=MqTPJmKukI75glDFUuhQzB5R4cb7ND2rNiyUphfNXYhTx2LOGAvuY5q2vVvGYoTrIcWlIpwexAnpWAywvFx_o_

用的啥版本的ubuntu？啥版本的gcc？看来是你的ld不能运行，重装gcc不行就重装ubuntu

引用 9 楼 Z_R_Z_798205 的回复:ld --verbose 输出之后看链接文件有没有错误  段错误（核心已转存）

ld --verbose 输出之后看链接文件有没有错误

重新安装gcc

把这个文件放别的机器上试试

吧多余的空行去掉试试。

引用 3 楼 ynsenyu 的回复:用root，很不好的习惯，试试普通用户编译看看  没有解决问题

用root，很不好的习惯，试试普通用户编译看看

引用 1 楼 zhangxiangDavaid 的回复:这种代码出错了，百度吧，太离谱了！  ------------------------------  你确定这个是简单的问题？ 我弄了一段时间，查过的方向：GCC版本问题——升级无果；GCC安装环境——重新配置无果

这种代码出错了，百度吧，太离谱了！


Question: C语言高手请进：这个分块求和C语言程序问题出在哪里？对一组无规律数据按正数、负数和零分块求和

引用 8 楼 topxjl 的回复:[quote=引用 7 楼 zhangxiangDavaid 的回复:] [quote=引用 6 楼 topxjl 的回复:] David 大师的代码让人惊奇！ 哪里惊奇？是哪里错了吗？[/quote] 您的代码是专家级别，水平高，大赞！！！[/quote] 哎，这年头专家可多了！不值一提

引用 6 楼 topxjl 的回复:David 大师的代码让人惊奇！ 哪里惊奇？是哪里错了吗？

David 大师的代码让人惊奇！

引用 3 楼 topxjl 的回复:[quote=引用 2 楼 paschen 的回复:] 数组初始化赋值用大括号：int source[100] = { 2, 3, 8, 6, 0, 0, -2, -1, -4, 0, 5, 6, 7, -5, -2 };  target[i] = target[i - 1] + source[i] 这句后面没有分号  r 变量 没有定义  for循环用的是分号不是逗号  for (j = 1, j <= 100, j++)  楼主先把基础打好先  谢谢版主！我用文本文件编辑的，没有编译。我的程序还有问题，希望能得到您的帮助！[/quote]  你先改了这些，看还有什么问题再回复

简单处理即可：  #include <stdio.h> #define M 15 int source[M] = { 2, 3, 8, 6, 0, 0, -2, -1, -4, 0, 5, 6, 7, -5, -2 }; int target[M]; int i, s, sum; int main(void) { 	sum = target[0] = source[0]; 	//统计求和 	for (i = 1; i < M; i++) { 		s = source[i] * source[i - 1]; 		if (s <= 0) { //有0出现或异号 			sum = target[i] = source[i]; 		} 		else { //同号 			sum += source[i]; 			target[i] = sum; 		} 	} 	//打印source 	for (i = 0; i < M; i++) { 		printf("%3d", source[i]); 	} 	printf("\n"); 	//打印target 	for (i = 0; i < M; i++) { 		printf("%3d", target[i]); 	} 	return 0; } // 2  3  8  6  0  0 -2 -1 -4  0  5  6  7 -5 -2 // 2  5 13 19  0  0 -2 -3 -7  0  5 11 18 -5 -7

引用 2 楼 paschen 的回复:数组初始化赋值用大括号：int source[100] = { 2, 3, 8, 6, 0, 0, -2, -1, -4, 0, 5, 6, 7, -5, -2 };  target[i] = target[i - 1] + source[i] 这句后面没有分号  r 变量 没有定义  for循环用的是分号不是逗号  for (j = 1, j <= 100, j++)  楼主先把基础打好先  谢谢版主！我用文本文件编辑的，没有编译。我的程序还有问题，希望能得到您的帮助！

引用 7 楼 zhangxiangDavaid 的回复:[quote=引用 6 楼 topxjl 的回复:] David 大师的代码让人惊奇！ 哪里惊奇？是哪里错了吗？[/quote] 您的代码是专家级别，水平高，大赞！！！

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


Question: 一个调用函数无法执行

引用 9 楼 zhao4zhong1 的回复:不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。 这个是真的，从安全高效方面来说，必须的。

引用 9 楼 zhao4zhong1 的回复:不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。 非常感谢，以后我会试着这样思考的。我还是初学者，有很多地方的确容易出错。

引用 8 楼 ysmz555 的回复:这里的  else if(p2 == NULL)              {                 p3->next = p1;                 p1->next = NULL;              }              else              {                 p3->next = p1;                 p1->next = p2;              } 中的p2==NULL是判断到了链表的最后不，到了则插入到最后，否则插入到中间结点。 的却是这样，但是如果是表尾，p2 == NULL。那么执行else里的也可以达到目的啊。效果是一样的吧。这个写出来只是为了方便学习它的人看明白是这样吗？

else if(p2 == NULL)              {                 p3->next = p1;                 p1->next = NULL;              }              else              {                 p3->next = p1;                 p1->next = p2;              }前面的表后插入和else里的功能貌似没有区别。为什么列出来？给解释下呗？我看网上也是这么写的。

引用 5 楼 zhourqaiai 的回复:我去。我搁着改了一天了，终于找到问题的所在了。 while (p2 != NULL && p1->NO > p2->NO)这个循环语句， 如果写成while (p1->NO > p2->NO && p2 != NULL)那么每次运行在表位插入时就结束进程，为什么？ while（）循环里面的顺序还有这讲究吗？求大神告知。  前者p2 == NULL时，将不会执行p1->NO > p2->NO 而后者，先执行p1->NO > p2->NO，而此时如果p2 == NULL，p2->NO这句将会出现非法访问

void inter (struct stu * head) {     struct stu * p1, * p2, * p3;     p1 = (struct stu *)malloc(sizeof (struct stu));     printf("enter a NO;\n");     scanf ("%d", &p1->NO);     getchar ();     printf("enter a name:\n");     gets (p1->name);     printf ("enter a sex:\n");     scanf("%c", &p1->sex);     getchar ();     printf ("enter a score:\n");     scanf("%f", &p1->score);     p2 = head;     if (head == NULL)     {         head = p1;         p1->next = NULL;     }     else     {         while (p2 != NULL && p1->NO > p2->NO)         {             p3 = p2;             p2 = p2->next;         }         if(p2 == head)         {             head = p1;             p1->next = p2;         }         else if(p2 == NULL)              {                 p3->next = p1;                 p1->next = NULL;              }              else              {                 p3->next = p1;                 p1->next = p2;              }     } }

引用 1 楼 wang0635 的回复:如果准备插入到表尾，第一个 while 循环结束后，p2 就是 NULL 了，但是后面的代码没有处理这种情况 while (p1->NO < p2->NO || p2 == NULL); 这里有个处理的，p2 == NULL跳到else里。

链表、链表、链表…… http://blog.csdn.net/zhangxiangdavaid/article/details/25082013


Question: for循环的小问题

for之后的分号让for成为一个空循环了

for 的循环体部分是空语句（;） for 后面的大括号是迷惑人的，跟没有一样。后面的代码它们与 for 没关系

原来如此，谢谢各位啦~


Question: 关于char *s的问题

switch中中的case 是标号 因此，执行很简单，符合条件转到标号执行 break,return ，goto 等跳转语句后，跳转到别处执行 break 跳出switch 块 return 跳出函数（函数返回） goto 跳到对应 的位置。 不过，一般switch 只有break,return 。很少用goto   switch 块内的语句，除了进入switch 块做个选择外，顺序执行。 遇到到break,return ，goto 等则跳转。

1.char *s与char s的区别 答：前者是指向字符类型的指针变量，存放的是地址，后者是字符变量，存放的是字符。  2.s初始地址是49，为什么当k=2时，又回到了初始地址49呢 答：图中说明了S的地址是49么？图中是*S，不是S，*S是读取指针S指向的元素值。这也就是为什么当K=2时，又回到49的原因了。  3、switch是开关语句，特性是如有break语句跳出该语句，没有从上往下执行一遍退出。

switch中每个case后不加break会一直往下执行  char是一个字符，char*是指向字符的指针

1.char *s与char s的区别 答：类型显然不同 2.s初始地址是49，为什么当k=2时，又回到了初始地址49呢 49是字符'1'的ASCII值，不是地址。  关于指针 http://blog.csdn.net/zhangxiangdavaid/article/details/37885275

看书去吧 1，字符串和字符 2.‘49’是第一个值和第三个值，都是1，不是地址。 3，单步调试


Question: Windows 下 c文件无法使用结构体struct stat

因为这个结构体在 sys/stat.h 头文件中，这是Linux环境下的头文件。

试试看能不能蹭分

包含头文件 #include<sys/stat.h>

帮结帖＋蹭分

是c文件函数必须变量定义在函数前的原因，忘了


Question: 哪位大大帮我看看为什么会这样

引用 6 楼 user-1 的回复:[quote=引用 5 楼 q1306436808 的回复:] [quote=引用 3 楼 user-1 的回复:] [quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  嗯啊，按理说应该能返回对应的值吧。比如选1能打印出100，我是这样想的[/quote]  按理说来说打印出来的值是对的 本人新手 帮不了你  等待大神帮你回答吧！[/quote]  。。。。

引用 5 楼 q1306436808 的回复:[quote=引用 3 楼 user-1 的回复:] [quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  嗯啊，按理说应该能返回对应的值吧。比如选1能打印出100，我是这样想的[/quote]  按理说来说打印出来的值是对的 本人新手 帮不了你  等待大神帮你回答吧！

嗯，按理说应该能返回对应的值吧。比如选1能打印出100，我是这样想的

引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  引用 3 楼 user-1 的回复:[quote=引用 2 楼 q1306436808 的回复:] [quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？[/quote]  嗯啊，按理说应该能返回对应的值吧。比如选1能打印出100，我是这样想的

引用 2 楼 q1306436808 的回复:[quote=引用 1 楼 user-1 的回复:] 你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。[/quote]   你指的是 f = money_menu(); printf("%f\n",f); 这里返回打印出来的值？

引用 1 楼 user-1 的回复:你的代码不全啊！你这上面的代码的函数定义呢？  应该是栈的问题！子函数m是在栈里存在的 只要子函数已结束 变量m的值就消失掉了  你在去返回他的值 自然是错误的！  float money_menu() 我是用的这个。


Question: if else 小问题！求解答！

是的，就算执行else，char max[100]的生命周期也仅仅在else范围中

函数体内的变量的生命周期在函数体内都可以访问。  vs2008 int _tmain(int argc, _TCHAR* argv[]) { 	//进入main函数后就在栈上开辟好了变量所需的空间。 	int a=4; 	//通过变量a的地址推算出数组imax,max的地址。 	memset((char*)((int)&a-8-100),0,100); 	//修改imax数组字符串"vvvvvvv"。 	strcat((char*)((int)&a-8-100),"vvvvvvv"); 	memset((char*)((int)&a-8-100-8-100),0,100); 	//修改max数组字符串"kkkkkkkkk"。 	strcat((char*)((int)&a-8-100-8-100),"kkkkkkkkk"); 	if (a!=0) 	{ 		char imax[100] ; 		//打印imax字符串"vvvvvvv"。 		printf("%s\n",imax); 	} 	else { 		char max[100];  		//打印max字符串"kkkkkkkkk"。 		printf("%s\n",max); 	} 	return 0; }

看编译生成的汇编代码