Question: 如何获取组合框控件中选择项的文本

CComboBox::GetLBText int GetLBText( int nIndex, LPTSTR lpszText ) const;  void GetLBText( int nIndex, CString& rString ) const;  Return Value  The length (in bytes) of the string, excluding the terminating null character. If nIndex does not specify a valid index, the return value is CB_ERR.  Parameters  nIndex  Contains the zero-based index of the list-box string to be copied.  lpszText  Points to a buffer that is to receive the string. The buffer must have sufficient space for the string and a terminating null character.  rString  A reference to a CString.  Remarks  Gets a string from the list box of a combo box. The second form of this member function fills a CString object with the item’s text.  CComboBox Overview |  Class Members |  Hierarchy Chart  See Also   CComboBox::GetLBTextLen,CB_GETLBTEXT   CB_GETLBTEXT An application sends a CB_GETLBTEXT message to retrieve a string from the list of a combo box.   CB_GETLBTEXT  wParam = (WPARAM) index;                // item index  lParam = (LPARAM) (LPCSTR) lpszBuffer;  // address of buffer    Parameters index  Value of wParam. Specifies the zero-based index of the string to retrieve.  lpszBuffer  Value of lParam. Pointer to the buffer that receives the string. The buffer must have sufficient space for the string and a terminating null character. You can send a CB_GETLBTEXTLEN message prior to the CB_GETLBTEXT message to retrieve the length, in bytes, of the string.  Return Values The return value is the length of the string, in bytes, excluding the terminating null character. If the index parameter does not specify a valid index, the return value is CB_ERR.   Remarks If you create the combo box with an owner-drawn style but without the CBS_HASSTRINGS style, the buffer pointed to by the lpszBuffer parameter of the message receives the 32-bit value associated with the item (the item data).   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 winuser.h.  See Also Combo Boxes Overview, Combo Box Messages, CB_GETLBTEXTLEN

MFC中的CComboBox类中有一个GetLBText，好像是这个可以获取某项的文本

你的想法是正确的，可能是细节上没注意到而已，比如窗口句柄是否正确。把代码贴出来嘛。

为毛没人鸟我？


Question: socket编程的问题，求高手指点

引用socket编程，如果我做服务端，那我能限制客户端来连我的ip地址吗 这是IT人员的工作，不需要写代码。 服务器也可以接受连接之后主动断开。

可以用数组存放连接套接字数，用IO复用select监听绑定了的fd,FD_ISSET()后判断数组fd连接数，超过限制则不accept（）

可以设置最大连接数：Listen(listenfd,LISTENQ);///LISTENQ==1024;可以改变其他值

这一般都是网卡做的吧 直接就有处理底层的过滤掉了啊  比如路由器的ACL 就可以直接设置驱动 可以对一些从底层直接拒绝掉。 你的Socket程序，人家驱动都把那个包收进来了,你只能在把它处理掉吧在程序里。估计只能是向楼上的 连接后判断是否过滤掉 在断开。。如果你问这个问题的目的是你的服务器怕很多陌生的IP连接，导致什么瘫痪啊，那就对请求的连接IP是禁止的每天进行一个Log日志统计，之后你写另一个可以操作驱动的程序或处理脚本，根据日志禁止IP访问的次数 把这个直接让它网卡都进不来。

lz这个服务器是用于局域网的吗

接收不允许的地址后，然后断开  如何？

原始套接字有那些功能

用防火墙就可以了，不过 192.168.1.1和192.168.1.2 是内网地址，经过路由器 NAT 后服务器看到的就不是这个地址了

等高手来帮忙解答啊


Question: 有哪些关于讲线程池，高并发，异步比较好的书籍资料？

windows核心编程，我也是来蹭分的，但那书真的不错

引用 1 楼 u013163178 的回复:windows核心编程 同意并蹭分。

windows核心编程


Question: Microsoft Visual C++2010 Express怎么用呀

嗯，目前我也在学习使用这款软件的过程中，哈哈。

好了 好高兴 iloveyou 这是我的输出结果

已经输出了，只是太快，一闪就结束了，你看不到结果而已。 按ctrl+F5运行就可以了。

发错了。是这张图，在哪里看那个输出iloveyou

知道怎么搞了，原来第二个项目建的位置错了。但是还有一个问题，不能显示输出结果呀


Question: 字符串全排列递归实现（避免重复），这段代码谁能说下思路，看不懂哇

@zzyafyj，十分感谢！

思路是： 1.轮流选取S[N]中的各个位作为第一位。如果第i位字符在[0,i-1]这个区间内出现过，就不再对其进行排列，因为把它放在第一位的所有排列在前面排列过了(就是代码中j作为循环变量的作用)。 2.把当前选取的这一位放入目标数组中 3.用一个临时数组保存剩余的字符，并把其作为源。同时目标数组的地址下移一位，因为当前位已经排列好。 4.递归 从1可以看出，这个算法是不会有重复排列的。 另外其他的一些注释： if(nLen == 1) { 		strTarget[0] = strSource[0];//拷贝最后一位 		printf("%s\n", t); 		return; }  for(i=0; i<nLen; i++) 		{ 			for(j=0; j<i && strSource[i] != strSource[j]; j++);//判断[0~i-1]区间内是否有与strSource[i]相同的字符，如果有则以strSource[i]开头的所有排列在j这个位置就已经做过，所以不再进行排列。 			if(j == i) 			{ 				strTarget[0] = strSource[i];//把strSource[i]作为排列的第一位。 				memcpy(strConvert, strSource, i); 				memcpy(strConvert+i, strSource+i+1, nLen-i-1);//这两行是把源字符串中剩余部分拷贝到临时数组中，因为strSource[i]的位置已经排好了 				convert(strConvert, strTarget+1, nLen-1); 			} 		}

引用 1 楼 u011779875 的回复:只从问题角度去分析下    1. 观察问题1123全排列  2.从递归角度实现全排列来看 思路可能是 求1123递归 只需要先求123的递归 递归下去。。。  3.从代码输出角度分析 观察全排列重复的情况，你会发现1123全排列之所以会重复是因为出现了俩个相临位数的相同导致的而  strSource[i] != strSource[j]在for中 且第一次不会判断 说明第二次如果俩个位数相同就不会再进入这个判断了 既相邻的不进行递归。  如果输入1213，全排列还是12个。所以这个程序不管重复的字符是否相邻都可以输出正确答案。


Question: 关于结构体内指针所指向的

引用 4 楼 u011391093 的回复:[quote=引用 3 楼 zhangsongtao123 的回复:] 注意看  ①、 20行         ret = (TSeqList*)malloc(sizeof(TSeqList)+sizeof(TSeqListNode)* capacity); 28行         ret->node = (TSeqListNode*)(ret + 1);//创建一个unsigned int 指针  ②、 75行 int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) // 插入O(n)  { . 96行 sList->node[i] = (TSeqListNode)node;//数据就插入这个位置 . } 由这两处可以看出 其存储的确实就对象的指针，获取的时候必然也就是对象的指针喽 同时我可以肯定，在对象释放的时候 肯定还要释放node指针对应的内存，不然就内存泄露了！！！  这是数据结构存储对象的常用方式，一般都是存储指针，并且该指针的对象一般都是动态开辟出来的内存，不然所指对象生命周期结束，被释放了，那么该指针就成野指针了！谢谢我已经懂了,我觉得他把数组元素赋值成地址,开始还不如创建一个指针数组int **node来代替那样,这样更容易理解,对吗,我感觉这样更好,请问这样可不可以[/quote]  SeqList* SeqList_Create(int capacity) // 传递创建的总数   O(1) {     TSeqList* ret = NULL;//创建结构体指针       if (capacity >= 0)//总数肯定要大于0的     {         ret = (TSeqList*)malloc(sizeof(TSeqList)+sizeof(TSeqListNode)* capacity);         //分配空间一个结构体的空间加上后面数组空间     }       if (ret != NULL)//判断是否创建失败     {         ret->capacity = capacity;         ret->length = 0;         ret->node = (TSeqListNode*)(ret + 1);//创建一个unsigned int 指针     }       return ret; } 由创建的函数可以知道，node指针的所知内存大小以及数据的数量是动态指定，因为new的时候是一块连续的空间，这样做的目的是方便释放内存。 如果按照你的意思，用一串连续的指针来存储数据，不是不可以，是因为难维护，释放的时候还要便利分别释放。  提示一点 int **node 可不是数组指针，自己去查查

引用 3 楼 zhangsongtao123 的回复:注意看  ①、 20行         ret = (TSeqList*)malloc(sizeof(TSeqList)+sizeof(TSeqListNode)* capacity); 28行         ret->node = (TSeqListNode*)(ret + 1);//创建一个unsigned int 指针  ②、 75行 int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) // 插入O(n)  { . 96行 sList->node[i] = (TSeqListNode)node;//数据就插入这个位置 . } 由这两处可以看出 其存储的确实就对象的指针，获取的时候必然也就是对象的指针喽 同时我可以肯定，在对象释放的时候 肯定还要释放node指针对应的内存，不然就内存泄露了！！！  这是数据结构存储对象的常用方式，一般都是存储指针，并且该指针的对象一般都是动态开辟出来的内存，不然所指对象生命周期结束，被释放了，那么该指针就成野指针了！谢谢我已经懂了,我觉得他把数组元素赋值成地址,开始还不如创建一个指针数组int **node来代替那样,这样更容易理解,对吗,我感觉这样更好,请问这样可不可以

指针还是用指针来存比较好，比竟有16位地址，32位地址，64位地址等不同 楼主可以发下SeqListNode的定义

没有看到SeqListNode的结构，不过显然是把sList->node[pos]整型值强转成指针了,或许作者用整型变量存储地址了！这是其一 如果SeqListNode是一个unsigned int类型，那么sList->node + pos更合理，也不需要类型转换。


Question: 求解输入数到数组问题

这几天都弄傻了    if(i<c)这里应该用for语句


Question: 新手求助

楼主虽然丝毫没有想要描述一下问题的意思，不过大家也都看出来了，在输入b为1后，下面的if中再输入的是字符，这个scanf会把缓存中的回车符读取，所以，输入字符前，一般都要加个清楚缓存的操作，比如楼上的，也可以getchar()

楼上正解。。。。

rewind(stdin);

#include<stdio.h>   int main() { 	char a; 	int b,c; 	 	printf("enter figure to choose   \n"); 	scanf("%d",&b); 	 	fflush(stdin);//清下缓冲  	 	if(b==1) 	{ 		scanf("%c",&a); 		 		if(a>=97) 			printf("%c\n",a-32); 		else if(a>=65) 			printf("%c\n",a+32); 		else  			printf("NO.%d\n",a); 	} 	else 	{ 		scanf("%d",&c); 		printf("NO.%d\n",c); 	} 	return 0; }


Question: 又被日经玩意撞了一下腰，气人

考这种题，我只能呵呵了；

其实这个种题目在理解编译器运作的时候是有意义的，不过做为考题价值不大。

让我想起了华山剑法。当年令狐冲和封不平。

吃饭睡觉都是活着的基础，可你有必要天天纠结于用勺子吃还是用筷子吃饭好，睡觉裸睡好还是穿睡衣好吗？楼猪的同事2，楼猪13

如果硬掰扯表达式的话：一种可能就是在执行 + 之前，i进行了两次++，即5，而后两个i相加  如果从标准看，这属于未定义语句，即使编译器给出的结果是 11, 12, 13, 14, ...  也都是正确的

怎么感觉还有点问题。。往前翻发现一帖，问i=3; (++i)+(++i)等于10的问题 虽然这东西是不确定的，但我觉得没有10的道理啊。无论两个++i哪个先算，总得有一个先算吧？而先算的那个，在算之前因为什么操作都没做，i必定是3，先算的那个++i必定是4 i=3; (++i)+(++i)这个东西，的确不确定，8和9都行，但10就觉得不可解释了 我这题的k，36和42都行，49就觉得不可解释了…… 如果10这个结果能出来，除非是发生了某种并行计算，在PC上总觉得无理

这题。。。出题人有问题。。。


Question: 求大神进来看看，请问为什么访问 3 号叶子的路径不能正确返回呢,

引用 3 楼 r_Jimy 的回复:楼主了，你的代码好乱啊~~~，下次发的时候整理下 问题在于Search函数可能返回未知值，（node的左右子树不空，但找到的p是空的，此时在if里不会返回）在search最末尾加个return NULL就可以了 大神啊，谢谢你

引用 1 楼 u011033348 的回复:楼主说得太简单了，把问题说明白点。 问题是，如何从根访问一个树的指定的叶子，显示它访问过程的路径，然后访问下一个指定的叶子，然后返回路径

楼主说得太简单了，把问题说明白点。


Question: c语言读文件死活读不到？？？？

引用 18 楼 wangyaninglm 的回复:各位我傻逼了，参数外面的尖括号忘了去调了，所以文件名全都是<intput.name>看着好像没错，其实都是错了的。。。+1

工作目录 或者 文件用绝对路径。这种问题查看下错误码，或者 监视中输入  @err,hr 看下 就很清楚了吧。

完整路径或者放到DEBUG下面去

引用 5 楼 wangzuxi 的回复:[quote=引用 1 楼 wangyaninglm 的回复:] input_left.ppm  这个文件明明在指定的位置啊？？？  啥情况么。。。。 你程序是运行在Debug目录下面，这个目录正面没有input_left.ppm这个文件[/quote] 你程序是运行在Debug目录下面，这个目录下面没有input_left.ppm这个文件，你用绝对路径应该就ok了

引用 1 楼 wangyaninglm 的回复:input_left.ppm  这个文件明明在指定的位置啊？？？  啥情况么。。。。 你程序是运行在Debug目录下面，这个目录正面没有input_left.ppm这个文件

文件名绝对路径

把那个文件放入Debug目录

工作目录没有设置吧？ 属性-配置属性-调试-工作目录

这样也行，楼主还需谨慎。。

引用 17 楼 mymtom 的回复:你的filename变量不对哦， 怎么有尖括号啊 "<input_left.ppm>"  我傻逼了。。。调试了一下午。。。。

引用 14 楼 zhao4zhong1 的回复:在fclose和fflush之前，文件不一定生成到磁盘上。  这个图片本身是有的嘛

绝对路径都，读不到，是个啥情况。。。。

在fclose和fflush之前，文件不一定生成到磁盘上。

建议楼主先学会如何全盘搜索指定文件名的文件

下面这样设置还是找不到啊。。。  E:\code\stereoMatch\match_original\win

但是我这个，getcwd代码生成的当前文件执行目录下面，有这个文件，还是找不到？还得在工程里面设置么？  。。。。  怎么这么坑爹

引用 2 楼 mymtom 的回复:工作目录没有设置吧？ 属性-配置属性-调试-工作目录  这个工作目录应该设置在何处？ 我的debug下面么？  这个是别人的工程，我看他程序生成都生成在win外头的bin文件夹下面了


Question: 【新手】如何在一个打开的文本文件中实现按照单词长度统计单词个数的功能呢

引用 6 楼 bjym1987 的回复:引用 5 楼 zhao4zhong1 的回复:万一一个单词长度是4GB呢？找老湿嗯弄个4GB的单词长度，不怕别人追杀你么. http://bbs.csdn.net/topics/360055953

万一一个单词长度是4GB呢？

引用 2 楼 r_Jimy 的回复:上面代码测试输出如下（其中类似X3J11,(X3)含非字母组合做了过滤，楼主看需要调整）： 该文本内容如下： The standard was developed by the X3J11 Technical Committee on the[3]the C Programming Language under project 381-D by American National[8]Nationa Standards Committee on Computers and Information Processing (X3).  上述文本中空白的数目:25  上述文本中字符的数目:169  上述文本中段落的数目:4  上述文本中单词的数目:25  长度      个数     1       1     2       4     3       5     4       0     5       1     6       0     7       1     8       4     9       6    10       1    11       2    12       0    13       0    14       0    15       0    16       0    17       0    18       0    19       0    20       0 由于是新手，所以问一下给出代码中的assert是个什么东西= =|| 还有打开的文件每个段落后面会多出来的类似[8]National，[3]the是怎么回事呢。可不可以去掉他们呢？ 啊。。还有。。中文全部崩掉了呢= =||

统计方法跟你后面提供的有所不同，供你参考  #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h>  FILE *fp; #define MAX_WORD_LEN 20  void main() {     int zifu=0,danci=0,kongbai=0,duanluo=0;     char ch;     char fname[1000];     char countArr[MAX_WORD_LEN]={0};     char chLen=0;     char chStr[21]={0};     int  i;     char wordTag = 1;//ÓÃÓÚ¹ýÂÇ·Çµ¥´Ê×éºÏ£¬Ä¿Ç°Ö»ÈÏÎª´¿×ÖÄ¸×éºÏÎªµ¥´Ê           printf("ÇëÊäÈëÐèÒª´ò¿ªµÄÓ¢ÎÄÎÄ±¾ÎÄ¼þÃû£º\n(×¢£ºÓ¦µ±°üº¬ÍêÕûÂ·¾¶)\n");     scanf("%s",fname);     if((fp=fopen(fname,"r"))==NULL)     {         printf("ÎÄ¼þ²»´æÔÚ£¡\n");         exit(0);     }     ch=fgetc(fp);     printf("\n¸ÃÎÄ±¾ÄÚÈÝÈçÏÂ£º\n");          while(ch!=EOF)     {     	if (ch>='A'&&chLen<='Z'||ch>='a'&&ch<='z') 	    { 	    	chStr[chLen]=ch; 	    	chLen++; 	    	assert(chLen<=MAX_WORD_LEN); 	    } 	    else if (ch !=' '&&ch!=10&&ch!=13) 	    { 	    	wordTag = 0; 	    }     	 	    if(ch==' ') 	    { 	    	if (chLen>0) 	    	{ 	    		if (wordTag) 	    		{ 		    		countArr[chLen-1]++; 		    		chStr[chLen]='\0'; 		    		//printf("[%d]%s ",chLen,chStr); debug 		    		danci++; 	    		} 	    		else 	    		{ 	    			wordTag = 1; 	    		} 	    		 	    		chLen = 0; 	    	} 	        kongbai++; 	    } 	    else if((ch>='!'&&ch<='~')) 	        zifu++; 	    else if(ch==10||ch==13) 	    { 	        duanluo++; 	        if (chLen>0) 	    	{ 	    		if (wordTag) 	    		{ 	    			countArr[chLen-1]++; 		    		chStr[chLen]='\0'; 		    		printf("[%d]%s ",chLen,chStr); 		    		danci++; 	    		} 	    		else 	    		{ 	    			wordTag = 1; 	    		} 	    		 	    		chLen=0; 	    	} 	    } 	 	    putchar(ch); 	    ch=fgetc(fp);     }          fclose(fp);     printf("\n\nÉÏÊöÎÄ±¾ÖÐ¿Õ°×µÄÊýÄ¿:%d\n",kongbai);     printf("\nÉÏÊöÎÄ±¾ÖÐ×Ö·ûµÄÊýÄ¿:%d\n",zifu);     printf("\nÉÏÊöÎÄ±¾ÖÐ¶ÎÂäµÄÊýÄ¿:%d\n",duanluo+1);     printf("\nÉÏÊöÎÄ±¾ÖÐµ¥´ÊµÄÊýÄ¿:%d\n",danci);          printf("\n³¤¶È      ¸öÊý\n");     for (i=0;i<MAX_WORD_LEN;i++)     {     	printf(" %4d    %4d\n",i+1,countArr[i]);     }      }

assert是断言，调试用，比如你输入文本有中文会触发断言失败，表明该程序不适用中文，如要使用中文需要调整，详细请百度自学 [8]National，[3]the表示National有8个字，the有3个字，这是我用来验证代码是否正确用的 请把下面这行注释掉 printf("[%d]%s ",chLen,chStr);


Question: 不同函数里的标签名是否可以相同？

引用 5 楼 mymtom 的回复:http://flash-gordon.me.uk/ansi.c.txt thank you!

引用 3 楼 mymtom 的回复:3.1.2.1 Scopes of identifiers    An identifier is visible (i.e., can be used) only within a region of program text called its scope . There are four kinds of scopes: function, file, block, and function prototype.  (A function prototype is a declaration of a function that declares the types of its parameters.)    A label name is the only kind of identifier that has function scope. It can be used (in a goto statement) anywhere in the function in which it appears, and is declared implicitly by its syntactic appearance (followed by a : and a statement).  Label names shall be unique within a function. 版主大人，这段出自哪里？

可以相同，GOTO不会GO到另一个函数去，同一个函数内唯一即可

可以相关同，GOTO不会GO到另一个函数去

是一个局部的。。

可以，只在函数内起作。

没试过，但这样做不会导致理解错误吗


Question: 真心求大神帮忙  已经有图 但是没有程序

但是这个程序不能用的仿真图里面的要求啊  要怎么改呢

学生吧，proteus,有什么问题吗？这个程序没啥难度。

#include<reg52.h> #include ".\LCD1602\LCD1602.h"     //调用LCD1602里的函数 #define uchar unsigned char		   //宏定义 #define uint unsigned int		   //宏定义 uchar c=0,e=0,i=0,t=5; unsigned char ss; sbit L=P1^3;     //提示灯 sbit K1=P1^4;    //用于给A对加分 sbit K2=P1^5;    // 给A对减分 sbit K3=P1^6; 	 // 给B对加分 sbit K4=P1^7;    //给B对减分 sbit K5=P3^0;	 //比赛开始暂停按键 /**************按键控制分数*****************/ void key() { 	if(TR0==0) 	{ 		K1=1;				 //中断没开始的时候，K1置1，按键锁定 		K2=1;				 //中断没开始的时候，K2置1，按键锁定 		K3=1;				 //中断没开始的时候，K3置1，按键锁定 		if(K4==0) 		{ 			c=0;			//中断没开始的时候，A队分数置0 			e=0;			//中断没开始的时候，B对分数置0 			t=5;			//中断没开始的时候，倒计时时间置5 			L=1;			//中断没开始的时候，K1置0 		 }				//在中断结束，按键K4控制分数时间以及提示灯的复位 	 }                   //当中断关闭时，K1、K2、K3键锁定，不能使用 	if(TR0==1) 	{ 	 	if(K1==0) 		{ 			c++; 			while(K1==0);	 //消抖，按键放开的时候分数加1 		}				     //按键K1控制A队分数     加 		if(K2==0) 		{ 			c--; 			if(c==-1) 			{ 				c=0; 			} 			while(K2==0);	 //消抖，按键放开的时候分数减1				 		 }					 //按键K2控制A队分数     减 		if(K3==0) 		{ 			e++; 			while(K3==0);	 //消抖，按键放开的时候分数加1 		 }					 //按键K3控制B队分数     加 		if(K4==0) 		{ 			e--; 			if(e==-1) 			{ 				e=0; 			} 			while(K4==0);	 //消抖，按键放开的时候分数减1 		 } 	   }				    //按键K4控制B队分数     减 	  if(K5==0) 	  { 		if(K5==0) 		{ 			TR0=~TR0;		 //定时器的启动与暂停 		} 		while(K5==0);		 //消抖，按键放开的时候K5操作有效 	  }						 //K5控制定时器的启动，进入倒计时 } /*****************中断函数初始化**********************/ void time() { 	TMOD=0x01;		  // 0000  0001   中断方式设置，T0设置在方式1 	TH0=15536/256; // 初值设定，（65536-x）*12/(12*10^6)=50*10^3 	TL0=15536%256;	 	ET0=1;			//  中断允许标志 	EA=1;		   //  中断总开关打开 } /********************主函数***********************/ void main(void) { 	LCD_init();									   //LCD初始函数调用 	time();										   //中断初始函数调用 	while(1) 	{ 		write_LCD_str(0,0," A : B");			   //显示字符串 		write_LCD_str(10,0,"Time");  		write_LCD_char(0,1,c/10+0x30);			   //A队分数十位显示 		write_LCD_char(1,1,c%10+0x30);			   //A队分数个位显示 		write_LCD_str(2,1," : "); 		write_LCD_char(5,1,e/10+0x30);			   //B队分数十位显示 		write_LCD_char(6,1,e%10+0x30);			   //B队分数个位显示  		write_LCD_char(11,1,t/10+0x30);			   //分钟十位此案时 		write_LCD_char(12,1,t%10+0x30);			   //分钟个位显示 		write_LCD_str(13,1,":"); 		write_LCD_char(14,1,ss/10+0x30);		   //秒钟十位显示 		write_LCD_char(15,1,ss%10+0x30);		   //秒钟个位显示 		key();									      //按键函数调用 	} } /***************中断倒计时**********************/ void jk() interrupt 1 {	 	TH0=15536/256;								//初值 	TL0=15536%256; 	i++; 	if(i>19)							//当i加到20的时候，程序往下运行    	{ 										   		i=0;									      	ss--;									//秒数减运算 	 	if(ss==-1)								//当秒数减到小于0的时候 	 	{  			ss=59; 								 	  		t--;								//分数减运算 	   		if(t==-1)							//当分数减到小于0的时候 	   		{  				t=0;							//时间分钟后显示为0 	     		ss=0;							//时间秒钟后显示为0 				L=~L;	 						//点亮提示灯 				TR0=0;	 //当时间减到0的时候，时间显示为00:00，关闭中断 		 	 } 		  } 	  } 	}

这个电路有问题，P0.0-P0.7接数码管还需要串一个限流电阻

引用 楼主 sinat_21986757 的回复: 帮忙用c语言写的 1)设计一个比赛记分牌，用4位LED显示比赛两方的分数（每方分数用2位LED表示）。比赛开始时显示零分。 2)每方都有得分按键和减分按键，得分按键每按一次加一分，减分按键每按一次减一分，并用数码管显示累计的分数。 这个程序很简单： 1，设计一个让数码管正常显示字符的模块； 2，设计一个模加的算法； 3，设计好按键中断； 4，把结果显示到数码管上。 我以前用汇编写了个带闹钟的电子时钟，代码也不过600行而已，你的个功能很简单，用c语言写200行应该完全可以搞写了。

要说怎么改，真是麻烦。你自己好好理解了改吧。51单片机的东西忘光了。

刚看郭天祥的单片机第一课。。。


Question: 结构体

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

buffer overflow

引用 7 楼 baidu_22691505 的回复:#include "stdio.h" main() { struct student { int num; char name[6]; char sex[6];//为什么赋值低于6运行结果是连接下一个字符串一起输出呢? char addr[15]; }a={2111404114,"helen","female","jiangxiganzhou"}; printf(" No:%d\n name:%s\n sex:%s\n addr:%s\n",a.num,a.name,a.sex,a.addr); return 0; } 楼主什么编译器啊？

结构体定义时初始化啊

定义struct类型变量时，直接初始化没有什么奇特之处额。

这个a 相当于是student类型的 但是如果加上typedef struct student a就是一个类型了 是一个变量了 不能直接赋值

引用 7 楼 baidu_22691505 的回复:#include "stdio.h" main() { struct student { int num; char name[6]; char sex[6];//为什么赋值低于6运行结果是连接下一个字符串一起输出呢? char addr[15]; }a={2111404114,"helen","female","jiangxiganzhou"}; printf(" No:%d\n name:%s\n sex:%s\n addr:%s\n",a.num,a.name,a.sex,a.addr); return 0; }这个要看编译环境，我使用vs2013，编译是无法通过的，因为“female”字符串的长度已经超过了6，无法初始化。严格的说，这种编译错误提示是有益的。

原来这么多人不会用结构体变量的初始化

把它整体移到main函数外，是不是就秒懂了？！放在函数外是全局的类型定义（常见方式），放在函数内是局部的类型定义（不常用方式，定义一个局部结构类型，出来函数就不可用了，这样的需求非常少），后面紧接着定义了一个变量a并用{ }方式初始化结构体成员  struct student { int num; char name[6]; char sex[6];//为什么赋值低于6运行结果是连接下一个字符串一起输出呢? char addr[15]; }a={2111404114,"helen","female","jiangxiganzhou"};  main() { printf(" No:%d\n name:%s\n sex:%s\n addr:%s\n",a.num,a.name,a.sex,a.addr); return 0; }

定义顺便初始化了啊

引用 1 楼 Falleyes 的回复:#include "stdio.h" int main() { 	struct student 	{ 		int num; 		char name[6]; 		char sex[7];   //这里要分配7个字符，因为字符串末尾’\0'也会占用一个字节 		char addr[15]; 	} a = { 2111404114, "helen", "female", "jiangxiganzhou" }; 	printf(" No:%d\n name:%s\n sex:%s\n addr:%s\n", a.num, a.name, a.sex, a.addr); 	return 0; }   学习了，不好意思。

C结构体没有这样的赋值方法。 a.num = 2111404114; 这样做。


Question: error C2446！！在线等！！

引用 2 楼 mujiok2003 的回复:引用qsort((void **)lineptr,0,nlines-1,                 (int (*)(void*,void*))(numeric ? numcmp : strcmp));  -->  typedef int( *cmp)(void*,void*); qsort((void **)lineptr,0,nlines-1,                 numeric ? (cmp)numcmp : (cmp)strcmp); 可以了！可以详细说明一下吗？ 对指向函数的指针的强制转换不是太懂

引用 3 楼 Falleyes 的回复:numcmp 和 strcmp 的参数类型不一样，strcmp的参数类型是const 类型。 你可以把你的numcmp也写成const 参数类型，这样就可以了。 int numcmp(const char *s1,const char *s2);不行...

引用 1 楼 jerry_dqh 的回复:(int (*)(void*,void*))(numeric ?numcmp :  (int (*)(void*,void*))strcmp)); strcmp前面加个强转看看,不行...

原因是 条件表达是的类型不一致


Question: 字符转double的面试题

3种方法， 1） 用整型数读取数据，直接组合数据，       这要求，这个整型长度比double 要长，或者二者相同，       并且要对浮点类型编码非常熟悉。 2）用double 计算，不过可能有精度问题。 3）整型数保存数据，转换成 double 做乘除法，      只有转换精度影响到结果精度， 比较接近编译器的精度了。      但是也要求整型精度要高。

基本思路：先分开保存整数部分与小数部分，再合并，小数部分先保存为整数再计算，避免精度丢失  #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h>  #define INTEGER_TAG		1//Çø·ÖÕûÊý²¿·ÖÓëÐ¡Êý²¿·Ö  #define FRACTION_TAG   0  int splite(char* pszTR,double *pTn,int nTnSize) {	 	//char* parse = pszTR; 	char reverse = 0; 	char typeTag  = INTEGER_TAG; 	int  integer = 0; 	int  fraction= 0; 	double  fractionBase = 1; 	int  index = 0; 	char  hasLastNumber;//·ÀÖ¹Â©µô×îºóÒ»¸öÊý  	 	assert(NULL!=pszTR&&NULL!=pTn&&nTnSize>0); 	 	while (*pszTR!='\0') 	{ 		if ('-'==*pszTR) 		{ 			reverse = 1; 		} 		else if (','==*pszTR) 		{ 			assert(index<nTnSize); 			assert(fractionBase>0); 			 			pTn[index]= integer+fraction/fractionBase; 			 			if (1==reverse) 				pTn[index]=0-pTn[index]; 			 			typeTag  = INTEGER_TAG; 			fraction = 0; 			fractionBase = 1; 			integer  = 0; 			reverse  = 0; 			index++; 			hasLastNumber = 0; 		} 		else if ('.'==*pszTR) 		{ 			typeTag = FRACTION_TAG; 		} 		else 		{ 			assert(*pszTR>='0'&&*pszTR<='9'); 			hasLastNumber = 1; 			 			if (INTEGER_TAG==typeTag) 			{ 				integer = 10*integer+*pszTR-'0'; 			} 			else 			{ 				fraction=10*fraction+*pszTR-'0'; 				fractionBase*=10; 			} 		} 		 		pszTR++; 	} 	 	if (1==hasLastNumber&&fractionBase>0) 	{ 		pTn[index]= integer+fraction/fractionBase; 				 		if (1==reverse) 			pTn[index]=0-pTn[index]; 		index++; 	} 	 	return index; }  void main() {    double getArr[10]={0};    int    size = sizeof(getArr)/sizeof(double);    int    renum = 0;    int    i;        renum=splite("12.322,4434,-3434,23,0.23,-0.232",getArr,size);        for (i=0;i<renum;i++)         printf("%g ",getArr[i]);    printf("\n"); }

循环pTn然后对每一个字符进行判断


Question: 冒泡排序 报错看不懂求救！

#include<stdio.h> void Bubble(int num[8]) { 	int i,j,t; 	for (i=0;i<7;i++) 	{ 		for (j=i+1;j<8;j++) 		{ 			if (num[j]<num[i]) 			{ 				t=num[j]; 				num[j]=num[i]; 				num[i]=t; 			} 		} 	} }  int Output(int num[8]) { 	int i; 	for(i=0;i<8;i++) 	{ 		printf("%d",num[i]); 	} 		printf("\n"); 		return num[i]; }  int main(void) { 	int num[8],i; 	printf("输入8个整数:\n"); 	for (i=0;i<8;i++) 		scanf("%d",&num[i]); 	Bubble(num);     Output(num); 	return 0; }

#include<stdio.h> void Bubble(int num[])/////////////////// { 	int i,j,t; 	for (i=0;i<7;i++) 	{ 		for (j=i+1;j<8;j++) 		{ 			if (num[j]<num[i]) 			{ 				t=num[j]; 				num[j]=num[i]; 				num[i]=t; 			} 		} 	} } int Output(int num[])/////////////////////////// { 	int i; 	for(i=0;i<8;i++) 	{ 		printf("%4d",num[i]);/////////要不然输出的数字会连在一起 	} 	printf("\n"); 	return num[i]; } int main() { 	int num [8],i; 	printf("输入8个整数:\n"); 	for (i=0;i<8;i++) 	{ 	 	scanf("%d",&num[i]); 	} 	Bubble(num);/////////////////////  	Output(num);//////////////////////// 	return num[i]; } 数组名可以在一定情形下看作指针，楼主可以看看///////////部分

引用 5 楼 qq_22753521 的回复:[quote=引用 3 楼 linux_hsylar 的回复:] 是这个样子吗 void Bubble(int num[],int 8) Bubble(num); 因为指针还没有学到所以不太懂( ▼-▼ ) 你也太猛了， void Bubble(int num[],int  size) size在main函数通过函数调用穿进去的 你也可以设置默认参数值 如： void  Bubble(int num[],int size=8), 这样的话在main中可以用 bubble(num)，第二个参数有默认值也可以

倒数第二三行修改下 Bubble(num); Output(num); 输出没问题

引用 3 楼 linux_hsylar 的回复:数组做形参时候，最好这样写： void Bubble/Output(int num[],int size])//size是数组的大小 还有下面的传参： Bubble(num);//把数组的首地址穿进去就OK了。     Output(num); //还有你编译结果警告的意思是： 形参 int num[8]编译器会将其作为指针int*看待，而你传进去的是num[i]是int类型。 还有一点你不知道： 数组作为形参时候会退化成指针  我自己看下吧 谢谢

[quote=引用 楼主 qq_22753521 的回复:] 真正运行之后输出的只有一串莫名其妙的数字

有什么问题吗？


Question: 递归调用

对于编译器来数， 递归调用不难， 和非递归一样， 不过是一个函数调用而已  现代CPU有堆栈指令，所以编译器实现递归和非递归是一样的  递归的逻辑也很简单，就是函数以某种方式调用自己。  真正需要能清楚的是，你的程序逻辑，以及有没有必要使用递归

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

递归，直接或间接的调用自身，楼主可以先看看简单的递归例子弄明白后再看稍微复杂的例子 http://blog.csdn.net/u012421456/article/details/32931999

借用赵老师一句话，代码终归是自己分析出来的

断点跟踪，一步一步走，走了几次就明白了

自己可以把程序的cow改为2 或者3 用笔写出递归的结果 看看跟执行的结果是不是一样 不是一样的就重来 然后你就会理解了


Question: 从TYPE *creat(int n){这里开始没看懂，请教

给一个参数n，创建n个链表结点，输入各个节点的数据num和age，组成链表，返回指向第一个节点的指针。 malloc申请节点的空间。         if(i==0)pf=head=pb ;         else pf->next=pb ;         pb->next=NULL ;         pf=pb ; 这几行处理节点上的next指针。每添加一个节点，就把现在的链表尾部节点的next指向新申请的节点，而新申请的节点的next指向NULL。

#define NULL 0 #define TYPE struct stu #define LEN sizeof (struct stu) struct stu  {     int num ;     int age ;     struct stu*next ; } ; TYPE*creat(int n) {     struct stu*head,*pf,*pb ;     int i ;     for(i=0;i<n;i++)     {         pb=(TYPE*)malloc(LEN);         printf("input Number and  Age\n");         scanf("%d%d",&pb->num,&pb->age);         if(i==0)pf=head=pb ;         else pf->next=pb ;         pb->next=NULL ;         pf=pb ;     }     return(head); }


Question: 新手求助一个文档替换问题，请大神们帮帮。。。

findstr

sed awk

是文档太多，一个一个很麻烦，所以如果能写代码，把文档往里面一扔就搞定的话，就快的多。 并不麻烦的事，希望有好心人帮一下。。。。

晕倒，这样的工作需要编程实现吗？ 你知道notepad++这个工具吗？ 它有搜索文件夹中所有包括目标字符的文件，并将需要的替换成需要字符的工能。  你要做的事情，随便找个工具分分钟能完成。现在是什么时候了，还写代码。


Question: 单链表冒泡操作相关

是不是第一步的指针p->next已经指向了q->nxet 3，那么第三步p->next->next就是3的next？  对

引用 10 楼 Maday55555 的回复:[quote=引用 8 楼 xionggch 的回复:] [quote=引用 6 楼 Maday55555 的回复:] [quote=引用 4 楼 xionggch 的回复:] p->next=q->next;                        //1,3连接 q->next=q->next->next;            //2,4连接 p->next->next=q;//此处不太懂啊 //3,2连接 就是3,2连 p->next->next指向的不就是第2个节点的下节点的指向么 p->next->next我理解为q->nxet ，也就是第2个节点的指向，这么想不对么？[/quote]  数据链1-->2-->3-->4 p指向1    q指向2 s=q->next;   //s指向3   p->next=q->next;          //1的next指向3  p指向的数据链1-->3-->4-->5..... q->next=q->next->next;    //2的next指向4  q指向的数据链2-->4-->5..... p->next->next=q;          //3的next指向2  p指向的数据链1-->3-->2-->4-->5..... [/quote] 我知道是应该3的next指向2，可是不应该是q->next->next么？就这不懂啊[/quote] 是不是第一步的指针p->next已经指向了q->nxet 3，那么第三步p->next->next就是3的next？

引用 8 楼 xionggch 的回复:[quote=引用 6 楼 Maday55555 的回复:] [quote=引用 4 楼 xionggch 的回复:] p->next=q->next;                        //1,3连接 q->next=q->next->next;            //2,4连接 p->next->next=q;//此处不太懂啊 //3,2连接 就是3,2连 p->next->next指向的不就是第2个节点的下节点的指向么 p->next->next我理解为q->nxet ，也就是第2个节点的指向，这么想不对么？[/quote]  数据链1-->2-->3-->4 p指向1    q指向2 s=q->next;   //s指向3   p->next=q->next;          //1的next指向3  p指向的数据链1-->3-->4-->5..... q->next=q->next->next;    //2的next指向4  q指向的数据链2-->4-->5..... p->next->next=q;          //3的next指向2  p指向的数据链1-->3-->2-->4-->5..... [/quote] 我知道是应该3的next指向2，可是不应该是q->next->next么？就这不懂啊

引用 8 楼 xionggch 的回复:[quote=引用 6 楼 Maday55555 的回复:] [quote=引用 4 楼 xionggch 的回复:] p->next=q->next;                        //1,3连接 q->next=q->next->next;            //2,4连接 p->next->next=q;//此处不太懂啊 //3,2连接 就是3,2连 p->next->next指向的不就是第2个节点的下节点的指向么 p->next->next我理解为q->nxet ，也就是第2个节点的指向，这么想不对么？[/quote]  数据链1-->2-->3-->4 p指向1    q指向2 s=q->next;   //s指向3   p->next=q->next;          //1的next指向3  p指向的数据链1-->3-->4-->5..... q->next=q->next->next;    //2的next指向4  q指向的数据链2-->4-->5..... p->next->next=q;          //3的next指向2  p指向的数据链1-->3-->2-->4-->5..... [/quote] 你的链表关系我懂 就是这个 p->next->next，应该是2的next啊 就这我理解不了啊 为啥会是3的next？

引用 6 楼 Maday55555 的回复:[quote=引用 4 楼 xionggch 的回复:] p->next=q->next;                        //1,3连接 q->next=q->next->next;            //2,4连接 p->next->next=q;//此处不太懂啊 //3,2连接 就是3,2连 p->next->next指向的不就是第2个节点的下节点的指向么 p->next->next我理解为q->nxet ，也就是第2个节点的指向，这么想不对么？[/quote]  数据链1-->2-->3-->4 p指向1    q指向2 s=q->next;   //s指向3   p->next=q->next;          //1的next指向3  p指向的数据链1-->3-->4-->5..... q->next=q->next->next;    //2的next指向4  q指向的数据链2-->4-->5..... p->next->next=q;          //3的next指向2  p指向的数据链1-->3-->2-->4-->5.....

//带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //

引用 4 楼 xionggch 的回复:p->next=q->next;                        //1,3连接 q->next=q->next->next;            //2,4连接 p->next->next=q;//此处不太懂啊 //3,2连接 就是3,2连 p->next->next指向的不就是第2个节点的下节点的指向么 p->next->next我理解为q->nxet ，也就是第2个节点的指向，这么想不对么？

引用 2 楼 Falleyes 的回复:void maopao(sdut *head) {     sdut *p,*q,*s,*tail;     tail=NULL;     while(head->next!=tail)     {         p=head;         q=p->next;         while(q->next!=tail)         {             if(p->next->test>q->next->test)             {                 s=q->next;                  p->next=q->next;。。。。。。。。1                 q->next=q->next->next;.。。。。。2                 p->next->next=q;//此处不太懂啊.。。3                                  //此处涉及指针的改变，建议楼主自己画图看看究竟哪里变化成什么了                 //我文本也不好给你说，我画了一下，这个结构体交换是对的                 q=s;             }             p=p->next;             q=q->next;         }         tail=q;     }     return; }  对啊 我就是画图 就是对两个节点进行交换么  第1步是将p所在节点指向q下一个节点 第2步是将q所在节点指向q的下一个再下一个节点，现在只有将q下一个节点指向q就能实现交换了嘛 可是就是不对啊 思路还是有问题啊

void maopao(sdut *head) {     sdut *p,*q,*s,*tail;     tail=NULL;     while(head->next!=tail)     {         p=head;         q=p->next;         while(q->next!=tail)         {             if(p->next->test>q->next->test)             {                 s=q->next;                  p->next=q->next;                 q->next=q->next->next;                 p->next->next=q;//此处不太懂啊                                  //此处涉及指针的改变，建议楼主自己画图看看究竟哪里变化成什么了                 //我文本也不好给你说，我画了一下，这个结构体交换是对的                 q=s;             }             p=p->next;             q=q->next;         }         tail=q;     }     return; }

这是意向链表，p和q是无法交换的，因为p的上家你无法知道，无法将p上家的next指针指向q。 所以交换的是p的next和q的next. 假如有以下的关系 p->q->n 那么交换的的其实是q和n，没有p什么事


Question: 使用c语言如何做出能在win上跑的界面程序呢？

用C的话，应该是windows api，用C++的话，MFC或者别的。 建议用C++吧，开发界面还是面向对象写起来快

譚的書籍只是學習 C 的語法和標準 C 庫函數。實際的開發都是面向平台，比如你要做窗口就要學習 Windows 編程，調用 Windows API 可以創建窗口，對話框等。推薦初學者使用 Pelles C for Windows，其自帶的嚮導可以生成一個基於對話框的 Windows 程序模版，還帶有對話框編輯器，支持 C11、變長數組等，安裝包僅 10M 左右。 官網有兩個：http://www.christian-heffner.de/、http://www.pellesc.de/

如果只是想用C写出一些图形界面的话，在VC里比较快捷的方法是下一个easyx库，里面有简单的图形函数实现，如果要深入研究界面设计的话就要学学windows程序设计，在学学MFC框架

慢慢来 不要着急  我刚开始学的时候也有你这些困惑， 嗯 Window 这些界面很大都是依靠微软的底层来绘制的 普通学的C就是来将逻辑联系起来

楼主如果只是兴趣的话  就请无视我下面的话：  只看谭浩强的书是远远不够的  他的书只能作为一种入门书籍看  你看完了  就可以算是一条腿迈进了编程的门槛  强烈推荐你看 c primer plus  这本书   你需要花大概半年到一年的时间去学习这本书和做一些练习题 如果想学c++的话  还有 c++ primer plus 和 c++ primer 这两本  先看第一本 再看第二本  总之，看你的描述，我相信你的基础是很不扎实的   在这种情况下想继续往深的地方走是很危险的  会遇到很多难以想象的困难  编程这个行业，是需要一些耐心的  一口吃不成胖子的 你需要长期在黑屏上看自己的程序的结果  反复琢磨和思索语法和一些编程领域的潜规则等等  等你把这些基础都打好了  再谈图形界面化编程  如果你实在想满足下你的好奇心  我可以告诉你   程序员所能接触到的图形界面程序  是这样的： 比如，我在这里想创建个按钮（button）  所以就会写：Button b("OK"); 诸如这样的代码  但是为什么这个代码就能显示出一个按钮  这是图形库的开发人员做的事情  我们根本不关心  也不可能去关心------重复前人的工作是愚蠢的，除非我们也在开发这样的库 对于程序员而言    声明定义一个按钮 和 声明定义一个int  毫无差别  但是，后者却更直接更简单   你现在需要做的 就是把后者学好 基础打好  才能去接触前者

#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {     PAINTSTRUCT ps;     HDC hdc;     HFONT hfont,ohfont;     RECT r;     COLORREF oc;      switch(message) {     case WM_CLOSE://按Alt+F4退出         PostQuitMessage(0);         break;     case WM_PAINT:         BeginPaint(hWnd, &ps);         hdc = ps.hdc; // the device context to draw in         GetClientRect(hWnd, &r); // Obtain the window's client rectangle         hfont = CreateFont(240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");         ohfont=(HFONT)SelectObject(hdc,hfont);         oc=SetTextColor(hdc,0x00C080FF);         SetBkMode(hdc, TRANSPARENT);         TextOut(hdc,r.left+r.right/2-720, r.top+r.bottom/2-120,"最短画图程序",12);         SelectObject(hdc,ohfont);         SetTextColor(hdc,oc);         DeleteObject(hfont);         EndPaint(hWnd, &ps);         break;     default:         return DefWindowProc(hWnd, message, wParam, lParam);     }     return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {     MSG msg             = {0};     WNDCLASS wc         = {0};     HBRUSH hbrh;     hbrh=CreateSolidBrush(0x00000000);     wc.lpfnWndProc      = WndProc;     wc.hInstance        = hInstance;     wc.hbrBackground    = hbrh;     wc.lpszClassName    = "minwindowsapp";     wc.hCursor          = LoadCursor(NULL,IDC_ARROW);     if( FAILED(RegisterClass(&wc)) ) return 1;      if(FAILED(CreateWindow(wc.lpszClassName,                         "Minimal Windows Application",                         WS_POPUP|WS_VISIBLE,                         0,                         0,                         GetSystemMetrics(SM_CXSCREEN),                         GetSystemMetrics(SM_CYSCREEN),                         0,                         0,                         hInstance,                         NULL)))         return 2;      while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {         DispatchMessage( &msg );     }     DeleteObject(hbrh);     return 0; }

我觉的可以学学qt么，虽然是c++的

有很多 win:MFC SDK unix/linux:GTK Qt ncursor库（终端图形库） Turbo C里提供了graphics.h库 还有很多三方库，可以google瞅瞅 建议还是以算法位主，界面虽然做起来有成就感，但是建立在娴熟的算法基础上的！先打基础，学数据结构和算法

学习图形界面开发，需要学习不同平台下的GDI开发，比如楼上各位大神说的Windows下的MFC，还有Linux下的GTK之类的。

楼主是不是想说，怎么用c语言做项目？

[quote=引用 13 楼 cdfc123 的回复:]  我的意思是不知道怎么用c语言做程序。。。[/quote楼主是不是想说，怎么用c语言做项目？

只有C语言基础还不行，还要会WINDOWS API,犹其是图形界面方面的API，这样才能做界面

主要就是一些windows api，或者经过封装的mfc以及dui,qt等了

windows程序设计、MFC深入浅出

window程序设计 这本书还是不错的啊

下载编译链接调试eMule源代码。

因为这刚好是我最近在研究的问题我也回答一下。你的意思应该是c的书本里头没有做图像的函数吧，我说一下我学到的。在c或c++的教科书乐透没有提到做界面的函数或api，实际上他们标准里头根本就没有定义相关内容！画图（画界面）呢其实不是语言层面的东西，而是硬件层面（由操作系统实现）东西。说完这些，估计你就要泄气，我说一点让你看到一点希望的话，其实你要做界面完全可以调用系统api（在Windows里头是Windows api或者mfc也可以），逻辑处理部分再用具体的语言代码。

语言吗，光看书效果是不明显的，还是得多看例子，多写...  网上下点源码，不懂自己查查，终归就会了...

表示从未用过c做界面程序

学算法还是学界面，这是一个问题


Question: 拉手网笔试题目

子串算吗？如果不算子串我真不明白这题目有什么意义。

如果包含子串，算法如下：  #include <stdio.h> #include <assert.h>  int main() {     char *A[3] = {"Basc","BcDcGf","Vcgddx"};     int i;     int   index;     char  targetStr[10] = {0};     char* chp=NULL;          for (i=0;i<sizeof(A)/sizeof(char*);i++)     {         chp=A[i];         index = 0;                  while ('\0'!=*chp)         {             assert(index<sizeof(targetStr));//确保不会溢出              if (index>0)             {                 targetStr[index] = *chp;                 index++;                 if ('C'==*chp||'c'==*chp)                 {                     targetStr[index] = '\0';                     printf("%s\n",targetStr);                 }             }                          if (0==index&&('B'==*chp||'b'==*chp))             {                 targetStr[index] = *chp;                 index++;             }                          chp++;         }     }          system("PAUSE");     return 0; } 输出： Basc Bc BcDc

如果不包括子串，代码其实只要一行就可以了，包括子串就麻烦一点了，等我想想哈  #include <stdio.h> #include <string.h>  int main() {     char *A[3]={"Basc","BcDcGf","Vcgddx"};     printf("%s",A[0]);     return 0; }

这么简单? 题目不完整吧?

#include <stdio.h> #include <string.h> char *A[3]={"Basc","BcDcGf","Vcgddx"}; int i; int main() {     for (i=0;i<3;i++) {         if ((A[i][0]=='B'||A[i][0]=='b')         && (A[i][strlen(A[i])-1]=='c'||A[i][strlen(A[i])-1]=='c'))             printf("%s\n",A[i]);     }     return 0; }


Question: 怎么把一帧帧的视频数据写入文件，然后播放？

1.硬件或设备获取到的数据，肯定是可以通过接口获取的，你需要使用接口获取到原始数据A 2.判断数据A的格式，如果是普通的格式，否则考虑进行解码，解码要用到解码器，这个ffmpeg是个好东西，但是很复杂，看有没有现成的可用，解码后得到的B，B是可以被系统支持的格式 3.如果A不需解码，调用系统API播放A，如果A经过解码，调用系统API播放B

看ffmpeg库的例子代码？


Question: 关于延时问题

同意2楼。使用全局变量作为延时变量。接到重复命令时 直接在中断处理程序里重新初始化你的延时变量 即可 实现。不过延时函数里面两次赋值200只要任意一处就可以了。

将uint z_x 定义 成全局变量，并赋初值。 void delay(uint z_z)    //延时子程序 {  uint z_x,z_y;  for(z_x=200;z_x>0;z_x--)//去掉红色的  {    for(z_y=z_z;z_y>0;z_y--)    {      _nop_();     if(x_r==1) break;    }    if(x_r==1)    break;  }  z_x =200;//在延时完之后将将它回复到200，以便 下一次延时用。 }  这样，在计算延时的过程中，只要外部重新将z_x=200赋值，就可以使得delay重新开始延时2s,而无须停机。

给你个思路吧： 方法1：在延时函数加个全局的reset标志，在最里层的循环不断判断标志，标志置位时，重置外层z_x为初始值200;               当外面判断需要再次延时时，将这个标志置位，延时的内层函数 方法2：用定时器来延时，需要再次延时时，重置定时器的计数就可以了，比如定时器超时一次为20ms,2秒即计数超时100次，               计数到80的时候，需要重新延时，此时重置计数为0就可以了，用定时器延时比较准


Question: 求教大侠：怎么输入一组字符串？

#include "iostream" #include "string" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { 	string str; 	cin>>str; 	cout<<str<<endl; 	system("pause"); 	return 0; }

引用 12 楼 u011033348 的回复:如果你想实现，输入任意个数的字符串，则可以采用队列： typedef struct Node { pNode next; char str[100]; }Node,*pNode; 然后每添加一个字符串，就生成一个结点，为其动态的为分配堆空间。然后再把这个结点接到队尾。 你如果不太了解这个的话，建议还是看看数据结构相关的书，这是比较基础的用法。 不好意思，很久没用c了，这里结构体定义有错。 typedef struct Node { char str[100]; struct Node* next; }Node,*pNode;

引用不定义数组长度，为所欲为地想输入多少字符串就输入多少字符串？内存和硬盘都是有限的，为所欲为， 想多了。

引用 10 楼 call_from_dream 的回复:[quote=引用 1 楼 lovesmiles 的回复:] 都学c++的人了，还用c语言的东西。跳不出这种思维，下面的代码自己试一下。 #include <string> #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std;  int main(void) { 	int i,n=6; 	string str[6];  //定义一个char型指针数组，用于存6个字符串，如6个国家的英文名字  	cout<<"Input 6 country names:\n";  	for (i=0;i<n;i++) 	cin>>str[i]; 	  	for (i=0;i<n;i++) 	{ 		cout<<"country name["<<i<<"] = "<<str[i]<<endl; 	} 	cin>>str[0]; 	return 0; }弱弱地问一句：最后那个 cin>>str[0]; 是什么作用？[/quote] 呵呵，相当于getchar() 暂时停一下给你看下结果。

引用 1 楼 lovesmiles 的回复:都学c++的人了，还用c语言的东西。跳不出这种思维，下面的代码自己试一下。 #include <string> #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std;  int main(void) { 	int i,n=6; 	string str[6];  //定义一个char型指针数组，用于存6个字符串，如6个国家的英文名字  	cout<<"Input 6 country names:\n";  	for (i=0;i<n;i++) 	cin>>str[i]; 	  	for (i=0;i<n;i++) 	{ 		cout<<"country name["<<i<<"] = "<<str[i]<<endl; 	} 	cin>>str[0]; 	return 0; }弱弱地问一句：最后那个 cin>>str[0]; 是什么作用？

引用 3 楼 user-8 的回复:[quote=引用 2 楼 u011033348 的回复:] 你这样的宏定义，我也是第一次见到。。 不过你的问题很简单： char* str[6]; 这里面有 这里定义了指针，但是没有为指针分配空间。 你写成char str[6][100];就好了 正解。[/quote]+1

引用 5 楼 linux_hsylar 的回复://写出这样的代码只是说明你基础有问题。 2楼已经说出原因了， char* str[6]; 你定义的是6个指针变量，你根本没有分配内存，可以说6个指针变量都是野指针；  S("%s",&str[i]);//这句就是问题关键，str[i]只是占用一个指针变量的内存，现在不指向任何内存，你让str[i]用什么接受你输入的字符串。谢谢！

引用 6 楼 u013163178 的回复:/*************************************************************************     > File Name: string_vector.cpp     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年10月30日 星期四 17时32分03秒  ************************************************************************/  #include<iostream> #include<string> #include<vector> using namespace std;  int main() { 	vector<string> v; 	string s; 	for(int i=0; i < 20; ++i) 	{ 		cin >> s; 		v.push_back(s); 	}  	for(auto a : v) 		cout << a << '\n';  	return 0; } 不知道你学了C++ 没有啊C++学了一点儿，学得不多。谢谢哈！

引用 2 楼 u011033348 的回复:你这样的宏定义，我也是第一次见到。。 不过你的问题很简单： char* str[6]; 这里面有 这里定义了指针，但是没有为指针分配空间。 你写成char str[6][100];就好了那个宏定义是为了练习用的，有和没有，对这个程序完全没影响。抱歉啊，误导你了！

引用 2 楼 u011033348 的回复:你这样的宏定义，我也是第一次见到。。 不过你的问题很简单： char* str[6]; 这里面有 这里定义了指针，但是没有为指针分配空间。 你写成char str[6][100];就好了 正解。


Question: 新手问一个Print Graphics Problerm ，初学，求解答。

if (a%2==0)条件成立时为偶数，你往这里面看，底下的printf(" ");就用来输出空格 而奇数走的是下面的这些语句：      else     {         for(i=1;i<=a;i++)         {             for (j=1;j<=a;j++)             {             if (j<a)                 printf("+");                       }         }     }  这里没地方输出空格，问题就在这里，补上空格吧（貌似楼上代码就是，你测试下）

#include <stdio.h> int main() { 	int a,i,j; 	scanf("%d",&a); 	if (a%2==0) 	{ 		for(i=1;i<=a;i++) 		{ 			for(j=1;j<=a+i-1;j++) 			{ 				if(j<=a-i) 				{ 					printf(" "); 				} 				else printf("+"); 			} 			printf("\n"); 		} 	} 	else 	{ 		for(i=a;i>=1;i--) 		{ 			for(j=1;j<=a+i-1;j++) 			{ 				if(j<=a-i) 				{ 					printf(" "); 				} 				else printf("+"); 			} 			printf("\n"); 		} 	}  	return 0; }


Question: 在Linux下用C写一个代理服务器，在用Socket链接远端服务器的时候connect总是返回-1

引用 3 楼 wanguser-1 的回复:[quote=引用 2 楼 u014598831 的回复:] [quote=引用 1 楼 wanguser-1 的回复:] [quote=引用 楼主 u014598831 的回复:] 这是我的代码，其中connect是要连接到例如百度等页面，然后再发送一个HTTP请求，GET一个页面，我还没有写http请求解析部分，linux下运行./proxy 8888 www.baidu.com telnet（这里我把telnet写成了23，方便调试），每次我开第二个终端时，telnet localhost 8888能够连接到我的代理，但是connect返回值是-1，无法连接。求大神帮助 #include "proxy_parse.h" #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<netdb.h> #include<string.h> #define BACKLOG 2 int main(int argc, char * argv[])  { char buf[1000]; int connectsocket,clientsocket,proxysocket; int port; struct sockaddr_in server_addr;//server addr struct sockaddr_in client_addr; struct sockaddr_in proxy_addr;//this addr  struct{            char remote_host[64];            char service_name[32];         } pargs; //remote information  struct hostent *hostp; //struct servent *servp;   strcpy(pargs.remote_host,argv[2]); strcpy(pargs.service_name,argv[3]); //set remote information  connectsocket = socket(AF_INET,SOCK_STREAM,0);//socketformainserver clientsocket = socket(AF_INET,SOCK_STREAM,0);//socketforclientserver proxysocket = socket(AF_INET,SOCK_STREAM,0);//socketforproxyserver   int i; for(i=0;i<strlen(argv[1]);i++) {    if(!isdigit(*(argv[1]+i)))    {         break;    }    if(i==(strlen(argv[1])-1))    port = htons(atoi(argv[1])); } // //set proxy_addr bzero(&proxy_addr,sizeof(proxy_addr)); proxy_addr.sin_family = AF_INET; proxy_addr.sin_addr.s_addr = htonl(INADDR_ANY);//ip error! proxy_addr.sin_port = port; //  //set remote server_addr bzero(&server_addr,sizeof(server_addr)); if((hostp = gethostbyname(pargs.remote_host))!=NULL); {     memcpy(hostp->h_addr,&server_addr.sin_addr,hostp->h_length); }  server_addr.sin_family = AF_INET; server_addr.sin_port = htons(23); //  // bind&listen bind(proxysocket,(struct sockaddr*)&proxy_addr,sizeof(proxy_addr)); listen(proxysocket,BACKLOG);  while(1) { int a=0; socklen_t addrlen = sizeof(struct sockaddr); clientsocket = accept(proxysocket,(struct sockaddr*)&client_addr,&addrlen); connectsocket = socket(AF_INET,SOCK_STREAM,0); a=connect(connectsocket,(struct sockaddr *)&server_addr,sizeof(server_addr)); printf("return value of connect = %d\n",a); //connected //printf("connected!\n"); int iolen=0; iolen = recv(clientsocket,buf,sizeof(buf),0); send(connectsocket,buf,iolen,0); //send to romote  if((iolen = recv(connectsocket,buf,sizeof(buf),0)) <= 0) {    send(clientsocket,buf,iolen,0); }  } //    return 0; }  第61行：memcpy(hostp->h_addr,&server_addr.sin_addr,hostp->h_length);写反了 应该是： memcpy(&server_addr.sin_addr,hostp->h_addr,hostp->h_length);[/quote] 谢谢！！这个是后面加的。。之前我直接把ip地址赋给server_addr也是链接不上。。然后我改了这个也连不上。。。[/quote] 从这句server_addr.sin_port = htons(23);看你要连baidu的telnet端口？百度都没开这个端口你咋连，应该是80才对吧[/quote] 太感谢了。。我一直以为那边telnet能用，前面夜试了ssh。。就是没想到要改成web。。是我愚蠢了。。

引用 2 楼 u014598831 的回复:[quote=引用 1 楼 wanguser-1 的回复:] [quote=引用 楼主 u014598831 的回复:] 这是我的代码，其中connect是要连接到例如百度等页面，然后再发送一个HTTP请求，GET一个页面，我还没有写http请求解析部分，linux下运行./proxy 8888 www.baidu.com telnet（这里我把telnet写成了23，方便调试），每次我开第二个终端时，telnet localhost 8888能够连接到我的代理，但是connect返回值是-1，无法连接。求大神帮助 #include "proxy_parse.h" #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<netdb.h> #include<string.h> #define BACKLOG 2 int main(int argc, char * argv[])  { char buf[1000]; int connectsocket,clientsocket,proxysocket; int port; struct sockaddr_in server_addr;//server addr struct sockaddr_in client_addr; struct sockaddr_in proxy_addr;//this addr  struct{            char remote_host[64];            char service_name[32];         } pargs; //remote information  struct hostent *hostp; //struct servent *servp;   strcpy(pargs.remote_host,argv[2]); strcpy(pargs.service_name,argv[3]); //set remote information  connectsocket = socket(AF_INET,SOCK_STREAM,0);//socketformainserver clientsocket = socket(AF_INET,SOCK_STREAM,0);//socketforclientserver proxysocket = socket(AF_INET,SOCK_STREAM,0);//socketforproxyserver   int i; for(i=0;i<strlen(argv[1]);i++) {    if(!isdigit(*(argv[1]+i)))    {         break;    }    if(i==(strlen(argv[1])-1))    port = htons(atoi(argv[1])); } // //set proxy_addr bzero(&proxy_addr,sizeof(proxy_addr)); proxy_addr.sin_family = AF_INET; proxy_addr.sin_addr.s_addr = htonl(INADDR_ANY);//ip error! proxy_addr.sin_port = port; //  //set remote server_addr bzero(&server_addr,sizeof(server_addr)); if((hostp = gethostbyname(pargs.remote_host))!=NULL); {     memcpy(hostp->h_addr,&server_addr.sin_addr,hostp->h_length); }  server_addr.sin_family = AF_INET; server_addr.sin_port = htons(23); //  // bind&listen bind(proxysocket,(struct sockaddr*)&proxy_addr,sizeof(proxy_addr)); listen(proxysocket,BACKLOG);  while(1) { int a=0; socklen_t addrlen = sizeof(struct sockaddr); clientsocket = accept(proxysocket,(struct sockaddr*)&client_addr,&addrlen); connectsocket = socket(AF_INET,SOCK_STREAM,0); a=connect(connectsocket,(struct sockaddr *)&server_addr,sizeof(server_addr)); printf("return value of connect = %d\n",a); //connected //printf("connected!\n"); int iolen=0; iolen = recv(clientsocket,buf,sizeof(buf),0); send(connectsocket,buf,iolen,0); //send to romote  if((iolen = recv(connectsocket,buf,sizeof(buf),0)) <= 0) {    send(clientsocket,buf,iolen,0); }  } //    return 0; }  第61行：memcpy(hostp->h_addr,&server_addr.sin_addr,hostp->h_length);写反了 应该是： memcpy(&server_addr.sin_addr,hostp->h_addr,hostp->h_length);[/quote] 谢谢！！这个是后面加的。。之前我直接把ip地址赋给server_addr也是链接不上。。然后我改了这个也连不上。。。[/quote] 从这句server_addr.sin_port = htons(23);看你要连baidu的telnet端口？百度都没开这个端口你咋连，应该是80才对吧

引用 1 楼 wanguser-1 的回复:[quote=引用 楼主 u014598831 的回复:] 这是我的代码，其中connect是要连接到例如百度等页面，然后再发送一个HTTP请求，GET一个页面，我还没有写http请求解析部分，linux下运行./proxy 8888 www.baidu.com telnet（这里我把telnet写成了23，方便调试），每次我开第二个终端时，telnet localhost 8888能够连接到我的代理，但是connect返回值是-1，无法连接。求大神帮助 #include "proxy_parse.h" #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<netdb.h> #include<string.h> #define BACKLOG 2 int main(int argc, char * argv[])  { char buf[1000]; int connectsocket,clientsocket,proxysocket; int port; struct sockaddr_in server_addr;//server addr struct sockaddr_in client_addr; struct sockaddr_in proxy_addr;//this addr  struct{            char remote_host[64];            char service_name[32];         } pargs; //remote information  struct hostent *hostp; //struct servent *servp;   strcpy(pargs.remote_host,argv[2]); strcpy(pargs.service_name,argv[3]); //set remote information  connectsocket = socket(AF_INET,SOCK_STREAM,0);//socketformainserver clientsocket = socket(AF_INET,SOCK_STREAM,0);//socketforclientserver proxysocket = socket(AF_INET,SOCK_STREAM,0);//socketforproxyserver   int i; for(i=0;i<strlen(argv[1]);i++) {    if(!isdigit(*(argv[1]+i)))    {         break;    }    if(i==(strlen(argv[1])-1))    port = htons(atoi(argv[1])); } // //set proxy_addr bzero(&proxy_addr,sizeof(proxy_addr)); proxy_addr.sin_family = AF_INET; proxy_addr.sin_addr.s_addr = htonl(INADDR_ANY);//ip error! proxy_addr.sin_port = port; //  //set remote server_addr bzero(&server_addr,sizeof(server_addr)); if((hostp = gethostbyname(pargs.remote_host))!=NULL); {     memcpy(hostp->h_addr,&server_addr.sin_addr,hostp->h_length); }  server_addr.sin_family = AF_INET; server_addr.sin_port = htons(23); //  // bind&listen bind(proxysocket,(struct sockaddr*)&proxy_addr,sizeof(proxy_addr)); listen(proxysocket,BACKLOG);  while(1) { int a=0; socklen_t addrlen = sizeof(struct sockaddr); clientsocket = accept(proxysocket,(struct sockaddr*)&client_addr,&addrlen); connectsocket = socket(AF_INET,SOCK_STREAM,0); a=connect(connectsocket,(struct sockaddr *)&server_addr,sizeof(server_addr)); printf("return value of connect = %d\n",a); //connected //printf("connected!\n"); int iolen=0; iolen = recv(clientsocket,buf,sizeof(buf),0); send(connectsocket,buf,iolen,0); //send to romote  if((iolen = recv(connectsocket,buf,sizeof(buf),0)) <= 0) {    send(clientsocket,buf,iolen,0); }  } //    return 0; }  第61行：memcpy(hostp->h_addr,&server_addr.sin_addr,hostp->h_length);写反了 应该是： memcpy(&server_addr.sin_addr,hostp->h_addr,hostp->h_length);[/quote] 谢谢！！这个是后面加的。。之前我直接把ip地址赋给server_addr也是链接不上。。然后我改了这个也连不上。。。

引用 楼主 u014598831 的回复:这是我的代码，其中connect是要连接到例如百度等页面，然后再发送一个HTTP请求，GET一个页面，我还没有写http请求解析部分，linux下运行./proxy 8888 www.baidu.com telnet（这里我把telnet写成了23，方便调试），每次我开第二个终端时，telnet localhost 8888能够连接到我的代理，但是connect返回值是-1，无法连接。求大神帮助 #include "proxy_parse.h" #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<netdb.h> #include<string.h> #define BACKLOG 2 int main(int argc, char * argv[])  { char buf[1000]; int connectsocket,clientsocket,proxysocket; int port; struct sockaddr_in server_addr;//server addr struct sockaddr_in client_addr; struct sockaddr_in proxy_addr;//this addr  struct{            char remote_host[64];            char service_name[32];         } pargs; //remote information  struct hostent *hostp; //struct servent *servp;   strcpy(pargs.remote_host,argv[2]); strcpy(pargs.service_name,argv[3]); //set remote information  connectsocket = socket(AF_INET,SOCK_STREAM,0);//socketformainserver clientsocket = socket(AF_INET,SOCK_STREAM,0);//socketforclientserver proxysocket = socket(AF_INET,SOCK_STREAM,0);//socketforproxyserver   int i; for(i=0;i<strlen(argv[1]);i++) {    if(!isdigit(*(argv[1]+i)))    {         break;    }    if(i==(strlen(argv[1])-1))    port = htons(atoi(argv[1])); } // //set proxy_addr bzero(&proxy_addr,sizeof(proxy_addr)); proxy_addr.sin_family = AF_INET; proxy_addr.sin_addr.s_addr = htonl(INADDR_ANY);//ip error! proxy_addr.sin_port = port; //  //set remote server_addr bzero(&server_addr,sizeof(server_addr)); if((hostp = gethostbyname(pargs.remote_host))!=NULL); {     memcpy(hostp->h_addr,&server_addr.sin_addr,hostp->h_length); }  server_addr.sin_family = AF_INET; server_addr.sin_port = htons(23); //  // bind&listen bind(proxysocket,(struct sockaddr*)&proxy_addr,sizeof(proxy_addr)); listen(proxysocket,BACKLOG);  while(1) { int a=0; socklen_t addrlen = sizeof(struct sockaddr); clientsocket = accept(proxysocket,(struct sockaddr*)&client_addr,&addrlen); connectsocket = socket(AF_INET,SOCK_STREAM,0); a=connect(connectsocket,(struct sockaddr *)&server_addr,sizeof(server_addr)); printf("return value of connect = %d\n",a); //connected //printf("connected!\n"); int iolen=0; iolen = recv(clientsocket,buf,sizeof(buf),0); send(connectsocket,buf,iolen,0); //send to romote  if((iolen = recv(connectsocket,buf,sizeof(buf),0)) <= 0) {    send(clientsocket,buf,iolen,0); }  } //    return 0; }  第61行：memcpy(hostp->h_addr,&server_addr.sin_addr,hostp->h_length);写反了 应该是： memcpy(&server_addr.sin_addr,hostp->h_addr,hostp->h_length);


Question: 读取txt的问题

引用 1 楼 xpdavis 的回复:你要随机读取的话，就用二进制来打开 void Read() {     FILE *file = fopen("abc.txt","rb");     fseek(file,0,SEEK_END);     long n = ftell(file);     ;//去掉最后的回车换行     char *list =new char[n+1];     rewind(file);     fread(list,sizeof(char),n,file);     list[n]='\0';     cout<<list; } 引用 2 楼 zhao4zhong1 的回复:不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  fseek是按二进制读取的，回车0d 0a会读成2个字符（回车存时就是存成0d 0a ），但是以文本形式打开时，fread将0d 0a 读成1个字符，所以会多读几个内存，出现乱码，就是这样吧


是因为没有捕捉PIPE信号SIGPIPE。设置忽略此信号后，运行正常。signal(SIGPIPE, SIG_IGN);

Close的时候，handle创建成功了吗？

可能需要加mutex


Question: 求教  sscanf_s读入的字符串中有"|"导致崩溃

你把参数搞错了。  CString cs = "11 山山|水水"; //11后有空格 int a=654321; char  str[100] = ""; sscanf_s(str, "%s%d", cs ,a );

结贴 算了不传多个字符参数了

感谢3楼的回复,虽然没懂我的意思  int a,b; CString cs; char  str[100] = ""; cs = "456 38  abc"; //123 456 后都有空格 sscanf_s(cs, "%d%d%s", &a,&b, str);  //到这里都是对的  cs = "456 38  a|bc"; //abc字符串中有符号 | sscanf_s(cs, "%d%d%s", &a,&b, str); //到这里就崩溃了  cs = "|";  sscanf_s(cs, "%s", str); //这样还崩溃 //看来就是符号的问题了  我要做的从cs的字串中 分离出包含符号 "|" 的字符串,  这个字符串是不定长的,可能像例子中,也可能只"aa|bb|cc" 或更多用符号 "|" 间隔的字符串  请问如何解决?

sscanf_s不是楼主这么用的！ Run-Time Library Reference  sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l  Example  See Also  Send Feedback     Read formatted data from a string. These are versions of sscanf, _sscanf_l, swscanf, _swscanf_l with security enhancements as described in Security Enhancements in the CRT.    int sscanf_s(    const char *buffer,    const char *format [,       argument ] ... ); int _sscanf_s_l(    const char *buffer,    const char *format,    locale_t locale [,       argument ] ... ); int swscanf_s(    const wchar_t *buffer,    const wchar_t *format [,       argument ] ... ); int _swscanf_s_l(    const wchar_t *buffer,    const wchar_t *format,    locale_t locale [,       argument ] ... );    Parameters buffer Stored data  format Format-control string. For more information, see Format Specifications.  argument Optional arguments  locale The locale to use  Return Value Each of these functions returns the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. The return value is EOF for an error or if the end of the string is reached before the first conversion.  If buffer or format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, these functions return -1 and set errno to EINVAL  For information on these and other error codes, see _doserrno, errno, _sys_errlist, and _sys_nerr.  Remarks The sscanf_s function reads data from buffer into the location given by each argument. The arguments after the format string specify pointers to variables with a type that corresponds to a type specifier in format. Unlike the less secure version sscanf, a buffer size parameter countOfBuffer is required when using the type field characters c, C, s, S and [. This parameter must be supplied as an additional parameter after each buffer which requires it. For more information, see scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l and scanf Type Field Characters.  Note:  The size parameter is of type unsigned, not size_t.    The format argument controls the interpretation of the input fields and has the same form and function as the format argument for the scanf_s function. If copying takes place between strings that overlap, the behavior is undefined.  swscanf_s is a wide-character version of sscanf_s; the arguments to swscanf_s are wide-character strings. sscanf_s does not handle multibyte hexadecimal characters. swscanf_s does not handle Unicode full width hexadecimal or "compatibility zone" characters. Otherwise, swscanf_s and sscanf_s behave identically.  The versions of these functions with the _l suffix are identical except that they use the locale parameter passed in instead of the current thread locale.  TCHAR.H routine   _UNICODE & _MBCS not defined  _MBCS defined  _UNICODE defined   _stscanf_s  sscanf_s  sscanf_s  swscanf_s   _stscanf_s_l  _sscanf_s_l  _sscanf_s_l  _swscanf_s_l    Requirements Routine  Required header   sscanf_s, _sscanf_s_l  <stdio.h>   swscanf_s, _swscanf_s_l  <stdio.h> or <wchar.h>    For additional compatibility information, see Compatibility in the Introduction.  Example   Copy Code  // crt_sscanf_s.c // This program uses sscanf_s to read data items // from a string named tokenstring, then displays them.  #include <stdio.h> #include <stdlib.h>  int main( void ) {    char  tokenstring[] = "15 12 14...";    char  s[81];    char  c;    int   i;    float fp;     // Input various data from tokenstring:    // max 80 character string plus NULL terminator    sscanf_s( tokenstring, "%s", s, _countof(s) );    sscanf_s( tokenstring, "%c", &c, sizeof(char) );    sscanf_s( tokenstring, "%d", &i );    sscanf_s( tokenstring, "%f", &fp );     // Output the data read    printf_s( "String    = %s\n", s );    printf_s( "Character = %c\n", c );    printf_s( "Integer:  = %d\n", i );    printf_s( "Real:     = %f\n", fp ); }     Copy Code  String    = 15 Character = 1 Integer:  = 15 Real:     = 15.000000    .NET Framework Equivalent See Parse methods, such as System::Double::Parse.  See Also Concepts Stream I/O fscanf, _fscanf_l, fwscanf, _fwscanf_l scanf, _scanf_l, wscanf, _wscanf_l sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l _snprintf, _snprintf_l, _snwprintf, _snwprintf_l Send feedback on this topic to Microsoft.

谢谢2楼的答复 前面我打错了,重新描述下 CString cs = "123 山山|水水|青青|草草"; //123后有空格 int a; char  str[100] = ""; sscanf_s(cs, "%d%s", a, str); 我要做的从cs的字串中 分离中数值"123""到a中,  剩下的"山山|水水|青青|草草" 要存到str中 这个子串是不定长的,可能像例子中,也可能只"山山|水水" 或更多用符号 | 分割的字串 上面的代码运行会崩溃  后来发现 CString cs = "|";  char  str[100] = ""; sscanf_s(cs, "%s", str); 只要字串中有"|" 就会崩溃 请问如何解决?


Question: 求高人指点：C语言中char型与int型强制转换的内部过程

引用 9 楼 xiaozhang112889 的回复:@user-5(三楼)  关于printf的问题，个人觉得没问题，查阅相关资料，%x表示输出16进制形式的无符号的整数，所以printf的时候，编译器隐式将char转换为unsingned int; 关于c的问题，个人觉得不太对；经过调试，你会发现a在内存中的确是以0xfe的形式存储，进行( a&0xff )运算时，两操作数位数相同，没道理将a转换为0xfffffffe，运算结果为0xfe,此时好编译器是不是默认为无符号数据？？ 实验可以证明：int c = (unsigned char)0xfe  、int c = 0xfe、int  c = (int)(a&0xFF)结果是一样的，都为0x000000fe; 若按位与两操作数都为char,结果自然依旧为char 实验可以证明 int c = (char)0xfe 、int  c = (int)(a&(char)0xFF)结果一样，都为0xfffffffe; 楼上讲了好多，主要是符号扩展，其实理解这件事除了符号扩展还有一点，然后才能整件事情串起来。 在C99标准中section 6.5.2.2 "Function calls" 的Paragraphs 6, 7： 1、默认参数提升：如果一个函数的形参类型未知，那么调用函数时要对相应的实参做“整数提升(integer promotions)”，除此以外，float类型的参数会被提升为double。 printf符合1，因为它是形参类型未知 int printf(const char *,...)。所以char or unsigned char会做类型提升，提升为int，提升这个操作才涉及到符号扩展的原则。

引用 6 楼 wangzuxi 的回复:我说的是默认情况，大多数编译器默认情况char就是signed char，要是强制指定-funsigned-char，当然是按无符号的来，无符号char转到int高位被置0，gcc下用movzbl指令，零扩展；有符号char转int用movsbl指令，符号扩展。 lz的问题只能用符号扩展来解释，不管char是signed还是unsigned一样能解释得通。 ps：@lz 遇到这种情况，linux下用gdb或者objdump看一下反汇编代码就知道了，windows下也可以用IDE的反汇编工具看或者od之类的也可以。  ??

引用 4 楼 dbzhang800 的回复:[quote=引用 3 楼 wangzuxi 的回复:] （1）a的最高位是1，转换成b时符号位扩展了，所以b=0xfffffffe （2）0xFF虽然看似一个字节，但等于0x000000FF，和a进行与运算之后符号位为0，转换成c时自然就为正数，即0xFE，如果像这样：int  c = (int)(a&(char)0xFF);那c和b是一样的值。 只强调最高位，不管unsigned还是signed是不恰当的的。  对楼主的程序来说，使用MSVC编译时，/J 参数用于控制 char 是否带符号  cl test.c cl /J test.c 结果是不一样的  同样，对GCC  gcc -fsigned-char test.c gcc -funsigned-char test.c 结果也是不一样的[/quote] 我说的是默认情况，大多数编译器默认情况char就是signed char，要是强制指定-funsigned-char，当然是按无符号的来，无符号char转到int高位被置0，gcc下用movzbl指令，零扩展；有符号char转int用movsbl指令，符号扩展。 lz的问题只能用符号扩展来解释，不管char是signed还是unsigned一样能解释得通。 ps：@lz 遇到这种情况，linux下用gdb或者objdump看一下反汇编代码就知道了，windows下也可以用IDE的反汇编工具看或者od之类的也可以。

计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

引用 3 楼 wangzuxi 的回复:（1）a的最高位是1，转换成b时符号位扩展了，所以b=0xfffffffe （2）0xFF虽然看似一个字节，但等于0x000000FF，和a进行与运算之后符号位为0，转换成c时自然就为正数，即0xFE，如果像这样：int  c = (int)(a&(char)0xFF);那c和b是一样的值。 只强调最高位，不管unsigned还是signed是不恰当的的。  对楼主的程序来说，使用MSVC编译时，/J 参数用于控制 char 是否带符号  cl test.c cl /J test.c 结果是不一样的  同样，对GCC  gcc -fsigned-char test.c gcc -funsigned-char test.c 结果也是不一样的

引用 楼主 xiaozhang112889 的回复:本人最近笔试，碰到不少C语言强制转换问题，赶脚越转越糊涂了~不多说，先看一段代码： #include <stdio.h> int main() { 	char a = 254;   	printf("10进制形式：a=%d,254=%d\n",a,254); 	printf("16进制形式：a=%x,254=%x\n",a,254); 	int  b = (int)a;  	int  c = (int)(a&0xFF); 	printf("10进制形式：b=%d,c=%d\n",b,c); 	printf("16进制形式：b=%x,c=%x\n",b,c); 	return 0; } 本人在VS2008（32位编译器）编译运行后结果如下： 10进制形式：a=-2,254=254 16进制形式：a=fffffffe,254=fe 10进制形式：b=-2,c=254 16进制形式：b=fffffffe,c=fe 请按任意键继续. . . 关于此题，本人有如下疑问，望高手解答一下： （1）char型变量a，在内存中占一个字节，按照低位截断，感觉16进制形式的a应该为0xfe，为何是0xfffffffe? （2）b的值还能勉强理解，但是c的值是怎么来的？ （1）a的最高位是1，转换成b时符号位扩展了，所以b=0xfffffffe （2）0xFF虽然看似一个字节，但等于0x000000FF，和a进行与运算之后符号位为0，转换成c时自然就为正数，即0xFE，如果像这样：int  c = (int)(a&(char)0xFF);那c和b是一样的值。

楼上说的对 printf("16进制形式：a=%x,254=%x\n",a,254); 由于VS里char是signed的 a = 254; 的实际结果是 这里的a = -2, printf会把 a 转成 int 类型 相当于 printf("16进制形式：a=%x,254=%x\n",（int)a,254);  输出就是fffffffe  一般来说如果char a; 要用%x输出的话，建议使用(unsigned char)类型转换  printf("16进制形式：a=%x,254=%x\n",(unsigned char)a,254);  c 的值 就是 0xfffffffe & 0xff = 0xfe啊

char 是 unsigned char 还是 signed char 是由编译器自主决定的。  很明显，VS2008中的 char 是 signed char。也就是   char a = 254; 其实就是 char a = -2;

引用 7 楼 dbzhang800 的回复:[quote=引用 6 楼 wangzuxi 的回复:]  我说的是默认情况，大多数编译器默认情况char就是signed char，要是强制指定-funsigned-char，当然是按无符号的来，无符号char转到int高位被置0，gcc下用movzbl指令，零扩展；有符号char转int用movsbl指令，符号扩展。 lz的问题只能用符号扩展来解释，不管char是signed还是unsigned一样能解释得通。 ps：@lz 遇到这种情况，linux下用gdb或者objdump看一下反汇编代码就知道了，windows下也可以用IDE的反汇编工具看或者od之类的也可以。  ??[/quote] signed char转int：符号扩展，unsigned char转int：零扩展


Question: 0xC0000005: 读取位置 0xcdcdcdcd 时发生访问冲突

CSDN果然牛逼.就是万恶的验证码阻碍了他的发展

感谢，万分感谢

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

#include<stdio.h> #include<malloc.h> struct BTNode{ 	char data; 	struct BTNode *pLchild; 	struct BTNode *pRchild; };  struct BTNode * CreateBTree(void){ 	struct BTNode * pA=(struct BTNode *)malloc(sizeof(struct BTNode)); 	struct BTNode * pB=(struct BTNode *)malloc(sizeof(struct BTNode)); 	struct BTNode * pC=(struct BTNode *)malloc(sizeof(struct BTNode)); 	struct BTNode * pD=(struct BTNode *)malloc(sizeof(struct BTNode)); 	struct BTNode * pE=(struct BTNode *)malloc(sizeof(struct BTNode)); 	pA->data='A'; 	pB->data='B'; 	pC->data='C'; 	pD->data='D'; 	pE->data='E';  	pA->pLchild=pB; 	pA->pRchild=pC; 	pB->pLchild=pB->pRchild=NULL; 	pC->pLchild=pD; 	pC->pRchild=NULL;///////////////////////// 	pD->pLchild=NULL; 	pD->pRchild=pE; 	pE->pLchild=pE->pRchild=NULL; 	return pA; }  void PreTraverseBTree(struct BTNode * pT) { 	if(pT!=NULL) { 		printf("%c ",pT->data); 		PreTraverseBTree(pT->pLchild); 	    PreTraverseBTree(pT->pRchild); 	}   } int main(void) { 	struct BTNode * pT=CreateBTree(); 	PreTraverseBTree(pT);      system("pause");  }


Question: 枚举型常量在预处理命令中的使用

引用 4 楼 humianzhou 的回复:[quote=引用 1 楼 LINUX2012LINUX 的回复:]         编译预处理阶段处理的内容有限，我猜测问题不在于你的定义值是多少，而是在于你的判相等操作符 == 问题，根据结果分析，编译预处理阶段根本无法处理这个符号，因此编译器在该阶段可能会随机的给一个值或者指定一个值，所以也就看到了你上面的结果。这个问题我也遇到过，和你的结果相同。         另外，编译预处理严格的说不属于编译阶段的事情，而是在编译前面，它具体能做什么，我们只能凭借编译预处理命令通过程序测试，毕竟我们不知道编译预处理阶段的处理代码是如何进行具体实现的。        个人意见，仅供参考！ 我觉得在处理“==”时，预处理时可以识别的，我觉得2楼说的比较有道理，你可以参考一下，具体正确与否我得验证一下[/quote]恩，你考虑下我的疑问，我的疑问是：既然在与处理阶段看不到定义的话，那么枚举变量的符号应该也是看不到的，这不就应该在编译预处理阶段出错吗？而你的编译预处理代码： #if (2u == XENUM_NUM)应该正常通过了吧，这个怎么解释呢？

引用 1 楼 LINUX2012LINUX 的回复:编译预处理阶段处理的内容有限，我猜测问题不在于你的定义值是多少，而是在于你的判相等操作符 == 问题，根据结果分析，编译预处理阶段根本无法处理这个符号，因此编译器在该阶段可能会随机的给一个值或者指定一个值，所以也就看到了你上面的结果。这个问题我也遇到过，和你的结果相同。         另外，编译预处理严格的说不属于编译阶段的事情，而是在编译前面，它具体能做什么，我们只能凭借编译预处理命令通过程序测试，毕竟我们不知道编译预处理阶段的处理代码是如何进行具体实现的。        个人意见，仅供参考！ 我觉得在处理“==”时，预处理时可以识别的，我觉得2楼说的比较有道理，你可以参考一下，具体正确与否我得验证一下

引用 2 楼 user-2 的回复:既然你知道这是预处理，那么此时是看不过枚举的。 也就是说在在进行预处理的时候，根本没有如下定义？也就是说XENUM_NUM这个枚举常量压根就不存在，所以预处理阶段进行判定时XENUM_NUM是处于未定义状态，所以其值不确定？还是默认当做0？ typedef enum {     XENUM_ONE = 0u,     XENUM_TWO = 1u,     XENUM_NUM = 2u }Xenum_Type;

既然你知道这是预处理，那么此时是看不过枚举的。


Question: C/C++中怎样从字符串中查找特定的字符

引用 2 楼 LINUX2012LINUX 的回复:你可以自己编写一个函数啊，遍历以便就OK了。 #include <stdio.h> char *s="0.1, 9.735e-012, 4.36397e-012, 6.37811e-012, 7.72087e-012, 1.17491e-011, 5.03535e-012"; int strnchr(const char *p,const char c) {     int n;     n=0;     while (1)  {         if (0==*p) break;         if (c==*p) n++;         p++;     }     return n; } int main() {     printf("%d\n",strnchr(s,','));//6     return 0; }

直接FIND函数就行了啊

引用 5 楼 wk89665944 的回复:统计个数(方法一)： #include <string> #include <algorithm> using namespace std;  int main() {     string st("0.1, 9.735e-012, 4.36397e-012, 6.37811e-012, 7.72087e-012, 1.17491e-011, 5.03535e-012");     int nCount = count(st.begin(), st.end(), ','); }  统计个数（方法二）并记录所有逗号',' #include <string> #include <algorithm> #include <vector> using namespace std;  int main() {     string st("0.1, 9.735e-012, 4.36397e-012, 6.37811e-012, 7.72087e-012, 1.17491e-011, 5.03535e-012");     vector<string::iterator>  vec_it;      string::iterator it_start = st.begin();     while(it_start != st.end())     {         it_start = find(it_start, st.end(), ',');         if (it_start != st.end())         {             vec_it.push_back(it_start);         }     }      int nCount = vec_it.size(); // 统计个数， 并且此时所有的逗号','的迭代器都被存储在vec_it容器中 } 非常感谢~~

引用 1 楼 wangzuxi 的回复:strchr strstr strstr和strchr都是只找到第一次出现的位置,怎么全部找到并计数 阿?

引用 2 楼 LINUX2012LINUX 的回复:你可以自己编写一个函数啊，遍历以便就OK了。 怎么写啊,strstr和strchr函数都是只读取一个字符或字符串..

你可以自己编写一个函数啊，遍历以便就OK了。

strchr strstr

引用 14 楼 u013163178 的回复:有时候想一想，他妈编程真难，不过像通了的时候有觉得，就那么回事。 /*************************************************************************     > File Name: char_count.cpp     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年10月29日 星期三 19时49分21秒  ************************************************************************/  #include<iostream> #include<string> using namespace std;  int main() { 	string test ="0.1, 9.735e-012, 4.36397e-012, 6.37811e-012, 7.72087e-012, 1.17491e-011, 5.03535e-012"; 	int num=0; 	for(auto c : test ) 	{ 		if(c == ',') 			num++; 	} 	cout<< num << endl;  	return 0; } 翻过了山就不觉得山高

历遍数组，然后统计个数

感觉还是for循环 挨个比较以下，比较好控制

引用 7 楼 mymtom 的回复:strchr或者自己遍历都可以呀   #include <stdio.h> #include <string.h>  void demo(const char *s) {     int n;     char c;     const char *p;      c = ',';     n = 0;     for (p = s; *p; ++p) {         if (*p == c) {             printf("p=%d\n", (int)(p - s));             ++n;         }     }     printf("n=%d\n", n); }  int main(int argc, char *argv[]) {     char s [] =      "0.1, 9.735e-012, 4.36397e-012, 6.37811e-012, 7.72087e-012, 1.17491e-011, 5.03535e-012"     ;     char *p;     char c;     int n;      c = ',';     n = 0;     for (p = s; p = strchr(p, c); ) {         printf("p=%d\n", (int)(p - s));         ++n;         ++p;     }     printf("n=%d\n", n);       printf("%s\n", "====");      demo(s);      return 0; } 谢谢了~~

引用 9 楼 zhao4zhong1 的回复:[quote=引用 2 楼 LINUX2012LINUX 的回复:] 你可以自己编写一个函数啊，遍历以便就OK了。 #include <stdio.h> char *s="0.1, 9.735e-012, 4.36397e-012, 6.37811e-012, 7.72087e-012, 1.17491e-011, 5.03535e-012"; int strnchr(const char *p,const char c) {     int n;     n=0;     while (1)  {         if (0==*p) break;         if (c==*p) n++;         p++;     }     return n; } int main() {     printf("%d\n",strnchr(s,','));//6     return 0; } [/quote]谢谢了


Question: 请问将指针传给函数,是不是malloc所以内存被回收?

#include <stdio.h>  //从第m个字符开始全部复制为另一个字符串. void cpy(char *s, char **d, int m) {     *d = s+m; }  int main(void) {     char *s = "hello world";     char *r = NULL;     cpy(s, &r, 5);     printf("[%s]\n", r);//[ world]     return 0; }

跟malloc没关系，第一个用参数返回结果无效所以错误。

调用函数改变一个指针的值，请用指向指针的指针


Question: 关于链表添加的问题。

仅供参考//带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //

引用 1 楼 user-2 的回复:2.在头指针赋值的时候这么写为什么是错的？ 因为参数是List * plist 1.为什么不能写成，我的这个也是查到NULL的指针啊. 因为要把newlist插到最后  这位兄弟。插到最后不就是把最后的NULL赋值新建的数据指针吗？


Question: 国密SM2算法代码结果有错误，求大神看看

仅供参考：void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

楼主，你的sm2签名 算出来的签名值是多少字节，你仔细算了吗   sm2签名值的长度是64个字节  你看下你这个是多少字节  ============== 你这个代码，网上一大片，但不对  不知道你有没解决这个问题

怎么把SM2算法拆分成，生成公私钥对，用私钥签名，公钥验证这三个函数

强制类型转换即可，如第一个void *" 类型的值分配到 "unsigned char *"，直接改为 if ((signature =(unsigned char*) OPENSSL_malloc(sig_len)) == NULL) 其他的类似

适当的强制转换。

if (!BN_hex2bn(&z, "6CB28D99385C175C94F94E934817663FC176D925DD72B727260DBAAE1FB2F96F")) ABORT; 	if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) 	{ 		fprintf(stdout, " failed\n"); 		goto builtin_err; 	} 	if (!EC_POINT_get_affine_coordinates_GFp(group,Q, x, y, ctx)) 	{ 		fprintf(stdout, " failed\n"); 		goto builtin_err; 	} 	fprintf(stdout, "\nTesting K Point\n     x = 0x"); 	BNPrintf(x); 	fprintf(stdout, "\n     y = 0x"); 	BNPrintf( y); 	fprintf(stdout, "\n");  	EC_GROUP_get_order(group, order, ctx); 	if (!BN_nnmod(rp, x, order, ctx)) 	{ 		fprintf(stdout, " failed\n"); 		goto builtin_err; 	} 	if (!BN_copy(kinv, z )) 	{ 		fprintf(stdout, " failed\n"); 		goto builtin_err; 	}  // 	for(i=0;i<32;i++) // 		printf("%02X",digest[i]); // 	printf("\n");  	if (!SM2_sign_ex(1, digest, 32, signature, &sig_len, kinv, rp, eckey)) 	{ 		fprintf(stdout, " failed\n"); 		goto builtin_err; 	} 	fprintf(stdout, "ECSign OK\n");  	/* verify signature */ 	if (SM2_verify(1, digest, 32, signature, sig_len, eckey) != 1) 	{ 		fprintf(stdout, " failed\n"); 		goto builtin_err; 	} 	fprintf(stdout, "ECVerify OK\n     r = 0x"); 	d2i_ECDSA_SIG(&ecsig, &signature, sig_len); 	BNPrintf(ecsig->r); 	fprintf(stdout,"\n     s = 0x"); 	BNPrintf(ecsig->s); 	fprintf(stdout,"\n");  	//testing SM2DH vector 	/* create key */ 	if (!BN_hex2bn(&z, "6FCBA2EF9AE0AB902BC3BDE3FF915D44BA4CC78F88E2F8E7F8996D3B8CCEEDEE")) ABORT; 	if (!EC_POINT_mul(group,P, z, NULL, NULL, ctx)) ABORT; 	if (!EC_POINT_get_affine_coordinates_GFp(group,P, x, y, ctx)) ABORT; 	fprintf(stdout, "\nTesting A Key Point\n     x = 0x"); 	BNPrintf(x); 	fprintf(stdout, "\n     y = 0x"); 	BNPrintf( y); 	fprintf(stdout, "\n"); 	EC_KEY_set_private_key(eckey,z); 	EC_KEY_set_public_key(eckey, P);  	if (!BN_hex2bn(&z, "5E35D7D3F3C54DBAC72E61819E730B019A84208CA3A35E4C2E353DFCCB2A3B53")) ABORT; 	if (!EC_POINT_mul(group,Q, z, NULL, NULL, ctx)) ABORT; 	if (!EC_POINT_get_affine_coordinates_GFp(group,Q, x, y, ctx)) ABORT; 	fprintf(stdout, "\nTesting B Key Point\n     x = 0x"); 	BNPrintf(x); 	fprintf(stdout, "\n     y = 0x"); 	BNPrintf( y); 	fprintf(stdout, "\n"); 	//EC_KEY_set_private_key(eckey,z); 	//EC_KEY_set_public_key(eckey, P);  	if (!BN_hex2bn(&z, "33FE21940342161C55619C4A0C060293D543C80AF19748CE176D83477DE71C80")) ABORT; 	if (!EC_POINT_mul(group,P, z, NULL, NULL, ctx)) ABORT; 	if (!EC_POINT_get_affine_coordinates_GFp(group,P, x, y, ctx)) ABORT; 	fprintf(stdout, "\nTesting Rb Key Point\n     x = 0x"); 	BNPrintf(x); 	fprintf(stdout, "\n     y = 0x"); 	BNPrintf( y); 	fprintf(stdout, "\n");  	if (!BN_hex2bn(&z, "83A2C9C8B96E5AF70BD480B472409A9A327257F1EBB73F5B073354B248668563")) ABORT; 	if (!EC_POINT_mul(group,R, z, NULL, NULL, ctx)) ABORT; 	if (!EC_POINT_get_affine_coordinates_GFp(group,R, x, y, ctx)) ABORT; 	fprintf(stdout, "\nTesting Ra Key Point\n     x = 0x"); 	BNPrintf(x); 	fprintf(stdout, "\n     y = 0x"); 	BNPrintf( y); 	fprintf(stdout, "\n");      	SM2_DH_key(group,P, Q, z,eckey,outkey,keylen);  	fprintf(stdout,"\nExchange key --KDF(Xv||Yv)--  :"); 	for(i=0; i<outlen; i++) 		printf("%02X",outkey[i]); 	printf("\n");    builtin_err:	 	OPENSSL_free(signature); 	signature = NULL; 	EC_POINT_free(P); 	EC_POINT_free(Q); 	EC_POINT_free(R); 	EC_POINT_free(DHPoint); 	EC_KEY_free(eckey); 	eckey = NULL; 	EC_GROUP_free(group); 	BN_CTX_free(ctx); 	return 0;  }  int main() { 	CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0); 	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); 	ERR_load_crypto_strings(); 	RAND_seed(rnd_seed, sizeof rnd_seed);  	 	SM2_Test_Vecotor2(); 	 	 	CRYPTO_cleanup_all_ex_data(); 	ERR_free_strings(); 	ERR_remove_state(0); 	CRYPTO_mem_leaks_fp(stderr); 	 	return 0;  }


Question: ！！急求！！C语言中结构体链表问题(在线坐等)

非常感谢各位大神，我已经明白了，多谢！

如果是存的字符串就strcpy，否则用memcpy(n.a, b, sizeof(b))。 最好用memcpy，用strcpy可能会使你的程序崩掉，因为如果不是字符串strcpy就找不到\0，就会一直复制

首先实例化一个结构体对象LNode struct node { char a[30]; struct node *next; }LNode;  一种方法为for循环可以一个一个复制。 另外一种方法就是用#include<string.h> 里面的strcpy函数。 strcpy(LNode.a,b);

struct node n; strcpy(n.a, b); 或者用strncpy、strcpy_s之类的也行


Question: 成员name是个字符型指针变量啊，咋还没分配地址空间就赋值了？

引用 5 楼 mujiok2003 的回复: void foo(){ char* p = (char*)malloc(10); free(p); }  p的空间在栈上， 它指向的空间在队上。  队上--> 堆上

常量字符串"Zhang ping"的空间已经被编译器在常量区.rdata里面分配好了。

这样没有问题相当于把“zhang ping” 这个字符串的地址给了name。字符跟字符串是有区别的

name分配的是指针变量的空间， 那个赋值只是把字符串地址值赋给name指针变量

这样的赋值是可以的，但是通常用malloc后strcpy


Question: 请问:udp中,当port设置为0时,为什么sendto错误?怎么才可以自动分配端口并且sendto可用?

引用 4 楼 u013024958 的回复:[quote=引用 1 楼 wangzuxi 的回复:] [quote=引用 楼主 u013024958 的回复:] 请问:   udp中,当port设置为0时,为什么sendto错误?怎么才可以自动分配端口并且sendto可用?    如下 1.当sin_port = htons(0);时, sendto失败:  bind成功:    2.当指定sin_port时: 发送成功:   bind失败:    要如何才能两个都成功呢?   (找不到关于网络编程的板块,只能放在c了....) 调用sendto说明你是client，你要给server发数据，你想如果不指定对方端口怎么能发送呢。 [/quote]但是sin_port = htons(0)不是自动分配端口号吗？我是已经把服务器的信息传递给客户端了（如果自动分配了的话，不是也该传过去了吗？）。。。[/quote] sin_port = htons(0)对于指定源端口来说是自动分配，源端口本来就是自动分配的，没必要再这么做，目的端口肯定不能自动分配，你在sendto的目的地址信息写这个肯定不对。 你对UDP理解还不透，首先，肯定得有一端先在一个端口上bind，即server端创建socket之后，要在这个socket上bind一个端口号，这个端口号必须是一个未被占用的端口号，不能自动分配；然后，另一端，也就是client端创建socket之后，就可以调用sendto发送数据给server，调用sendto也得给参数说明这个数据要发给谁，这个谁就是由IP和port来决定的，显然server和client的port一样才能通信。

引用 6 楼 u013024958 的回复:[quote=引用 5 楼 wangzuxi 的回复:] [quote=引用 4 楼 u013024958 的回复:] [quote=引用 1 楼 wangzuxi 的回复:] [quote=引用 楼主 u013024958 的回复:] 请问:   udp中,当port设置为0时,为什么sendto错误?怎么才可以自动分配端口并且sendto可用?    如下 1.当sin_port = htons(0);时, sendto失败:  bind成功:    2.当指定sin_port时: 发送成功:   bind失败:    要如何才能两个都成功呢?   (找不到关于网络编程的板块,只能放在c了....) 调用sendto说明你是client，你要给server发数据，你想如果不指定对方端口怎么能发送呢。 [/quote]但是sin_port = htons(0)不是自动分配端口号吗？我是已经把服务器的信息传递给客户端了（如果自动分配了的话，不是也该传过去了吗？）。。。[/quote] sin_port = htons(0)对于指定源端口来说是自动分配，源端口本来就是自动分配的，没必要再这么做，目的端口肯定不能自动分配，你在sendto的目的地址信息写这个肯定不对。 你对UDP理解还不透，首先，肯定得有一端先在一个端口上bind，即server端创建socket之后，要在这个socket上bind一个端口号，这个端口号必须是一个未被占用的端口号，不能自动分配；然后，另一端，也就是client端创建socket之后，就可以调用sendto发送数据给server，调用sendto也得给参数说明这个数据要发给谁，这个谁就是由IP和port来决定的，显然server和client的port一样才能通信。[/quote]server端创建socket之后，要在这个socket上bind一个端口号，这个端口号必须是一个未被占用的端口号，不能自动分配...为什么不能自动分配呢?你说的源端口和这个端口不一样的吗?不是只有一处地方(sin_port那里)填充服务器的端口吗?如果不一样,源端口本来就自动分配,那sin_port = htons(0);自动分配的是什么端口呢?很菜,请见谅.[/quote] sendto肯定要指定目的IP和目的端口，你说这个目的端口能自动分配？ 你先弄清楚什么是源IP、源端口、目的IP、目的端口吧。

引用 5 楼 wangzuxi 的回复:[quote=引用 4 楼 u013024958 的回复:] [quote=引用 1 楼 wangzuxi 的回复:] [quote=引用 楼主 u013024958 的回复:] 请问:   udp中,当port设置为0时,为什么sendto错误?怎么才可以自动分配端口并且sendto可用?    如下 1.当sin_port = htons(0);时, sendto失败:  bind成功:    2.当指定sin_port时: 发送成功:   bind失败:    要如何才能两个都成功呢?   (找不到关于网络编程的板块,只能放在c了....) 调用sendto说明你是client，你要给server发数据，你想如果不指定对方端口怎么能发送呢。 [/quote]但是sin_port = htons(0)不是自动分配端口号吗？我是已经把服务器的信息传递给客户端了（如果自动分配了的话，不是也该传过去了吗？）。。。[/quote] sin_port = htons(0)对于指定源端口来说是自动分配，源端口本来就是自动分配的，没必要再这么做，目的端口肯定不能自动分配，你在sendto的目的地址信息写这个肯定不对。 你对UDP理解还不透，首先，肯定得有一端先在一个端口上bind，即server端创建socket之后，要在这个socket上bind一个端口号，这个端口号必须是一个未被占用的端口号，不能自动分配；然后，另一端，也就是client端创建socket之后，就可以调用sendto发送数据给server，调用sendto也得给参数说明这个数据要发给谁，这个谁就是由IP和port来决定的，显然server和client的port一样才能通信。[/quote]server端创建socket之后，要在这个socket上bind一个端口号，这个端口号必须是一个未被占用的端口号，不能自动分配...为什么不能自动分配呢?你说的源端口和这个端口不一样的吗?不是只有一处地方(sin_port那里)填充服务器的端口吗?如果不一样,源端口本来就自动分配,那sin_port = htons(0);自动分配的是什么端口呢?很菜,请见谅.

引用 1 楼 wangzuxi 的回复:[quote=引用 楼主 u013024958 的回复:] 请问:   udp中,当port设置为0时,为什么sendto错误?怎么才可以自动分配端口并且sendto可用?    如下 1.当sin_port = htons(0);时, sendto失败:  bind成功:    2.当指定sin_port时: 发送成功:   bind失败:    要如何才能两个都成功呢?   (找不到关于网络编程的板块,只能放在c了....) 调用sendto说明你是client，你要给server发数据，你想如果不指定对方端口怎么能发送呢。 [/quote]但是sin_port = htons(0)不是自动分配端口号吗？我是已经把服务器的信息传递给客户端了（如果自动分配了的话，不是也该传过去了吗？）。。。

不是..是用c写一个聊天小软件.......总是遇到很多问题....

你这是什么？是python吗？百度一下呗

引用 楼主 u013024958 的回复:请问:   udp中,当port设置为0时,为什么sendto错误?怎么才可以自动分配端口并且sendto可用?    如下 1.当sin_port = htons(0);时, sendto失败:  bind成功:    2.当指定sin_port时: 发送成功:   bind失败:    要如何才能两个都成功呢?   (找不到关于网络编程的板块,只能放在c了....) 调用sendto说明你是client，你要给server发数据，你想如果不指定对方端口怎么能发送呢。


Question: 函数的指针变量编译出现的问题

是的，原本是想让他在switch语句输出，后来发现可以在子函数中输出，看了半天不知道错哪了……

switch(e) { case 1: {fun(a,b,max);printf("%d",max);break;} case 2: {fun(a,b,min);printf("%d",min);break;} case 3: {fun(a,b,sum);printf("%d",sum);break;}  } 感觉 switch语句里的printf语句好多余啊

好厉害，膜拜

switch(e) 	{ 	case 1: 		{fun(a,b,max);printf("%d",max);break;} 	case 2: 		{fun(a,b,min);printf("%d",min);break;} 	case 3: 		{fun(a,b,sum);printf("%d",sum);break;}  	} printf 打印的是 如printf("%d",max)  打印的是max地址的int型 数值（保存的函数地址的32位值如果是int 4字节）


Question: 郁闷得想Die——求解：怎样才能把二维数组作为参数传进函数？

引用 6 楼 mujiok2003 的回复:想爹(die)干啥你爹去死（Go to die, your dad）!

用脚后跟思考一下为什么没人将整个互联网内容作为函数参数传来传去呢？

想爹(die)干啥

引用 3 楼 call_from_dream 的回复:[quote=引用 1 楼 zgangz 的回复:] 1.二维数组可以作用函数参数，但不能这样定义 一维可省，但二维不可省 void sort2(char arr[][222],int l); 2.                 tem=arr[i];                 arr[i]=arr[j];                 arr[j]=tem; 不能这样直接交换 为啥不能直接交换，能具体点儿吗，大侠？[/quote] 数组类型不能被赋值，作为数组名的数组指针不能被赋值，

引用 2 楼 user-4 的回复:1. 把所谓的 [][] 或 [5][] 都改成 [][20]  2. sort2 里面的用于交换的3条语句必须改成 strcpy 或类似的东西。谢谢，大侠！

引用 1 楼 zgangz 的回复:1.二维数组可以作用函数参数，但不能这样定义 一维可省，但二维不可省 void sort2(char arr[][222],int l); 2.                 tem=arr[i];                 arr[i]=arr[j];                 arr[j]=tem; 不能这样直接交换 为啥不能直接交换，能具体点儿吗，大侠？


Question: glib库中的链表 问题？算不算bug

引用 2 楼 wangzuxi 的回复:g_slist_alloc函数里面应该已经把内存清零了。 多半是这样

引用 楼主 xiaopohaibebo 的回复:红色部分 给链表赋值后没有给给slist->next赋值。应该给它赋值为null吧 g_slist_insert_before (GSList  *slist, 		       GSList  *sibling, 		       gpointer data) {   if (!slist)     {       slist = g_slist_alloc ();       slist->data = data;       g_return_val_if_fail (sibling == NULL, slist);       return slist;     }   else     {       GSList *node, *last = NULL;        for (node = slist; node; last = node, node = last->next) 	if (node == sibling) 	  break;       if (!last) 	{ 	  node = g_slist_alloc (); 	  node->data = data; 	  node->next = slist;  	  return node; 	}       else 	{ 	  node = g_slist_alloc (); 	  node->data = data; 	  node->next = last->next; 	  last->next = node;  	  return slist; 	}     } }  GSList * g_slist_concat (GSList *list1, GSList *list2) {   if (list2)     {       if (list1) 	g_slist_last (list1)->next = list2;       else 	list1 = list2;     }    return list1; }  g_slist_alloc函数里面应该已经把内存清零了。

红色在哪里，没看到


Question: 请教个视频帧处理的问题~~先谢谢啦

好多关于这方面的文章，搜搜YUV格式就出来啦，附图的能让你看得更明白 如：详解YUV420p数据格式  至于你说的采样不是4的倍数…不知道

引用 6 楼 FancyMouse 的回复:看来你啥基础都没啊。连yuv420都不懂。如果帧的采样Y不是4的倍数怎么办？

引用 6 楼 FancyMouse 的回复:看来你啥基础都没啊。连yuv420都不懂。知道不给我讲点

引用 3 楼 max_min_ 的回复:ffmpeg？ 目的是啥？为什么把一帧数据拆开？处理解码出来的幀数据啊，首先针对frame->data[0]的数据来说，如何取出右边一半数据？求指导求方法，感谢…

看来你啥基础都没啊。连yuv420都不懂。

引用 3 楼 max_min_ 的回复:ffmpeg？ 目的是啥？为什么把一帧数据拆开？你要我的目的做什么？ 简单说就是处理帧数据， 解码出来的YUV格式也不是很懂， 为什么存Y的data[0]是width*height而U的data[1]和V的data[2]都是Y的1/4，它们又是如何的对应关系？

引用 1 楼 q339659207 的回复:这你不就要用循环来做了。width*height*channel。取width/2*channel来截断咯。channel是什么？不用循环用什么处理？原本的获取每一帧的数据就是一个循环，再在里面嵌套循环是处理速度跟不上么？

ffmpeg？ 目的是啥？为什么把一帧数据拆开？

遍历所有的，把需要的部分取出来，循环height，每个取width*channel/2~width*channel。仅供参考


Question: 可否使用一个字节来保存浮点数？

C语言一个字节只能存整数

这个问题让我想起上家公司的一个逗逼同事，他是想把整数装进char里面还不损失精度，去问技术总监，总监说不行的，他拍桌子说总监技术不行。。。其实这逗逼为什么要这么搞呢，因为让他做的事情是把数据发给串口

引用 7 楼 ForestDB 的回复:自己仿IEEE 754定个1字节的浮点数的规范， 然后自己再根据这个规范和IEEE 754的规范，写出标准浮点数和一字节浮点数的互转例程，搞定。 看来要想满足要求，只能如此了，再没有更简便的方法了

引用 2 楼 xiao88yan 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 1位符号，2位阶码，5位尾数 ？ http://bbs.csdn.net/topics/390676437 需要手动修改吗？我只是想把一个float型的值直接存到一个字节里面去[/quote] 想想就好， 不要实践，害人害己。

一个字节才多大，你存浮点数还要考虑小数吧，这样放的就更小了..

引用 3 楼 r_Jimy 的回复:[quote=引用 2 楼 xiao88yan 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 1位符号，2位阶码，5位尾数 ？ http://bbs.csdn.net/topics/390676437 需要手动修改吗？我只是想把一个float型的值直接存到一个字节里面去[/quote] 直接赋值，就是没尾数而已，比如：      double test=3.92;     char ch=test;  上面代码中ch存的是3[/quote] 这个精度损失有点大，呵呵

引用 2 楼 xiao88yan 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 1位符号，2位阶码，5位尾数 ？ http://bbs.csdn.net/topics/390676437 需要手动修改吗？我只是想把一个float型的值直接存到一个字节里面去[/quote] 直接赋值，就是没尾数而已，比如：      double test=3.92;     char ch=test;  上面代码中ch存的是3

引用 1 楼 zhao4zhong1 的回复:1位符号，2位阶码，5位尾数 ？ http://bbs.csdn.net/topics/390676437 需要手动修改吗？我只是想把一个float型的值直接存到一个字节里面去


Question: 这样的指针用法错在哪？？

没有错，但是只是野指针或者悬浮指针，很不安全，×p是个指针变量，对指针的加减操作是不安全的

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

这不是悬挂指针吗，推荐楼主看《C陷阱与缺陷》

*p未初始化，是野指针，指向不确定，其他没什么

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

*p-2没有赋值，也就没有修改内存上的值，是安全的，只是没有意义。

引用 2 楼 zilin0110 的回复:那如果 我定义  int stuff[10];  int *p; p = stuff + 2;  让输出 printf ( "  % d ", * p - 2);  有错吗，错在哪？谢谢你！！！！  没有语法错误，*p相当于stuff[2]。但是stuff[10]没有初始化，*p-2的值是未知的。

% d中间怎么有空格

操作空 指针。。未初始化

找 syntax error， 别人问的一道题，说有syntax error，我糊涂了。。。

引用 2 楼 zilin0110 的回复:那如果 我定义  int stuff[10];  int *p; p = stuff + 2;  让输出 printf ( "  % d ", * p - 2);  有错吗，错在哪？谢谢你！！！！ 语法OK， 功能未知。 你要干啥啊？

int stuff[10] = {0}; int *p; p = stuff[0]; printf ( "  % d ", * p - 2);

指针未初始化 你这样写代码是很危险的 这时的指针里是个garbage value 如果这个garbage value 刚好指向内存中 且该内存有重要数据 后面的 p*-2 就更改了内存的内容

声明时的前缀*（表示后面是一个指针变量） 和 运行时的*（表示取后面指针所指的内容） 不是一回事！

引用 6 楼 zilin0110 的回复:[quote=引用 5 楼 r_Jimy 的回复:] 指针未初始化，它的值没有定义，如果访问到不能读的区域，会报错，即使读到了也没意义  如果我让 p= stuff + 2,   这样还会有问题吗？什么问题呢？谢谢你[/quote] 初始化后就没问题了

引用 5 楼 r_Jimy 的回复:指针未初始化，它的值没有定义，如果访问到不能读的区域，会报错，即使读到了也没意义  如果我让 p= stuff + 2,   这样还会有问题吗？什么问题呢？谢谢你


Question: 请教哈希函数双散列是如何计算的？

双散列函数为h(k,i)=(k mod 11 + i(1+k mod 9)) mod 11，其实就是 h(k,i) = (k % 11 + i * ( 1 + k % 9 )) % 11， 把k和i带进去就可以算出来了，i表示计算hash的次数，如果算出来的h已经被占用就说明hash冲突，需要再次计算hash，i就加1，直到算出来的hash没有冲突为止


Question: 新人想学网络编程，求大神捎上道

学习使用抓包软件比如wireshark  不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

先研究一下linux方面的吧

入门的话，可以看《Linux程序设计》的第3章和15章。 接着看《UNIX环境高级编程》和《UNIX网络编程》，把基础打扎实。 然后呢，可以看一下Libevent、muduo这些网络库


Question: 应用程序错误问题

内存访问越界。指定的地址0xccccccc不允许你读取，但是你的指令00x404a3尝试读取该地址上存储的数据。 通常是由于使用指针不当造成的。

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

百分之99是空指针或者野指针引起的。

未分配内存。

基本上是你使用了未初始化的指针


Question: 华为面试题一道

引用 3 楼 wanguser-2 的回复:[quote=引用 2 楼 smartjeckk 的回复:]  1、最好不要添加删除语句 ============================ 没添加删除语句啊，只是把第34、35行修改成下面这两句而已啊  first_file = first_file ? first_file : file; last_file = last_file ? (last_file->pnext = file) : file; [/quote] 最后面一句不对，假如last_file不为NULL，那么last_file = (last_file->pnext=file)，也就是last_file = last_file->next = file，这肯定不对

引用 4 楼 s_a_n_ 的回复:[quote=引用 3 楼 wanguser-2 的回复:] [quote=引用 2 楼 smartjeckk 的回复:]  1、最好不要添加删除语句 ============================ 没添加删除语句啊，只是把第34、35行修改成下面这两句而已啊  first_file = first_file ? first_file : file; last_file = last_file ? (last_file->pnext = file) : file; [/quote] 最后面一句不对，假如last_file不为NULL，那么last_file = (last_file->pnext=file)，也就是last_file = last_file->next = file，这肯定不对[/quote] 你再想想

first_file = first_file ? first_file : file; last_file = last_file ? (last_file->pnext = file) : file;  这个还不对？

引用 2 楼 smartjeckk 的回复:1、最好不要添加删除语句 ============================ 没添加删除语句啊，只是把第34、35行修改成下面这两句而已啊  first_file = first_file ? first_file : file; last_file = last_file ? (last_file->pnext = file) : file;


Question: 关于指针的定义格式

这个是编程规范 你搜下编程规范，那里有讲

*可以:1,紧挨着变量类型，如 int*   p; 2,紧挨着变量，如 int   *p; 3,两个都不挨着，也是可以滴，如 int   *   p;

引用 5 楼 mujiok2003 的回复:加空格只是为了代码便于人阅读， 编译器不需空格。 恩……，这个重点

都一样的。。

两种方式都是对的，编译器都支持。一般编程规范都推荐*号挨着指针变量，为的是避免在一行定义多个指针变量时不小心出错，例如： int   *p,q; // 这样读起来容易识别q是整形变量不是指针 int*  p,q;  // 这样比较容易误解p和q都是指针

加空格只是为了代码便于人阅读， 编译器不需空格。

从语法上来说，* 挨着变量是比较容易理解的。 以 int * p; 为例  int 是 type-specifier -> declaration-specifiers *p 是 declarator -> init-declarator -> init-declarator-list  3.5 DECLARATIONS  Syntax            declaration:                   declaration-specifiers init-declarator-list<opt> ;            declaration-specifiers:                   storage-class-specifier declaration-specifiers<opt>                   type-specifier declaration-specifiers<opt>                   type-qualifier declaration-specifiers<opt>            init-declarator-list:                   init-declarator                   init-declarator-list ,  init-declarator             init-declarator:                   declarator                   declarator =  initializer ================ 3.5.2 Type specifiers  Syntax            type-specifier:                   void                   char                   short                   int                   long                   float                   double                   signed                   unsigned                    struct-or-union-specifier                   enum-specifier                   typedef-name  =========================== 3.5.4 Declarators  Syntax            declarator:                   pointer<opt> direct-declarator            direct-declarator:                   identifier                   (  declarator )                    direct-declarator [  constant-expression<opt> ]                     direct-declarator (  parameter-type-list )                    direct-declarator (  identifier-list<opt> )            pointer:                   *  type-qualifier-list<opt>                   *  type-qualifier-list<opt> pointer            type-qualifier-list:                   type-qualifier                   type-qualifier-list type-qualifier            parameter-type-list:                   parameter-list                   parameter-list , ...            parameter-list:                   parameter-declaration                   parameter-list ,  parameter-declaration            parameter-declaration:                   declaration-specifiers declarator                   declaration-specifiers abstract-declarator<opt>            identifier-list:                   identifier                   identifier-list ,  identifier

楼上说的都很对！

靠哪一个都行了，或者两个都不靠也可以。  但是，如果一行定义多个变量的话，*靠近变量可能更容易理解。  比如下面等价的写法  int *p1, i1; int* p1, i1;  或   int *p1, *p2, i1, i2, *p3, i3; int* p1, * p2, i1, i2, * p2, i3;

两种都对，只是书写不同，编译器认为是一样的

都可以 各种风格而已

引用 6 楼 zhuimengfuyun 的回复:这两种情况对于编译器来将是一样的，只是让阅读你代码的人看起来更爽一些。比如 int *p, q; 和 int* p, q;  这两种定义都是p为int类型指针， q为int类型，阅读你代码的人可能会把第二种情况的p和q误解释为int 类型指针。  所以不建议在一个声明中一起写两个以上的变量。。。

季经贴


Question: 关于C语言浮点数快速计算

引用 11 楼 shinerise 的回复:引用 10 楼 DelphiGuy 的回复:可以参考：http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/Bcffigdj.html我用的是cotex m3，不带vfp。sigh。。。  VFP没有，NEON也没有，那你就别搞什么优化了，用语言本身实现的浮点仿真库就行了。

引用 6 楼 shinerise 的回复:[quote=引用 5 楼 DelphiGuy 的回复:] 这种简单运算,你直接f = f1 + f2;就可以了，非要写的话：  float f_add(float f1, float f2) {   __asm{     fld dword ptr f2     fadd dword ptr f1   } }  也可以用SSE指令movss、addss，但是在32位代码中这样做有些得不偿失，计算结果还要压入FPU栈。多谢。我是ARM平台，不支持浮点指令。[/quote]  新一些的ARM也支持浮点（VFP）和SIMD（NEON）指令，你的不会是ARM v6架构吧。

《算法心得——高效算法的奥秘》

我也不知道但是之前遇到过浮点数计算是把一个浮点数拆分成两部分 一部分是小数部  一部分是整数部 进行计算的

引用 7 楼 jerry_dqh 的回复:[quote=引用 6 楼 shinerise 的回复:] [quote=引用 5 楼 DelphiGuy 的回复:] 这种简单运算,你直接f = f1 + f2;就可以了，非要写的话：  float f_add(float f1, float f2) {   __asm{     fld dword ptr f2     fadd dword ptr f1   } }  也可以用SSE指令movss、addss，但是在32位代码中这样做有些得不偿失，计算结果还要压入FPU栈。多谢。我是ARM平台，不支持浮点指令。[/quote] arm构架不是很了解，如果cpu没有特别的加速指令，我估计性能都是差不多了[/quote]看到说用Q格式快速计算，自己写了个example，结果计算总是错误，搞不懂啊。

引用 6 楼 shinerise 的回复:[quote=引用 5 楼 DelphiGuy 的回复:] 这种简单运算,你直接f = f1 + f2;就可以了，非要写的话：  float f_add(float f1, float f2) {   __asm{     fld dword ptr f2     fadd dword ptr f1   } }  也可以用SSE指令movss、addss，但是在32位代码中这样做有些得不偿失，计算结果还要压入FPU栈。多谢。我是ARM平台，不支持浮点指令。[/quote] arm构架不是很了解，如果cpu没有特别的加速指令，我估计性能都是差不多了

引用 5 楼 DelphiGuy 的回复:这种简单运算,你直接f = f1 + f2;就可以了，非要写的话：  float f_add(float f1, float f2) {   __asm{     fld dword ptr f2     fadd dword ptr f1   } }  也可以用SSE指令movss、addss，但是在32位代码中这样做有些得不偿失，计算结果还要压入FPU栈。多谢。我是ARM平台，不支持浮点指令。

帮顶一下，一直也没有怎么用过浮点数，也想了解一下。快速算法是基于什么原理呢？


Question: 怎么在O（1）的时间复杂度下找到数组的最大值？

这是CRCI里面讲到的一道题。  参考     最小换成最大，一样的效果。

引用 11 楼 mymtom 的回复:原理上不行吧，需要有序的才行啊++

空间换取时间

引用 11 楼 mymtom 的回复:原理上不行吧，需要有序的才行啊 5楼的想法不错

引用 5 楼 user-11 的回复:保存(data_,max_)这样一对的数据。 比如，入栈1 4 2 5 3 实际上保存的是(1,1), (4,4), (2,4), (5,5), (3,5) 这应该是个不错的办法！

引用 5 楼 user-11 的回复:保存(data_,max_)这样一对的数据。 比如，入栈1 4 2 5 3 实际上保存的是(1,1), (4,4), (2,4), (5,5), (3,5) 靠谱

引用 5 楼 user-11 的回复:保存(data_,max_)这样一对的数据。 比如，入栈1 4 2 5 3 实际上保存的是(1,1), (4,4), (2,4), (5,5), (3,5) 正解，如果只用一个栈，最大值可用数组来存，还得保存数组当前索引 如果不用数组，只用一个值保存，每次出入栈都要对所有元素重新计算最大值

引用 9 楼 zhouqinghe24 的回复:[quote=引用 8 楼 mujiok2003 的回复:] [quote=引用 7 楼 zhouqinghe24 的回复:] [quote=引用 3 楼 mujiok2003 的回复:] [quote=引用 2 楼 zhouqinghe24 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 每次更行栈的时候，更新成员max_, 而max函数直接返回成员max_   你这个不行。 出栈后 就不能确定是否为最大值了，这个需要借助双栈。[/quote] 每次更新栈包括入栈和出站。[/quote]  出栈遍历一遍就是O(n)了 不是O(1)[/quote] 要求的不是出站吧， 是max?[/quote]   这样的话  可以先都pop 出来，求到max 再push进去，保存max的值，用max 函数来返回这个值。也算O(1)？[/quote] 显然不算， 你对max使用提出额外的要求，max的复杂度是O(n)

进栈的时候就用最小堆？-。-

原理上不行吧，需要有序的才行啊

5楼不错。。。

栈的底层实现用大顶堆，这样堆顶元素就是最大值

引用 8 楼 mujiok2003 的回复:[quote=引用 7 楼 zhouqinghe24 的回复:] [quote=引用 3 楼 mujiok2003 的回复:] [quote=引用 2 楼 zhouqinghe24 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 每次更行栈的时候，更新成员max_, 而max函数直接返回成员max_   你这个不行。 出栈后 就不能确定是否为最大值了，这个需要借助双栈。[/quote] 每次更新栈包括入栈和出站。[/quote]  出栈遍历一遍就是O(n)了 不是O(1)[/quote] 要求的不是出站吧， 是max?[/quote]   这样的话  可以先都pop 出来，求到max 再push进去，保存max的值，用max 函数来返回这个值。也算O(1)？

引用 7 楼 zhouqinghe24 的回复:[quote=引用 3 楼 mujiok2003 的回复:] [quote=引用 2 楼 zhouqinghe24 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 每次更行栈的时候，更新成员max_, 而max函数直接返回成员max_   你这个不行。 出栈后 就不能确定是否为最大值了，这个需要借助双栈。[/quote] 每次更新栈包括入栈和出站。[/quote]  出栈遍历一遍就是O(n)了 不是O(1)[/quote] 要求的不是出站吧， 是max?

引用 3 楼 mujiok2003 的回复:[quote=引用 2 楼 zhouqinghe24 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 每次更行栈的时候，更新成员max_, 而max函数直接返回成员max_   你这个不行。 出栈后 就不能确定是否为最大值了，这个需要借助双栈。[/quote] 每次更新栈包括入栈和出站。[/quote]  出栈遍历一遍就是O(n)了 不是O(1)

引用 3 楼 mujiok2003 的回复:[quote=引用 2 楼 zhouqinghe24 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 每次更行栈的时候，更新成员max_, 而max函数直接返回成员max_   你这个不行。 出栈后 就不能确定是否为最大值了，这个需要借助双栈。[/quote] 每次更新栈包括入栈和出站。[/quote] 出栈的时候更新，需要把整个栈重新扫一遍，效率不太高。 空间换时间，把每次入栈的max_历史记录保存下来，这样出栈更新就很快了。

引用 2 楼 zhouqinghe24 的回复:[quote=引用 1 楼 mujiok2003 的回复:] 每次更行栈的时候，更新成员max_, 而max函数直接返回成员max_   你这个不行。 出栈后 就不能确定是否为最大值了，这个需要借助双栈。[/quote] 每次更新栈包括入栈和出站。

引用 1 楼 mujiok2003 的回复:每次更行栈的时候，更新成员max_, 而max函数直接返回成员max_   你这个不行。 出栈后 就不能确定是否为最大值了，这个需要借助双栈。


Question: 请教一个结构体的问题

定义学生数目 #define INF (30)  定义学生结构体： typedef struct _stu {     unsigned o;//年龄     unsigned w;//体重     unsigned t;//身高 }stu;  定义班级结构体： typedef struct _cls {     stu st[INF];//学生     int w,h;//行列数 }cls;  初始化的话，如果想单独赋值就这么做： void init(cls& c) {     for ( int i = 0; i < INF; i++)     {         memset(&c.st[i], 0, sizeof(stu));     }      c.w = c.h = 1;     return; }  如果要是都赋值成0的话，就这么做就行了： cls c; memset(c, 0, sizeof(cls));

引用 4 楼 csdn324t9 的回复:[quote=引用 3 楼 xihu1364 的回复:]  const int FILEPATH_MAX_LEN = 256; 表示看不懂，能有简单点儿的不[/quote]  怎么会看不懂呢？ 你是C选手还是C++选手？  如果是C选手，就不知道构造函数了  那这样  const int INF = 3; //定义一个变量 跟 #define INF 3 是一样的  typedef struct CLS  {     int *stu[INF];     int w,h; }cls,*Pcls;   //这里的*Pcls   就是跟cls一样 这里只是指针类型  //初始化的时候 void main() {     cls a;     a.stu[0] = NULL;     a.stu[1] = NULL;     a.stu[2] = NULL;     a.h = 0;     a.w = 0; //这里就是初始化      //也可以一步到位     //memset(&a,0,sizeof(cls)); }

引用 1 楼 user-3 的回复:得先定义一个该结构体类型的变量已经定义好了啊，我那样的不行么？  然后再实现 （总共有四列的话，原本是顺序1，2，3，4）改成1，3，2，4的座位顺序

引用 3 楼 xihu1364 的回复: const int FILEPATH_MAX_LEN = 256; 表示看不懂，能有简单点儿的不

const int FILEPATH_MAX_LEN = 256;

请参考...  typedef struct MODIFYFILE_REQ { 	char szFilePath[FILEPATH_MAX_LEN]; 	char szFileName[FILEPATH_MAX_LEN]; 	char szNewFileName[FILEPATH_MAX_LEN];  	MODIFYFILE_REQ() 	{ 		memset(this,0x00,sizeof(MODIFYFILE_REQ)); 	} }ModifyFile_Req,*PModifyFile_Req;  typedef struct MODIFYFILE_RESP { 	unsigned int nResult;  	MODIFYFILE_RESP() 	{ 		memset(this,0x00,sizeof(MODIFYFILE_RESP)); 	} }ModifyFile_Resp,*PModifyFile_Resp;

得先定义一个该结构体类型的变量


Question: c中如何用一个for循环求最小数

基础不太好，多多包涵

晕死，这和求最大数一个样，只是把大于改成小于。

谢谢各位大神，你们的解答很好，我不会求最小的，可能因为数组与循环那里学的不太好，回去会好好研究的

/*************************************************************************     > File Name: min.cpp     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年10月29日 星期三 20时02分45秒  ************************************************************************/  #include<iostream> #include<random> #include<vector> using namespace std;  int main() { 	vector<unsigned> v; 	int tmp; 	uniform_int_distribution<unsigned> u(2,99); 	default_random_engine e; 	for(size_t i =0; i < 20; ++i) 	{ 		tmp = u(e); 		v.push_back(tmp); 	} 	//下面代码求最小值 	int min; 	min = *v.begin(); 	for(auto a : v) 	{ 		cout << a << ' '; 		if(a < min) 			min = a; 	} 	cout<< endl;  	cout << "The min is : "<< min << endl;  	return 0; }

引用 1 楼 Deng_W_W 的回复: int get_minimum(int a[],int length) {     int minimum = a[0];     for(int i = 1; i < length; i ++)     {         if(minimum <= a[i])         {            minimum = a[i];         }     }     return minimum; }  不好意思，写错了  if(minimum >= a[i])         {            minimum = a[i];         }

都会求最大数了， 还不会求最小数？