Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 请问有没有一种效率很高的从一堆有重复字符串出现的字符串数组中记录下每个字符串重复出现的次数的算法？

回复:
user: user-1
content: c语言的实现思路 以所有可能出现的字符串做一个索引咯，每碰到一个字符串，找到对应的字符串并计数+1

user: user-2
content: http://baike.baidu.com/link?url=YIr6cwMyp76zVwpXtbXkffbixNe3fsjqq6Avzyd5I5Lx6H0EZOtFqup45wxbfHQV5YCAkPgsdMkm2UjzWIQ-c_

user: user-3
content: 字典树(trie tree)

user: user-4
content: hash也可以，但索引项为字符串的hash table自己构造比较困难 可以考虑直接采用标准库里的map容器，它是用红黑树实现的，效率应该和hash有一拼

user: user-5
content: std::unordered_map ？可以测试一下，效率不够了再试其它的吧……

user: user-6
content: 用二叉树，记录就可以了 或者用hash table
user-0 提问: 请教各位一个问题

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

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

user: user-0
content: 引用 2 楼 user-2 的回复:假设输入5 3 ， 在程序运行的时候，，经过3个递归，K的值已经变为1，但之后我看K的值会跳变为2，请问这是为什么 =》 不知道你是怎么看的，递归吗，执行完了最内侧的，就要执行倒数第二的了，是不是在执行倒数第2时看到的K为2啊，如果是的话就应该这样啊。   为什么执行最内侧完 要执行倒数第2的呢？

user: user-0
content: #include <stdio.h> #include <stdlib.h> #define MAXN 100 int a[MAXN]= {0}; int counts=0; void  combine(int m,int k) {     printf("*****%d,%d\n\n",m,k);     int i,j;     for (i=m; i>=k; i--)     {         a[k]=i;         if (k>1)         {             printf("[[[[[[[%d,%d\n\n",m,k);             combine(i-1,k-1);          }         else         {             counts++;             for (j=a[0]; j>0; j--)             {                 printf("%2d ",a[j]);             }             printf("\n");         }     } } int main() {     int m,n;     printf("Please input m:");     scanf("%d",&m);     printf("Please input n:");     scanf("%d",&n);     counts=0;     a[0]=n;     combine(m,n);     printf("All kinds is:%d\n",counts);     return 0; }     就是为什么输入5, 3 后    三个递归后 m和k已经变为3,1   为什么k会加1变为2 还能进行递归

user: user-2
content: 假设输入5 3 ， 在程序运行的时候，，经过3个递归，K的值已经变为1，但之后我看K的值会跳变为2，请问这是为什么 =》 不知道你是怎么看的，递归吗，执行完了最内侧的，就要执行倒数第二的了，是不是在执行倒数第2时看到的K为2啊，如果是的话就应该这样啊。

user: user-2
content: 不太清楚你的问题是什么， 随便说说我看到的内容， 下面函数是没有返回值的也没有对m和k的更改权限，所以第1次调用的" for (i=m; i>=k; i--)" 一定要i<k才会退出，假设第一次m = 10 , k =5 那么 i 一定会经历 10~5的变化后，最外层经过5次循环才会退出。 void  combine(int m,int k)

user: user-2
content: 引用 4 楼 qq_35319548 的回复:[quote=引用 2 楼 user-2 的回复:]  假设输入5 3 ， 在程序运行的时候，，经过3个递归，K的值已经变为1，但之后我看K的值会跳变为2，请问这是为什么 =》 不知道你是怎么看的，递归吗，执行完了最内侧的，就要执行倒数第二的了，是不是在执行倒数第2时看到的K为2啊，如果是的话就应该这样啊。   为什么执行最内侧完 要执行倒数第2的呢？ [/quote]  7楼回答的就是这个问题。不太好回答你这个问题，不知道应该怎么讲才容易明白。 其实你打印出来的内容就是执行的过程。 假设有下面两个函数： funA() { A1; A2; funB(); A3; A4; }  funB() { B1; B2; B3; B4; }  其实和下面一个函数是一样的，B执行完了就会走A3,A4. funA() { A1; A2; B1; B2; B3; B4; A3; A4; } 你把上面例子的B想象成A,就变成下面的样子，就是两次的递归了。 funA() { A1; A2; A1; A2; A3; A4 A3; A4; } 下面是3次的递归，展开时就像这个样子。 funA() { A1; A2; A1; A2; A1; A2; A3; A4 A3; A4 A3; A4; }

user: user-0
content: 谢谢 谢谢  懂了

user: user-1
content: 感觉楼主没有很好的理解递归。 递归就是某个函数直接或间接地调用了自身，这种调用方式叫做递归调用。 但凡是递归的函数，一定会在某一个地方存在能够返回上一层函数的代码。 函数自己在一层层的往深度调用自己，然后一层层的往回返。
user-0 提问: 一个可能是动态存储及链表的问题

回复:
user: user-1
content: 1.creat拼错了，应该是create 2.你create函数里的island *i = malloc(sizeof(island));应该是island *i = (island *)malloc(sizeof(island));

user: user-2
content: 两个name重名？
user-0 提问: 关于指针数组的一个问题。求解答

回复:
user: user-1
content: *p1=192; p1+=1;*p1=168; p1+=1;*p1=6; p1+=1;*p1=252;

user: user-2
content: 你给p1赋值的时候用的不对，每次+=1就行了  #include<stdio.h> void ip2s(int n) { 	unsigned char *p = (unsigned char *)&n; 	printf("%u.%u.%u.%u\n", *p, *(p + 1), *(p + 2), *(p + 3));   } int main() { 	int ip=0; 	unsigned char *p1=(unsigned char *)&ip;  	int a=0x12345678; 	char*p=(char *)&a; 	p++; 	printf("%x\n",a);  	//"192.168.6.252"  	*p1=192;  	p1+=1; 	*p1=168; 	 	p1+=1; 	*p1=6;  	p1+=1; 	*p1=252;  	printf("ip=%d\n",ip);  	ip2s(ip);  	return 0;  }
user-0 提问: TCP客户端与服务器通信，非阻塞模式，程序填空，运行服务器闪退？求改错

回复:
user: user-1
content: 这题面本身就不是什么好东西，对于tcp的socket来说就是误人子弟。。。

user: user-2
content: 个人意见：用填空题考程序理解能力纯属脑残！

user: user-3
content: #由Windows版移至C语言
user-0 提问: 求大神帮忙做这个题目

回复:
user: user-0
content: 引用 6 楼 情月的回复:问题已经被解答了，不过还是提几个建议： 1、提问的时候最好能把code排版下。这样方便别人查看和阅读。3楼的仁兄的code看过去就舒服点了。  2、然后看了你的code， 建议阅读下林锐《高质量c/c++编程指南》。对你会有帮助的。 大一小白刚学c语言没多久。目前还在努力中。谢谢你的建议，表示会去研究那边书的。

user: user-1
content: 问题已经被解答了，不过还是提几个建议： 1、提问的时候最好能把code排版下。这样方便别人查看和阅读。3楼的仁兄的code看过去就舒服点了。  2、然后看了你的code， 建议阅读下林锐《高质量c/c++编程指南》。对你会有帮助的。

user: user-2
content: 引用 4楼我是你的主体 的回复:[quote=引用 1 楼 小灸舞的回复:]1.你的fun函数写的有问题，k=1应该是k=2，k<n-1应该是k<=n-1 2.main函数里printf的应该是i，而不是k  #include<stdio.h> int fun(int n) { 	int k,r; 	for(k=2;k<=n-1;k++) 	{ 		r=n%k; 	if(r==0) 		break; 	} 	if(k==n) 		return 1; 	else 		return 0; } void main() {  	int i,j,k,sum; 	for(i=1;i<=1000;i++) 	{  		k=i; 		sum=0; 		while(k) 		{ 			j=k%10; 			if(fun(j)==0)break; 			sum+=j; 			k/=10; 		} 		if(fun(sum)&&k==0) 			printf("%d\n",i); 	}  }  谢谢大神我看了好久都没有反应过来。[/quote]解决了的话记得及时结帖

user: user-0
content: 引用 1 楼 小灸舞的回复:1.你的fun函数写的有问题，k=1应该是k=2，k<n-1应该是k<=n-1 2.main函数里printf的应该是i，而不是k  #include<stdio.h> int fun(int n) { 	int k,r; 	for(k=2;k<=n-1;k++) 	{ 		r=n%k; 	if(r==0) 		break; 	} 	if(k==n) 		return 1; 	else 		return 0; } void main() {  	int i,j,k,sum; 	for(i=1;i<=1000;i++) 	{  		k=i; 		sum=0; 		while(k) 		{ 			j=k%10; 			if(fun(j)==0)break; 			sum+=j; 			k/=10; 		} 		if(fun(sum)&&k==0) 			printf("%d\n",i); 	}  }  谢谢大神我看了好久都没有反应过来。

user: user-0
content: 引用 1 楼 小灸舞的回复:1.你的fun函数写的有问题，k=1应该是k=2，k<n-1应该是k<=n-1 2.main函数里printf的应该是i，而不是k  #include<stdio.h> int fun(int n) { 	int k,r; 	for(k=2;k<=n-1;k++) 	{ 		r=n%k; 	if(r==0) 		break; 	} 	if(k==n) 		return 1; 	else 		return 0; } void main() {  	int i,j,k,sum; 	for(i=1;i<=1000;i++) 	{  		k=i; 		sum=0; 		while(k) 		{ 			j=k%10; 			if(fun(j)==0)break; 			sum+=j; 			k/=10; 		} 		if(fun(sum)&&k==0) 			printf("%d\n",i); 	}  }  谢谢大神我看了好久都没有反应过来。

user: user-3
content: 已知某一整数,求各位数字均为素数,而且各位数字之和也为素数 什么意思，是不是  已知某一整数, 判断 它的 各位数字是否均为素数,而且各位数字之和也为素数？

user: user-2
content: 1.你的fun函数写的有问题，k=1应该是k=2，k<n-1应该是k<=n-1 2.main函数里printf的应该是i，而不是k  #include<stdio.h> int fun(int n) { 	int k,r; 	for(k=2;k<=n-1;k++) 	{ 		r=n%k; 	if(r==0) 		break; 	} 	if(k==n) 		return 1; 	else 		return 0; } void main() {  	int i,j,k,sum; 	for(i=1;i<=1000;i++) 	{  		k=i; 		sum=0; 		while(k) 		{ 			j=k%10; 			if(fun(j)==0)break; 			sum+=j; 			k/=10; 		} 		if(fun(sum)&&k==0) 			printf("%d\n",i); 	}  }
user-0 提问: c语言 ip地址如何手动输入

回复:
user: user-1
content: 请问 这个问题你是怎么改的呀 error C2664: 'inet_addr' : cannot convert parameter 1 from 'char (*)[32]' to 'const char *'

user: user-0
content: 大神，怎样把分给你啊？是不是用结贴啊

user: user-0
content: 大神，谢谢啊，我经过几次修改，没问题了，我成功了

user: user-0
content: 谢谢你哦，不过有个错误：error C2664: 'inet_addr' : cannot convert parameter 1 from 'char (*)[32]' to 'const char *' inet_addr里面好像是const char* 类型，我改了一下，还是不对

user: user-2
content: scanf("%31s", &ip);

user: user-2
content: string q;   //这是什么鬼？C++里面的std::string？  char ip;    //char表达不了一个IP地址，不管是v4还是v6  ip=scanf("%s",&q); // scanf的返回值不是输入的内容（IP地址字符串）！成功读入的项数或EOF  sockaddr_in addrSrv;   addrSrv.sin_addr.S_un.S_addr = inet_addr(&ip); //&ip类型确实是char*，但不是以'\0'结尾的C字符串！！  稍微改下：  char ip[32] = "";  struct sockaddr_in addrSrv;    if (scanf("%s", &ip) != 1) {       printf("input error!\n");  }   memset(&addrSrv, 0, sizeof(addrSrv));   addrSrv.sin_family = AF_INET;   addrSrv.sin_addr.s_addr = inet_addr(&ip);  addrSrv.sin_port = htons(6000);

user: user-0
content: connect连接服务器时候失败的
user-0 提问: c语  将若干字符串按字母顺序小到大输出

回复:
user: user-0
content: 引用 5 楼 qq423399099 的回复: 这样子不行？不知道楼主究竟想达到什么效果  恩 对  是我弄错了

user: user-1
content: 这样子不行？不知道楼主究竟想达到什么效果

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:#include<stdio.h> #include<string.h> void mysort(int *p,int n); void myprintf(char *name[],int n); void myscanf(char *name[],int n); int main() {     char *str[][];     int n;     myscanf(name,n);     mysort(name,n);     myprintf(name,n);  } void myscanf(char *name[],int n) {     int i;     for(i=0;i<n;i++)         scanf("%s",name[i]); } void mysort(char *name[],int n) {     char *temp;     int i,j;     for(i=0;i<n-1;i++)         for(j=i+1;j<n;j++)             if(strcmp(name[i],name[j])>0)             {                 temp=name[i];                 name[i]=name[j];                 name[j]=temp;             } } void myprintf(char *name[],int n) {     int i;     for(i=0;i<n;i++)         printf("%s\n",name[i]); }  还是不对啊  我也不知道怎么改？？

user: user-2
content: #include<stdio.h> #include<string.h> void mysort(int *p,int n); void myprintf(char *name[],int n); void myscanf(char *name[],int n); int main() {     char *str[][];     int n;     myscanf(name,n);     mysort(name,n);     myprintf(name,n);  } void myscanf(char *name[],int n) {     int i;     for(i=0;i<n;i++)         scanf("%s",name[i]); } void mysort(char *name[],int n) {     char *temp;     int i,j;     for(i=0;i<n-1;i++)         for(j=i+1;j<n;j++)             if(strcmp(name[i],name[j])>0)             {                 temp=name[i];                 name[i]=name[j];                 name[j]=temp;             } } void myprintf(char *name[],int n) {     int i;     for(i=0;i<n;i++)         printf("%s\n",name[i]); }

user: user-1
content: 先输入一个数，指定一共有几个字符串 然后依次输入要排序的字符串(指针数组的每个指针都要malloc空间才行)

user: user-1
content: #include<stdio.h> #include<string.h> #include<stdlib.h> int main() { 	void sort(char *name[],int n); 	void myprintf(char *name[],int n); 	void std(char *name[],int n); 	char *name[32]; 	int n; 	scanf("%d", &n); 	std(name,n); 	sort(name,n); 	myprintf(name,n);  } void std(char *name[],int n) { 	int i; 	for(i=0;i<n;i++) 	{ 		name[i] = (char *)malloc(32); 		scanf("%s",name[i]); 	}  } void sort(char *name[],int n) { 	char *temp; 	int i,j; 	for(i=0;i<n-1;i++) 		for(j=i+1;j<n;j++) 			if(strcmp(name[i],name[j])>0) 			{ 				temp=name[i]; 				name[i]=name[j]; 				name[j]=temp; 			} } void myprintf(char *name[],int n) { 	int i; 	for(i=0;i<n;i++) 		printf("%s\n",name[i]); }
user-0 提问: 调用以下头文件的时候会出错，大概说是重定义了。求大声帮我找出原因和解决办法

回复:
user: user-0
content: 是单片机程序，但是我包含了STC.H也是这样呢

user: user-1
content: 这是单片机程序？应该是没有包含寄存器定义头文件，比如<reg51.h>之类的。

user: user-2
content: 如果你的P0~P4是定义在别的文件中的话那么使用EXTERN 声明变量 如果不是的话，那么在当前文件中定义一下P0~P4

user: user-0
content: 该头文件中，如 sbit     pb_GPIO0         = P1^6;   sbit     pb_GPIO1         = P4^2; sbit     pb_GPIO11        = P1^0; sbit     pb_GPIO12        = P1^1;  sbit     pb_GPIO5         = P1^2; sbit     pb_GPIO14        = P1^3;  sbit     pb_GPIO6         = P1^4; sbit     pb_GPIO9         = P0^0;	  这几个如何在使用它的文件里面定义？ 或者怎样可以调用帖子里面那个头文件，我一调用就会出错

user: user-2
content: 不是重定义，而是没定义。 undefined identifier是常见的keil编译错误 引发这一错误的原因是你使用的变量没有被定义 常见的处理手段是对你使用到的变量进行变量定义 另外一种常见的错误就是大小写导致的 如你定义的是unsigned char num； 在使用的时候，写成了NUM，也会出现同样的错误。
user-0 提问: 刚开始看书自学C 看到for循环就碰到问题了求解

回复:
user: user-0
content: 引用 3 楼 talkdream 的回复:[quote=引用 楼主 boy9178 的回复:] for循环求平均数  为什么会跳过里面的if检查输入一个数后就变这样了 输入数字后你又输入了回车，回车被下个scanf 取走了. 你在下面scanf 的%c 前面加一个空格就好了。这个空格有去除回车的作用 scanf(" %c",&answer);[/quote]  试了下果然是这个原因，谢谢！

user: user-1
content: 自己查找一下错误原因，没那么难：for (;;) {     int ret;     int ans;     ////////////////////////////////////     /////// 此处代码略去     ////////////////////////////////////     ret = scanf("%c",&answer);     printf( "scanf: %d\n"             "answer: %c\n",             ret,             answer             );     ans = tolower(answer);     printf( "tolower: %c\n",             ans             );     if (ans == 'n')     {         break;     } }

user: user-2
content: 你先geichar 一下 在  scanf   建议 scanf  写成getchar       一般获取 字符   需要 获取2次  第一次获取的是缓存里的回车 第二次才可以拿到  想要的字符  所以写两次getchar

user: user-3
content: 引用 楼主 boy9178 的回复:for循环求平均数  为什么会跳过里面的if检查输入一个数后就变这样了 输入数字后你又输入了回车，回车被下个scanf 取走了. 你在下面scanf 的%c 前面加一个空格就好了。这个空格有去除回车的作用 scanf(" %c",&answer);

user: user-4
content: 好吧，，不是这个原因，无视我我再看看

user: user-4
content: 第16排，n要大写，'N' n和N在编码器中数值是不相等的  ------------------------------------------------ 我也是新手，握爪~一起加油~
user-0 提问: 用CreateProcess打开某个应用程序，要怎么才能在这个应用程序的线程关闭后作出处理？

回复:
user: user-0
content: 引用 1 楼 列子汤问的回复:这样不行吗  WaitForSingleObject( pi.hProcess, INFINITE );  pi.hProcess是子进程的Handle.  不是窗口的句柄。 试过了，不知怎么回事，程序关闭后一直没有返回，不知是不是我写错了。

user: user-1
content: 这样不行吗  WaitForSingleObject( pi.hProcess, INFINITE );  pi.hProcess是子进程的Handle.  不是窗口的句柄。

user: user-2
content: 引用 2 楼 zghmvp 的回复:[quote=引用 1 楼 列子汤问的回复:]这样不行吗  WaitForSingleObject( pi.hProcess, INFINITE );  pi.hProcess是子进程的Handle.  不是窗口的句柄。 试过了，不知怎么回事，程序关闭后一直没有返回，不知是不是我写错了。[/quote]  检查程序关闭后，程序的进程是否还在后台没有结束

user: user-0
content: 引用 3 楼 user-2的回复:[quote=引用 2 楼 zghmvp 的回复:] [quote=引用 1 楼 列子汤问的回复:]这样不行吗  WaitForSingleObject( pi.hProcess, INFINITE );  pi.hProcess是子进程的Handle.  不是窗口的句柄。 试过了，不知怎么回事，程序关闭后一直没有返回，不知是不是我写错了。[/quote]  检查程序关闭后，程序的进程是否还在后台没有结束[/quote] 解决了，感谢。。。。
user-0 提问: 如何用变量初始化静态局部变量

回复:
user: user-1
content: 引用 2 楼 brookmill 的回复:int func() { 	static int flag = 0;     static int x;     static int y = 10; 	if (!flag) 	{ 		x = rand(); 		flag = 1; 	}   这个有线程安全问题，别这么写。

user: user-2
content: c++之所以能够这么干是有它的道理的,明白crt0.s的桩程序吗?这个就是Linux中调用main函数的一段代码。为什么我要提这个,我要开始啰嗦了，为什么c++编译器这么难做,举个列子c++有一个东西,这个叫做全局类,这个类有个构造函数,这个构造函数优先于main函数。原有的crt0.s的桩程序就不能再满足c++程序,所以后面拆分了很多，名字我不细举了。那现在为啥c++允许你static int x = rand(); 原因就如上面所说的,你的random在main函数之前跑这是可以的,但是换成c就不可以了。还有一点细节就是,未初始化的静态变量处于bss段中,其值都是0

user: user-3
content: int func() { 	static int flag = 0;     static int x;     static int y = 10; 	if (!flag) 	{ 		x = rand(); 		flag = 1; 	}

user: user-4
content: 活人不会被尿憋死。

user: user-5
content: C里面不允许啊， 当然C++是可以的。

user: user-6
content: 把x拿出来，作为全局变量吧。
user-0 提问: 在C语言编程中一直遇到的一个语法报错问题

回复:
user: user-1
content: 先重新生成工程试试。 还不行的话代码和错误都截个图发上来。

user: user-0
content: 引用 1 楼 qq423399099 的回复:把power10函数里的变量定义放到最前面  #include <stdio.h>  void test(); int power10(int n);   int power10(int n) { 	int i; 	int value = 10; 	if (n == 0) 		return 1; 	 	for (i = 1; i < n; i++) 	{ 		value *= 10; 	} 	return value; } void test() { 	printf("test\n"); } int main() { 	printf("%d\n",power10(3)); 	return 0; }  我已经放到最前面了啊。但是没用啊

user: user-1
content: 把power10函数里的变量定义放到最前面  #include <stdio.h>  void test(); int power10(int n);   int power10(int n) { 	int i; 	int value = 10; 	if (n == 0) 		return 1; 	 	for (i = 1; i < n; i++) 	{ 		value *= 10; 	} 	return value; } void test() { 	printf("test\n"); } int main() { 	printf("%d\n",power10(3)); 	return 0; }
user-0 提问: 一个新手关于指针的问题。

回复:
user: user-1
content: 不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！

user: user-2
content: 1. VS 不是 C 编译器，它是一个 C++ 编译环境。VS 对 C 的支持也就到了 2015 才好了一些。 2. 不是所有非法的东西编译器都会报错。使用非法的程序产生的任何后果都需要程序员自己负责。

user: user-3
content: C++下将通不过，C编译器类型转换时可能不做过多检查，所以可以将const int[]转换为int* 而C++下pd = ar;这一步会出错

user: user-4
content: 简单说说： 编译器都会越来越智能 C语言来说： const int和 int 是两种不同的类型 这点一定要弄清楚。  从 const int 转换到 int 就会警告 这是C语言的规定

user: user-5
content: .cpp文件中这是一个错误，.c文件中这是一个警告。但都不能视而不见。建议把所有警告都当成错误。

user: user-6
content: 你重建工程试试看。  除非强制性的做类型转换。  pd = (int *) ar;

user: user-6
content: 我用的也是Visual Studio 10 ， 显示的结果是编译出错。  1error C2440: “=”: 无法从“const int [10]”转换为“int *”

user: user-5
content: 你难道看不到警告？或者选择性忽视？编译通过也不证明一切都正确。

user: user-0
content: 哦，环境是VS2010
user-0 提问: 为什么两次输入的都是一样的，但数出来却多了个‘？’

回复:
user: user-1
content: 仅供参考：#include <conio.h> #include <stdio.h> char pw[40]; int i,ch; FILE *f; void main() {     cprintf("\r\nPassword:");     i=0;pw[i]=0;     while (1) {         ch=getch();         if (ch==13 || i>=39) break;         switch (ch) {         case 27:             cprintf("\rPassword: %40s"," ");             cprintf("\rPassword: ");             i=0;pw[i]=0;             break;         case 8:             if (i>0) {                 i--;                 pw[i]=0;                 cprintf("\b \b");             }             break;         default:             pw[i]=ch;             i++;             pw[i]=0;             cprintf("*");             break;         }     }     cprintf("\r\n");     f=fopen("password.txt","w");     fprintf(f,"%s\n",pw);     fclose(f); }

user: user-2
content: 因为   你输入  123456 的时候在数组里 存的是123456  当你在输入 abcd的时候那么数组就会自动的把abcd覆盖到1234里  但是 5和6 是没有覆盖的所以还是会显示出来,所以当你再次使用数组的时候要 memset 一下

user: user-3
content: 你给一部分代码没法帮你调试  你自己单步跟踪程序运行，哪里多出一个什么来很容易就可以发现，然后分析原因

user: user-4
content: 楼主 在声明 pass2的时候，没有初始化。  pass2 = {0};  就可以了。

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

回复:
user: user-1
content: EXAMPLE Load the math library, and print the cosine of 2.0:  #include <stdio.h> #include <dlfcn.h>  int main(int argc, char **argv) {     void *handle;     double (*cosine)(double);     char *error;      handle = dlopen ("libm.so", RTLD_LAZY);     if (!handle) {         fprintf (stderr, "%s\n", dlerror());         exit(1);     }      dlerror();    /* Clear any existing error */     *(void **) (&cosine) = dlsym(handle, "cos");     if ((error = dlerror()) != NULL)  {         fprintf (stderr, "%s\n", error);         exit(1);     }      printf ("%f\n", (*cosine)(2.0));     dlclose(handle);     return 0; }  If this program were in a file named "foo.c", you would build the program with the following command:   gcc -rdynamic -o foo foo.c -ldl   Libraries exporting _init() and _fini() will want to be compiled as follows, using bar.c as the example name:   gcc -shared -nostartfiles -o bar bar.c

user: user-0
content: 引用 2 楼 Saleayas 的回复:假如你的共享库的名字叫 libSoName，并且导出 Func 函数。 这个 Func 函数对于不同的共享库就是不同的功能。  那么你的 main 函数传入 SoName。 那么使用 dlopen 打开这个共享库。 呼叫共享库的导出函数 Func 就可以了。  以后需要使用其他的功能，创建一个共享库，比如名字叫 libSoNameNew。 同样导出函数 Func 。实现自己的功能。 main 函数传入参数 SoNameNew 就可以了。  当然你需要手动把新建的共享库放入指定的目录。 你这个是什么环境下呢，我的环境是linux下纯c语言，没有 dlopen

user: user-0
content: 引用 3 楼 Rewen 的回复:楼主可以参考一下设计模式里面的command模式。 linux下的c好像不行吧

user: user-2
content: 赵老师的方法是可行的，就是对dlopen和dlsym的应用 不过一般而言，在Linux下，感觉还是写一个脚本，比如 shell 脚本或者 perl 脚本，这样比较容易实现， c++只是静态语言，而shell 和perl 是动态语言

user: user-3
content: switch(n) {  case 1:func1(); break; case 2:func2(); break; ... }

user: user-4
content: 楼主可以参考一下设计模式里面的command模式。

user: user-5
content: 假如你的共享库的名字叫 libSoName，并且导出 Func 函数。 这个 Func 函数对于不同的共享库就是不同的功能。  那么你的 main 函数传入 SoName。 那么使用 dlopen 打开这个共享库。 呼叫共享库的导出函数 Func 就可以了。  以后需要使用其他的功能，创建一个共享库，比如名字叫 libSoNameNew。 同样导出函数 Func 。实现自己的功能。 main 函数传入参数 SoNameNew 就可以了。  当然你需要手动把新建的共享库放入指定的目录。

user: user-6
content: 少的话挨着比较，多的话就用hash查找，找到后调用对应函数.... 应该算是基础吧.....
user-0 提问: 初学者关于  指针  的一些问题！！！

回复:
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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495 //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-2
content: 首先你要知道 地址是什么。 指针是什么。 然后 指针变量 是什么。 指针变量存的是什么。 * 和 & 运算符的作用在不同的语句里面作用是什么。 有不同意见欢迎指正。

user: user-3
content: 你的p是指针变量，直接printf ("p = %d\n", p); 当然输出的是地址了 只有解引用后（*）才能输出指针所指向的值 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！
user-0 提问: 编写程序，统计1-100，阿拉伯数字“5”出现的次数

回复:
user: user-1
content: 引用 5 楼 baijiaheizhiganmao 的回复:[quote=引用 4 楼 qq423399099 的回复:] [quote=引用 3 楼 cqh963852 的回复:] [quote=引用 2 楼 baijiaheizhiganmao 的回复:] 5 15 25 35 45 55 65 75 85 95  -- 观察后发现,数子小于10的,可以判断他是否等于5 假如是就是5 数字>10 的可以模10 余下为5的就是有数字5 正解。[/quote] 50~59呢[/quote] 说的很对! 侧漏了![/quote]

user: user-2
content: 引用 4 楼 qq423399099 的回复:[quote=引用 3 楼 cqh963852 的回复:] [quote=引用 2 楼 baijiaheizhiganmao 的回复:] 5 15 25 35 45 55 65 75 85 95  -- 观察后发现,数子小于10的,可以判断他是否等于5 假如是就是5 数字>10 的可以模10 余下为5的就是有数字5 正解。[/quote] 50~59呢[/quote] 说的很对! 侧漏了!

user: user-3
content: 引用 3 楼 cqh963852 的回复:[quote=引用 2 楼 baijiaheizhiganmao 的回复:] 5 15 25 35 45 55 65 75 85 95  -- 观察后发现,数子小于10的,可以判断他是否等于5 假如是就是5 数字>10 的可以模10 余下为5的就是有数字5 正解。[/quote] 50~59呢

user: user-1
content: 引用 2 楼 baijiaheizhiganmao 的回复:5 15 25 35 45 55 65 75 85 95  -- 观察后发现,数子小于10的,可以判断他是否等于5 假如是就是5 数字>10 的可以模10 余下为5的就是有数字5 正解。

user: user-2
content: 5 15 25 35 45 55 65 75 85 95  -- 观察后发现,数子小于10的,可以判断他是否等于5 假如是就是5 数字>10 的可以模10 余下为5的就是有数字5  #include <iostream> using namespace std; int main() { 	int count = 0;				//计算器 	for(int i= 1;i<=100;i++) 	{ 		if(i<10 && i == 5) 			count++; 		else 		{ 			if(i%10 == 5) 				count ++; 		} 	} 	cout<<count<<endl; 	return 0; }

user: user-4
content: #include <stdlib.h> #include <stdio.h> #include <math.h> void  main() { 	int x=0; 	for(int i=1;i<=100;i++) 	{ 		int a=i%10; 		int b=i/10%10; 		if(a==5) 			x++; 		if(b==5) 			x++;  	} 	printf("%d",x); 	system("pause"); }
user-0 提问: 求大神指导，putchar和scanf的问题

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\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-2
content: 标红的能读到运算符这个应该好理解吧？ 标绿的之所以读不到，是因为你输入a,b对应的数字后，输入缓冲区有遗留的回车符，会直接被getchar()给读走 用scanf %c或者getchar读之前，最好都加一句fflush(stdin)清空输入缓冲区

user: user-0
content: 前面一个char ch=getchar();是红色，后面一个char ch=getchar();是绿色，由于输入错误，颜色未显示
user-0 提问: open串口设备 20秒才返回

回复:
user: user-1
content: 引用 10 楼 abc3240660 的回复:实际情况是 有其他进程close另一个串口设备时，tty_lock迟迟不释放  导致我open时，一直在等待 原来如比！

user: user-0
content: 实际情况是 有其他进程close另一个串口设备时，tty_lock迟迟不释放  导致我open时，一直在等待

user: user-1
content: Linux好就好在是开源的。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:还有可能是不是串口之前已经被另一个进程或僵尸进程打开了。 现在基本可以定位到tty_open中的tty_lock导致了这么久的等待，还得继续分析

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:会不会是串口通讯的对端的处理有问题。 或串口线缆太长，误码率超高。 …… 这种时候，需要“怀疑一切，打击一切”的心态。  我打开的是USB接口的4G模块生成的ttyUSB，没有线缆  你说的 引用 5 楼 zhao4zhong1 的回复:还有可能是不是串口之前已经被另一个进程或僵尸进程打开了。 正常的时候我试过，生成的串口设备是可以被多次打开的  所以好奇怪。。。

user: user-1
content: 会不会是串口通讯的对端的处理有问题。 或串口线缆太长，误码率超高。 …… 这种时候，需要“怀疑一切，打击一切”的心态。

user: user-1
content: 还有可能是不是串口之前已经被另一个进程或僵尸进程打开了。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:没准当时cpu被另一个进程或线程占用了。 倒也想过这个问题，但是10多秒才返回，这时间也忒长了。。。

user: user-1
content: 没准当时cpu被另一个进程或线程占用了。

user: user-0
content: 引用 1 楼 Rewen 的回复:是不是调用了fcntl函数？ 没有调用这个函数啊，我现在的测试程序 就只有open和close  在内核中添加了一些打印信息发现应用层调用open后，有时过了10多秒内核中的sys_open才调用

user: user-2
content: 是不是调用了fcntl函数？
user-0 提问: #C语言#起泡排序法的总结

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

user: user-2
content: 楼主有兴趣建议把各种排序算法都实现一下，再进行一下比较

user: user-3
content: 还有时间复杂度分析

user: user-0
content: 版主，我这里blog登陆不了。所以发到这里。这里可以发PM你么？

user: user-4
content: 是呢，放到这里你结贴咋搞啊

user: user-5
content: 你这个可以发博客
user-0 提问: 请教一个算法问题。。。

回复:
user: user-0
content: 引用 6 楼 FancyMouse 的回复:一个数x有N位，因为第一项至少是1，所以x>=10^(N-1)。因为高于N位的数码都是0，所以x<=9*10^(N-1)+9*10^(N-2)+...+9<10^N 10^(N-1)<=x<10^N 两边取log10 N-1<=log10(x)<N多谢耐心解答！

user: user-0
content: 引用 4 楼 user-4 的回复:1)乘积化和： lg(a*b) = lg(a)+lg(b) 2)位数和对数的关系， 对于一个大于0 的数 x 常用对数的整数部分加一，就是位数 假设 lg(x) =n+lg(t)  //1<=t <10 则有 x= t  *10^n 也就数有 n+1位数  lg（1)=0 lg（2）=0.3010 lg(10)=1  3）常用对数 lg C语言中, 用库函数  log10表示 常用对数lg就是以10为底数的对数多谢耐心解答！

user: user-1
content: 仅供参考：#include<stdio.h> #define N 1000    //要计算的N long s[N]={1,1},n=N,t=2,a=1,b=0; int main()//雨中飞燕之作 {     for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)         s[a]=(b+=s[a]*t)%10000,b/=10000;     for(printf("%d",s[*s]);--*s>0;) printf("%04d",s[*s]);     return 0; }

user: user-2
content: http://www.examw.com/biancheng/c/200668/

user: user-3
content: 一个数x有N位，因为第一项至少是1，所以x>=10^(N-1)。因为高于N位的数码都是0，所以x<=9*10^(N-1)+9*10^(N-2)+...+9<10^N 10^(N-1)<=x<10^N 两边取log10 N-1<=log10(x)<N

user: user-4
content: 对于一个大于1 的数 x 当整数部分为负值的时候，表示这个是小于1 就变成计算小数位数了

user: user-4
content: 1)乘积化和： lg(a*b) = lg(a)+lg(b) 2)位数和对数的关系， 对于一个大于0 的数 x 常用对数的整数部分加一，就是位数 假设 lg(x) =n+lg(t)  //1<=t <10 则有 x= t  *10^n 也就数有 n+1位数  lg（1)=0 lg（2）=0.3010 lg(10)=1  3）常用对数 lg C语言中, 用库函数  log10表示 常用对数lg就是以10为底数的对数

user: user-0
content: 引用 2 楼 user-4 的回复:数学上是没问题的 唯一有问题的，是精度问题  因为 n^ ( log( n,x)) =x;  所以 log(n，x) 的整数部分就是 x的位数 (x>0), 如果位数为负值 ，则该数字小于1  成绩的对数，等于对数和，所以这个加法没问题，可以求出位数，如果能够计算出并且精确度可控 那么这么做就可以了，不然会有误差 我就是想知道数学上这个怎么解释？解释为什么可以以取对数的方法来求它的位数？

user: user-4
content: 数学上是没问题的 唯一有问题的，是精度问题  因为 n^ ( log( n,x)) =x;  所以 log(n，x) 的整数部分就是 x的位数 (x>0), 如果位数为负值 ，则该数字小于1  成绩的对数，等于对数和，所以这个加法没问题，可以求出位数，如果能够计算出并且精确度可控 那么这么做就可以了，不然会有误差

user: user-0
content: scanf("%d",&m);       sum=0;       for(i=1;i<=m;i++)       {           sum=sum+log10((double)i);           }       printf("%d\n",(int)sum+1);
user-0 提问: C语言编的程序编译没有错误，运行时出现unhandled exception in xx.exe 0xC000005:Access Violation

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

user: user-0
content: 引用 1 楼 lianshaohua 的回复:运行完这个函数后你做了什么操作？ channel函数：  void channel(dcomplex *ricianSeq, dcomplex *signalSeq, double sigma) {      dcomplex temp;     double nc, ns;     for(int i = 0; i < SYMBOLLEN; i++)     {         ricianSeq[i] = rician_distribution();         ComplexGauss(sigma, &nc, &ns);         temp = cMult(ricianSeq[i], signalSeq[i]);         signalSeq[i].re = temp.re + nc;         signalSeq[i].im = temp.im + ns;     } }

user: user-0
content: 把修改后的signalSeq作为参数被channel函数调用； void channel(dcomplex *ricianSeq, dcomplex *signalSeq, double sigma)；

user: user-2
content: 运行完这个函数后你做了什么操作？

user: user-0
content: 引用 6 楼 qq423399099 的回复:眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 单步，设断点都尝试过了，还是没有找到问题所在for(int i = 0; i < SYMBOLLEN; i++)     {         randSeq[i] = rand() % ConstellationSize;         for(label = 0, m = 0; m < MODULATION_TYPE; m++)             label = (label<<1) + (int)encoded_bit[(i+1)*MODULATION_TYPE-m-1];         label = label ^ randSeq[i];         int index = m_pSignalMapper[label];          signalSeq[i] = m_pSignal[index];     } 执行完这个循环后程序里吗就出现 call stack 中提示：NTDLL! 775315ee()， 然后汇编跳到：775315EE   add     esp, 4

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

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  尽量将代码贴全。 完整代码太长了，我试下，谢谢
user-0 提问: C文件读写问题

回复:
user: user-1
content: 先rb，如果不成功(说明没有创建)，再wb

user: user-0
content: 第一次文件不存在，需要建立文件，rb+要出错

user: user-2
content: rb+

user: user-3
content: http://en.cppreference.com/w/c/io/fopen

user: user-0
content: 是在VC++6.0版本之下编写的
user-0 提问: 大神帮忙看下，为什么下面的方法不行？？

回复:
user: user-1
content: b指向的是垃圾区域，尝试写入会出现异常。 ps:下面那个程序'\0'也写错了

user: user-2
content: b是个野指针，没有分配空间。
user-0 提问: 怎么用C语言猜由电脑随机产生的一个四位数，输出你猜对了这个数中的哪几个数字，谢谢

回复:
user: user-1
content: https://www.baidu.com/s?wd=C源代码%20猜数字

user: user-2
content: 怎么猜法，比大小？

user: user-3
content: #include <stdlib.h> #include <stdio.h> #include <math.h> void  main() { 	while(1){ 		printf("已经生成随机数，请输入猜测数据，4位数"); 		int x=rand() % 10000; 		int y; 		while(1){ 			int right_number=0; 			scanf("%d",&y); 			if(y%10==x%10) 				right_number++; 			if(y/10%10==x/10%10) 				right_number++; 			if(y/100%10==x/100%10) 				right_number++; 			if(y/1000%10==x/1000%10) 				right_number++; 			if(right_number==4) 			{ 				printf("恭喜，猜对了%d",x); 				getchar(); 				printf("重新生成随机数"); 				break; 			} 			printf("输入正确数字数目%d",right_number); 			system("pause"); 		} 		 	} 	 }
user-0 提问: 输入错误格式的内容，编译器怎么处理？

回复:
user: user-1
content: 如果输入了非法数据，键盘缓冲区就可能还有残余信息。 当使用scanf函数时，如果遇到一些匪夷所思的问题，在scanf函数后正确使用fflush(stdin);，清空输入缓冲区，可以解决很多问题。

user: user-2
content: 引用 1 楼 u010165006 的回复:运行期，不是编译器的问题了 要看scanf这个函数具体怎么实现了  如果scanf函数是你编写的，如果输入错误，你默认给个0或者0xffff也是随你的，不过当然要符合常理。

user: user-2
content: 运行期，不是编译器的问题了 要看scanf这个函数具体怎么实现了
user-0 提问: c strlen问题

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

user: user-2
content: 字符串之类的，要留个位置哦，让系统放入\0的吧，否则如何使用操作，因为找不到尾巴啦

user: user-3
content: strlen是以'\0'为终结的，和sizeof不同。

user: user-4
content: char s3[6] = { 'I', 'S', 'O', 'C', '+', '+' };你这样写，使得s3这个数组没有'\0'结尾 那执行strlen的时候就是看脸了，返回一个什么值都有可能

user: user-5
content: strlen碰到0才算结束…… 你的字符串中没有0，所以会越界查找，直接有找到0为止。

user: user-6
content: 已经超出数据范围，结果不确定 char s3[7] = { 'I', 'S', 'O', 'C', '+', '+' };
user-0 提问: socket编程中inet_xxx函数中的inet代表什么

回复:
user: user-1
content: DESCRIPTION        inet_aton() converts the Internet host address cp from  the  IPv4  num-        bers-and-dots  notation  into  binary  form (in network byte order) and        stores it in the structure that inp  points  to.  所以inet指internet，a指address（不正规的说法ascii），即"192.168.0.1"这样的字符串格式的地址（人可读）； n指number/numeric，即0xC0A80001这样数字格式的地址（机器可读）。

user: user-2
content: inet_ntoa The Windows Sockets inet_ntoa function converts an (Ipv4) Internet network address into a string in Internet standard dotted format.  char FAR * inet_ntoa (   struct in_addr in   );   Parameters in  [in] A structure that represents an Internet host address.  Remarks The inet_ntoa function takes an Internet address structure specified by the in parameter and returns an ASCII string representing the address in ".'' (dot) notation as in "a.b.c.d''. The string returned by inet_ntoa resides in memory that is allocated by Windows Sockets. The application should not make any assumptions about the way in which the memory is allocated. The data is guaranteed to be valid until the next Windows Sockets function call within the same thread, but no longer. Therefore, the data should be copied before another Windows Sockets call is made.  Return Values If no error occurs, inet_ntoa returns a char pointer to a static buffer containing the text address in standard ".'' notation. Otherwise, it returns NULL.   QuickInfo   Windows NT: Yes   Windows: Yes   Windows CE: Use version 1.0 and later.   Header: Declared in winsock2.h.   Import Library: Link with ws2_32.lib.  See Also inet_addr
user-0 提问: 求教这个程序的运行过程，为什么s=1,结果会输出65

回复:
user: user-1
content: 是先打印出6后程序没有停下来，又进入了下一个case又打印了一个5，所以你看到的是65了吧

user: user-0
content: 引用 7 楼 小灸舞的回复:解决了记得结帖 貌似手机上找不到这个功能啊

user: user-2
content: 解决了记得结帖

user: user-0
content: 引用 4 楼 小灸舞的回复:建议楼主再去看下switch....case case只是个标签，表示跳转到那里开始执行，如果没有break,它会一直往后面执行  你输入一个小于0的数就能跳出while循环了 谢谢指教，已解决，我忽略后面有个break可以跳出循环

user: user-3
content: 对于switch（i）语句，根据i的值进入对应的case语句中，如果执行完该case之后的语句没有遇到break，则会按顺序继续运行下面的case语句，依次类推，直到遇到break或者运行到最后一行case才会退出。        至于while（）怎么退出……只要满足while（）括号里的条件，程序就会一直运行的，通过scanf("%d",&s);来改变s的值，如果你输入的s小于0，不满足while（）的条件，程序就会推出while了。        这些都是基础，不会的时候多看基本概念。

user: user-2
content: 建议楼主再去看下switch....case case只是个标签，表示跳转到那里开始执行，如果没有break,它会一直往后面执行  你输入一个小于0的数就能跳出while循环了

user: user-0
content: 引用 1 楼 小灸舞的回复:因为你输入1，会进入case 1的分支，然后输出6 因为没有break,会继续执行case 2，然后输出5，然后break; 执行到scanf("%d",&s);等待输入 而且这个while循环该怎么跳出

user: user-0
content: 引用 1 楼 小灸舞的回复:因为你输入1，会进入case 1的分支，然后输出6 因为没有break,会继续执行case 2，然后输出5，然后break; 执行到scanf("%d",&s);等待输入 但是s=1啊，case后面是2不应该执行后面的语句吧

user: user-2
content: 因为你输入1，会进入case 1的分支，然后输出6 因为没有break,会继续执行case 2，然后输出5，然后break; 执行到scanf("%d",&s);等待输入
user-0 提问: C语言读取PLC数据

回复:
user: user-0
content: 为什么只读到第一个的值呢,D500的,其他读出来的都是错误的

user: user-1
content: Short data[5]; int i; lRet = object.ReadDeviceBlock2("d500",5,&data[0]); for (i=0;i<5;i++) printf("%04hx ",data[i]);
user-0 提问: 散分＋快来报名“C语言指针与汇编内存地址（三、四）”公开课

回复:
user: user-1
content: 这个要认真学习，关于指针与内存！

user: user-2

user: user-3
content: 学习，并且来支持一下。

user: user-4
content: 学习了。

user: user-0
content: 引用 53 楼 sprint06 的回复:哈哈哈，新人来报道啊，刚刚听了老师的课，还不错的感觉哦 理解和讨论之前请先学会如何观察！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-5
content: 学习

user: user-6

user: user-7
content: 哈哈哈，新人来报道啊，刚刚听了老师的课，还不错的感觉哦

user: user-8

user: user-9
content: 学习

user: user-10
content: 支持赵老师！

user: user-0
content: 引用 47 楼 liuyiqi5145 的回复:支持赵老师！ 来自00:20:27的支持我是应该感动还是应该悲哀呢？  or

user: user-11

user: user-12
content: 点个赞

user: user-13
content: 感快报名啊米娜桑

user: user-14

user: user-15
content: 好久没有写过C的代码了。 学习了。

user: user-16
content: 支持赵老师.

user: user-0
content: 引用 41 楼 user-17 的回复:赵老师的课坚决支持，赵老师，我爱你！！ 在CSDN是禁止搞基的。

user: user-17
content: 赵老师的课坚决支持，赵老师，我爱你！！
user-0 提问: GDI 全屏如何改成窗体

回复:
user: user-1
content: 来源保密。

user: user-2
content: 引用 4 楼 zhao4zhong1 的回复:  老赵这个是中文版的MSDN里的？

user: user-2
content: 窗口宽度包括两边框，高度也包括两边框（其它标题栏、菜单栏要看创建的窗口样式有没有）

user: user-1

user: user-2
content: 引用 1 楼 u010165006 的回复:ScreenW=GetSystemMetrics(SM_CXSCREEN); ScreenH=GetSystemMetrics(SM_CYSCREEN);   width=GetSystemMetrics(SM_CXSCREEN); //屏幕宽度改成你需要的窗口宽度（客户区宽度+两边沿） height=GetSystemMetrics(SM_CYSCREEN);  //屏幕高度改成你需要的窗口高度（客户区高度+标题栏+菜单栏+边沿） hWnd=CreateWindow( "BasicApp", "Basic Applicaton", WS_POPUP|WS_MAXIMIZE, 0,0, width,height, NULL,NULL, hCurrentInst,NULL);  WS_POPUP|WS_MAXIMIZE  可以改成  WS_OVERLAPPEDWINDOW ，窗口样式参数很多，具体要查MSDN

user: user-1
content: width=GetSystemMetrics(SM_CXSCREEN)/2; height=GetSystemMetrics(SM_CYSCREEN)/2;

user: user-2
content: ScreenW=GetSystemMetrics(SM_CXSCREEN); ScreenH=GetSystemMetrics(SM_CYSCREEN);   width=GetSystemMetrics(SM_CXSCREEN); //屏幕宽度改成你需要的窗口宽度（客户区宽度+两边沿） height=GetSystemMetrics(SM_CYSCREEN);  //屏幕高度改成你需要的窗口高度（客户区高度+标题栏+菜单栏+边沿） hWnd=CreateWindow( "BasicApp", "Basic Applicaton", WS_POPUP|WS_MAXIMIZE, 0,0, width,height, NULL,NULL, hCurrentInst,NULL);
user-0 提问: 一道编程题

回复:
user: user-1
content: 引用 5 楼 xw3527858 的回复:百度考试碰到这道题了，以下是我写的代码，可惜提交的时候页面抽风，代码不完整。。。 #include <iostream> using namespace std; void GetTheNext1(int**& gird,int n,int m,int rows,int columns) { 	gird[n][m] = 0; 	if ((n+1)<rows&&gird[n+1][m]==1) 	{ 		GetTheNext1(gird,n+1,m,rows,columns); 	} 	if ((n-1)>=0&&gird[n-1][m]==1) 	{ 		GetTheNext1(gird,n-1,m,rows,columns); 	} 	if ((m+1)<columns&&gird[n][m+1]==1) 	{ 		GetTheNext1(gird,n,m+1,rows,columns); 	} 	if ((m-1)>=0&&gird[n][m-1]==1) 	{ 		GetTheNext1(gird,n,m-1,rows,columns); 	} } int GetTheNubmer(int** grid,int n,int m) { 	int rows = n; 	int	columns = m; 	int theNumbers=0; 	for(int i = 0;i<n;i++) 	{ 		for (int j=0;j<m;j++) 		{ 			if (grid[i][j] == 1) 			{ 				GetTheNext1(grid,i,j,rows,columns); 				theNumbers++; 			} 		} 	}  	return theNumbers; } 具体思想是，每找到一个1，房子数+1，然后将这个1上下左右的1全置为0（此处递归），所以要把传数组的引用

user: user-1
content: 百度考试碰到这道题了，以下是我写的代码，可惜提交的时候页面抽风，代码不完整。。。 #include <iostream> using namespace std; void GetTheNext1(int**& gird,int n,int m,int rows,int columns) { 	gird[n][m] = 0; 	if ((n+1)<rows&&gird[n+1][m]==1) 	{ 		GetTheNext1(gird,n+1,m,rows,columns); 	} 	if ((n-1)>=0&&gird[n-1][m]==1) 	{ 		GetTheNext1(gird,n-1,m,rows,columns); 	} 	if ((m+1)<columns&&gird[n][m+1]==1) 	{ 		GetTheNext1(gird,n,m+1,rows,columns); 	} 	if ((m-1)>=0&&gird[n][m-1]==1) 	{ 		GetTheNext1(gird,n,m-1,rows,columns); 	} } int GetTheNubmer(int** grid,int n,int m) { 	int rows = n; 	int	columns = m; 	int theNumbers=0; 	for(int i = 0;i<n;i++) 	{ 		for (int j=0;j<m;j++) 		{ 			if (grid[i][j] == 1) 			{ 				GetTheNext1(grid,i,j,rows,columns); 				theNumbers++; 			} 		} 	}  	return theNumbers; }

user: user-2
content: 这个你做出来了么？

user: user-3
content: 你还记得测试用例？

user: user-0
content: 引用 1 楼 user-4 的回复:这不是四连通区域提取吗？ 能帮忙写一下，或者找源代码吗

user: user-4
content: 这不是四连通区域提取吗？
user-0 提问: coad = C, 动态开辟二维数组的方法有多少种

回复:
user: user-1
content: 会这一种就行：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //
user-0 提问: 求C语言大神解题！！！！

回复:
user: user-1
content: 引用 3 楼 u010165006 的回复:这是很好的很基础的字符串练习题目，楼主应该自己练习写一遍，如果以后考C语言二级类似的很常见。  包括自己实现一遍strcpy,strcat,strlen等等（不要和库函数同名），都是基本功的练习。

user: user-1
content: 这是很好的很基础的字符串练习题目，楼主应该自己练习写一遍，如果以后考C语言二级类似的很常见。

user: user-2
content: 好歹自己先想想，直接拿来的东西终究不是自己的……

user: user-3
content: #include<stdio.h> #include<string.h> int main() { 	char buffer[128] = {0}, str[128] = {0}; 	scanf("%s", buffer); 	int i, j = 0; 	for(i = 0; i < strlen(buffer); i++) 	{ 		if((buffer[i] >= '0' && buffer[i] <= '9') || (buffer[i] >= 'a' && buffer[i] <= 'z') || (buffer[i] >= 'A' && buffer[i] <= 'Z')) 			str[j++] = buffer[i]; 	} 	str[j] = '\0'; 	printf("%s\n", str); 	return 0; }
user-0 提问: vc中加入ege库图形化输出时莫名占cpu导致一段时间后图形无法输出

回复:
user: user-1
content: 没有开其他线程的话， 那么还是死循环啊

user: user-2
content: 检查是否资源泄漏的办法之一： 在任务管理器 进程 查看 选择列 里面选择：内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍，越多越好，比如1000000次甚至无限循环，记录以上各数值，再隔至少一小时，越长越好，比如一个月，再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加，则铁定有对应资源的资源泄漏！  搜“GDI泄露检测”

user: user-3
content: ”程序中没有使用线程，死循环中有sleep函数“ 你的死循环是在哪个线程？  看起来像是消息处理出问题了，是不是消息死循环了？

user: user-4
content: 改成多线程试试？

user: user-0
content: 引用 1 楼 lunat 的回复:cpu占用前后是否有明显变化？你怎么判断是cpu占用导致无法输出？ 能看到运行到一分多钟Cpu占用就百分百，随即就不能正常输出

user: user-3
content: cpu占用前后是否有明显变化？你怎么判断是cpu占用导致无法输出？
user-0 提问: C中I/O的一点疑惑，请大家指点！

回复:
user: user-1
content: 二进制流  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-2
content: 不同类型计算机（CPU可能也不同） 中间传递 文件。存为 文本文件 带格式的文件，一般存为文本文件 需要人识别的文件，存为文本文件  仅仅计算机才需要的， 存为二进制

user: user-3
content: Q1：看你文件的用途,假如是给人看的,建议使用文件流,否则使用二进制流 Q2：在Unix环境高级编程中有一章节专门讲操作数据流的i/o库以及以及read和write函数,他们的效率实际上并不会相差太大,你如何方便就如何使用,看你喜欢用哪个了 Q3:redis的话有一本书叫做redis设计与实现,讲的通俗易懂,不让去淘一本高仿的看看,我目前就在看.至于nginx恕我不太熟,就不给意见了.

user: user-4
content: 一年分为春夏秋冬四个季节，我们通常处于哪个季节？
user-0 提问: c 指针写3*3的转置

回复:
user: user-1
content: 请那些喜欢将数组作为函数参数传来传去的码农思考一下为什么不把整个互联网内容当作函数参数传来传去呢？

user: user-2
content: 你的inv函数的第二个参数n好像没用到啊？ 而且int  (*q)[3]你用这种形式，必须要指定列数3，如果你的矩阵维数不固定的话限制很大

user: user-3
content: void inv(int (*q)[],int n);  改成：  void inv(int (*q)[3],int n);

user: user-0
content: 引用 2 楼 小灸舞的回复:可以跑出结果 可是它调试的时候有提示错误这样没有关系吗？

user: user-2
content: 可以跑出结果

user: user-0
content: #include<stdio.h> int main() {     void inv(int (*q)[],int n);     int a[3][3],i,j;     int (*p)[3];     printf("请输入一个3*3矩阵\n");     for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			scanf("%d",&a[i][j]); 		p=a; 	inv(p,3);     for(i=0;i<3;i++) 	{ 		for(j=0;j<3;j++) 			printf("%d ",a[i][j]); 		printf("\n");  	} 	return 0; } void inv(int (*q)[3],int n) {     int i,j,t;     for(i=0;i<3;i++)         for(j=0;j<3;j++)             if(i<j)             {                 t=*(*(q+i)+j);                 *(*(q+i)+j)=*(*(q+j)+i);                 *(*(q+j)+i)=t;             }   }  我刚改了  不知道还有什么问题
user-0 提问: 链表操作为什么要双指针而顺序表只要单指针？

回复:
user: user-1
content: 因为Create（）需要向main函数传递指针参数，需要改变指针参数。通过二级指针才能传递出去。还有一种方法可以通过引用来传递指针参数。  typedef struct LNode{        ElemType data;        struct LNode *next; }LinkList; void CreateList(LinkList *&L ,int n) {         int i=0;        LInkList *s;         L = (LinkList *)malloc(sizeof(LinkList));        L -> next = NULL;         for(i = 0; i < n ; i++)         {              s = (LinkList *)malloc(sizeof(LinkList));              s -> next = L -> next;              L ->next = s;         } }

user: user-0
content: 引用 5 楼 qq423399099 的回复:你如果想在某个函数内改变指针的指向，那么需要传二级指针。 假设你main函数里定义了一个指针叫head,然后调用fun函数（形参名叫h2） 你如果传的是一级指针，那么仅仅只是head和h2所指的是同一块内存区域，而h2和head本身并不是同一个指针刚刚看到别人以前在CSDN发的类似问题，看了下底下的回答，差不多已经明白了，不过还是多谢你的回答。

user: user-2
content: 你如果想在某个函数内改变指针的指向，那么需要传二级指针。 假设你main函数里定义了一个指针叫head,然后调用fun函数（形参名叫h2） 你如果传的是一级指针，那么仅仅只是head和h2所指的是同一块内存区域，而h2和head本身并不是同一个指针

user: user-0
content: 引用 2 楼 lm_whales 的回复:链表的头指针，是个非常重要的东西 它在程序的使用中，代表整个链表。 创建链表，需要给头指针赋值，尤其是不带空头节点的单链表 一级指针，不能改变链表的头指针， 只有传递二级指针，才可以 另外一般都说 一级指针，二级指针，。。多级指针 很少有人说双重指针的，三重指针的1级链表为什么不能改变头指针呢，可否再具体一点。。。

user: user-0
content: 引用 1 楼 user-4 的回复:"双重指针"是”二级指针”的意思？嗯，是啊

user: user-3
content: 链表的头指针，是个非常重要的东西 它在程序的使用中，代表整个链表。 创建链表，需要给头指针赋值，尤其是不带空头节点的单链表 一级指针，不能改变链表的头指针， 只有传递二级指针，才可以 另外一般都说 一级指针，二级指针，。。多级指针 很少有人说双重指针的，三重指针的

user: user-4
content: "双重指针"是”二级指针”的意思？
user-0 提问: 这里我想请问大家一个用c语言编的俄罗斯方块的部分代码问题，请大家帮忙

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

user: user-2
content: HWND wnd = GetHWnd();  当你要关闭窗口时，你首先要获取到要关闭的窗口，这行代码就是达到获取窗口的目的； WORD c = g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir];//.这个是确定生成图形的形状和颜色 setlinecolor(0x006060);//  这里的十六进制是一个颜色值.颜色可以用6位十六进制表示，从高到低每两位表示一个色的占位大小，分别是red，green，blue

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

user: user-0
content: 源代码中 在对应按键操作的时候有两个case情况： case 0: case 0xE0: 然后对应山下左右按键操作。 请问那两个case是什么意思啊？？
user-0 提问: 马踏棋盘问题，探索路径的时候为什么要找到当前位置的下一个位置的可行路径条数？

回复:
user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出  http://www.codeproject.com/Articles/418776/How-to-replace-recursive-functions-using-stack-and
user-0 提问: 用指针查找 第某个学生的成绩

回复:
user: user-0
content: 谢谢版主  我知道啦

user: user-1
content: printf("%d ",*(search(p,n)+1));应该是printf("%d ",*(search(p,n)+i));  #include<stdio.h> int main() {     int *search(int (*s)[4],int n);     int sorce[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};     int n,i;     int (*p)[4];     p=sorce;     printf("请输入你要搜索的学生号\n");     scanf("%d",&n);     for(i=0;i<4;i++)         printf("%d ",*(search(p,n)+i));     return 0; } int *search(int (*s)[4],int n) {     return *(s+n-1); }
user-0 提问: Ｃ＃面向对象

回复:
user: user-1
content: C语言栏目中一个C#的帖子是用来干什么的，求讲解。 构造函数是构造一个类的实例时，执行的初始化函数；类的方法是类的行为或者基于类数据的某个操作。 我觉得你的问题应该是：有没有C#入门的书推荐一下（注：零基础）？
user-0 提问: 申请空间的问题

回复:
user: user-0
content: 引用 2 楼 qq423399099 的回复:List *P;这样写意味着你的P指向的是一个未知区域，然后进行写操作自然出现异常了。 List *P = (List *)malloc(sizeof(List)); 谢谢！

user: user-0
content: 引用 1 楼 user-2 的回复:List P; P.con=(S)malloc(sizeof(Stu)); 初学者少用typedef，以免发生逻辑错误 谢谢！解决了！

user: user-1
content: List *P;这样写意味着你的P指向的是一个未知区域，然后进行写操作自然出现异常了。 List *P = (List *)malloc(sizeof(List));

user: user-2
content: List P; P.con=(S)malloc(sizeof(Stu)); 初学者少用typedef，以免发生逻辑错误
user-0 提问: 编译时：warning C4715: 'add' : not all control paths return a value

回复:
user: user-1
content: 引用 3楼我是你的主体 的回复:[quote=引用 2 楼 小灸舞的回复:]要学会看错误信息： not all control paths return a value说的很清楚了 不是所有的路径都返回了值 只知道中文意思却不知道它为什么是这样也没用啊[/quote]把错误拿去一搜就行了。 大部分常见错误都能找到答案

user: user-0
content: 引用 2 楼 小灸舞的回复:要学会看错误信息： not all control paths return a value说的很清楚了 不是所有的路径都返回了值 只知道中文意思却不知道它为什么是这样也没用啊

user: user-1
content: 要学会看错误信息： not all control paths return a value说的很清楚了 不是所有的路径都返回了值

user: user-2
content: #include<stdio.h> #include<string.h>  int main() {     int num = 1, sn;      int add(int num);      sn = add(num);     printf("%d\n", sn);     return 0; }  int add(int num) {     static int sn;      sn += num;      if (num == 100) {         return sn;     }      return add(++num); }  并不是所有的控制路径都返回了一个值。 相对于这个警告，我更感兴趣的是你这个函数的设计。
user-0 提问: 前辈们，我这SetWindowsHookEx总提示参数错误

回复:
user: user-1
content: 第三个参数 GetModuleHandleA("name.dll")

user: user-2
content: 引用 3 楼 darksoulson 的回复:我会了，哈哈。。。。  我也碰到这个问题了，能解释一下吗？

user: user-3
content: 帮结帖＋蹭分

user: user-0
content: 我会了，哈哈。。。。

user: user-0
content: 坐等大神，我一直等呢

user: user-0
content: 在线等，希望前辈们赐教
user-0 提问: double数组的第一个值调用函数中和调用函数后不一样？

回复:
user: user-1
content: 读取前用fseek函数置头看看

user: user-0
content: 原因找到了，就是txt下面多了一个回车，没有看出来，导致数组越界，对本次数组没影响，但是覆盖了前面读进去的数组的第一个值。

user: user-0
content: 对不起，下结论太早了。feof（）虽然读取成功了，但是改变的还是不对。

user: user-0
content: 非常感谢大家 问题解决了： 问题出在feof（）  假设"in.txt"中存放的内容是：ABCDFEFG 按照自己的想法，输出应该是：ABCDEFG，但是实际上的输出却是：ABCDEFGG，最后一个字符被输出了两次！  在官方帮助文档里查询feof，其返回值说明为：A non-zero value is returned in the case that the End-of-File indicator associated with the stream is set.Otherwise, a zero value is returned. 如果流的文件结束符（EOF）已经被设置，那么返回非零值，否则返回零。输入文件的最后一个字符是不可见的字符 '\0'，所以文件指针移动到指向'\0'的时候，还没有设置EOF，此时进行设置，因此再进入循环体一次。而fscanf()已经读取不到有效字符，所以返回EOF，而ch的值没有被改变（同样，参考文档里对fscanf()的说明），还是'G'，所以'G'第二次被输出。 由于fscanf()返回的读取的有效字符的个数，所以代码可以修改为： #include <stdio.h> #include <stdlib.h> int main() { char ch; FILE *fp = fopen("in.txt", "r"); while (fscanf(fp, "%c", &ch) > 0) printf("%c", ch); return 0; }

user: user-2
content: 单步跟踪程序运行，观察分析变量变化情况，在哪发生了变化，然后分析原因

user: user-0
content: 引用 1 楼 chendepeng17 的回复:读取前用fseek函数置头看看  嗯设置了 还不行。没理由啊，为啥只有第一个不对呢？后面的都正确。而且我单独把读取程序和调用过程，运行的话，就对着呢。如果原封不动的放回生态模型中，数组的第一个就不对，后面的都对。这真是太诡异了。
user-0 提问: 基本块用()包络是否是UB行为

回复:
user: user-1
content: 不是标准C++而已 UB 是可以任意处理的 同一款编译器，编译的结果，都不一定一样

user: user-2
content: 因为vs用的不是gcc编译器

user: user-3
content: GCC扩展了一些功能而已
user-0 提问: 求助：include conio.h头文件突然报错。

回复:
user: user-0
content: 原本想两位版本都分20分的，结果点结贴自己变了，原来不能平均得分。。。。不好意思。  我摸索了一天。找到原因了。原来是VS2015的include文件路径指向了VS2013的include。因为我装两个版本，一个2015一个2013。。。 打开include 目录下的conio.h发现路径是vs2013里的include文件夹。不是VS2015的。。 自作自受。。

user: user-0
content: 手机上传图片太小了。再次上传截图。。

user: user-1
content: 网上重新下个conio.h替换试试

user: user-2
content: 另外建议写成：#include <conio.h>

user: user-2
content: 看下_CRT_BEGIN_C_HEADER那个宏的定义
user-0 提问: 大神们，帮忙看一下哪儿错了

回复:
user: user-0
content: 文档上传失败了//////////////////////////////////

user: user-1
content: 就几个头文件怎么看得出

user: user-2
content: 去掉： 。。。。。。。。。。。。。。。。。。。。。。。。。
user-0 提问: 为什么会出现乱码的，用c写的定时关机

回复:
user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

user: user-2
content: 文件编码不是gbk

user: user-3
content: 控制台在简体中文Windows下的编码一般是是ANSI编码(代码页936, GBK),先明确这点。 然后检查下文件的编码.