Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求c语言大神解答

回复:
user: user-1
content: 直接拿a跟b+0,b+1,b+..k 去比较不行吗

user: user-0
content: [size=24px]题目描述：Given two strings A and B, whose alphabet consist only ‘0’ and ‘1’. Your task is only to tell how many times does A appear as a substring of B? For example, the text string B is ‘1001110110’ while the pattern string A is ‘11’, you should output 3, because the pattern A appeared at the position 4, 5 and 8. It’s very simple, isn’t it?[/size] 输入：The first line consist only one integer C(C <= 10), indicates C cases follows. In each case, there are two lines, the first line gives the string A, length (A) <= 30, and the second line gives the string B, length (B) <= 100000000. And it is guaranteed that B is always longer than A. 输出：For each case, output a single line consist a single integer, tells how many times do B appears as a substring of A

user: user-2
content: 楼主能不能把 前面的题目描述,输入,输出 截清楚.

user: user-3
content: 截的图太模糊了，你可以把问题叙述一下
user-0 提问: 最大子序列求和问题

回复:
user: user-1
content: for(int i=iCenter;i>=iLeft;i--) //从中间向左扩展求子段的最大子序列和，必然包括子段的最右端数       {           iLeftBorderSum+=s[i];           if(iLeftBorderSum>iMaxLeftBorderSum)           {               iMaxLeftBorderSum = iLeftBorderSum; //包含左端数的最大子序列和  ？只是反序查找左区间能够达到的最大和。                                                                                    //这个最大和是中间向左这一小段最大的                     }       }   下面那个循环，性质相同，这两段是相连的，也就是中间一段，跨越了左右两个区间。所以对它们求和，就是跨区间最大和 下面就是比较到底谁最大，取最大的那个 两个递归，和一个终止条件，（也包括递归过程的跨界这一段）。共同求出左，右两个区间最大和、  递归部分直接就认为是对的，不要问为什么，除非这个问题的结构不是这样的。

user: user-1
content: iMaxLeftSum = SubsequenceSum(s,iLeft,iCenter); //每次递归返回时，该值为该子段的最终左最大子序列和  ？ iMaxRightSum = SubsequenceSum(s,iCenter+1,iRight); //每次递归返回时，该值为该子段的右最大自序列和  ？ 这是递归部分， 不要问为什么， 要问这个结构合理不合理 可不可以这么做。 首先，这么做，确实是一个元素不漏，把区间划分成左右两部分了。 所以只要非递归部分实现没有问题，这个地方就没有问题。  递归问题，要考虑的是，有没有这种递归结构，能不能这么分开处理。

user: user-1
content: 递归的思想是 1）基准情形：必须总有某些基准情形，此时不用递归，就能求解。（这样可以有个出口，避免无穷递归。） 2）不断推进：对于递归求解的情况，递归必须总能够朝着一个基准情形推进。（这保证，规模不是无限增加，以至于到不了出口） 3）设计法则：假设所有递归都能运行。（就是不要考虑细节。递归自己会处理的。） 4）合成效益法则：在求解同一个问题的同一实例的时候，切勿在不同的递归调用中，做重复性的工作。（避免重复以至于耗时太多） 这是数据结构的书籍中，一般都会提到的。 这几句，是在书中原话抄来的，不过不是英文原文 () 括号中注解的是我个人的理解。 书名 << Data Structures and Algorithm Analysis in C++>>  Third Edition  原作者是 Mark Allen Weiss  中文版 ： 《数据结构与算法分析C++描述》  第3版 张怀勇 等翻译 刘田 审校 人民邮电出版社

user: user-0
content: 引用 2 楼 user-1 的回复:iMaxLeftSum = SubsequenceSum(s,iLeft,iCenter); //每次递归返回时，该值为该子段的最终左最大子序列和  ？ iMaxRightSum = SubsequenceSum(s,iCenter+1,iRight); //每次递归返回时，该值为该子段的右最大自序列和  ？ 这是递归部分， 不要问为什么， 要问这个结构合理不合理 可不可以这么做。 首先，这么做，确实是一个元素不漏，把区间划分成左右两部分了。 所以只要非递归部分实现没有问题，这个地方就没有问题。  递归问题，要考虑的是，有没有这种递归结构，能不能这么分开处理。所以递归调用只要初值设好了就基本可实现了？感觉这种抽象思维还是没形成

user: user-0
user-0 提问: 用C语言如何获取当前系统的当前毫秒数，每八位转换成十六进制，并做统计由高到底按顺序输出？？？？，重点是后边的转换！！！

回复:
user: user-1
content: 引用 4 楼 vshuo7013 的回复:这是我写的程序： #include <stdio.h>     #include <sys/time.h>   //获取十进制毫秒数二进制位数函数 int num_bin(long time){ 	int num=0; 	while(time!=0)     {        	time/=2;        	num++;     } 	return num; } //获取系统当前时间毫秒数十六进制形式函数 void binhex(int num,long time,int *hex){ 	int j;  	for(j=0;j<num;j++){ 		hex[j] = time & 0XFF; 		time=time>>8;  	} } //获取当前时间毫秒数    long getCurrentTime()     {        	struct timeval tv;        	gettimeofday(&tv,NULL);         long time = tv.tv_sec * 1000 + tv.tv_usec / 1000; 	return time;     }              int main()     {   	long time = getCurrentTime(); 	int num = num_bin(time);     	printf("%ld\n",time); 	int NUM = (num/8 +1); 	printf("NUM=%d\n", NUM); 	int hex[NUM]; 	binhex(NUM,time,hex);  	int n;	 	for(n=0;n<NUM;n++){ 		printf("%02X ",hex[n]); 	} 	printf("\n");    	return 0;     }    其中的一个运行结果是： 1450193000132 NUM=6 C4 16 3D A6 51 01 我的意图就是得到这种答案：C4 16 3D A6 51 01 我觉得我的方法很麻烦！ 想请教下有没有更好的方法？？？ 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。  #include <stdio.h> int main() {     long long int ms=1450193000132LL;     printf("%016llX\n",ms);     for (int i=0;i<8;i++) {         printf("%02X ",((unsigned char *)&ms)[i]);     }     printf ("\n");     return 0; } //00000151A63D16C4 //C4 16 3D A6 51 01 00 00 //

user: user-2
content: http://blog.csdn.net/jefry_xdz/article/details/8072097

user: user-0
content: 这是我写的程序： #include <stdio.h>     #include <sys/time.h>   //获取十进制毫秒数二进制位数函数 int num_bin(long time){ 	int num=0; 	while(time!=0)     {        	time/=2;        	num++;     } 	return num; } //获取系统当前时间毫秒数十六进制形式函数 void binhex(int num,long time,int *hex){ 	int j;  	for(j=0;j<num;j++){ 		hex[j] = time & 0XFF; 		time=time>>8;  	} } //获取当前时间毫秒数    long getCurrentTime()     {        	struct timeval tv;        	gettimeofday(&tv,NULL);         long time = tv.tv_sec * 1000 + tv.tv_usec / 1000; 	return time;     }              int main()     {   	long time = getCurrentTime(); 	int num = num_bin(time);     	printf("%ld\n",time); 	int NUM = (num/8 +1); 	printf("NUM=%d\n", NUM); 	int hex[NUM]; 	binhex(NUM,time,hex);  	int n;	 	for(n=0;n<NUM;n++){ 		printf("%02X ",hex[n]); 	} 	printf("\n");    	return 0;     }    其中的一个运行结果是： 1450193000132 NUM=6 C4 16 3D A6 51 01 我的意图就是得到这种答案：C4 16 3D A6 51 01 我觉得我的方法很麻烦！ 想请教下有没有更好的方法？？？

user: user-0
content: 14501700938 假设其二进制形式为111000010101010001000110101010101010101010 从左到右，有高到底，转换成每八位对应十六进制

user: user-1
content: 引用 1 楼 user-3 的回复: 什么叫“每8位转成十六进制”？  char a[100]; sprintf(a,"%016llx",1450170093810LL);

user: user-3
content: 什么叫“每8位转成十六进制”？  char a[100]; sprintf(a,"%llx",1450170093810);
user-0 提问: 备忘录法解背包问题，哪错了

回复:
user: user-1
content: 引用 2 楼 u010107248 的回复:[quote=引用 1 楼 user-1 的回复:] MFKnapsack 中int i 是递减, 小于0 怎么办, 还有T[i][j]初始化行列都少1 if(i>=0&&j>=0)不是只有i>0时才执行么。 初始化我改了，还还不对啊 	for(i=0 ; i<=goods->numbers ; i++) 		for(j=0 ; j<=knapsack->MaxWeight ; j++) 			T[i][j] = -1 ; [/quote] value = MFKnapsack(i-1,j, knapsack, 如果i=0, 这个调用会返回什么

user: user-0
content: int MFKnapsack(int i, int j, struct Knapsack *knapsack, struct Goods *goods) {     int value;      if (i > 0 && j > 0)     {         if (T[i][j] < 0)         {             if (j < goods->weight[i])             {                 value = MFKnapsack(i - 1, j, knapsack, goods);             }             else             {                 value = Max(MFKnapsack(i - 1, j, knapsack, goods),                         goods->value[i] + MFKnapsack(i - 1, j - goods->weight[i], knapsack, goods));             }             T[i][j] = value;         }         return T[i][j];     }     return T[i][j] = 0; }

user: user-0
content: 引用 4 楼 user-1 的回复:[quote=引用 2 楼 u010107248 的回复:] [quote=引用 1 楼 user-1 的回复:] MFKnapsack 中int i 是递减, 小于0 怎么办, 还有T[i][j]初始化行列都少1 if(i>=0&&j>=0)不是只有i>0时才执行么。 初始化我改了，还还不对啊 	for(i=0 ; i<=goods->numbers ; i++) 		for(j=0 ; j<=knapsack->MaxWeight ; j++) 			T[i][j] = -1 ; [/quote] value = MFKnapsack(i-1,j, knapsack, 如果i=0, 这个调用会返回什么[/quote] 原来是没设置递归出口 int  MFKnapsack( int i , int j , struct Knapsack *knapsack ,  struct Goods *goods )  { 	int value ;  	if(i==0) return 0 ;  	else  	{ 		if(T[i][j]<0) 		{ 			if( j<goods->weight[i] ) 				value = MFKnapsack(i-1,j, knapsack ,  goods ) ; 			else 				value =  Max(   MFKnapsack(i-1,j, knapsack , goods ) , 						   goods->value[i]+MFKnapsack( i-1 , j-goods->weight[i] , knapsack , goods )  ); 			T[i][j] = value ; 		} 		 		return T[i][j] ; 	} 	 }

user: user-0
content: 引用 4 楼 user-1 的回复:[quote=引用 2 楼 u010107248 的回复:] [quote=引用 1 楼 user-1 的回复:] MFKnapsack 中int i 是递减, 小于0 怎么办, 还有T[i][j]初始化行列都少1 if(i>=0&&j>=0)不是只有i>0时才执行么。 初始化我改了，还还不对啊 	for(i=0 ; i<=goods->numbers ; i++) 		for(j=0 ; j<=knapsack->MaxWeight ; j++) 			T[i][j] = -1 ; [/quote] value = MFKnapsack(i-1,j, knapsack, 如果i=0, 这个调用会返回什么[/quote] 原来是没设置递归出口 int  MFKnapsack( int i , int j , struct Knapsack *knapsack ,  struct Goods *goods )  { 	int value ;  	if(i==0) return 0 ;  	else  	{ 		if(T[i][j]<0) 		{ 			if( j<goods->weight[i] ) 				value = MFKnapsack(i-1,j, knapsack ,  goods ) ; 			else 				value =  Max(   MFKnapsack(i-1,j, knapsack , goods ) , 						   goods->value[i]+MFKnapsack( i-1 , j-goods->weight[i] , knapsack , goods )  ); 			T[i][j] = value ; 		} 		 		return T[i][j] ; 	} 	 }

user: user-0

user: user-0
content: 引用 1 楼 user-1 的回复:MFKnapsack 中int i 是递减, 小于0 怎么办, 还有T[i][j]初始化行列都少1 if(i>=0&&j>=0)不是只有i>0时才执行么。 初始化我改了，还还不对啊 	for(i=0 ; i<=goods->numbers ; i++) 		for(j=0 ; j<=knapsack->MaxWeight ; j++) 			T[i][j] = -1 ;

user: user-1
content: MFKnapsack 中int i 是递减, 小于0 怎么办, 还有T[i][j]初始化行列都少1
user-0 提问: 有个问题,如何给一个没有窗体的程序用sendmessage发送消息?

回复:
user: user-1
content: 两个windows进程间通信的问题，可以socket，也可以管道，等等。

user: user-2

user: user-3
content: PostThreadMessage给线程发消息  怎么接受，搜“控制台 消息循环”
user-0 提问: 数组查询求教

回复:
user: user-1
content: 2楼的方法受教了。我本来直接想到的是用char来循环查找buf里的字符，进行判断。然后逐个记住v的位置。

user: user-2
content: #include <stdio.h> char *buf="v11111011v2222201212v21323123"; __int64 v[3]; int main() {     sscanf(buf,"v%I64dv%I64dv%I64d",&v[0],&v[1],&v[2]);     printf("%I64d %I64d %I64d",v[0],v[1],v[2]);//11111011 2222201212 21323123     return 0; }

user: user-3
content: 字符串分割，或者strchr查找v找到后从指针位置后一字符开始复制到目的数组中
user-0 提问: 为什么用fwrite函数输出的文本文件打开为乱码？

回复:
user: user-0
content: void writeFile(int number) {     int i=0;     FILE *fp;     if((fp = fopen("studentscore.txt","w"))==NULL)     {         printf("打开studentscore.txt失败\n");         return;     }     rewind(fp); //    fwrite(Score,sizeof(StuS),number,fp);     for(i=0;i<number;i++);     {         fprintf(fp,"%d%s%d%d%d%d%.1f\n",Score[i].ID,Score[i].Name,Score[i].MathScore,Score[i].EngScore,Score[i].PhyScore,Score[i].TotalScore,Score[i].AverScore);     }     fclose(fp);     printf("文件写入成功\n");     return; }    引用 1 楼 zhangxiangDavaid 的回复:二进制写入，使用fwrite，所以打开乱码 文本文件写入，使用fprintf   我改成这样了为何输出了一串0，用printf在屏幕上输出都正常

user: user-1
content: read与write时都分二进制文件与文本文件

user: user-2
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-3
content: 二进制写入，使用fwrite，所以打开乱码 文本文件写入，使用fprintf
user-0 提问: 用C语言编程，如何将一个将一个IP地址字符串转换成十六进制数

回复:
user: user-1
content: 请问char IP[7]={“”11001100“”}，这字符串怎么转换整数吗？

user: user-1
content: 请问char IP[7]={"11001100"} 怎么转换int a=?

user: user-0
content: 赵4老师多谢了!!!

user: user-2
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。 sscanf(IP,"%x.%x.%x.%x",&a,&b,&c,&d);

user: user-3
content: http://zhidao.baidu.com/link?url=TyFyEylYM97IVWl5pdf_tiXLyJ9nXbkbf-BsSMW9BHMIcYtVqc4-T81f73OLL-ukeJxiy21hoaqgZRCh56S3G_
user-0 提问: c语言实现顺序栈进栈时的指针问题

回复:
user: user-1
content: 引用 3 楼 xiangkuiming的回复:引用 1 楼 u011133403 的回复:楼主好，你上面的代码一看就是严奶奶数据结构那本书上的C语言伪代码。伪代码就是为了让我们更容易看懂。void Push(SqStack &S,SElemType e) 这段伪代码指参数是SqStack 的地址。  真正用的时候应该就是void Push(SqStack *S,SElemType e)，SqStack *S 代表参数是地址。   手工打字党，望采纳。恩  我大致明白了。后来我了解到&作引用是在c++中才可以对吗？如果用C++写的话就可以用void Push(SqStack &S,SElemType e)来实现了吧？然后具体实现也可以用*S.top而非必须用*S->top吧？ 非常sorry,没有去研究过C＋＋。

user: user-2
content: 《数据结构（C语言描述）》

user: user-0
content: 引用 1 楼 u011133403 的回复:楼主好，你上面的代码一看就是严奶奶数据结构那本书上的C语言伪代码。伪代码就是为了让我们更容易看懂。void Push(SqStack &S,SElemType e) 这段伪代码指参数是SqStack 的地址。  真正用的时候应该就是void Push(SqStack *S,SElemType e)，SqStack *S 代表参数是地址。   手工打字党，望采纳。恩  我大致明白了。后来我了解到&作引用是在c++中才可以对吗？如果用C++写的话就可以用void Push(SqStack &S,SElemType e)来实现了吧？然后具体实现也可以用*S.top而非必须用*S->top吧？

user: user-1
content: 楼主好，你上面的代码一看就是严奶奶数据结构那本书上的C语言伪代码。伪代码就是为了让我们更容易看懂。void Push(SqStack &S,SElemType e) 这段伪代码指参数是SqStack 的地址。  真正用的时候应该就是void Push(SqStack *S,SElemType e)，SqStack *S 代表参数是地址。   手工打字党，望采纳。
user-0 提问: 谁来讲一讲在什么情况下定义头文件(x.h)??? 想知道？

回复:
user: user-1
content: 不想提供C代码给调用者，仅提供.h和.lib、.dll

user: user-0
content: 我想说的是在C语言中，你这个是C++了，

user: user-2
content: 简单的程序是不需要的，程序复杂的话是必须建立头文件的，目的是对一些类进行声明，尤其是需要建立自己的名称空间的时候
user-0 提问: 程序跑loadfile()后提示 steam!=null  求老师指点

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

user: user-2
content: scanf("%s", &file1); ==>  scanf("%s", file1);
user-0 提问: 求大神解决。问题：可以运行只有一个星星没有墙，小白本想编一个迷宫的，求大神抽空改一下小白的程序让它完整

回复:
user: user-1
content: main里面introduced前面的void去掉，打印迷宫函数里面打印#字符前面掉了printf

user: user-1
content: 引用 2 楼 aaa461534727的回复:按您的要求加了printf与去掉viod，运行后可以玩了，但是在地图中按右键撞那个墙后就变黑屏了，按其他键有恢复，求解决 加个判断，撞了墙就结束游戏

user: user-0
content: 按您的要求加了printf与去掉viod，运行后可以玩了，但是在地图中按右键撞那个墙后就变黑屏了，按其他键有恢复，求解决
user-0 提问: 原来C语言不支持体外循环

回复:
user: user-1
content: 引用 3 楼 adlay 的回复:函数外面不是不能有循环，而是任何语句都不行，只能对全局变量做初始化。

user: user-2
content: 函数外面不是不能有循环，而是任何语句都不行，只能对全局变量做初始化。

user: user-3
content: 语句不能放在全局区，需要放到函数里

user: user-4
content: 楼主是javascript转过来的？
user-0 提问: 调用含参函数不传参数？

回复:
user: user-0
content: 引用 7 楼 paschen 的回复:[quote=引用 6 楼 u011412782 的回复:] [quote=引用 5 楼 paschen 的回复:] 那个只是声明，不是函数调用，而且通常应该把他放到该函数前面（虽然在里面也行） 嗯嗯，但是在内部申明函数有什么意义呢？？与外面有什么不同？[/quote]  在内部只有当前这个函数可以用，其他函数（在调用函数的上面的）则用不了[/quote]  所噶，那主要作用就还是控制函数作用范围咯？？  非常感谢！

user: user-1
content: 引用 6 楼 u011412782 的回复:[quote=引用 5 楼 paschen 的回复:] 那个只是声明，不是函数调用，而且通常应该把他放到该函数前面（虽然在里面也行） 嗯嗯，但是在内部申明函数有什么意义呢？？与外面有什么不同？[/quote]  在内部只有当前这个函数可以用，其他函数（在调用函数的上面的）则用不了

user: user-0
content: 引用 5 楼 paschen 的回复:那个只是声明，不是函数调用，而且通常应该把他放到该函数前面（虽然在里面也行） 嗯嗯，但是在内部申明函数有什么意义呢？？与外面有什么不同？

user: user-1
content: 那个只是声明，不是函数调用，而且通常应该把他放到该函数前面（虽然在里面也行）

user: user-0
content: 引用 3 楼 user-2 的回复:[quote=引用 2 楼 u011412782 的回复:] [quote=引用 1 楼 user-2 的回复:] 调用了有参数的函数，但是并没有传递参数 是指那一句? 不会是指上面的函数声明吧 是这里： void add(comp_int ,comp_int ,comp_int *); void sub(comp_int ,comp_int ,comp_int *); void mul(comp_int ,comp_int ,comp_int *); 这里是函数的申明？？？ C语言不允许这样的函数申明吧？  如果是函数申明的话，这样的申明的意义在哪儿呢？[/quote] 不声明 func_die就不能调用这些函数[/quote]  那为什么不在函数外面申明？？在内部申明有什么意义？

user: user-0
content: 引用 1 楼 user-2 的回复:调用了有参数的函数，但是并没有传递参数 是指那一句? 不会是指上面的函数声明吧 是这里： void add(comp_int ,comp_int ,comp_int *); void sub(comp_int ,comp_int ,comp_int *); void mul(comp_int ,comp_int ,comp_int *); 这里是函数的申明？？？ C语言不允许这样的函数申明吧？  如果是函数申明的话，这样的申明的意义在哪儿呢？

user: user-2
content: 引用 2 楼 u011412782 的回复:[quote=引用 1 楼 user-2 的回复:] 调用了有参数的函数，但是并没有传递参数 是指那一句? 不会是指上面的函数声明吧 是这里： void add(comp_int ,comp_int ,comp_int *); void sub(comp_int ,comp_int ,comp_int *); void mul(comp_int ,comp_int ,comp_int *); 这里是函数的申明？？？ C语言不允许这样的函数申明吧？  如果是函数申明的话，这样的申明的意义在哪儿呢？[/quote] 不声明 func_die就不能调用这些函数

user: user-2
content: 调用了有参数的函数，但是并没有传递参数 是指那一句? 不会是指上面的函数声明吧
user-0 提问: 小白一枚 初次试水  碰到了一个oj上无法编译但编译器正常编译运行的问题 请各路大神帮忙看看

回复:
user: user-1
content: 引用 4 楼 supersuperna 的回复:引用 2楼lm_whales 的回复:int a[n];估计问题在这里我是先输入的n后定义的an 应该不会有事情阿 而且我都运行成功了只是oj显示编译不对 int *a=new int[n]; 弄明白编译期、运行期相关概念。

user: user-2
content: [n] 去掉。

user: user-0
content: 对不起哦，我不太明白应该加在哪里， 麻烦您能说的细一点吗 谢谢了哦

user: user-3
content: int a[n];///估计问题在这里  这是gcc 或者C99标准支持的 但是很多编译器支持的不是很好。 也就是说，你的oj系统，采用的一个或者多个编译器的几个，不支持这个写法 于是不能编译。 虽然，你用你自己的编译器（或者开发环境中的编译器），没有任何问题。 int *a=new int[n];///可以解决这个 ..... delete[] a; ///最后别忘记加上这个。

user: user-4
content: int  *a = malloc(n * sizeof(int));

user: user-0
content: 引用 2楼lm_whales 的回复:int a[n];估计问题在这里我是先输入的n后定义的an 应该不会有事情阿 而且我都运行成功了只是oj显示编译不对

user: user-0
content: 引用 3楼Zllvincent 的回复:你的数组是在栈上分配的，不能是动态的，数组大小在编译时就确定了大小的，但是运行成功了编译器也没有问题 请问该怎么改改呢

user: user-5
content: 你的数组是在栈上分配的，不能是动态的，数组大小在编译时就确定了大小的，

user: user-3
content: int a[n];估计问题在这里

user: user-3
content: C99 或 gcc 私货 C99 很多编译器支持的不好 因为C99出生太晚了 很少有专门做C编译器  大家一般都是C++编译器， 买一赠一C编译器，而且一般还附赠汇编器。 所以C99标准,各大编译器，支持的不是很好。 个人猜测是这个样子的， 具体原因，真的不知道为何支持这么差。
user-0 提问: 用C语言，如何将一个16位二进制字符串转换成十进制整数？？？？？

回复:
user: user-1
content: 引用 1 楼 machongcong 的回复:int  m= 0; int n = strlen(AD); for(int i =0;i<n;i++) { if(AD[i]!=0) m+= AD[i]*pow(16,n-1-i); }  m为最终计算的10进制数  int  m= 0;     int n = strlen(AD);     for(int i =0;i<n;i++)     {     if(AD[i]!='0')     m+=pow(2,n-1-i);     }    上面的有点错误

user: user-2
content: 初始整数a为0 ，定义临时变量 t 为1 从低位到高位循环这20个数 每次循环判断，如果是字符1，a &= t; 每次循环完，t <<= 1;

user: user-3
content: #include <stdio.h>  int main(int argc, char **argv) { 	char str[20] = "0000000000010010"; 	 	long value = 0; 	char * p = str;  	// skip leading zeros 	while(*p == '0') ++p; 	 	if(*p != '\0')  	{ 		value = 1; 		while(*(++p)) 		{		 			value <<= 1; 			if((*p) == '1') value++; 		} 	} 	 	printf("value = %ld\n", value);	 	return 0; }

user: user-4
content: 从低位往高位算啊。。

user: user-1
content: int  m= 0; int n = strlen(AD); for(int i =0;i<n;i++) { if(AD[i]!=0) m+= AD[i]*pow(16,n-1-i); }  m为最终计算的10进制数
user-0 提问: C/C++随机数生成

回复:
user: user-1
content: http://www.cplusplus.com/reference/random/random_device/operator()/index.html

user: user-2
content: c++11 #include<random>

user: user-3
content: srand需要且只需要执行一次

user: user-4
content: random_shuffle 这个算不算
user-0 提问: 【提问】关于static定义函数的使用问题

回复:
user: user-0
content: 我明白了，谢谢

user: user-1
content: 引用 4 楼 Sariel_zq 的回复:但是我测试时不是这样的，是不是我哪里使用有问题 主函数文件： // main.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h" #include "A.h" #include "B.h"   int _tmain(int argc, _TCHAR* argv[]) { 	A(); 	B(); 	printf("main\r\n"); 	return 0; }  A.h文件 #include "stdafx.h"  static void fun() { 	printf("AAAAA\r\n"); }  void A() { 	fun(); } B.h文件 #include "stdafx.h"  static void fun() { 	printf("BBBBB\r\n"); }  void B() { 	fun(); }  编译结果 1>------ 已启动生成:  项目: main, 配置: Debug Win32 ------ 1>  main.cpp 1>i:\project\多文件staitc测试\main\main\b.h(4): error C2084: 函数“void fun(void)”已有主体 1>          i:\project\多文件staitc测试\main\main\a.h(3) : 参见“fun”的前一个定义 1>i:\project\多文件staitc测试\main\main\b.h(10): error C3861: “fun”:  找不到标识符 ========== 生成:  成功 0 个，失败 1 个，最新 0 个，跳过 0 个 ========== 是说这个函数重定义了，但我是声明为static了的啊，这里哪有问题吗？  说的文件是指源文件   当一个源程序由多个源文件组成时，根据函数能否被其它源文件中的函数调用，将函数分为内部函数和外部函数。 1 内部函数（又称静态函数） 如果在一个源文件中定义的函数，只能被本文件中的函数调用，而不能被同一程序其它文件中的函数调用，这种函数称为内部函数。 定义一个内部函数，只需在函数类型前再加一个“static”关键字即可： static  函数类型  函数名(函数参数表) 关键字“static”，译成中文就是“静态的”，所以内部函数又称静态函数。但此处“static”的含义不是指存储方式，而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是：不同的人编写不同的函数时，不用担心自己定义的函数，是否会与其它文件中的函数同名，因为同名也没有关系。 2 外部函数 外部函数的定义：在定义函数时，如果没有加关键字“static”，或冠以关键字“extern”，表示此函数是外部函数，也就是我们最常用的函数形式。

user: user-0
content: 但是我测试时不是这样的，是不是我哪里使用有问题 主函数文件： // main.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h" #include "A.h" #include "B.h"   int _tmain(int argc, _TCHAR* argv[]) { 	A(); 	B(); 	printf("main\r\n"); 	return 0; }  A.h文件 #include "stdafx.h"  static void fun() { 	printf("AAAAA\r\n"); }  void A() { 	fun(); } B.h文件 #include "stdafx.h"  static void fun() { 	printf("BBBBB\r\n"); }  void B() { 	fun(); }  编译结果 1>------ 已启动生成:  项目: main, 配置: Debug Win32 ------ 1>  main.cpp 1>i:\project\多文件staitc测试\main\main\b.h(4): error C2084: 函数“void fun(void)”已有主体 1>          i:\project\多文件staitc测试\main\main\a.h(3) : 参见“fun”的前一个定义 1>i:\project\多文件staitc测试\main\main\b.h(10): error C3861: “fun”:  找不到标识符 ========== 生成:  成功 0 个，失败 1 个，最新 0 个，跳过 0 个 ========== 是说这个函数重定义了，但我是声明为static了的啊，这里哪有问题吗？

user: user-1
content: 变量也好，函数也好，你在不同文件中用static定义不会出现重复定义

user: user-2
content: 可以通过函数指针，等手段，在别的文件里面使用 不能直接通过函数名调用 毕竟 static 本来就是局部的，只打算在这个文件里面使用 static 其实是对其他.c，.cpp 隐藏的私有函数  两个文件里面同名完全没有关系，因为这个名字，只在本文件使用  毕竟 外部函数才是模块的接口。 静态函数不是，他只是实现手段。  各个文件编译的时候，互相没有关联， 连接的时候，才会连接到一起。 所以只有外部函数，才会有命名冲突。  多人开发的话 只需要开发 外部函数，这些名字要统一命名，每个模块的开发者都知道有这个名字。 静态函数，就不必了，可以随意命名。不需要大家都知道。 毕竟只是为何实现，才定义的函数。

user: user-3
content: 两个 fun 相互独立，互不干扰。  ============ 但是程序员有可能被两个同名函数搞糊涂。
user-0 提问: VS2015能不能不下断点查看内存

回复:
user: user-1
content: http://bbs.csdn.net/topics/390439995

user: user-0
content: 麻烦各位老师们看到了给说一下初学者应该怎样简单了解一下调试方法，以及windows平台下都有哪些常用的调试工具

user: user-1
content: 判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-0
content: 引用 1 楼 user-2 的回复:VS里不能不断下查看内存，如果要看你可以用一些工具查看内存，但没意义 为什么没有意义啊，理解不了这句话

user: user-2
content: VS里不能不断下查看内存，如果要看你可以用一些工具查看内存，但没意义
user-0 提问: C语言指针传递问题

回复:
user: user-1
content: 楼主，这个问题是因为printf函数对参数的入栈调用规则造成的：  1、printf函数参数的入站顺序为从右至左，因而末尾的x入栈时的值为初始值4（你可以把x改成6试试，同样有这种现象） 2、然后入栈求和函数的地址，于是在代码运行期间，跳转到了求和函数，而求和的系统默认入栈顺序也是从右到左，所以能够顺利地传入存放x为初始值4时的main中变量x的地址； 3、求和函数中，对自身的指针x指向的内存单元地址（main中的变量x的内存单元），通过求和和重新赋值，获得了新值8，并通过返回求和函数的 x 的指针值，新值得以保存到main中的变量x的内存单元中； 4、printf继续执行，从栈中，读出了求和函数处理完成的结果数据（此时x值被改变后的真实数据），和在自己的参数栈中的前期入栈数据（修改前的x的值4）  所以你总会看到这样奇怪的输入； 因为不同的操作系统平台或者不同的编译环境，对参数入栈规则可能略有差异，这样交叉使用同一变量的方法，容易导致错误，还是建议楼主用注释掉的那部分代码来实现，比较安全。

user: user-2
content: 调用后，x的值肯定变了，因为就指针特性而言，调用后x的地址指向的值为8，所以你的第一个输出是8,8，而第二个输出是在x的值改变后，所以输出为16,8

user: user-3
content: 你需要参考下函数参数压栈的方式

user: user-1
content: 引用 2 楼 yaojuntong77 的回复:楼主，这个问题是因为printf函数对参数的入栈调用规则造成的：  1、printf函数参数的入站顺序为从右至左，因而末尾的x入栈时的值为初始值4（你可以把x改成6试试，同样有这种现象） 2、然后入栈求和函数的地址，于是在代码运行期间，跳转到了求和函数，而求和的系统默认入栈顺序也是从右到左，所以能够顺利地传入存放x为初始值4时的main中变量x的地址； 3、求和函数中，对自身的指针x指向的内存单元地址（main中的变量x的内存单元），通过求和和重新赋值，获得了新值8，并通过返回求和函数的 x 的指针值，新值得以保存到main中的变量x的内存单元中； 4、printf继续执行，从栈中，读出了求和函数处理完成的结果数据（此时x值被改变后的真实数据），和在自己的参数栈中的前期入栈数据（修改前的x的值4）  所以你总会看到这样奇怪的输入； 因为不同的操作系统平台或者不同的编译环境，对参数入栈规则可能略有差异，这样交叉使用同一变量的方法，容易导致错误，还是建议楼主用注释掉的那部分代码来实现，比较安全。  操作系统对于带参数的函数，调用时会涉及两个基本动作： 1、将参数压入临时开辟的栈帧；入栈顺序为：有的系统从右到左，有的系统从左到右； 2、处理参数值；       在处理参数时，往往多数是从左到右，当需要某个局部数据时，会从第一步入栈时的内存区取需要的值进行计算；  在带参函数处理完成后就向其调用者返回处理结果；

user: user-4
content: 序列点问题。 入栈顺序不是求值顺序，C语言没有规定函数参数的求值顺序，具体请看置顶贴
user-0 提问: c语言 文件中读取浮点数的问题

回复:
user: user-1
content: 可以把这个结构，当作一个编程语言 按照解释器的思路做 也可以看作树结构， 用树的思路 来做  方法是读取关键字解释它的含义（后面的数据是什么） facet侧面 outer 外部 vertex 顶点  这明显是某种图形的结构

user: user-2
content: 仅供参考：//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
user-0 提问: 关于二维数组的子数组越界问题

回复:
user: user-0
content: 两个知识点： 1.  数组在内存中是线性连续的 2. []下标运算符  感谢各位回答

user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-2
content: a[i][j] 理解成  *(*(a+i)+j)

user: user-3
content: 数组在内存是线性连续

user: user-4
content: 别的语言，至少Fortran,VB，pascal 也是连续内存，但是是否可以这么用，有点记不得了

user: user-4
content: 基于内存的连续性，C,C++ 都不认为有什么问题

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  观察是肯定观察过了，来提问只是想证实一下，或者想得到一个专业或者正规的说法。 我的理解是以c[0] 为起始地址，然后指针往后移动8个存储单元

user: user-5
content: 计算机会正常访问访问c[0][8]！应为编译器是这样理解数组的c[][]解释为**c!然后你自己看！以指针的角度去看会有问题吗!
user-0 提问: 关于字符数组的长度的基础问题

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-2
content: 数组的大小（长度）和“以零结尾的”字符串的长度是两回事，两者完全不同。  以上数组的长度都是固定的。  部分初始化的时候，没有初始化值的数据会被初始化为零。由于数组的长度的不同，造成了有些有 '\0' ，有些没有。造成了他们有些是合法的“以零结尾的字符串”，有些不是。

user: user-3
content: 就像int a[5] = {1,2,3}; 这句，a中后面两个元素将被初始化为0，是这么规定的，同理你的char  另char数组不可以这样初始化：char b[] = "ac0z3df"; 这样结尾也是带有0的

user: user-4
content: 不知道你对长度的理解是什么，是数组的长度还是用strlen测出的数组长度

user: user-4
content: 引用 7 楼 醉花阴柳的回复:不知道你对长度的理解是什么，是数组的长度还是用strlen测出的数组长度 不知道你对长度的理解是什么，是数组的长度还是用strlen测出的长度，多打了两字

user: user-5
content: 当数组或结构使用 {} 赋值的时候，没有被明确赋值的元素或者字段被置为 0. 所以如果数组或者结构需要赋值 0. 直接使用 = { }; 就可以了。  '\0' 的。

user: user-6
content: 引用 3 楼 qq_30632937 的回复:这个结果取决于计算机！我用安卓手机软件c4droid运行没有问题！用电脑测试(5)有问题！(5)的定义看上去没问题！引用时会出现问题！我用标准c编译器！他会访问越界！ 可能侥幸没问题，但是不能保证任何时间、任何环境中都没问题

user: user-7
content: c对数组检测能力很弱！

user: user-7
content: 这个结果取决于计算机！我用安卓手机软件c4droid运行没有问题！用电脑测试(5)有问题！(5)的定义看上去没问题！引用时会出现问题！我用标准c编译器！他会访问越界！

user: user-7
content: 引用 1 楼 wang0635的回复:（1）数组中有7个元素，没有初始化到的用0补了 （5）数组中只有6个元素，全初始化了，却没有0 这个数组没有问题吗？

user: user-6
content: （1）数组中有7个元素，没有初始化到的用0补了 （5）数组中只有6个元素，全初始化了，却没有0
user-0 提问: linux C编译出错

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

user: user-0
content: 已经解决了，眼瞎了。和你说的一样。不过十分谢谢……

user: user-0
content: 引用 1 楼 user-2的回复:opnedir还是opendir？ 已经解决了，眼瞎了。和你说的一样。不过十分谢谢……

user: user-2
content: opnedir还是opendir？
user-0 提问: 这两个全局数组怎么失效了

回复:
user: user-1
content: 孩子！以后别撸了！听我的！没错

user: user-1
content: 访问越界！你定义的数组用第101个元素吗？

user: user-2
content: 不错

user: user-3
content: 局部变量和全局变量重名了~

user: user-0

user: user-0
content: #include <stdio.h> #include <stdlib.h>  #define  MaxNumber 100 #define  MaxWeight1 100 int M[100][100] ; int book[100] ;  struct Goods { 	int	weight[ MaxNumber ] ; 	int value[ MaxNumber]   ; 	int numbers            ;//物品数量 } ;   struct Knapsack { 	int MaxWeight ;  //背包承重量  } ;  int Max( int a, int b ) { 	if(a>b) return a ; 	else return b ; }   //自底向上动态规划 int MaxValue( struct Knapsack *knapsack ,  struct Goods *goods ) { 	int i , j ;  	for(j=0 ; j<=knapsack->MaxWeight ; j++ ) //第0行每列都为0 		M[0][j] = 0 ;     	for(i=1 ; i<=goods->numbers ; i++) 	{ 		M[i][0] = 0  ;	//逐行，从左向右依次填充表格 		for(j=1 ; j<= knapsack->MaxWeight ; j++) 		{ 			if( j< goods->weight[i] ) 				M[i][j] = M[i-1][j] ; 			else   				M[i][j] = Max( M[i-1][j] , goods->value[i]+M[i-1][ j-goods->weight[i] ] ) ;			 		}	 	} 	 	return M[goods->numbers][knapsack->MaxWeight] ; }  void recall(struct Knapsack *knapsack ,  struct Goods *goods ) { 	int i , j ;//回溯表格，标记最优子集中的物品,属于最优子集中的标记为1，否则标记为0 	j=knapsack->MaxWeight ; 	for(i=goods->numbers ; i>=0 ; i--)	 			if(M[i][j] == M[i-1][j] ) 			{ 				book[i]=0 ;//第i个物品放与不放不影响价值，则不需要放入 			} 			else 			{	 				book[i]=1 ;//第i个物品取出 				j = j-goods->weight[i] ; 			} 		  }  int main( ) { 	int i,j ; 	int MV ; 	struct Knapsack *knapsack ; 	struct Goods *goods ;  	knapsack=(struct Knapsack *)malloc(sizeof(struct Knapsack) ) ; 	goods = (struct Goods *)malloc( sizeof(struct Goods) ) ;  	printf("输入背包最大承重量\n"); 	scanf( "%d" , &knapsack->MaxWeight ) ;//输入背包最大承重量  	printf("输入物品数量\n"); 	scanf( "%d" , &goods->numbers ) ; //输入物品数量  	printf("输入物品重量\n"); 	for( i=1 ; i<=goods->numbers ; i++ )//输入物品重量 	{ 		scanf("%d",&goods->weight[i]) ; 	}  	printf("输入物品价值\n"); 	for( i=1 ; i<=goods->numbers ; i++ )//输入物品价值 	{ 		scanf("%d",&goods->value[i]) ; 	}  	MV=MaxValue( knapsack , goods ) ;  	printf("背包能容纳的最大价值%d\n" , MV ) ;	 	 	printf("输出表格\n"); 	for(i=0 ; i<=goods->numbers ; i++)//输出表格 	{	 		for(j=0 ; j<=knapsack->MaxWeight ; j++) 			printf("%d ", M[i][j]) ; 		printf("\n"); 	} 	 	//最优子集不止一种如何输出 	recall( knapsack , goods ) ; 	printf("输出最优子集物品编号\n") ;  	for(i=1;i<=goods->numbers;i++) 		if(book[i]==1) printf("%d ",i) ; 	printf("\n") ; }

user: user-0
content: 找到M[][]的原因了，在函数内部定义了一次M[][]导致全局变量定义失效，book[]失效还在找原因

user: user-4
content: MaxValue函数中又有一个局部的数组M
user-0 提问: 读配置文件问题

回复:
user: user-1
content: num++;if (num>=100) {printf("SectionNumbers>=100!\n";return 1;}

user: user-2
content: 大早上特意来为楼主改代码，改动如下，望采纳。 #include <stdio.h> #include <stdlib.h> #include <string.h>  int GetConfigSection(char *FileName){     FILE *fp;     //char *SectionName[100];     char SectionName[100][32];     char buffer[100];     int num=0;     memset(SectionName, 0, sizeof(SectionName));     if(NULL==(fp=fopen(FileName,"r"))){         perror("fopen"),exit(-1); } printf("文件打开成功\n");     while(!feof(fp)){ char *p1,*p2;         memset(buffer,0,sizeof(buffer));         if(NULL==fgets(buffer, 20, fp))             break;         if(*buffer == '['){ //printf("%s",buffer); num++; p1 = buffer+1; p2 = buffer+1; while(*p1 != ']') p1++; *p1 = '\0'; //SectionName[num-1] = p2; strcpy(SectionName[num-1],p2); printf("%s\n",SectionName[num-1]);         }     } printf("%s\n",SectionName[0]);         SectionName[0]原来是指向buffer+1的位置的 ，现在buffer+1处的字符串早就为空了。 printf("%s\n",SectionName[1]);           printf("%s\n",SectionName[2]);           printf("节名个数:num=%d\n",num); return num; } int main(void){     int num = GetConfigSection("./Config"); printf("%d\n",num); printf("\n");     return 0; }

user: user-2
content: 因为你char *SectionName[100] 定义的是指针数组，在循环里的时候， SectionName［0］指向p1，所以能打印出来，而出了循环， SectionName［0］只是个指针。   说到底就是你找到的 SectionName 没有保存。  你可以用二维数组 char SectionName[100]［32］，这样就能行。

user: user-2
content: 话说我好像有回答过楼主这个类似问题。

user: user-3
content: boost::property_tree
user-0 提问: 如何让这个程序在C++中运行

回复:
user: user-1
content: C与C++程序设计学习与实验系统 2013.3 自带TC和VC编译器，自带DOSBox 你这个是TC程序，就用TC编译器 如果要移植到Windows下，可以了解一下EasyX

user: user-2
content: Head.h 这个文件不存在，先找到这个文件吧

user: user-0
content: 几个头文件都不在，这个程序好像很古老
user-0 提问: c语言指针传递原来值到底变不变请教大神

回复:
user: user-1
content: printf()不是函数！ printf()的参数是从右向左计算的！

user: user-2
content: C语言只有传值调用 所有的实参都不会变 通过参数找到的其他内容有可能被改变

user: user-3
content: 引用 4 楼 srx942173347 的回复:[quote=引用 1 楼 aini_dianlu 的回复:] 函数参数的压栈顺序导致的，就你后面这段打印在不同的编译器上有可能会导致结果不同 请问以后编程怎样避免这样的情况？[/quote] 很简单，在同一个函数的多个参数之间如果有互相计算关系，不要再直接在参数中嵌套调用。 最简单的避免方法就是，先计算函数的值然后再将此值传入函数就行，不要直接嵌套调用。 像你这种情况，如果项目很大，这个隐含的bug会坑死很多人！！！

user: user-4
content: x变量的地址是复制进函数的，所以返回值（复制后的地址）与原X地址肯定不同 x本身则是相同的，函数中修改的值会反应到X变量

user: user-0
content: 引用 1 楼 aini_dianlu 的回复:函数参数的压栈顺序导致的，就你后面这段打印在不同的编译器上有可能会导致结果不同 请问以后编程怎样避免这样的情况？

user: user-3
content: 刚才在手机上回答的，现在上电脑详细解释一下。 1，这个函数qiuhe2调用之后肯定是会导致传入的参数值发生变化的，这个是毫无疑问的，在这一点上就不用纠结了。 2，C语言中，调用函数时会系统会讲函数的参数压入栈，之后执行函数代码。那么问题来了，对于多个参数，先压入 哪一个参数呢？也就是说，函数的参数时从左到右压栈还是从右到左？这个具体的编译器以及平台会有不同的结果， 有的是从左到右，有的编译器是从右到左。 3，所以，你得问题情况就是如下： a，系统在调用printf时，如果参数从左到右压栈，那么*qiuhe(&x)会比x先执行计算，所以到计算x的时候，其实此时x的值已经 在计算qiuhe(&x)的时候被改变了，此时，x被打印出来就是改变之后的结果。 b，如果系统是从右到左压站，那么，x先别传入printf,之后qiuhe2才会被调用计算出结果并传入printf，此时，打印出的x的 值就是为被改变之前的值。此时就看起来好像是x的值“没变”，其实x的值已经变了，只不过，x先被值传递到printf的而已。

user: user-5
content: 你在16行之后加一句： printf(",调用后x=%d\n",  x); 看结果思考一下

user: user-3
content: 函数参数的压栈顺序导致的，就你后面这段打印在不同的编译器上有可能会导致结果不同
user-0 提问: 求解

回复:
user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 自己运行一下不就知道答案咯 然后再调试一遍，不就知道为啥了？

user: user-3
content: <script>alert("close me!")</script>

user: user-4
content: 选A。 递归，n的值分别是0 1 2 3。  为了方便，第一个e（）为a，第二个e（）为b。  3是初始值，直到n变成0一直没有输出。 从0开始退出每层递归： 第一步 0的时候，if条件不满足，不输出； 第二步 1的时候输出0； 第三步 2的时候，输出1，b执行，但是条件不满足，没有输出； 第四步 3的时候，输出2，b执行，然后重复第一步和第二步，输出0； 结束。
user-0 提问: 请教c语言把malloc申请的内存块写入各种数据后存进文件，但是从文件中读出来时发现数据的位置有变动。即无法读取正确的数据

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

user: user-2
content: 任何地址，都不要写入文件 读出来后很可能是无效的，即不是所希望的位置

user: user-3
content: 1）结构体，有对齐问题，这个跟编译器有关 2）int,double 等非单字节数据，有字节序问题，这和CPU等平台相关。 如果你采用的，是同一个操作系统的同一个版本，同一个编译器的同一版本 编译参数也是相同设置。那应该没问题。  如果出现，和上面两种情况相关的问题，那就可能读取出错。 否则，可能是你自己的读写代码有问题。

user: user-4
content: 用结构体，把结构体写到文件里面对取得时候遍历就好了，不会乱不影响使用
user-0 提问: c/c++标准有没有规定字符编码？

回复:
user: user-1
content: 更多的处理方法是，你的源文件是啥编码的，你的字符串就是啥编码的。  编译器通常不给自己找麻烦做编码转换。  只有程序员才必须知道自己的东西是啥编码的，以便于信息的显示、传输或交换。  ===========  你那个数组，你有没有指定长度，编译器自然会自己计算长度开辟空间。  不过编译器通常不会去管你的编码是啥，程序源文件中，两个引号之间的二进制字节会是字符串的内容。  引用 5 楼 u012879787 的回复:[quote=引用 4 楼 user-2 的回复:] Windows 上 MBCS 字符串，和ANSI字符串 都采用 char数组实现， 这个已经使用很多年了，不可能给什么警告。 除非微软以后都不支持， 仅仅支持 ANSI编码（8bits ,256甚至仅仅128个字符） 和UNICODE编码（16Bits ,后来也不够用了，一部分采用32Bits编码）。 windows 采用 MBCS 编码，支持西方语言和多字节混合编码。 后来又有UNICODE编码，支持统一编码。 linux 采用 UTF8 编码，支持西方语言和多字节混合编码。是单字节和UNICODE编码的杂糅 UTF8 编码 也被网络传输采用 所以，编程语言，尤其是像，C,C++这种跨平台的编程语言，不太可能仅仅支持哪一种编码  不知道你是不是没有理解我的意思，还是我没有理解你的。  我是想说：  1. c/c++编译器对于 字符串的编码默认是由操作系统来决定（编译器没有规定），  windows 采用mbcs， 由于国内几乎都是中文系统，很少见纯英文操作系统。所以编码实际上是gbk，  gbk对中文是2个字节。所以那个数组没有溢出。  2.  linux下默认是utf-8,  gcc默认也采用utf-8， utf8对于中文字符可以采用2-3个，  所以造成了数组溢出！！！  中——E4B8AD  国——E59BBD   加上3个asicc码， 导出溢出！！！   以上是我要表达的观点。  ————————分割线—————————————————————— 下面说你提到的问题：   MBCS 字符串，和ANSI字符串   其中ansi就是mbcs， dbcs也是mbcs的一个子集。   警告的原因是溢出，和微软有没有搞这么多年，感觉没有关系。[/quote]

user: user-2
content: 刚刚查了一下，中国的编码是0x4E2D;0x56FD; 按说，UTF8三字节编码汉字，跟两字节编码 不是同一 位置的数据，应该不会忽而两字节，忽而三字节吧 我觉得，遇到汉字统一三字节应该就可以了 毕竟字符串加结束符是编译系统做的。数组大点没问题。

user: user-2
content: 如果你只是用到 127以内的字符。按照字符数数，没有问题 如果包含汉字，还希望能够兼容，数组只好开大一点了。 不考虑 个别32Bits 汉字， utf8  最多3各字节， MBCS 汉字最多占用2个字节。 unicode 16 汉字两个字节，不过字母也占用两个字节。 如果是网上传过来的文件，会自动转换代码的应该，因为网上用UTF8 正好是linux的格式 Windows估计会做转换 如果是优盘复制就不会转换了

user: user-0
content: 引用 4 楼 user-2 的回复:Windows 上 MBCS 字符串，和ANSI字符串 都采用 char数组实现， 这个已经使用很多年了，不可能给什么警告。 除非微软以后都不支持， 仅仅支持 ANSI编码（8bits ,256甚至仅仅128个字符） 和UNICODE编码（16Bits ,后来也不够用了，一部分采用32Bits编码）。 windows 采用 MBCS 编码，支持西方语言和多字节混合编码。 后来又有UNICODE编码，支持统一编码。 linux 采用 UTF8 编码，支持西方语言和多字节混合编码。是单字节和UNICODE编码的杂糅 UTF8 编码 也被网络传输采用 所以，编程语言，尤其是像，C,C++这种跨平台的编程语言，不太可能仅仅支持哪一种编码  不知道你是不是没有理解我的意思，还是我没有理解你的。  我是想说：  1. c/c++编译器对于 字符串的编码默认是由操作系统来决定（编译器没有规定），  windows 采用mbcs， 由于国内几乎都是中文系统，很少见纯英文操作系统。所以编码实际上是gbk，  gbk对中文是2个字节。所以那个数组没有溢出。  2.  linux下默认是utf-8,  gcc默认也采用utf-8， utf8对于中文字符可以采用2-3个，  所以造成了数组溢出！！！  中——E4B8AD  国——E59BBD   加上3个asicc码， 导出溢出！！！   以上是我要表达的观点。  ————————分割线—————————————————————— 下面说你提到的问题：   MBCS 字符串，和ANSI字符串   其中ansi就是mbcs， dbcs也是mbcs的一个子集。   警告的原因是溢出，和微软有没有搞这么多年，感觉没有关系。

user: user-2
content: Windows 上 MBCS 字符串，和ANSI字符串 都采用 char数组实现， 这个已经使用很多年了，不可能给什么警告。 除非微软以后都不支持， 仅仅支持 ANSI编码（8bits ,256甚至仅仅128个字符） 和UNICODE编码（16Bits ,后来也不够用了，一部分采用32Bits编码）。 windows 采用 MBCS 编码，支持西方语言和多字节混合编码。 后来又有UNICODE编码，支持统一编码。 linux 采用 UTF8 编码，支持西方语言和多字节混合编码。是单字节和UNICODE编码的杂糅 UTF8 编码 也被网络传输采用 所以，编程语言，尤其是像，C,C++这种跨平台的编程语言，不太可能仅仅支持哪一种编码

user: user-0
content: 引用 1 楼 user-2 的回复:没有吧， 毕竟操作系统，才能决定该用什么编码 例如 UTF8 编码，Window 并不怎么爱用 不过，C11以及以后的标准， 规定了字符串常量 可以按照 某种编码给出。 u8"abcs" 是UTF8 编码，如此等等 引用 2 楼 fefe82 的回复:这些都是 implementation defined 。也就是，由编译器自行规定。  那这不会带来问题吗？  比如：  char str[7] = "he中国";  不同的编码方式，容易造成，溢出的。  gbk 2个字节一个中文， 如果操作系统用utf8来解释这句代码的话，恐怕？  做个试验：  linux 下编译，果然有警告  vc15 无警告， vc15应该说对警告，错误检测已经很严格了。

user: user-1
content: 这些都是 implementation defined 。也就是，由编译器自行规定。

user: user-2
content: 没有吧， 毕竟操作系统，才能决定该用什么编码 例如 UTF8 编码，Window 并不怎么爱用 不过，C11以及以后的标准， 规定了字符串常量 可以按照 某种编码给出。 u8"abcs" 是UTF8 编码，如此等等
user-0 提问: 关于位类型

回复:
user: user-1
content: 引用 5 楼 paschen 的回复:[quote=引用 4 楼 paschen 的回复:] *(unsigned long*)flag  ?  错了，*(unsigned char*)flag ??[/quote]  *(unsigned char*)&flag

user: user-1
content: 引用 4 楼 paschen 的回复:*(unsigned long*)flag  ?  错了，*(unsigned char*)flag ??

user: user-1
content: *(unsigned long*)flag  ?

user: user-2
content: 引用 2 楼 mewiteor 的回复:printf("%hhu\n",*(unsigned char*)flag); 少了个&，应该是 printf("%hhu\n",*(unsigned char*)&flag);

user: user-2
content: printf("%hhu\n",*(unsigned char*)flag);

user: user-3
content: union U {  FLAGS f; unsigned char u; };  U flag; printf("%d\n", flag.u);

user: user-2
content: 引用 9 楼 ojc520520 的回复:[quote=引用 8 楼 mewiteor 的回复:] [quote=引用 7 楼 ojc520520 的回复:] [quote=引用 3 楼 mewiteor 的回复:] [quote=引用 2 楼 mewiteor 的回复:] printf("%hhu\n",*(unsigned char*)flag); 少了个&，应该是 printf("%hhu\n",*(unsigned char*)&flag);[/quote] hhu这个代表了什么？[/quote]printf, fprintf, sprintf, snprintf, printf_s, fprintf_s [/quote] 英文不好看不懂，好像没看到对hhu的描述[/quote]就是中间的那个表格。length modifier中有hh，Conversion specifier中有u

user: user-0
content: 引用 8 楼 mewiteor 的回复:[quote=引用 7 楼 ojc520520 的回复:] [quote=引用 3 楼 mewiteor 的回复:] [quote=引用 2 楼 mewiteor 的回复:] printf("%hhu\n",*(unsigned char*)flag); 少了个&，应该是 printf("%hhu\n",*(unsigned char*)&flag);[/quote] hhu这个代表了什么？[/quote]printf, fprintf, sprintf, snprintf, printf_s, fprintf_s [/quote] 英文不好看不懂，好像没看到对hhu的描述

user: user-2
content: 引用 7 楼 ojc520520 的回复:[quote=引用 3 楼 mewiteor 的回复:] [quote=引用 2 楼 mewiteor 的回复:] printf("%hhu\n",*(unsigned char*)flag); 少了个&，应该是 printf("%hhu\n",*(unsigned char*)&flag);[/quote] hhu这个代表了什么？[/quote]printf, fprintf, sprintf, snprintf, printf_s, fprintf_s

user: user-0
content: 引用 3 楼 mewiteor 的回复:[quote=引用 2 楼 mewiteor 的回复:] printf("%hhu\n",*(unsigned char*)flag); 少了个&，应该是 printf("%hhu\n",*(unsigned char*)&flag);[/quote] hhu这个代表了什么？
user-0 提问: C语言读取文件的一个很奇怪的问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:fscanf(fp, "%d%d", &a, &b); fscanf(fp, "%d“, &CityInfo[a].TInfo[b].MoneyCost);  你一行的最后一个数据读取的时候要用到 a, b ，所以不要写到一起。  正解，谢谢了！奇怪在第一次读取第一行没问题，后面几次读取才出问题

user: user-1
content: fscanf(fp, "%d%d", &a, &b); fscanf(fp, "%d“, &CityInfo[a].TInfo[b].MoneyCost);  你一行的最后一个数据读取的时候要用到 a, b ，所以不要写到一起。
user-0 提问: vs2013编译不过，运行不出来。求大神帮忙看看。

回复:
user: user-0
content: 引用 1 楼 user-2的回复:strcpy_s的参数第一个是目的，第二个是目的大小，第三个是源 所以你参数顺序没搞对，你把大小放在最后了 其次把其他函数放到主函数前，或者在主函数前面加上声明 谢谢你啊

user: user-0
content: 谢谢各位大神 ，问题已经解决了 嘿嘿

user: user-1
content: C++环境下编译，加头文件#include<stdlib.h>; gets_s(name[i], 9);改为gets_s(name[i] ; strcpy_s(temp2, name[i], 7); strcpy_s(name[i], name[min], 7); strcpy_s(name[min], temp2, 7); 上述三条改为 strcpy(temp2, name[i]); strcpy(name[i], name[min]); strcpy(name[min], temp2); 编译通过，运行正确

user: user-1
content: gets_s(name[i], 9);改为gets(name[i]);

user: user-2
content: strcpy_s的参数第一个是目的，第二个是目的大小，第三个是源 所以你参数顺序没搞对，你把大小放在最后了 其次把其他函数放到主函数前，或者在主函数前面加上声明
user-0 提问: 求助：c语言神奇的问题，真的是日狗了，请各位大神解救

回复:
user: user-0
content: 谢谢楼上。。。自己太逗比了

user: user-1
content: int locate(char *s,char a)//给出字符a在字符串s中的下标 {     int i;     while(*(s+i)!=a&&*(s+i)!='\0') ++i;     if(*(s+i)=='\0'){         printf("There is no 'a' in the string.\n");         return -1;     }     return i; } --- int i,没有对i初始化，改了之后试试呢
user-0 提问: 如何用C编程，遍历一个配置文件中的所有节名，并保存到一个字符指针数组中？？？？请高手们指教！！！

回复:
user: user-1
content: 里面居然不能标注红色，重传一次。（令一个帖子不让我传了，只能放到楼主这个帖子了。）  #include <stdio.h> #include <stdlib.h> #include <string.h>  int GetConfigSection(char *FileName){     FILE *fp;     //char *SectionName[100];    char SectionName[100][32];     char buffer[100];     int num=0;     memset(SectionName, 0, sizeof(SectionName));     if(NULL==(fp=fopen(FileName,"r"))){         perror("fopen"),exit(-1); } printf("文件打开成功\n");     while(!feof(fp)){ char *p1,*p2;         memset(buffer,0,sizeof(buffer));         if(NULL==fgets(buffer, 20, fp))             break;         if(*buffer == '['){ //printf("%s",buffer); num++; p1 = buffer+1; p2 = buffer+1; while(*p1 != ']') p1++; *p1 = '\0'; //SectionName[num-1] = p2; strcpy(SectionName[num-1],p2);  printf("%s\n",SectionName[num-1]);         }     } printf("%s\n",SectionName[0]);         SectionName[0]原来是指向buffer+1的位置的 ，现在buffer+1处的字符串早就为空了。 printf("%s\n",SectionName[1]);           printf("%s\n",SectionName[2]);           printf("节名个数:num=%d\n",num); return num; } int main(void){     int num = GetConfigSection("./Config"); printf("%d\n",num); printf("\n");     return 0; }

user: user-0
content: 我这是在linux下，另外能不能写出详细的代码啊，我是个新手啊！

user: user-1
content: 用fgets(fp)一行行读取，第一个字符为‘[’为所需的，保存到定义的数组中。

user: user-2
content: 可以用boost::property_tree

user: user-3
content: WINDOWS自身带了读写 ini配置文件的API，不需要自己写 比如GetPrivateProfileString 等，用法网上都有讲
user-0 提问: 有关c语言宏定义

回复:
user: user-1
content: 之后如果用到，就把他替换成空，一般仅作一个标记 还有就是如果定义了这个宏可以通过#ifdef  #ifndef 判断是否定义过，根据判断结果编译不同的代码

user: user-2
content: 定义为空，就没作用。  显然在没有定义 ENABLE_DTRACE 的时候，不需要这些语句。
user-0 提问: 初上OJ；算高精度阶乘和遇到超时，不知道程序还能怎么优化，大神求解

回复:
user: user-0
content: 对哦要用数组

user: user-1
content: __int64 factorial(int num)  //用__int64减小溢出可能性 { 	__int64 value = 1; 	while(num>1) 		value*=num--; 	return value; }

user: user-2
content: 你这好像不是高精度阶乘吧，高精度阶乘可以用数组实现

user: user-3
content: 在计算factorial(int m)的时候，循环中从1开始乘开始已经把1到m-1的阶乘全部计算了一遍， 越小的数的阶乘被重复计算的次数越多，建议楼主建立一个存n个数的数组 long* arr =  (long*)malloc(n*sizeof(long)); arr[0] = 1; for(int i = 1; i <n; ++i) { arr[i] = arr[i-1]*(i+1); }  for(int i = 0; i < n; ++i) { S += arr[i]; }

user: user-4
content: #include"stdio.h" long main() {     long S=0;     long n,i;     long p=1;     scanf("%d",&n);     for(i=1;i<=n;i++)     {         p*=i;         S+=p;     }     printf("%ld",S); }

user: user-0
content: 刚刚看到你发的觉得好简单可是运行了一下还是超时

user: user-4
content: #include"stdio.h" long main() { 	long S=0; 	long n,i; 	long c,p=1; 	scanf("%d",&n); 	for(i=1;i<=n;i++) 	{ 		p*=i; 		S+=p; 	} 	printf("%ld",S);  }
user-0 提问: 大神求解！初上OJ，最怕遇到答案对却wronganswer的题

回复:
user: user-1
content: 楼主现在就改行还来得及。

user: user-2
content: 很多问题，你试下你的版本字符串第一个是数字能统计到吗？isdigit没有包含头文件，ch大小应该是256   #include <stdio.h> #include<ctype.h> int main() { 	int i=0,c=0; 	char ch[256]; 	gets(ch); 	while(ch[i]!='\0') 	{ 		if(isdigit(ch[i])) 			c++; 		i++; 	} 	printf("%d",c); 	return 0; }

user: user-3
content: 首先第一，按照题意，数组为ch[256]才对，应为要包含最后一个结束符‘\0’, 第二，i++，应给放在while循环的最后一句。不然一开始就没检测到ch[0]。 还有while（ch[i]  != '\0'）的意思是检测到最后的字符为‘\0’时结束循环。 ‘\0’是字符串的结束标志。你输入完字符串按确定后，系统会自动在字符串最后加一个'\0'. 所有while判定是以'\0'为结束的标志。

user: user-4
content: 我觉得应该把＇\0＇换成＇\n＇

user: user-5
content: 小白有话想问，就是那个while里面的意思是当ch[i]不等于空格的时候的在开始循环吧（不知道这么理解对不对），但是为什么不能去掉呢，假入我去掉了然后不打空格的话，运行也不对啊，而且我试了试用没有ctype.h的头文件只用stdio.h的也ac了啊请问大神为什么呢

user: user-6
content: ch[256]

user: user-7
content: 头文件错了#include<iostream>

user: user-0
content: 好像还是错的。

user: user-7
content: #include"stdio.h" int main() {     int i=0,c=0;     char ch[255];     gets(ch);     while(ch[i]!='\0')     {                if(isdigit(ch[i]))         c++;          i++;//放到这里     }     printf("%d",c); }
user-0 提问: 字符数组内容为0X04，0X03，0X00....，作输出后为04 03 00，而不是4 3 0这样的形式?

回复:
user: user-1
content: printf("%02X ",buf[i]);  这跟浮点型数想保留两位小数一样道理

user: user-2
content: 用 "%02X"

user: user-3
content: printf("%X ",buf[i]) 修改为 printf("%02X ",buf[i]);
user-0 提问: 初学者关于数组的问题

回复:
user: user-1
content: 告诉你一个最简单的办法。   一批数对吧， 不知道多少个对吧， 那么100个够不够？a[100] 不够？1000个够不够？a[1000] 还不够？100w个够不够？a[1000000] 总够了吧

user: user-2
content: 搂主总得说明你的一堆整数程序是如何输入的阿?对吧,是文件呢,还是一个一个的键盘输入呢,这样才好设计整个程序的逻辑流程.

user: user-3
content: 预先指定个数或结束符。

user: user-4
content: 对于我们初学者来说还不知道动态内存是什么意思， 我大概只会判断一下录入了多少个数字之间的分隔符来判断输入了多少个数字

user: user-5
content: 程序使用方法： 1、每输入一个整数，按一下回车。 2、最后，输入calc，并且按回车开始计算。  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct _Node {     int value;     _Node * next; }Node;  int main() {     //初始化     Node * pHead = new Node;     pHead->next = NULL;     Node * pTemp = NULL;     int max=0, min=0;          //录入数据     char buf[32];     while(true) {         scanf("%s", buf);         if (strcmp(buf, "calc") == 0)             break;         else         {             Node * pTemp = new Node;             pTemp->value = atoi(buf);             pTemp->next = pHead;             pHead = pTemp;         }     }      //计算数据     pTemp = pHead;     max = min = pTemp->value;     while (pTemp->next)     {         if (pTemp->value > max)             max = pTemp->value;         if (pTemp->value < min)             min = pTemp->value;         pTemp = pTemp->next;     }      //输出结果     printf("最大值为%d，最小值为%d\n",max,min);      //清理     while (pHead)     {         pTemp = pHead;         pHead = pHead->next;         delete pTemp;     }      //暂停     system("pause");     return 0; }

user: user-6
content: 可以这么定义 struct unfixedArr { int len; int a[];//这里也可以设为1 个元素 };  unfixedArr *alloc_arr(int n) {      unfixedArr *p = malloc (sizeof(unfixedArr ) +sizeof(int)*n);      if(p)p->len =n;       return p;  }

user: user-7
content: 用链表来实现

user: user-8
content: 先让用户输入数组长度，然后动态分配一个：int* arr = (int*)malloc(n*sizeof(int));   //n为数组元素个数

user: user-9
content: 先malloc申请，不够（判断）再通过relloc申请

user: user-10
content: 一个未定义长度的数组，是编译不了的，数组的内存未指定

user: user-11
content: VLA或动态内存都可以

user: user-0
content: 大概的意思是a[n]
user-0 提问: 关于linux内核链表写法问题

回复:
user: user-0
content: 引用 5 楼 chj4129 的回复:1.这里就是一个量表的头，占用2个指针的内存，如果用struct    list_head *app_info_head的话，还需要为app_info_head去kmalloc内存，一般人不会这么写代码的。 2.如果是hash表的表头，就有可能使用指针。  非常感谢 想明白了  如果是指针  这里只不过是分配一个指针变量  没有任何的内存空间  就需要malloc内存然后挂载上去才行！ 所以用结构体方法！

user: user-0
content: 老师  您直接告诉我 不就得了么

user: user-1
content: 网上搜，有理由的。

user: user-2
content: 1.这里就是一个量表的头，占用2个指针的内存，如果用struct    list_head *app_info_head的话，还需要为app_info_head去kmalloc内存，一般人不会这么写代码的。 2.如果是hash表的表头，就有可能使用指针。

user: user-1
content: 引用 2 楼 Unixb 的回复:老师  您直接告诉我 不就得了么 问题是我也忘了。 http://www.cnblogs.com/Daniel-G/archive/2013/09/06/3305834.html http://www.cnblogs.com/Anker/archive/2013/12/15/3475643.html

user: user-3
content: container_of()的存在，让它成为可能 1. 每个需要链入的结构实例中都嵌入list_head实例 2. 通过嵌入list_head实例相互链接起来，而不关心具体的“箱子”结构体是什么，实现了任何类型都能链接起来的通用 3. 通过指定的结构类型，和链表指针，使用container_of()宏反推结构体的基址  打个比方：货运火车见过吧？这个list_head就像货运火车,不同的结构体实例就是火车上的货物，第一节是油罐，第二节是木材，第三节是坦克。container_of()通过链接指针和货物类型，就能获得它的实例基址。
user-0 提问: 求助C语言构建数据结构中的线性顺序表

回复:
user: user-1
content: 引用 2 楼 roovyoung 的回复:[quote=引用 1 楼 user-2 的回复:] 别直接传结构体。  把所有的函数都修改为传递指针，例如：  Sqlist * InitList_Sq(Sqlist * p_list) {     p_list->elem = ... }  int main(int argc, char ** argv) {      Sqlist La;        InitList_Sq(&La);      ...  } 谢谢，做出来了，能告诉我原因吗？[/quote]  传入函数的参数按值传递只是一个副本，如果你要修改他，应该传递他的地址进函数

user: user-0
content: 引用 1 楼 user-2 的回复:别直接传结构体。  把所有的函数都修改为传递指针，例如：  Sqlist * InitList_Sq(Sqlist * p_list) {     p_list->elem = ... }  int main(int argc, char ** argv) {      Sqlist La;        InitList_Sq(&La);      ...  } 谢谢，做出来了，能告诉我原因吗？

user: user-2
content: 别直接传结构体。  把所有的函数都修改为传递指针，例如：  Sqlist * InitList_Sq(Sqlist * p_list) {     p_list->elem = ... }  int main(int argc, char ** argv) {      Sqlist La;        InitList_Sq(&La);      ...  }
user-0 提问: 命令行参数错误！帮忙看看

回复:
user: user-1
content: 项目、属性、配置属性、调试、命令参数：填写命令行参数。

user: user-2
content: 去终端输入！ 直接用IDE编译肯定直接通过了！

user: user-1
content: http://bbs.csdn.net/topics/390469280

user: user-3
content: window下点开开始->运行，输入cmd，定位到你的程序目录，输入程序名空格后输入命令行参数

user: user-0
content: 我说的是main（）函数，它有两种一种是没有参数一种是有两个参数。两个参数就是上面的这种，但是运行不出来啊。

user: user-4
content: 项目属性中可以添加命令行参数，实际运行时可以在命令行下自己加上命令行参数，如果不加的话argc就是1（为程序自身路径） 这方面也不用看书，去网上看下资料就行了，没什么难理解的

user: user-5
content: 上面就会输出 shell.exe  arg1 arg2  arg3

user: user-5
content: 不是，你理解错了。 比如你上面这个是名为shell.exe的执行文件， 你在cmd里面输入 ./shell.exe arg1 arg2 arg3 那么main的形参argv就会包含这四个字符串。
user-0 提问: 在C中如何接收DLL发送的消息

回复:
user: user-1
content: 如果指的是SendMessage所发的消息，那么在对应窗口的回调程序中接收该消息。  假设该窗口句柄（hWnd）对应的回调函数为MyWndProc  LRESULT CALLBACK MyWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {       switch(uMsg)       {       ...       case MY_DEFINED_MESSAGE:             // do sth.              break;       }       return DefWindowProc(hWnd, uMsg, wParam, lParam); }