Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 新人问一个c语言问题，大家帮忙看一下

回复:
user: user-1
content: 选择排序法的的降序排列没有实现是因为内层循环有个地方写错了 for(j=n+1;j<n;j++)应该改为for(j=i+1;j<n;j++) 折半查找法这里不是用不了，是你的scanf里面多写了\n scanf("%ld\n",&x1);应该是scanf("%ld",&x1);  #include <stdio.h> #include <stdlib.h> #define N 5 int Readscore(int  score[],long id[]); int Linsearch(long id[],long m,int n); void Linsort(int score[],long id[],int n); void Selectsort(int score[],long id[],int n); int Binsearch(long id[],long m,int n); void Printf(int score[],long id[],int n);  int main() { 	int score[N];//记录学生成绩 	long id[N];//记录学生学号 	int num;//接收 READscore的返还值，即学生人数 	long x,x1; 	int a,a1;//接收返回学号的值  	//记录学生成绩 	num=Readscore(score,id);  	//输出成绩和学号 	Printf(score,id,num);   	// 顺序查找法 	printf("输入你要查找的学生的学号："); 	scanf("%ld",&x); 	a=Linsearch(id,x,num); 	printf("%d %ld\n",score[a],id[a]);  	//线性排序法 	Linsort(score,id,num);  	//输出成绩和学号 	Printf(score,id,num);  	//选择排序法 	Selectsort(score,id,num);  	//输出成绩和学号 	Printf(score,id,num);  	//折半查找法 	printf("输入你要查找的学生的学号："); 	scanf("%ld",&x1); 	a1=Binsearch(id,x1,num); 	if(a1 != -1) 	{ 		printf("%d %ld\n",score[a1],id[a1]); 	} 	else 	{ 		printf("大兄弟，没这个人啊!"); 	}   	//输出成绩和学号 	Printf(score,id,num);   	return 0; }  //录入学生成绩 和学号 int Readscore(int score[],long id[]) { 	int i=-1; 	do 	{ 		i++; 		printf("input score and id:"); 		scanf("%d %ld",&score[i],&id[i]); 	}while((score[i] >= 0)&&(id[i] >=0)); 	return i; } //顺序查找 int Linsearch(long id[],long m,int n) { 	int i;  	for(i=0;i<n;i++) 	{ 		if(m == id[i]) 		{ 			return i; 		} 	} 	return -1; } //线性排序,升序排 void Linsort(int score[],long id[],int n) { 	int i,j; 	int temp1,temp2;  	for(i=0;i<n-1;i++) 	{  		for(j=i+1;j<n;j++) 		{ 			if(score[i]>score[j]) 			{ 				//交换成绩 				temp1=score[j]; 				score[j]=score[i]; 				score[i]=temp1; 				//交换学号 				temp2=id[j]; 				id[j]=id[i]; 				id[i]=temp2; 			} 		} 	} } //选择排序法,降序排 void Selectsort(int score[],long id[],int n) { 	int i,j,k; 	int temp1; 	long temp2;  	for(i=0;i<n-1;i++) 	{ 		k=i; 		for(j=i+1;j<n;j++) 		{ 			if(score[j] > score[k]) 			{ 				k=j; 			} 		} 		if(k != i) 		{ 			//交换成绩 			temp1 = score[k]; 			score[k] = score[i]; 			score[i] = temp1;  			//交换学号 			temp2 = id[k]; 			id [k] =id[i]; 			id[i] = temp2; 		} 	} }  //折半查找法 int Binsearch(long id[],long m,int n) { 	int high = n-1; 	int low = 0; 	int mid;  	while(low <= high) 	{ 		mid = (high+low)/2; 		if(m < id[mid]) 		{ 			high = mid-1; 		} 		else if(m > id[mid]) 		{ 			low = mid+1; 		} 		else 		{ 			return mid; 		} 	} 	return -1; } //输出函数 void Printf(int score[],long id[],int n) { 	int i; 	printf("=============================\n"); 	for(i=0;i < n;i++) 	{  		printf("%d %ld\n",score[i],id[i]);  	} }

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

user: user-3
content: 你的降序中第二个循环根本不会执行。初始条件不对。 你说的不继续执行是什么意思

user: user-4
content: 有个工具叫调试器，还有个工具叫日志。
user-0 提问: 杭电acm2014

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:如果 输入的数据满足   n%m ==0 循环一次也没有执行 tmp 中就是错误的值，而不是m谢谢，漏掉了，问题解决

user: user-1
content: 如果 输入的数据满足   n%m ==0 循环一次也没有执行 tmp 中就是错误的值，而不是m
user-0 提问: 怎么用setTimeout（）设置页面为指定时间刷新

回复:
user: user-1
content: var timmer = setInterval(function () {             var curDate = new Date();             if (curDate.getHours() == 0) {                 clearInterval(timmer);                 location.href = 'Index.aspx';             }         }, 1000)  设置一个间隔1秒的计时器，每隔一秒检查一下当前时间，如果发现到0点了，执行刷新操作
user-0 提问: Cmake3.4 + opencv3.0 + Qt5.2

回复:
user: user-1
content: 研读CMake在线相关文档或在CMake官方论坛发帖求助。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:在CMake里你选的什么编译器？ 试了三个 1：VS2013  生成完了以后有VS的工程文件，可以用VS2013编译，不过有一个工程失败，highgui那个工程 2.VS2008 生成VS工程文件，但是基本上没有一个工程编译通过 3.：GCC + G++ 仍然没有Makefile文件

user: user-1
content: 在CMake里你选的什么编译器？
user-0 提问: [C语言求救贴] C语言里的一个细节问题，求大神指教

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

user: user-2
content: 引用 10 楼 dalemwi 的回复:[quote=引用 7 楼 ForestDB 的回复:] 没有用return，就表示你只是调用函数，并不要函数的返回值。  所以我在函数里直接打印出正确的x可以，因为函数有分配临时的空间给那个正确的多次递归后的x，但是就不能返回给main了，请问是这样吗？[/quote] 虽然不准确，差不多就这个意思。 每次函数调用都有其自己的frame，每个frame中的‘同名’变量‘，其实是没有任何关系的。

user: user-3
content: 楼主可以自己单步一步步看 如果没有加return,那么一层层递归进去，到最里面那层了（即进入else分支了）打印出2.00000，然后return x了 但由于之前的没有return,你用什么接收返回值呢？ 最后在主函数打印出来的也就是寄存器里的值

user: user-0
content: 引用 7 楼 ForestDB 的回复:没有用return，就表示你只是调用函数，并不要函数的返回值。  所以我在函数里直接打印出正确的x可以，因为函数有分配临时的空间给那个正确的多次递归后的x，但是就不能返回给main了，请问是这样吗？

user: user-0
content: 引用 6 楼 user-5 的回复:longjmp 或者异常  好的，谢谢您！

user: user-4
content: 楼主sb昂。。

user: user-2
content: 没有用return，就表示你只是调用函数，并不要函数的返回值。

user: user-5
content: 要不用长跳转 或者 异常试试看

user: user-5
content: 递归 必须逐层返回，没有捷径 想要捷径，用循环

user: user-5
content: longjmp 或者异常

user: user-0
content: 引用 1 楼 user-5 的回复:funct(x);---> tmp = funct(x); 递归调用结束，继续执行后续代码  return funct(x); 递归调用结束执行 函数调用funct(x); 的返回值作为 返回值象上一层调用返回   您好！我还想问一下， funct(x);---> tmp = funct(x) 这样的话，为什么多次这样调用后，在函数里  printf("%.5lf!!\n\n",x);  这一句中，我还是可以得到一我想要的递归结果（x）呢？  而且为什么这样不能把那个正确的递归结果（x）返回给main函数为它所用呢？  谢谢您！

user: user-0
content: 引用 楼主 dalemwi 的回复:新手初学C，有一个细节问题一直想不懂，求教各位大神  在一个需要返回值得函数里，函数调用自己这两种形式： .. function(..) { 	..         function(..)	 }   和这样调用自己：   .. function(..) { 	.. 	return function(..)	 }  有什么区别呢？。。。   问题来源于一段简单的递归代码：  #include<stdio.h>  int main() {     double funct(double x);      printf("%.5lf",funct(10.0));     return 0; }   double funct(double x) {    if(x!=2.0)    {         x--;         funct(x);    }    else   {        printf("%.5lf!!\n\n",x);         return x;   } }   里面递归的一句：         funct(x);  没有写成： return funct(x);[/code]  会造成返回给main的参数出错。。。。但是一直想不懂为什么。。。  所以求教各位大神了，帮帮初学者吧！   您好，我还想问一下， funct(x);---> tmp = funct(x) 这样的话，为什么多次这样调用后，在函数里  printf("%.5lf!!\n\n",x); 这一句中，我还是可以得到一我想要的递归结果（x）呢？  而且为什么这样不能把那个正确的递归结果（x）返回给main函数为它所用呢？  谢谢您！

user: user-5
content: funct(x);---> tmp = funct(x); 递归调用结束，继续执行后续代码  return funct(x); 递归调用结束执行 函数调用funct(x); 的返回值作为 返回值象上一层调用返回
user-0 提问: 从串口接收一段十六进制数据中提取特定数据

回复:
user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:#pragma warning(disable:4305 4309) #include <stdio.h> #include <string.h> char b[]={ 0x2D,0x30,0x30,0x30,0x35,0x2E,0x30,0xB7, 0x8D,0x0A,0x53,0xD4,0xAC,0x4E,0xD4,0xAC, 0x2D,0x30,0x30,0x30,0x35,0x2E,0x30,0xB7, 0x8D,0x0A,0x53,0xD4,0xAC,0x4E,0xD4,0xAC, }; char s[8]; int main() {     s[7]=0;     memcpy(s,&b[ 0],7);     printf("%s\n",s);     memcpy(s,&b[16],7);     printf("%s\n",s);     return 0; } //-0005.0 //-0005.0 // 谢谢。

user: user-2
content: #pragma warning(disable:4305 4309) #include <stdio.h> #include <string.h> char b[]={ 0x2D,0x30,0x30,0x30,0x35,0x2E,0x30,0xB7, 0x8D,0x0A,0x53,0xD4,0xAC,0x4E,0xD4,0xAC, 0x2D,0x30,0x30,0x30,0x35,0x2E,0x30,0xB7, 0x8D,0x0A,0x53,0xD4,0xAC,0x4E,0xD4,0xAC, }; char s[8]; int main() {     s[7]=0;     memcpy(s,&b[ 0],7);     printf("%s\n",s);     memcpy(s,&b[16],7);     printf("%s\n",s);     return 0; } //-0005.0 //-0005.0 //
user-0 提问: 数据结构栈的问题

回复:
user: user-1
content: 我靠，忘记了一个重点，因为原始栈有一个字节，所以上面的函数中的栈大小等处代码都要相应+1

user: user-1
content: char gettop (SqStack *s)//取栈顶的元素  {   if(s->base==s->top||s->base==NULL)      return ERROR;   return *(s->top); }  int stacklength (SqStack *s)//返回栈的长度  {     //返回S的元素个数，即栈的长度     return (s->base - s->top); }  SElemType pop (SqStack *s)//弹出一个，删除  {     //若栈不空，则删除S的栈顶元素     if (s->top==s->base) return ERROR;      return (*s->top);//带回了被删除的值       --s->top; }  Status visit(SqStack *s) { while(s->base!=s->top)   printf("%c\n",*s->top);   --s->top; return ok; } #endif  #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include"stack.h" int main()  {  char c; SqStack *s; s=(SqStack*)malloc(sizeof(SElemType)); ; while(scanf("%c",&c)!=EOF) push(s,c);     return 0;  另外，楼主你的栈还不完美，只能处理CHA类型的数据，那要是INT或float的你怎么办

user: user-1
content: Status push(SqStack *s, char c)//在栈顶插入新元素 {    if((s->base)-(s->top)>=(s->stacksize))//通常栈是向低端地址增长的，你用top-base是个负数一定会大于                                                                                                                                                             stacksize     {  s->base=(char *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(SElemType));          s->stacksize += STACKINCREMENT;         s->top=s->base + s->stacksize;、\\这里前后顺序错了         } s->top=s->top-STACKINCREMENT; \\栈顶指针减少了10个cha *(s->top)=c;  return ok; }

user: user-2
content: SqStack *s改成SqStack s你栈没分配空间，sigsegv 段访问违例，一般由于没有分配空间的指针被访问

user: user-3
content: 稍微看了下发现了两个问题： 1.SqStack *s这个指针需要分配空间，因为楼主initstack函数传的是一级指针，所以建议直接在主函数里malloc 2.while(scanf("%c",&c)!=EOF);后面多了分号吧？ PS:不过另外还有错误，楼主会单步调试的，自己先调试下，还有问题再发上来  int main()  { 	char c; 	SqStack *s = (SqStack *)malloc(sizeof(SqStack)); 	initstack(s); 	while(scanf("%c",&c)!=EOF) 		push(s,c); 	return 0; }
user-0 提问: c预定义

回复:
user: user-1
content: 楼上该说的都说了。我就不废话了。

user: user-2
content: VMX_API_PRINTF(...)	do{}while(0)好处： 1、辅助定义复杂的宏，避免引用的时候出错： 2、避免空宏引起的warning

user: user-3
content: 把宏展开了理解。 cpp, gcc -E, cl.exe /E可以帮你展开。

user: user-4
content: VMX_API_PRINTF("%s-Line-%d\n",__FUNCTION__,__LINE__);	  ---->lib_print("%s-Line-%d\n",__FUNCTION__,__LINE__);	  VMX_API_PRINTF(...)---->	do{}while(0)  在不同条件下，VMX_API_PRINTF 定义成不同 形式 前一种形式，VMX_API_PRINTF 直接替换成 lib_print 后一种形式，不定参数宏调用 替换成 空循环 这样 两种宏，定义形式虽然不统一 用起来却是一致的  前一种，定义不带参数宏 直接替换，省得处理不定参数 让 lib_print 这个函数来处理 不定参数  后一种，处理就是不处理  所以 定义带不定参数的宏 ，使之武功尽废，什么也不做。

user: user-5
content: 就是打印当前函数名以及行号。
user-0 提问: c语言：带有参数的main（int argc，char *args[])中参数的含义

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

user: user-2
content: main函数的两个参数用于接收命令行的参数，第一个是命令行参数的个数，第二个一个字符串数组，用于访问命令行的参数。 假如你的程序最后生成的程序文件是p.exe，那么，当你双击程序运行它是，相当于在命令行输入以下内容并回车： p.exe 这时，你在程序中可以得到第一个参数是1,第二个参数是含有1个字符串的字符串数组，这1个字符串是"p.exe"  如果想带参数运行你的程序，应该使用Cmd窗口，在cmd窗口中输入你的程序，后面带上参数： p.exe c1 c2 c3 以上表示你的程序带了3个参数运行，3个参数分别是c1,c2和c3，在你的程序中，第一个参数的值将是4,第二个参数将是包含4个字符串的字符串数组，这4个字符串分别是：“p.exe"，"c1"，"c2"，"c3"。  下面是我曾经写过的一个命令行程序的代码片段，楼主可以参考一下这两个参数的用法：    int main(int argc, char* argv[]) {     bool bRemoveAsterisk=false;     bool bRemoveSlash=false;     bool bRemoveBlankLine=false;     bool bReplaceTab=false;     String str,file1,file2;     int n;     int iErrorCode=0;     for(int i=1;i<argc;i++)     {         str = argv[i];         if(str=="//") bRemoveSlash=true;         else if(str=="/*") bRemoveAsterisk=true;         else if(str=="/b") bRemoveBlankLine=true;         else if(str.SubString(1,2)=="/t")         {             if(str=="/t")             {                 cout<<"对C语言程序源文件进行处理"<<endl;                 cout<<endl;                 cout<<"CommRemove [/b] [/*] [//] [/t<n>] <file1> <file2>"<<endl;                 cout<<endl;                 cout<<" <file1> 需要处理的源文件"<<endl;                 cout<<" <file2> 处理后的结果文件"<<endl;                 cout<<endl;                 cout<<" [/t<n>] 将源文件中的TAB字符替换为空格,n为替换空格的个数"<<endl;                 cout<<"         其中的<n>必须指定一个数值"<<endl;                 iErrorCode = 3;             }             String ns = str.SubString(3,255);             bReplaceTab=true;             n = atoi(ns.c_str());         }         else if(file1.Length()==0) file1 = str;         else file2 = str;     }     if(iErrorCode!=0) return iErrorCode;

user: user-3
content: argc,argv 用命令行编译程序时有用。 主函数main中变量(int argc, char *argv[])的含义 有些编译器允许将main() 的返回类型声明为void，这已不再是合法的C++ main(int argc, char *argv[], char **env)才是UNIX和Linux中的标准写法。 argc: 整数,用来统计你运行程序时送给main函数的命令行参数的个数 * argv[]: 字符串数组，用来存放指向你的字符串参数的指针数组，每一个元素指向一个参数 argv[0] 指向程序运行的全路径名 argv[1] 指向在DOS命令行中执行程序名后的第一个字符串 argv[2] 指向执行程序名后的第二个字符串          argv[argc]为NULL。 **env:字符串数组。env[]的每一个元素都包含ENVVAR=value形式的字符串。其中ENVVAR为环境变量，value 为ENVVAR的对应值。 argc,argv,env是在main( )函数之前被赋值的，编译器生成的可执行文件，main()不是真正的入口点，而是一个标准的函数,这个函数名与具体的操作系统有关。

user: user-4
content: 没用过对于没用过命令行的人的确很难说清楚, 去实地用一下就清楚了。 试想一下我想删除某个文件夹，但是没有GUI工具该怎么办.
user-0 提问: C中macro的Token Pasting的问题

回复:
user: user-1
content: cur_l3_ ## table ## _table_entries++;   \

user: user-2
content: #define CURL_I3_TABLE_ENTRIES(table, entries) curl_I3_##table##entries  #define TTP_ROUTE_TABLE_ENTRY(table, tag)    \ static inline void  \ ttp_route_##table##tag(void)   \ {   \   CURL_I3_TABLE_ENTRIES(table, _entries)++; \ }  #define TTP_ROUTE_TABLE_ENTRY_INC(table) TTP_ROUTE_TABLE_ENTRY(table, _inc)  TTP_ROUTE_TABLE_ENTRY_INC(ipv4_host)

user: user-3
content: 你那样会把taken_inc解析成一个标识符那就与你的taken无关了

user: user-3
content: #define TTP_ROUTE_TABLE_ENTRY_INC(table)    \ static inline void  \ ttp_route_##table(void)   \ {   \     cout<<#table<<endl;   \ }去掉_inc

user: user-4
content: 仅供参考： #与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         return 0; } 宏展开时： 如果宏定义以#开头，不展开参数，直接替换。 故g(f(1,2))--->#f(1,2)--->"f(1,2)"； 如果宏定义不以#开头，展开参数，直接替换，由外层向里层，如果碰到的是#开头的宏，不继续往里层展开，往外层展开。 由外层向里层，如果碰到的是以非#开头的宏，继续往里层走，直至最里层，开始一层层往外层展开。 故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。 PS： ##在宏中定义，是字符连接符 如a##b##c 等同于 "abc" #在宏开头出现，是表示宏展开的方式不同 #a 等同于"a" #abc 等同于 "abc" 复杂的: #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         char a = 'a';         cout<<g(a)<<endl; // a         cout<<g(g(a))<<endl; // a         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         printf("%s\n", g(h(f(1,2)))); // h(f(1,2))         printf("%s\n", h(g(f(1,2)))); // "f(1,2)"         printf("%s\n", h(h(f(1,2)))); // "12"         system("pause");         return 0; } 预处理后的：（在编译选项中添加/EP /P后编译生成的.i文件。gcc加-E） int main() {         char a = 'a';         cout<<"a"<<endl;         cout<<"g(a)"<<endl;         printf("%s\n", "12");         printf("%s\n", "f(1,2)");         printf("%s\n", "h(f(1,2))");         printf("%s\n", "\"f(1,2)\"");         printf("%s\n", "\"12\"");         system("pause");         return 0; } --------------------------------------------------- 宏解析 1.       ##操作符 ##操作符它的作用是在替代表中将其前后的参数连接成为一个预处理符号，它不能出现于宏替代表的开端和末尾。 例： #define concat(s,t) s##t #define AAA ABC concat(A, AA) 将被替换成 ABC 2.       重新扫描和替换 在替换列表中的所有参数替换过之后，预处理器将对结果token序列重新扫描以便对其中的宏再次替换。 当正在替换的宏在其替换列表中发现自身时，就不再对其进行替换。在任何正在嵌套替换的宏的替换过程中遇到正被替换的宏就对其不再进行替换（防止递归）。 例： #define ROOT AAA CCC #define AAA ROOT ROOT 将被替换成 ROOT CCC
user-0 提问: error C2064: term does not evaluate to a function

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

user: user-2
content: 关于这个错误我遇到了两种情况： 1.数组下标问题     char szBuffer[64];     int nTest = szBuffer(0); // 注意到了没有？[]写成了()  2.将类成员的后面加了()，被当做函数调用  反正总是跟()有关，仔细看看吧。

user: user-0
content: 谢谢您，这个方法试过了，还是不行。还有其他办法吗？

user: user-1
content: 将Hx替换为MyHx ？
user-0 提问: 求助，C语言编程结果不对

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

user: user-2
content: scanf("%f%f",&t[0][1],&t[0][2]); 改为scanf("%lf%lf",&t[0][1],&t[0][2]);  这处改了以后后面也有地方不对ax[k][i]=0.5*(a+b); 在调试的时候发现k会取到大于100的数，然后越界崩溃了  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 从键盘给指针赋值

回复:
user: user-1
content: 怎么从键盘上给一个初始化为NULL的指针赋值

user: user-2
content: 当然，范围是受限制的

user: user-2
content: 如果是读取内存数据，还是可以的，如果写数据，是不能随意指定的

user: user-3
content: 需要创建空间，不然往哪写数据就不知道了

user: user-4
content: 需要创建空间，用scanf
user-0 提问: strbprk

回复:
user: user-1
content: 因为你的source 和chars指针是指向NULL的，NULL指针代表的地址为0x00000000，该地址代表的内存区域是不允许读写的 然后执行gets(source)试图写入的时候自然引发异常了 可以改为数组或者malloc出来的堆空间,而且在find_char里找到的话应该返回source字符串，同时还要遍历chars字符串才行  #include<stdio.h>  char *find_char( char *source, char *chars){ 	char *p; 	while(*source != NULL){ 		for(p = chars; *p != '\0'; p++) 		{ 			if(*source == *p){ 				return source; 			} 		} 		source++; 	} 	return NULL; }  int main(){ 	char *source = (char *)malloc(64 * sizeof(char)); 	char chars[64] = {0}; 	gets(source); 	gets(chars); 	printf("%s\n",find_char(source, chars)); }

user: user-2
content: source chars是指针，得分配空间，用char数组
user-0 提问: c语言 循环问题

回复:
user: user-0
content: 引用 3 楼 qq423399099 的回复:放这里应该可以的啊，每次b[j]的各自取sgn的累乘之前初始化成1 楼主有什么问题么？可是我这样跑出来的结果不对因为我这地方是对b取sgn得连乘，就是每次当b数组里面的负数的个数是奇数个时，出来的结果就会在最后一个数出错。如果b数组里面的负数是偶数个时，出来的结果就全对。不知道为什么？？？求大神帮我看看 谢谢啦

user: user-1
content: double minof(double x[], int no) { int i; double min = x[0];  for (i = 1; i < no; i++) { if (x[i] < min) min = x[i]; }  return min; }  int pr(int a[],int no) { int i; int c = 1;  for (i = 0; i < no; i++) { c *= a[i]; } return c; }  int sgn(double x) { if (x > 0) return 1; else if (x < 0) return -1; else return 0; }  int main(void) { int c = 1; double a[] = { 1.2, 3.4, 5.6, 7.8 }; double b[] = { -1.1, 2.4, 4.8, -7.9 }; double e[] = { 0 }; int i, j; double d = 1.0;    for (i = 0; i < 4; i++) {  for (j = 0; j < 4; j++) { if (j != i) { d = minof(&a[j], 3); break; } }     for (j = 0; j < 4; j++) {  if (j != i) { c *= sgn(*(b + j)); } }  e[i] = c*d; printf("%f\t", e[i]); }   getchar(); return(0); } 这样就可以了，

user: user-2
content: 放这里应该可以的啊，每次b[j]的各自取sgn的累乘之前初始化成1 楼主有什么问题么？

user: user-0
content: 在线等大神！！！！！！！！！

user: user-0
content: 顶上去！！！！
user-0 提问: 数组指针的问题

回复:
user: user-1
content: 引用 3 楼 TsingSoftware2014 的回复:[quote=引用 1 楼 paschen 的回复:] int (*p1)[3]; 改成 int (*p1)[4];  int (*p)[3]; 它表示，数组 *p 具有三个int类型元素，分别为 (*p)[0] , (*p)[1] , (*p)[2] ，即 p指向的是具有三个int类型的一维数组，也就是说，p为行指针么？那这里为什么要改成4啊？[/quote]   int (*p1)[3]; 这里的3表示的是列而不是行

user: user-2
content: 引用 3 楼 TsingSoftware2014 的回复:[quote=引用 1 楼 paschen 的回复:] int (*p1)[3]; 改成 int (*p1)[4];  int (*p)[3]; 它表示，数组 *p 具有三个int类型元素，分别为 (*p)[0] , (*p)[1] , (*p)[2] ，即 p指向的是具有三个int类型的一维数组，也就是说，p为行指针么？那这里为什么要改成4啊？[/quote]首先*p不是一个标示符，而且这是一个定义语句。首先p1是一个指针，它指向的内容是一个维数为3的一维数组，这个数组中的类型是int类型，你将 数组名赋给这个指针：p1 = arr;而arr是一个二维数组，数组名是指向首个行数组的指针，arr的首个行数组是一个int类型的4维数组，因此需要将int (*p1)[3]; 改成int (*p1)[4];

user: user-3
content: 引用 4楼我是你的主体 的回复:引用 2 楼 renwotao2009 的回复:int (*p)[3]改成int *p[3]我就是想用数组指针来实现看看的。那用1楼的方式

user: user-4
content: #include<stdio.h> int main() {     int arr[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};     int (*p1)[4];     int i,j;     p1 = arr;      fprintf(stdout,"使用数组指针的方式访问二维数组arr\n");     for(i = 0;i<3;i++)     {         for(j = 0;j<4;j++)         {             printf("arr[%d] [%d]= %d\t",i,j,*(*(p1+i)+j));         }         printf("\n");     }    getchar(); }   这样就对了，

user: user-5
content: 不要急着运行。先编译一下，把所有的语法警告都消除了，再考虑结果为什么不对

user: user-0
content: 引用 2 楼 renwotao2009 的回复:int (*p)[3]改成int *p[3]我就是想用数组指针来实现看看的。

user: user-0
content: 引用 1 楼 paschen 的回复:int (*p1)[3]; 改成 int (*p1)[4];  int (*p)[3]; 它表示，数组 *p 具有三个int类型元素，分别为 (*p)[0] , (*p)[1] , (*p)[2] ，即 p指向的是具有三个int类型的一维数组，也就是说，p为行指针么？那这里为什么要改成4啊？

user: user-3
content: int (*p)[3]改成int *p[3]

user: user-1
content: int (*p1)[3]; 改成 int (*p1)[4];
user-0 提问: OpenGL编程读取txt文档数据，运行时不显示图像，只出现一个白色背景的窗口，怎么回事。本人刚开始学习编程，求各位大神指导，跪谢，急~~

回复:
user: user-1
content: while(!feof(fp))  {   fscanf(fp,"%4f",&data);   a[i]=data;   i++;  } 应改为 while(1)  {   if (1!=fscanf(fp,"%f",&data)) break;   a[i]=data;   i++;   if (i>=20) break;  }

user: user-2
content: 多是viewport设置不正确看不到图 尝试在opengl api 每一步后调用 glGetError ，看看有没有 opengl抛出的渲染错误

user: user-0
content: 谢谢楼上解答。楼上提示我都尝试了，还是不行……继续跪求解答
user-0 提问: 段错误（核心转存）

回复:
user: user-1
content: 你记载coredump文件了吗

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

user: user-0
content: 在进入 gdb 输入where时，说no stack

user: user-1
content: 已经生成了coredump，用gdb加载一下看一下死在哪里  coredump 位置：cat /proc/sys/kernel/core_pattern coredump大小设置：ulimit -c unlimited 编译时候需要加 -g -ggdb选项  gdb 你的程序 core的位置  bt命令

user: user-3
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  那什么操作会引起段错误呢？   粗略的分一下类：   1）往受到系统保护的内存地址写数据   有些内存是内核占用的或者是其他程序正在使用，为了保证系统正常工作，所以会受到系统的保护，而不能任意访问。   2）内存越界(数组越界，变量类型不一致等)   3）其他   例如：   <1>定义了指针后记得初始化，在使用的时候记得判断是否为NULL   <2>在使用数组的时候是否被初始化，数组下标是否越界，数组元素是否存在等   <3>在变量处理的时候变量的格式控制是否合理等    代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: c语言结构体指针问题

回复:
user: user-1
content: char *p; if(p!=NULL) { ... } 和这个同样的道理吧，肯定不能这样判断的，定义指针时，在用他前必须要赋值的，没有的话，那定义时就这样char *p= NULL。

user: user-2
content: 内存没有初始化

user: user-3
content: 没有分配的内存，全部是随机值。 不是一个指针是随机值。

user: user-0
content: 那只要声明一个结构体指针，只要没有赋值，都会是有一个指针为随机值，其他为空？

user: user-4
content: 在 Debug 模式下，VC 会把未初始化的栈内存上的指针全部填成 0xcccccccc ，会把未初始化的堆内存上的指针全部填成 0xcdcdcdcd 楼主可以用printf("%p\n", head->right);打印看看

user: user-5
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-6
content: malloc 出的内存中是随机值。
user-0 提问: C语言问题，关于getchar和switch问题

回复:
user: user-1
content: while((c = getchar()) != '0')这句也有问题 下面k = c%2;也不对，k是个int的，你case的情况是'0'和'1'是字符啊。。。。 所以一个case分支都不会进去，所以打印出来都是0 改为如下：  #include<stdio.h> int main() { 	char c = ' '; 	int oushu = 0,sum1=0,jishu = 0,sum2=0; 	int k; 	while(c != '\n') 	{ 		scanf("%d", &k); 		switch(k%2) 		{ 		case 0:oushu+=1;sum1 +=k;break; 		case 1:jishu+=1;sum2 +=k;break; 		} 		c = getchar(); 	}  	printf("oushu: %d,oushu of sum: %d\n",oushu,sum1); 	printf("jishu: %d,jishu of sum: %d\n",jishu,sum2); 	return 0; }

user: user-2
content: k = c%2+‘0';

user: user-3
content: c语言中 '0' == 0x30, '\0' == 0
user-0 提问: 一个关于溢出的问题

回复:
user: user-1
content: 引用 3 楼 qq_33257674 的回复:引用 1 楼 u014444402 的回复:后面的strlen dest长度已经是不确定的了，因为结束值0已经被你覆盖了。请问可以怎么改？   #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include<stdio.h> #include<string.h> #define MAX 128  int substr( char dst[], char src[], int start, int len ) { int i; int previouslength = strlen(dst); for(i = 0;i < len; i++){ if ( (src[start  + i] != 0)  ) {     dst[previouslength + i] = src[start  + i]; }  } dst[previouslength+i] = '\0'; return strlen(dst); }  int main(){ char dst[MAX]; char src[MAX]; int start, len;  gets(dst); gets(src); scanf("%d%d",&start, &len); printf("%d\n",substr(dst, src, start, len)); printf("%s", dst); }  不过还有个bug就是start要是比src的长度大，会发生错误。

user: user-2
content: dst  src数组清零

user: user-0
content: 请问可以怎么改？

user: user-0
content: 引用 1 楼 u014444402 的回复:后面的strlen dest长度已经是不确定的了，因为结束值0已经被你覆盖了。请问可以怎么改？

user: user-1
content: 后面的strlen dest长度已经是不确定的了，因为结束值0已经被你覆盖了。
user-0 提问: 一个问题！

回复:
user: user-1
content: while("getchar() == '\n'"); return num; 永不退出的死循环么?

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

user: user-3
content: 楼上正解while("getchar() == '\n'");多了双引号,恒为真 应该是while(getchar() != '\n');  单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-4
content: 是不是get_float里面错了 改成getchar() == '\n'可不可以？ 应该是回车的时候返回吧？
user-0 提问: 请问关于指针内存分配问题？

回复:
user: user-1
content: 给结构体malloc只能是申请了12个字节（32位系统），三个结构提元素都是指针（3×4）那么这三个都是野指针，即若不进行初始化或申请空间（malloc)很有可能会出现内存错误；建议在使用时初始化或为其分配空间；

user: user-2
content: 有点复杂，倒没用过，内还有指针的，学习学习

user: user-3
content: 一段没有使用的空间，malloc出来是全0，如果使用过的空间，那么其中可能保留有旧值，这些值对于用户来说是随机数据，会构成潜在的程序bug，C中指针避免操作NULL和野指针

user: user-4
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-5
content: mystruct* ms = malloc(sizeof(mystruct)); 此时结构体内的3个指针都是野指针，指着一个未知的区域 如果尝试访问这3个指针所指的区域或者尝试写入那么就会产生异常

user: user-6
content: 都是野指针，

user: user-7
content: malloc申请到的内存，不会自动清零，很可能是一些垃圾数据。申请成功后应该给它们赋初值，如果不加处理而直接使用，那么里面的指针是野指针，数据是垃圾数据。 如果仅仅是为了将申请到地内存全部清零的话，也可以使用另一个申请内存的函数：calloc，它的原型如下： void * calloc(size_t n,size_t size); 这个函数会自动将申请到的内存清零，相信应该比我们先用malloc再用memset效率更好一些。

user: user-8
content: 在解引这个指针之前，你肯定要malloc或者让这个指针去指向一个已有的对象  否则是个野指针，解引可能导致程序崩溃

user: user-9
content: 不初始化或者不分配内存是允许的,但是一旦操作到结构体指针的时候一定要分配内存或指向操作,否则操作野指针结局等同于 int main(void) { char *p; *p='a'; return 0; }  https://www.zhihu.com/question/35470332

user: user-10
content: malloc后，memset为0
user-0 提问: 关于最少费用购物问题，有几段程序看不懂，希望能给我解释一下红色代码的作用？

回复:
user: user-1
content: 搜“动态规划”

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

user: user-3
content: 建议不要光看代码，必要时单步跟踪程序运行，观察每步各变量的变化情况，这样会容易理解的多
user-0 提问: 字符变量和字符常量所占内存大小？(C语言)

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

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

user: user-0
content: 谢了，，我已知道了、

user: user-2
content: sizeof('a')的结果是多少？这个要看是在C中还是C++中了。根据C99标准的规定，'a'叫做整型字符常量（integer character constant），为int型，故结果是4（对于32位机器）；而ISO C++规定，'a'叫做字符字面量（character literal），为char型，故结果是1。C强调了'a'的“数”属性，而C++强调了'a'的“字符”属性。 字符常量在C中长度是4，在C++中是1，VC中默认如果源文件为.c则按c编译，如果是.cpp则按C++编译 PS:在C程序里可以试试sizeof((char)'A')

user: user-3
content: C99标准的规定，'a'叫做整型字符常量(integer character constant)，被看成是int型，所以在32位机器上占4字节。  ISO C++标准规定，'a'叫做字符字面量(character literal)，被看成是char型，所以占1字节。  C99: An integer character constant is a sequence of one or more multibyte characters enclosed in single-quotes, as in 'x'. An integer character constant has type int.  C++2003: A character literal is one or more characters enclosed in single quotes, as in ’x’, optionally preceded by the letter L, as in L’x’.A character literal that does not begin with L is an ordinary character literal, also referred to as a narrow-character literal. An ordinary character literal that contains a single c-char has type char, with value equal to the numerical value of the encoding of the c-char in the execution character set. An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined value.   文章来自于： http://blog.csdn.net/rangf/article/details/8199241

user: user-0
content: 这个现象   有个什么合理的解释呢？
user-0 提问: c语言   宏定义

回复:
user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-2
content: 假定有三个不同的宏，来包装多条表达式：#define statement1() x; y #define statement2() { x; y; } #define statement3() do { x; y; } while (0)1. 如果程序员这样写代码： if (a)     statement1(); else     statement0();由于分号的作用，if (a) 只对 “x;” 有效。 如果没有 else，逻辑可能达不到书写的目的，如果有 else 分支，则无法编译通过。 2. 如果程序员这样写代码：if (a)     statement2(); else     statement0();由于分号的作用，if (a) 只对 “{ x; y; }” 有效。 如果没有 else，一切都很正常。如果有 else 分支，则无法编译通过。  以上两种情况都需要在任何情况下强制使用大括号才能消除问题。 如果使用 statement3() 这个宏，则不管有没有大括号，有没有 else 都不会影响到代码逻辑。

user: user-3
content: 引用 楼主 qq_28325599 的回复: 这里的_align怎么理解？？  这里出现的"_align"只是一个普通的变量（应该是一个整数），用4个二进制位（bits）来表示ALIGN的模式。 其中，_align的bit0和bit1对应HALIGN的4种取值，bit2和bit3对应VALIGN的4种取值。

user: user-4
content: 使用 {} 把复合语句变成一个块。 加上 do while(0) 使得这个块变成一个语句。而且 while(0) 保证仅仅执行一次。 这样在使用的时候，就好像使用一个语句一样。  ALIGN 的宏定义表示 参数 _align 包含了HV 对齐的两个参数，而这两个参数放在一个 UINT8 中。

user: user-5
content: do{...}while(0); 说明只执行一次do ...while里面的代码即刻停止

user: user-6
content: __align 关键字指示编译器在 n 字节边界上对齐变量。 参考：http://blog.csdn.net/bruce0532/article/details/4719540
user-0 提问: 为啥输出差距那么大？

回复:
user: user-1
content: 建议楼主看一下浮点数在内存中的存储，就明白了  union{ 		float input; 		char output[4]; 	}data; 	data.input = 3.14; 	printf("%d %d %d %d\n", data.output[0], data.output[1], data.output[2], data.output[3]);

user: user-1
content: 输出差距那么大，是因为浮点数在内存中的存储造成的 可以借助联合体输出一个浮点数在内存中的存储  #include<iostream> #include <bitset> using namespace std;   void main() {        union {         float input;         int output;     } data;       data.input = 3.14;     std::bitset<sizeof(float) * 8>bits(data.output);     std::cout << bits << std::endl; }  也可以参考：http://bbs.csdn.net/topics/390676437

user: user-0
content: 引用 1 楼 qq423399099 的回复:输出差距那么大，是因为浮点数在内存中的存储造成的 可以借助联合体输出一个浮点数在内存中的存储  #include<iostream> #include <bitset> using namespace std;   void main() {        union {         float input;         int output;     } data;       data.input = 3.14;     std::bitset<sizeof(float) * 8>bits(data.output);     std::cout << bits << std::endl; }  也可以参考：http://bbs.csdn.net/topics/390676437 你这个是c++的，也适用于C么？
user-0 提问: UVA227 总是无法ac 写了两遍调了一天  求找bug

回复:
user: user-1
content: 一般来说，测试用例要涵盖以下情况： 小规模、可以手算的数据。用于快速检验程序的正确性。要注意规模不能太小以至于过分简化问题，比如对于图论题，只有2、3个点的图就太小，一般要取5、6个点。 大规模，但仍有规律、可以手算的数据。也是用于检验程序的正确性。如果程序算出来的结果跟手算的不同，不要急着debug，还需要考虑一下是不是手算错了哦~ 边界和极端情况。一方面检验程序的正确性，另一方面保证复杂度不超过限制。比如二叉树退化成一条链的情况。 大规模随机数据。用于保证程序不会崩溃，以及复杂度不超过限制。 输入格式不正确的情况，在OJ上一般可以忽略，虽然在实际应用中必须考虑。

user: user-2
content: 边界条件 逐字扣题意和输入输出格式
user-0 提问: C++小白遇到环境配置问题，程序有点多，求大神帮忙解决问题，必有重谢啊！

回复:
user: user-1
content: 你搞一个winxp虚拟机安装一个VC6.0++，再下载winpcap就行了， 别告诉我你在win7、win8上搞。。。  设置我没动过，肯定和原来的一样，我记得是3个 wpcap、socket、netapi， 在家里电脑中搞得现在在公司，看不到了

user: user-0
content: 引用 6 楼 lgbxyz 的回复:可以运行-我编译的是最新版本下面的那个ProcessBusTool文件夹，其他的没试过 xp3 - 虚拟机 vc6.0++ 企业版（完整版），不要下载网上的精简版   依然不行，请问能不能把你工程-设置-连接里的的库文件粘贴下给我看一下呢？不知道会不会是这个问题，不行我就重装系统了

user: user-1
content: 可以运行-我编译的是最新版本下面的那个ProcessBusTool文件夹，其他的没试过 xp3 - 虚拟机 vc6.0++ 企业版（完整版），不要下载网上的精简版

user: user-0
content: 引用 10 楼 lgbxyz 的回复:socket库 是 Ws2_32.lib 谢谢，ProcessBusToolDSW文件确实可以运行了，分给你，方便加个Q吗 249225749

user: user-1
content: socket库 是 Ws2_32.lib

user: user-0
content: 引用 8 楼 lgbxyz 的回复:你搞一个winxp虚拟机安装一个VC6.0++，再下载winpcap就行了， 别告诉我你在win7、win8上搞。。。  设置我没动过，肯定和原来的一样，我记得是3个 wpcap、socket、netapi， 在家里电脑中搞得现在在公司，看不到了 我没有socket的库文件，我找找看

user: user-0
content: 引用 4 楼 lgbxyz 的回复:缺少winpcap库，安装了就能编译过了. 下载一个winpcap http://120.52.72.59/www.winpcap.org/c3pr90ntcsf0/archive/4.0-WpdPack.zip 解压后把 WpdPack\Lib 下的文件 拷贝到 Microsoft Visual Studio\VC98\Lib 下， WpdPack\Include下的文件 拷贝到 Microsoft Visual Studio\VC98\Include下，  1.打开ProcessBusTool.dsw 2.编译->重建全部 3.运行(Ctrl+F5)  PS* winxp-sp3, VC6.0++企业版  谢谢啊！·只是我之前也装过WINPCAP了，也设置了库文件，我按你的步骤还是有错误啊，错误如下 ProcessBusTool.obj : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CProcessBusToolDoc::classCProcessBusToolDoc" (?classCProcessBusToolDoc@CProcessBusToolDoc@@2UCRuntimeClass@@B) ProcessBusTool.obj : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CMainFrame::classCMainFrame" (?classCMainFrame@CMainFrame@@2UCRuntimeClass@@B) ProcessBusTool.obj : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CProcessBusToolView::classCProcessBusToolView" (?classCProcessBusToolView@CProcessBusToolView@@2UCRuntimeClass@@B) Debug/ProcessBusTool.exe : fatal error LNK1120: 3 unresolved externals Error executing link.exe.  ProcessBusTool.exe - 4 error(s), 0 warning(s)  好象也是些配置错误，请问在你电脑上是可以运行的么？

user: user-1
content: 缺少winpcap库，安装了就能编译过了. 下载一个winpcap http://120.52.72.59/www.winpcap.org/c3pr90ntcsf0/archive/4.0-WpdPack.zip 解压后把 WpdPack\Lib 下的文件 拷贝到 Microsoft Visual Studio\VC98\Lib 下， WpdPack\Include下的文件 拷贝到 Microsoft Visual Studio\VC98\Include下，  1.打开ProcessBusTool.dsw 2.编译->重建全部 3.运行(Ctrl+F5)  PS* winxp-sp3, VC6.0++企业版

user: user-0
content: 引用 1 楼 lgbxyz 的回复:首先这是个VC6.0的MFC程序， 你VC6.0下也无法运行?   是的呀，这个程序有个界面，应用程序已经是可以运行的了，我现在是需要对其源程序做一些修改，完成自己要的功能，然而第一步在VC++6里运行源程序就很多错误，没法解决

user: user-2
content: 重建所有 ？

user: user-1
content: 首先这是个VC6.0的MFC程序， 你VC6.0下也无法运行?
user-0 提问: 关于结构体函数调用的问题 急急急

回复:
user: user-1
content: xavs_image_t  * nn1; 这里应该是xavs_image_t类型指针吧

user: user-0
content: 完美！大神你说得对，把out4在外部只打开一次，现在问题就解决了！

user: user-2
content: 按照你给的内容，可能出现问题的地方是out4文件打开的方式是追加， 不会多次执行吗？

user: user-0
content: 为什么只是简单调用一下，图像就不一样了呢？求大神解答！ 上图是一开始很正确的，下方是进了encode_frame里输出的问题图像
user-0 提问: 请问听说Android基于Linux内核,Ios基于Unix,为什么他们不编写全新的内核呢?难道Unix、Linux在新系统上不会有多余的代码吗？

回复:
user: user-0
content: 引用 3 楼 user-3的回复:Linux内核是可以裁剪的，可以对不同的目标平台（如PC、嵌入式设备。。）做不同的裁剪。 很早以前我自己也编译过Linux内核，编译之前有一个工具可以定制内核需要哪些模块、排除哪些模块，这些模块一般都是支持某些特性或者某些驱动支持，可选择的项目有几十上百项（那时候），然后我那台老奔腾MMX编译了半个多小时产生内核二进制文件。 有实力的厂家一般还可以直接修改内核源代码，做不同的定制或者裁剪。比如以前国产麒麟系统修改了FreeBSD（一种Unix）内核以便符合自主安全，成为一个事件。 学过《操作系统》这门课就会知道系统内核技术上是很复杂的。Linux内核由0.01版本的1万行代码发展到1996年2.0版本时就有40多万行代码，可见没有一定实力不是想编写就编写的。 原来是这样，学习了！！

user: user-1
content: 建议楼主先搞搞清楚啥叫“内核”。 《30天自制操作系统》

user: user-2
content: android系统运行在虚拟机上的，ios之间和硬件打交道

user: user-3
content: Linux内核是可以裁剪的，可以对不同的目标平台（如PC、嵌入式设备。。）做不同的裁剪。 很早以前我自己也编译过Linux内核，编译之前有一个工具可以定制内核需要哪些模块、排除哪些模块，这些模块一般都是支持某些特性或者某些驱动支持，可选择的项目有几十上百项（那时候），然后我那台老奔腾MMX编译了半个多小时产生内核二进制文件。 有实力的厂家一般还可以直接修改内核源代码，做不同的定制或者裁剪。比如以前国产麒麟系统修改了FreeBSD（一种Unix）内核以便符合自主安全，成为一个事件。 学过《操作系统》这门课就会知道系统内核技术上是很复杂的。Linux内核由0.01版本的1万行代码发展到1996年2.0版本时就有40多万行代码，可见没有一定实力不是想编写就编写的。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:建议楼主先搞搞清楚啥叫“内核”。 《30天自制操作系统》  谢谢指点!
user-0 提问: 关于换行符

回复:
user: user-1
content: toprint[strlen(toprint)] = '\n'; 你把之前的\0改成了\n以后，还需要在后面加一个\0，否则这个字符串没有结束

user: user-2
content: VC 会把未初始化的栈内存全部填成 0xcc，当字符串看就是 烫烫烫烫……  会把未初始化的堆内存全部填成 0xcd，当字符串看就是 屯屯屯屯……

user: user-3
content: 你的char数组都清零

user: user-4
content: //toprint[strlen(toprint)] = '\n'; //改为: toprint[strlen(toprint)] = '\n'; toprint[strlen(toprint)+1] = '\0';  //或者 //char toprint[1000]; //改为: char toprint[1000]={'\0'};
user-0 提问: 新手问题

回复:
user: user-1
content: 只要输入的不是\n（即你没按回车），就一直循环（不退出），循环语句是空（最后分号）

user: user-2
content: getchar()每次从stdin输入流中获取单个字符。当按键是回车的时候不进入while循环，相当于某种意义上的清除回车

user: user-3
content: 两个while用来判断是否为空格和换行符，如果不是这两个，就将读到的字节值返回

user: user-4
content: get_first只取输入字符串中非空格，tab，\0的第一个字符

user: user-4
content: 引用 3楼renwotao2009 的回复:get_first只取输入字符串中非空格，tab，\0的第一个字符说错了不是\o是换行符

user: user-4
content: 不是换行符就循环，遇见换行符跳出循环

user: user-5
content: 就是当输入的字符不是换行符的时候执行
user-0 提问: 如何将浮点数的二进制形式输出？

回复:
user: user-1
content: 也可以用联合体  #include<iostream> #include <bitset> using namespace std;  void main() {	 	union { 		float input; 		int output; 	} data;  	data.input = 3.14; 	std::bitset<sizeof(float) * 8>bits(data.output); 	std::cout << bits << std::endl; }

user: user-2
content: 浮点数格式 http://bbs.csdn.net/topics/390676437 ↑此为唯一正解！

user: user-3
content: unsigned char* b = (unsigned char*)&a; 	printf("%02X %02X %02X %02X", b[0], b[1], b[2], b[3]);
user-0 提问: 求最少等待时间。出现错误代码，求解错误

回复:
user: user-1
content: printf("%d",mintime(a,n)); 就好了

user: user-2
content: 没有给add负值,当然是脏值了

user: user-3
content: mintime的声明和实现的格式不一致  声明是：  int mintime(int a[]);  实现是：  int mintime(int a[],int n)

user: user-0
content: 上面的声明在刚刚复制时不小心复制了之前的，应该是 int mintime(int a[]，int n);

user: user-4
content: 函数实现和声明都不一致，楼主居然可以过编译。。。。 输出-858993460是因为那个值根本没有被赋值也没有被初始化过 当一个未初始化赋值的时候(至少是vc 下未初始化的内存)默认是0xCCCCCCCC;，他在内存就默认保存为-858993460
user-0 提问: 关于归并排序中内存释放的问题

回复:
user: user-1
content: 通常是你访问申请到的内存越界了而导致堆破坏，在释放时就会出错

user: user-2
content: 是你malloc的地方有问题，应该是： int *L = (int*)malloc(sizeof(int)*lenl); int *R = (int*)malloc(sizeof(int)*lenr);  #include <stdio.h> #include <stdlib.h>   void Merge(int a[], int p, int q, int r) {     int lenl = q - p+1;     int lenr = r - q;           int i, j,k;     int *L = (int*)malloc(sizeof(int)*lenl);     int *R = (int*)malloc(sizeof(int)*lenr);           for (i = 0; i < lenl; i++) {         L[i] = a[p + i];     }           for (j = 0; j < lenr; j++) {         R[j] = a[q + 1 + j];     }           i = j = k = 0;     while (i < lenl && j < lenr) {         if (L[i]<R[j]) {             a[p + k++] = L[i++];         }         else {             a[p + k++] = R[j++];         }     }     while (i < lenl) {         a[p + k++] = L[i++];     }     while (j < lenr) {         a[p + k++] = R[j++];     }           free(L);     free(R); }   void MergeSort(int a[], int p, int r) {     if (p == r) {         return;     }     int mid = (p + r) / 2;     MergeSort(a, p, mid);     MergeSort(a, mid + 1, r);     Merge(a, p, mid, r); }   int main(void) {     int i;     int a[] = { 76,5,34,3,13,4,6,75 };     int last_index = sizeof(a) / sizeof(int) - 1;     MergeSort(a, 0, last_index);     for (i = 0; i <= last_index;i++) {         printf("%d\n", a[i]);     }     return 0; }
user-0 提问: 杭电hdu 2054 比较大小问题

回复:
user: user-0
content: 引用 1 楼 qq423399099 的回复:楼主注意这个是for循环，只要一次不满足s[i] == '0'就会结束for循环 不是把小数点后的都变成0了，而是把小数最后多余的0给去掉了 主要有两种转换： 1.类似5.转换成5 2.类似4.50400转换成4.504 (如果是4.51这种是不会转换的)   233333   突然明白了  谢谢你！

user: user-0
content: 233333   突然明白了  谢谢你！

user: user-1
content: 楼主注意这个是for循环，只要一次不满足s[i] == '0'就会结束for循环 不是把小数点后的都变成0了，而是把小数最后多余的0给去掉了 主要有两种转换： 1.类似5.转换成5 2.类似4.50400转换成4.504 (如果是4.51这种是不会转换的)
user-0 提问: 循环无法结束

回复:
user: user-1
content: 楼上已经解决了，我再给个方案  scanf("%s", buff); len = strlen(buff); int i,j; j = i = len - 1; for(; i >= 0; --i) {      if(buff[i] == ' ' || i == 0) {             int k = i;             while(k != j)                      printf("%c", buff[k++]);            printf(" ");            j =  --i;      } }  如果有第三方库包含substr接口，那么上文中的while循环可以直接使用substr替换 此外，还有一种解决方案使用strtok函数，不过这个需要栈和内存分配结合使用

user: user-2
content: 首先要理解你自己的代码的含义. for(i=0;;i++)//这里有BUG，要是超过20个单词怎么办？   {        for(j=0;;j++)//同样的，超过14个字符也有问题      {          getchar(a[i][j]);          if(a[i][j]==' '||a[i][j]=='\0')              break;     }     if(a[i][j]=='\0')//主要是这里，什么时候发生这个条件？发生不了，因为在内层循环里面也有个if(a[i][j]==' '||a[i][j]=='\0')                       这是死循环的症结所在。          break;   }

user: user-3
content: getchar(a[i][j]);这是什么用法。。。。  #include<stdio.h> #include<string.h>   void a(char *p) {     char temp[100];     int b    = strlen(p);     int k    = 0;     char temp1[100];     int    i    = 0;     for(i=0;i<b;i++)     {         temp[i]=p[b-i-1];     }     temp[b]='\0';     //puts(temp);     int j    = 0;     //要循环结束条件为: j <= b     for(j=0;j<=b;j++)     {         //此处应为判断,用 '=='，还要考虑句尾的情况，要不最后一个单词打印不出来         if(temp[j]==' ' || temp[j] == '\0')         {             int l    = 0;             for(;k<j;k++)             {                 temp1[k]=temp[j-l-1];                 l++;             }                 //在单词之间添加空格             temp1[j]    = ' ';                         k++;         }     }     temp1[b]='\0';     puts(temp1); }   int main() {     char ch[100];     gets(ch);     a(ch);     return 0; }

user: user-4
content: 为啥不用指针，当指到空格跳出，储存
user-0 提问: 用C语言在黑框里画一个爱心，为什么就是不行

回复:
user: user-1
content: 引用 9 楼 Cerman 的回复:楼主用的什么app啊，求推荐  我用过C4droid ……不过你会发现很不方便。还是用电脑吧。

user: user-2
content: 楼主用的什么app啊，求推荐

user: user-3
content: system("chcp 437");printf("%c",3);

user: user-4
content: 引用 1 楼 qq423399099 的回复: #include<stdio.h>  # define U 0.06 # define V 0.025  # define M 1.1 # define N 1.2 int main(void) { 	float x, y; 	float m, n;  	for ( y=2; y>=-2; y-=U ) 	{  		for ( x=-1.2; x<=1.2; x+=V) 		{ 			if ( ( ( (x*x + y*y - 1)*(x*x + y*y - 1)*(x*x + y*y - 1) - x*x*y*y*y ) <= 0 ) ) 				printf("*"); 			else 				printf(" "); 		} 		printf("\n"); 	} 	getchar(); 	return 0; }    心不错，有人还有一箭双心的

user: user-5
content: 那些 2n、4n、2a 什么的，改成2*n、4*n、2*a C语言中乘号是不能省略的，必须要有*号

user: user-6
content: 引用 3 楼 u010643841 的回复:[quote=引用 1楼小灸舞 的回复:] #include<stdio.h>  # define U 0.06 # define V 0.025  # define M 1.1 # define N 1.2 int main(void) { 	float x, y; 	float m, n;  	for ( y=2; y>=-2; y-=U ) 	{  		for ( x=-1.2; x<=1.2; x+=V) 		{ 			if ( ( ( (x*x + y*y - 1)*(x*x + y*y - 1)*(x*x + y*y - 1) - x*x*y*y*y ) <= 0 ) ) 				printf("*"); 			else 				printf(" "); 		} 		printf("\n"); 	} 	getchar(); 	return 0; }  这个，我现在还看不懂呀，现阶段，我思考的到底有错没，我就想知道我那思路和代码有问题吗[/quote] 楼主代码直接拷贝上来吧，不要截图。。。

user: user-0
content: 引用 2楼ooolinux 的回复:用手机来写程序这么先进平常上班就用手机搞

user: user-0
content: 引用 1楼小灸舞 的回复: #include<stdio.h>  # define U 0.06 # define V 0.025  # define M 1.1 # define N 1.2 int main(void) { 	float x, y; 	float m, n;  	for ( y=2; y>=-2; y-=U ) 	{  		for ( x=-1.2; x<=1.2; x+=V) 		{ 			if ( ( ( (x*x + y*y - 1)*(x*x + y*y - 1)*(x*x + y*y - 1) - x*x*y*y*y ) <= 0 ) ) 				printf("*"); 			else 				printf(" "); 		} 		printf("\n"); 	} 	getchar(); 	return 0; }  这个，我现在还看不懂呀，现阶段，我思考的到底有错没，我就想知道我那思路和代码有问题吗

user: user-6
content: #include<stdio.h>  # define U 0.06 # define V 0.025  # define M 1.1 # define N 1.2 int main(void) { 	float x, y; 	float m, n;  	for ( y=2; y>=-2; y-=U ) 	{  		for ( x=-1.2; x<=1.2; x+=V) 		{ 			if ( ( ( (x*x + y*y - 1)*(x*x + y*y - 1)*(x*x + y*y - 1) - x*x*y*y*y ) <= 0 ) ) 				printf("*"); 			else 				printf(" "); 		} 		printf("\n"); 	} 	getchar(); 	return 0; }

user: user-4
content: 用手机来写程序这么先进
user-0 提问: 文件尾和文件结束标识

回复:
user: user-1
content: feof是测试stream是否设置end-of-file标志，而ftell/seek函数不会设置end-of-file标志符。 你看下面的例子，如果你个文件有5个字节长，那么你从读完5个字节后，feof仍然返回0， 说明文件流没有被end-of-file标志，如果你再多读取一个1个字符，feof就返回非0值了。 那么道理就明白了吧，fseek设置文件指针到文件末尾，末尾也是在文件范围内，只有出 了这个范围才是end-of-file   #include <stdio.h>  int main(void) { 	FILE* fp = NULL; 	long offset = 0; 	int ret = 0; 	char buf[4096]; 	 	fp = fopen("words", "rb"); 	if (NULL == fp) { 		return -1; 	} 	 	fseek(fp, 0, SEEK_END); 	offset = ftell(fp);     printf("offset=%ld\n", offset);          //reset 	fseek(fp, 0, SEEK_SET); 	fread(buf, 1, offset, fp);  	ret = feof(fp); 	printf("feof return %d\n", ret); 	if (ret) { 		printf("the end of file \n"); 	} 	fclose(fp); 	return 0; }

user: user-2
content: 参考楼上的文章， 1、你可能没有在程序开头 #include <stdio.h>  #include <stdlib.h> 2、feof函数在文件结尾会返回一个非0值，这个值跟ftell函数在文件尾读到的offset不知是否一样？你可以采用楼上的count计数方法获得offset

user: user-3
content: feof Tests for end-of-file on a stream.  int feof( FILE *stream );  Function Required Header Compatibility  feof <stdio.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  The feof function returns a nonzero value after the first read operation that attempts to read past the end of the file. It returns 0 if the current position is not end of file. There is no error return.  Parameter  stream  Pointer to FILE structure  Remarks  The feof routine (implemented both as a function and as a macro) determines whether the end of stream has been reached. When end of file is reached, read operations return an end-of-file indicator until the stream is closed or until rewind, fsetpos, fseek, or clearerr is called against it.  Example  /* FEOF.C: This program uses feof to indicate when  * it reaches the end of the file FEOF.C. It also  * checks for errors with ferror.  */  #include <stdio.h> #include <stdlib.h>  void main( void ) {    int  count, total = 0;    char buffer[100];    FILE *stream;     if( (stream = fopen( "feof.c", "r" )) == NULL )       exit( 1 );     /* Cycle until end of file reached: */    while( !feof( stream ) )    {       /* Attempt to read in 10 bytes: */       count = fread( buffer, sizeof( char ), 100, stream );       if( ferror( stream ) )      {          perror( "Read error" );          break;       }        /* Total up actual bytes read */       total += count;    }    printf( "Number of bytes read = %d\n", total );    fclose( stream ); }   Output  Number of bytes read = 745   Error Handling Routines |  Stream I/O Routines  See Also   clearerr, _eof, ferror, perror
user-0 提问: 请问在函数中给指针重新分配内存这样对吗?在这里报错了，求指教!

回复:
user: user-1
content: 引用 8 楼 yyxgs 的回复:[quote=引用 5 楼 qq423399099 的回复:] 要修改指针的指向必须传二级指针，或者传一级指针的引用  请问是这样吗? void giveBirth_rabbit(int **rabbit, int rabbitNumber) {  	*rabbit = (int*)realloc(*rabbit, rabbitNumber * sizeof(int)); 	if (!rabbit) { 		printf("兔子增加失败!\n"); 	} }[/quote] 对的

user: user-0
content: 引用 4 楼 akirya 的回复:[quote=引用 3 楼 yyxgs 的回复:] [quote=引用 1 楼 akirya 的回复:] 代码呢???  发了，不好意思...[/quote] 要修改指针参数,那么必须使用指针的指针 int**rabbit [/quote]  请问是这样吗? void giveBirth_rabbit(int **rabbit, int rabbitNumber) {  	*rabbit = (int*)realloc(*rabbit, rabbitNumber * sizeof(int)); 	if (!rabbit) { 		printf("兔子增加失败!\n"); 	} }

user: user-0
content: 引用 6 楼 butters10 的回复:void giveBirth_rabbit(int * &rabbit, int rabbitNumber) ;   请问是这样吗? void giveBirth_rabbit(int **rabbit, int rabbitNumber) {  	*rabbit = (int*)realloc(*rabbit, rabbitNumber * sizeof(int)); 	if (!rabbit) { 		printf("兔子增加失败!\n"); 	} }

user: user-0
content: 引用 5 楼 qq423399099 的回复:要修改指针的指向必须传二级指针，或者传一级指针的引用  请问是这样吗? void giveBirth_rabbit(int **rabbit, int rabbitNumber) {  	*rabbit = (int*)realloc(*rabbit, rabbitNumber * sizeof(int)); 	if (!rabbit) { 		printf("兔子增加失败!\n"); 	} }

user: user-2
content: void giveBirth_rabbit(int * &rabbit, int rabbitNumber) ;

user: user-1
content: 要修改指针的指向必须传二级指针，或者传一级指针的引用

user: user-0
content: void giveBirth_rabbit(int *rabbit, int rabbitNumber) {  	rabbit = (int*)realloc(rabbit, rabbitNumber * sizeof(int)); 	if (!rabbit) { 		printf("兔子增加失败!\n"); 	} }

user: user-3
content: 引用 3 楼 yyxgs 的回复:[quote=引用 1 楼 akirya 的回复:] 代码呢???  发了，不好意思...[/quote] 要修改指针参数,那么必须使用指针的指针 int**rabbit

user: user-0
content: 引用 1 楼 akirya 的回复:代码呢???  发了，不好意思...

user: user-3
content: 代码呢???
user-0 提问: c程序界面问题

回复:
user: user-1
content: 参见1楼...

user: user-2
content: 仅供参考： 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子  http://blog.163.com/tab_98/blog/static/1192409720158673337998/

user: user-3
content: 仅供参考：#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(200, 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-600, r.top+r.bottom/2-100,"最短画图程序",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; }

user: user-4
content: 1 QT 2 MFC 3 WPF 4 WINFORM 5 GTK