Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言字符串分隔问题

回复:
user: user-1
content: strtok不好吗

user: user-2
content: 代码如下：  #include <stdio.h> #include <string.h> int split(char strs[][50],char *p); void print(char strs[][50],int n);   int main() {    	int n; 	char strs[50][50]; 	char ch[3000]; 	scanf("%s",ch);  	n=split(strs,ch);  	//将ch按照#进行分割，将分隔后的多个字符串，保存到strs中,并且返回字符串个数,传给n   	printf("%d\n",n); 	print(strs,n); }  int split(char strs[][50],char *p)  {    	int i=0,j;         //分隔出第i个字符串,保存到strs[i]中，一开始i=0  	int len=strlen(p); //被分隔的字符串p(即ch)的长度  	int k=0;               //strs[i]中，下一个可放入字符的位置。  	for(j=0;j<len;j++)  //利用j扫描字符串p(即ch)  	{   		if(p[j]!='#') //如果不是# 		{ 			strs[i][k++] = p[j];//将p中的字符逐个复制给strs[i] 		}  		else 		{ 			strs[i][k] = '\0'; //给strs[i]添加字符串结束符0 			k = 0; //准备将分隔出的字符串，复制给下一个strs[i] 			i++; //让k指向新的strs[i]的起始位置  		} 	} 	return i; } void print(char strs[][50],int n) { 	int i;   	//输出n个字符串 	for(i=0;i<n;i++) 		printf("%s\n",strs[i]); //输出第i个字串并换行  }  运行结果：

user: user-3
content: 所谓复制就是 a=b ;

user: user-0
content: 需要填空的代码 #include <stdio.h> #include <string.h> int split(char strs[][50],char *p); void print(char strs[][50],int n);   int main() {   int n;     char strs[50][50];     char ch[3000];     scanf("%s",ch);          n=split(strs,ch);     //将ch按照#进行分割，将分隔后的多个字符串，保存到strs中,并且返回字符串个数,传给n          printf("%d\n",n);     print(strs,n); }     int split(char strs[][50],char *p)  {   int i=0,j;         //分隔出第i个字符串,保存到strs[i]中，一开始i=0      int len=strlen(p); //被分隔的字符串p(即ch)的长度      int k=0;               //strs[i]中，下一个可放入字符的位置。  	for(j=0;j<len;j++)  //利用j扫描字符串p(即ch)      {  if(p[j]!='#') //如果不是# 	{@@1          将p中的字符逐个复制给strs[i]          @@1 	 }  	   else 	 {@@2           给strs[i]添加字符串结束符0           准备将分隔出的字符串，复制给下一个strs[i]           让k指向新的strs[i]的起始位置           @@2  		     	 }          }     return i; } void print(char strs[][50],int n) {     int i;       //输出n个字符串     for(i=0;i<n;i++)     printf("%s\n",strs[i]); //输出第i个字串并换行         }

user: user-0
content: 引用 4楼user-3 的回复:所谓复制就是 a=b ;能否劳烦写下代码，填下空呢

user: user-0
content: 我比较笨哎，能直接填下空，把代码写一下吗？这样更好理解一点哎

user: user-0
content: 引用 1楼user-3 的回复:方法一 两遍搜索 第一遍搜索#个数 n 如果第一个字符不是#，最后也不是# 那么 串数目  n+1 个 二者只有一个是#输出 n个 两个都是#n-1个 遇到 # 或者 结束符，输出一行字符串，空串不输出 方法一2 用一个字符数组储存字符串 其他同上我比较笨哎，能直接填下空，把代码写一下吗？这样更好理解一点哎￼

user: user-3
content: 方法一 两遍搜索 第一遍搜索#个数 n 如果第一个字符不是#，最后也不是# 那么 串数目  n+1 个 二者只有一个是#输出 n个 两个都是#n-1个 遇到 # 或者 结束符，输出一行字符串，空串不输出 方法一2 用一个字符数组储存字符串 其他同上
user-0 提问: C语言Windows程序

回复:
user: user-1
content: 目测楼主缺少头文件，如wingdi.h;windows.h;等

user: user-2
content: 没有包含相关头文件

user: user-3
content: -L库文件所在目录 -l库文件

user: user-4
content: GetStockObject，头文件：wingdi.h；库：gdi32.lib。 使用PlaySound函数时需要在#include<windows.h>后面加上（注意：不能加在前面）： #include <mmsystem.h> #pragma comment(lib, "WINMM.LIB")  不知道LZ是不是少了头文件

user: user-5
content: 没有链接库文件吧
user-0 提问: getop函数中的细节

回复:
user: user-1
content: 这本书叫什么

user: user-0
content: 引用 3楼galiniur0u 的回复:s[i] = '\0';这种做法主要的目的是为字符串封尾，就是告诉编译器，这个字符数组到这个字符就结束了。 如果不用s[i] = '\0'这种做法，如果使用到s时，程序就会一直读到s的最后一个字符。就例如 #include <stdlib.h> #include <stdio.h>  int main(int argc, char *argv[]) { 	char s[] = {'a', 'b', 'c', 'd'}; 	printf("%s\n", s); 	s[2] = '\0'; 	printf("%s\n", s); 	return 0; }  如果操作字符数组能够明确的给出要操作到第几个，可以不写s[i] = '\0';但是这个程序里，使用到s时是用while循环判断的，如果不是空格会结束循环，还有必要用s[1]='\0'吗？

user: user-2
content: while循环判断不是空格或者不是tab键才结束，判断的是s[0]，而不是s[1]。书上这么写只是让人知道，字符串结尾字符是'\0'。 前面也说了，如果在操作字符数组的时候，你能够明确的从第几个字符结束扫描，是否加'\0'无所谓。

user: user-2
content: s[i] = '\0';这种做法主要的目的是为字符串封尾，就是告诉编译器，这个字符数组到这个字符就结束了。 如果不用s[i] = '\0'这种做法，如果使用到s时，程序就会一直读到s的最后一个字符。就例如 #include <stdlib.h> #include <stdio.h>  int main(int argc, char *argv[]) { 	char s[] = {'a', 'b', 'c', 'd'}; 	printf("%s\n", s); 	s[2] = '\0'; 	printf("%s\n", s); 	return 0; }  如果操作字符数组能够明确的给出要操作到第几个，可以不写s[i] = '\0';

user: user-0
content: 引用 1楼user-3 的回复:就是判断是不是空字符或制表符 是就以\0字符串结束符赋值给数组s 就是不保存判断条件里面的东西这一步可以省略吗，书中之前都没有这种用法，第一次遇到，所以是否是必须的？

user: user-3
content: 就是判断是不是空字符或制表符 是就以\0字符串结束符赋值给数组s 就是不保存判断条件里面的东西
user-0 提问: 急，求高手帮忙，程序设计要上交给老师

回复:
user: user-1
content: 引用 9 楼 galiniur0u 的回复:windows下2013编译并运行，不过按照楼主这种方式的输出到文件的内容，因为内存对齐以及内存值的原因，基本上没法看。 这跟内存对齐可没有关系，这是因为fwrite是写二进制的，不是写文本的。

user: user-2
content: #include <stdlib.h> #include <stdio.h> #include <conio.h>  typedef struct information    //定义一个结构体，包含家庭成员的姓名，日期，收入及支出 { 	char name[7]; 	int date = 0; 	float income = 0.0f; 	float payout = 0.0f; }   xinxi; #define  sizexin sizeof(xinxi) int main() { 	xinxi x[1000];                //定义一个结构体数组 	 	FILE *fp;                     //定义一个文件指针 	int i = 0; 	char ch; 	char other[100]; 	printf("请按照示例输入今天家人们的收支情况:\n"); 	printf("姓名\t日期\t\t收入\t支出\n"); 	printf("张三\t20150120\t120\t40\n"); 	printf("\n"); 	do 	{ 		memset(x[i].name, '\0', 7); 		scanf("%s%d%f%f", x[i].name, &x[i].date, &x[i].income, &x[i].payout); 		gets(other);//这里接收多余字符 		printf("继续输入？(y / n)\n"); 		ch = getchar(); 		i++; 	} while ('y' == ch);//这里= 	fp = fopen("D:\\family financy.dat", "ab+"); 	while (i >= 0) 	{ 		fwrite(&x[i], sizexin, 1, fp); 		i--; 	} 	fclose(fp); 	printf("成功添加纪录!\n"); 	return 0; } windows下2013编译并运行，不过按照楼主这种方式的输出到文件的内容，因为内存对齐以及内存值的原因，基本上没法看。

user: user-0
content: 可是好像还是有问题，有大神在电脑上运行过这段代码吗？为什么输入信息之后回车还是没出现 继续输入 ？

user: user-3
content: 5楼真是厉害  只看出了第一处

user: user-4
content: 楼上说的对，就是把\n读给了ch，不过我用的是gets()读走多余的。

user: user-5
content: LZ有两个问题： 1.while(ch='y');要改成while(ch=='y');   //楼上的已经说了 2.LZ需要读取掉输入缓冲区中遗留的\n,不然ch=getchar();会使得ch='\n',然后判断while循环ch=='y',结果是不相等， 循环结束，所有LZ看起来是直接就结束了程序 这里提供两种解决方法: 1.scanf("%s%d%f%f",x[i].name,&x[i].date,&x[i].income,&x[i].payout);改为scanf("%s%d%f%f%*c",x[i].name,&x[i].date,&x[i].income,&x[i].payout); //用%*c匹配掉最后的回车符 2.ch=getchar();这句前面加上一句getchar(); //先用一个getchar();读取掉回车符

user: user-0
content: 运行的时候， 继续输入        没显示出来

user: user-6
content: 检查文件是否打开成功

user: user-0
content: 还是运行不出来

user: user-6
content: while(ch='y'); 改成 while(ch=='y');
user-0 提问: 大家好，新手问个问题，安卓的应用层语言是java，内核是基于Linux的，是C/C++编写。那请问那么和系统内核有关的软件，到底是用C/C++写的，还是用

回复:
user: user-0
content: 防沉补丁安装中...

user: user-0
content: 引用 3 楼 Saleayas 的回复:基于开发的需求。 如果 java 不能满足的时候，可以就需要使用 NDK 来开发。 如果是 Android 的底层服务是使用 Linux 开发，然后使用 NDK 或者 Binder 来暴露 java 接口的。  如果是纯粹的服务，就是 Linux 开发。   也就是说C/C++编写的Linux服务，可以在安卓系统中运行，即使不使用Java?

user: user-1
content: 很多大型的应用都是有 C/C++ 代码的， 这就是为什么 Intel 心痛的原因，因为这些 C/C++ 代码，很多引用里面只有 arm 版本的。 导致同样运行在 Android 的虚拟机上，Android 应用依旧不能跨平台的原因。

user: user-1
content: 基于开发的需求。 如果 java 不能满足的时候，可以就需要使用 NDK 来开发。 如果是 Android 的底层服务是使用 Linux 开发，然后使用 NDK 或者 Binder 来暴露 java 接口的。  如果是纯粹的服务，就是 Linux 开发。

user: user-0
content: 引用 1 楼 user-2 的回复:安卓 有 NDK 开发 这个东西。 不一定涉及 内核开发， 游戏开发里面计算量大的，也是用C++开发打包成动态库的。   直接用C或C++写的程序可以在安卓系统上运行吗?

user: user-2
content: 安卓 有 NDK 开发 这个东西。 不一定涉及 内核开发， 游戏开发里面计算量大的，也是用C++开发打包成动态库的。
user-0 提问: 内存管理算法

回复:
user: user-1
content: memcached或redis有类似的源码

user: user-2
content: 可以参考stl的allocator的实现。或者你直接看linux下的malloc不就好了。 windows下使用heapalloc 创建无分页内存。完成大内存实现。然后再通过链表时间内存插入。 不过你想别人帮你实现不太现实。应用不同实现都不一样。好的内存池专用算法 也不便宜。
user-0 提问: a=3；关于b=（++a）+（++a）+（++a），vc运行为什么b=16？？

回复:
user: user-1
content: 引用 11 楼 FrankHB1989 的回复:为什么这里的人问这种智障题目会这么熟练啊……我倒觉得 这里的人 回答这种问题 这么熟练 也是挺赏心悦目的 哈哈哈

user: user-2
content: 为什么这里的人问这种智障题目会这么熟练啊……

user: user-3
content: 未定义行为，请不要使用

user: user-4
content: 这条语句是未定义的语句，c++标准中没有这样的语句，简单的说这是个错误的语句。

user: user-5
content: 又有人问这种问题....前几天刚有个人问完。完全没有结果的事总经常有人喜欢讨论。

user: user-6
content: 介个东西吧！IDE不同 操作系统不同都能算出不一样的结果

user: user-7
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-8
content: 好像C/C++对这个没有明确规定，结果应该不确定，与编译器有关

user: user-9
content: 这是未定义行为，结果完全取决于编绎器。别人也问过了。要么把三个操作数都算出来，再计算和；要么先计算前两个操作数，计算其和，再计算第三个操作数。

user: user-10
content: 这是未定义行为，结果完全取决于编绎器。别人也问过了。要么把三个操作数都算出来，再计算和；要么先计算前两个操作数，计算其和，再计算第三个操作数。

user: user-11
content: 这种行为不确定  关于C,C++表达式求值顺序  http://bbs.csdn.net/topics/370153775

user: user-12
content: 这种题目没啥意思，各个编译器实现不一样，可能结果不一样。 具体看下面这个帖子， 写的很好 http://bbs.csdn.net/topics/370153775  我的编译器vs2012 结果是18 他生成的汇编代码  	mov	eax, DWORD PTR _a$[ebp] 	add	eax, 1 	mov	DWORD PTR _a$[ebp], eax 	mov	ecx, DWORD PTR _a$[ebp] 	add	ecx, 1 	mov	DWORD PTR _a$[ebp], ecx 	mov	edx, DWORD PTR _a$[ebp] 	add	edx, 1 	mov	DWORD PTR _a$[ebp], edx ----------------------------------------------------------------》 这里一口气 进行了3次 ++a 	mov	eax, DWORD PTR _a$[ebp] 	add	eax, DWORD PTR _a$[ebp] 	add	eax, DWORD PTR _a$[ebp] 	mov	DWORD PTR _b$[ebp], eax
user-0 提问: socket编程，为什么recv函数一直都只能接收到一个字节

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

user: user-2
content: int k=recv(s2,buffer,sizeof(buffer),0)>0 注意到优先级了没 > 和=

user: user-1
content: while( int k=recv(s2,buffer,sizeof(buffer),0)>0) {     printf("客户端：%d字节\n",k);     for (int i=0;i<k;i++) printf(" %02x",(unsigned char)buffer[i]);     printf("\n");     memset(buffer,100,0);     Sleep(100); }

user: user-3
content: int k=recv(s2,buffer,sizeof(buffer),0) while(k) {}
user-0 提问: 计算学生，课程的平均成绩的C程序，找了好久的Bug！没找到

回复:
user: user-1
content: 除了上面说的问题外，还有一个数组越界的问题，程序运行后会崩溃。 打印课程平均分用的 stu[i] ，在上面for循环完事后，i就越界了。 另外，结构体中的平均分一个就够了，课程的平均分不应该在学生的结构体中， 因为与学生的属性无关，建议申请一个课程平均分的变量，这样也避免了数组越界的问题。   #include <stdio.h> #include <stdlib.h>  typedef struct student { 	char name[10]; 	int score[3];//三门考试成绩 	float average[2];//两个平均成绩 }STU;  int main(void) { 	STU stu[5]; 	int i,j; 	float sum; //	memset(&stu, 0x00, sizeof(stu)); 	printf("please input the students' score:\n"); 	printf("姓名	A	B	C\n"); 	//输入学生的数据 	for(i=0;i<5;i++) 	{ 		scanf("%s",stu[i].name); 		for(j=0;j<3;j++) 		{ 			scanf("%d", &stu[i].score[j]); 		} 	} 	//计算学生的平均成绩 	printf("\n学生的平均成绩\n"); 	for(i=0;i<5;i++) 	{ 		sum=0; 		for(j=0;j<3;j++) 		{ 			sum+=stu[i].score[j]; 		} 		stu[i].average[0]=sum/3; 		printf("%s的平均成分:%.2f\n",stu[i].name,stu[i].average[0]); 	}  	//计算课程的平均成绩 	printf("\n课程的平均成绩\n"); 	for(j=0;j<3;j++) 	{ 		sum=0; 		for(i=0;i<5;i++) 		{ 			sum+=stu[i].score[j]; 		} 		stu[i-1].average[1]=sum/5; //数组越界 		printf("%c课程的平均分%.2f\n",j+65,stu[i-1].average[1]); 	}  	system("pause"); 	return 0; }

user: user-2
content: scanf("%s",stu[i].name);这个后面的参数，如果是整形的需要加&，取地址的。

user: user-3
content: 你确定是输入一组？还是只是一个(姓名)？

user: user-4
content: 输入学生数据下面的for 循环的第二个scanf，就是输入分数，少了个&

user: user-0
content: 运行之后的刚输入一组学生的数据 结果就 中断了！！！ 不知道有什么地方错了！自己也找了好久吗，绝对不是伸手党，实在是无可奈何了！ 才来向大家求助的。
user-0 提问: 关于link 2019的错误

回复:
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: main...

user: user-3
content: main函数的main拼写错了，其实链接错误提示也说的很明白了，找不到main的实现

user: user-4
content: ......... 楼上已说

user: user-5
content: mian main拼写错误

user: user-0
content: 请问为什么要改成这样呢？

user: user-6
content: 主函数改成 int main()  { 。。。。 return 0; }

user: user-7
content: int mian(void)
user-0 提问: 谁知道 用C语言写excel文件，要求多个sheet(工作表)

回复:
user: user-0
content: 我直接用写数据的方式写进去过，不过我只会写一个工作表，多个工作表不会写

user: user-1
content: 可以二进制写进去，不过可能是乱码

user: user-2
content: 可参考一些网上资源：http://download.csdn.net/detail/ql306800470/4344172#comment
user-0 提问: Linux socket  服务端发送心跳包

回复:
user: user-1
content: 引用 2 楼 waitlessness 的回复:[quote=引用 1 楼 user-1的回复:]服务器开个线程扫描客户端列表，每个客户端关联一个计数器。  每隔几秒扫描一次，对计数器计数之前，查看是否 >= 你的次数， 如果>=， 就closesocket 你的意思是用alarm来产生信号，然后记数？[/quote]  直接sleep即可，  难度你觉得时间精度不够？

user: user-0
content: 引用 1 楼 user-1的回复:服务器开个线程扫描客户端列表，每个客户端关联一个计数器。  每隔几秒扫描一次，对计数器计数之前，查看是否 >= 你的次数， 如果>=， 就closesocket 你的意思是用alarm来产生信号，然后记数？

user: user-1
content: 服务器开个线程扫描客户端列表，每个客户端关联一个计数器。  每隔几秒扫描一次，对计数器计数之前，查看是否 >= 你的次数， 如果>=， 就closesocket
user-0 提问: 【关于C语言动态内存分配的问题】

回复:
user: user-0
content: 引用 2 楼 github_27756899 的回复:malloc(sizeof(tech));处理后 pName ,padress , pdate 本身已经有空间了,但是值未定.(空间存放值)。  psteach[i].pName=(char *)malloc(30);(char *)malloc(30); 申请空间存放值(pName），使指针指向申请的空间。  typedef struct date{   //日期结构体类型 	int day; 	int month; 	int year; }setDate;  typedef struct teacher{  //教师结构体类型 	char *name; 	char *address; 	setDate *birthday; }setTeacher;  void main(){ 	setTeacher *staff; 	int i; 	staff=(setTeacher *)malloc(sizeof(setTeacher)*3); 	for(i=0;i<3;i++) 	{ 		/* 		先进行动态内存分配 		*/  		staff[i].name=(char *)malloc(20); 		staff[i].address=(char *)malloc(20); 		staff[i].birthday=(setDate *)malloc(sizeof(setDate));    	} 	//通过strcpy把名字和地址赋值给指针字符串数组  	strcpy(staff[0].name,"Lu Shan"); 	strcpy(staff[1].name,"Zhi Feng"); 	strcpy(staff[2].name,"Chun Guo"); 	strcpy(staff[0].address,"BeiJing"); 	strcpy(staff[1].address,"ShangHai"); 	strcpy(staff[2].address,"ShenZhen"); 	//通过指针数组.birthday指向year  或者  month  或者   day  	staff[0].birthday->year=1996; 	staff[0].birthday->month=07; 	staff[0].birthday->day=14; 	staff[1].birthday->year=1995; 	staff[1].birthday->month=3; 	staff[1].birthday->day=10; 	staff[2].birthday->year=1970; 	staff[2].birthday->month=9; 	staff[2].birthday->day=25;  大大，可以最后一个问题吗~就是我的   "."和"->"使用得正确吗？因为我觉得,和->我比较模糊。可以解释一下吗 拜托了QAQ

user: user-0
content: 引用 2 楼 github_27756899 的回复:malloc(sizeof(tech));处理后 pName ,padress , pdate 本身已经有空间了,但是值未定.(空间存放值)。  psteach[i].pName=(char *)malloc(30);(char *)malloc(30); 申请空间存放值(pName），使指针指向申请的空间。  所以就是动态分配都是需要需要定值的对吧   如果是通过sizeof()定义的都是需要后面定义具体数值是嘛

user: user-1
content: 代码里的psteach变量后边都要有中括号下标才可以

user: user-2
content: malloc(sizeof(tech));处理后 pName ,padress , pdate 本身已经有空间了,但是值未定.(空间存放值)。  psteach[i].pName=(char *)malloc(30);(char *)malloc(30); 申请空间存放值(pName），使指针指向申请的空间。

user: user-3
content: 指针的大小是确定的。
user-0 提问: for循环为什么没有执行

回复:
user: user-1
content: 哈哈，LZ大于小于搞混了么

user: user-2
content: 哦，楼主自己找到原因了，直接结贴吧，不然回答越来越多，都是无用的

user: user-2
content: 循环条件设置错误 应该是对 for 循环的条件，理解有误，或者对要做的事情理解有误。 其实 C,C++ 循环 ，都是当型循环。 条件合适（非0）才执行，到不合适终止循环执行， 如果一开始就不合适 for,while 一次循环也不执行 其中for(e1;e2;e3){s;} 如果条件不合适， 仅仅执行 初始化表达式 e1一次， 执行条件表达式e2一次， 并作出判断是否执行循环体的判断一次。  while(e)s;  仅仅执行一次 e; 并作出判断是否执行循环体的判断一次。 do{s;}while(e);  仅仅执行循环体s一次,e 一次，并作出是否继续循环的判断一次。 C,C++ 没有直到型循环， 如果需要，可以自行把当型，转换成直到型（循环条件取非即可实现） 直到型循环，对于C,C++是一种语法冗余，所以C,C++没有实现直到型循环。

user: user-3
content: 我来看看。。。。

user: user-4
content: 打断点进行调试吧。

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

user: user-6
content: 遇到这种问题学会利用单步调试，一步步看程序怎么执行，看哪一步和你预期的不一致

user: user-7
content: 断点调试就能找到原因了
user-0 提问: 指针强制类型转换导致死机

回复:
user: user-1
content: STM32F030   使用MDK自带的编译器,遇到了同样的问题

user: user-2
content: char Tab[5] = {0x01,0x02,0x03,0x04,0x05}; short *p; p = (short *)(&Tab[1]); printf("Dat = %d",*p);

user: user-2
content: 在ARM上才可能出现对齐问题，但我打赌楼主用的不是ARM

user: user-3
content: 在AMD CPU上也没问题。 好吧，在x86 CPU上都没问题。 也许，在复杂指令集CPU上都没问题。

user: user-4
content: 引用 7 楼 zhao4zhong1 的回复:我敢打赌，楼主的问题是越界访问造成而非什么对齐造成。  赵老湿先是看出楼主用的INTEL CPU，然后断言楼主问题在于越界。这就好有一比：赵老湿穿的红内裤，所以认为大家都在穿红内裤，进而认为他的红内裤掉色，大家的秋裤都必须跟着染上红色素。

user: user-4
content: 引用 6 楼 zhao4zhong1 的回复:在Intel CPU上，对齐不是问题。  赵老湿从哪里看出楼主是INTEL CPU

user: user-2
content: 在Intel CPU上，对齐不是问题。

user: user-2
content: 我敢打赌，楼主的问题是越界访问造成而非什么对齐造成。

user: user-4
content: 引用 4 楼 zhao4zhong1 的回复:char Tab[5] = {0x01,0x02,0x03,0x04,0x05}; short *p; p = (short *)(&Tab[1]); printf("Dat = %d",*p);  赵老湿有点进步，知道*p可能越界（只是可能，因为short int和int的宽度可能相同）。但是不管你怎么改，对齐始终是个问题。我们认为程序的行为是未定义的。

user: user-5
content: 试试 t[2] 呢？可能奇数地址上弄不出来 short，现在 cpu 一般情况下都是对齐的，正常情况下 short 不会放在寄地址上。

user: user-4
content: 引用 2 楼 zhao4zhong1 的回复:char Tab[4] = {0x01,0x02,0x03,0x04}; short *p; p = (short *)(&Tab[1]); printf("Dat = %hd",*p);  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  赵老师是欺负我们不懂C语言吗？ 1，%d要求一个int类型的参数，表达式* p的类型是short int，但这个表达式的值会在提升为int类型之后传递给printf函数，%d有错？？  2，好，就算是%hd，那也只不过是将* p的值从提升后的int再次转换为short int罢了，有意义？  3，表达式  (short *)(&Tab[1]); 唯一的问题就是转换后的指针可能不是正确对齐的。对于X86来说，这不是问题，大不了迂回一些，但对其它处理器来说问题就不是这么简单了。

user: user-2
content: char Tab[4] = {0x01,0x02,0x03,0x04}; short *p; p = (short *)(&Tab[1]); printf("Dat = %hd",*p);  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
user-0 提问: c语言fopen函数怎么打开指定路径文件？

回复:
user: user-1
content: 引用 1 楼 qq423399099 的回复:LZ你的fnasb函数有问题，你不能返回一个局部变量的地址，这个值很有可能是个垃圾值 不信你可以打印一下fnasb(filename)的值 应该改成用new或者malloc char *fnasb(char *fn) { 	char *path_name =  (char *)malloc(300); 	strcpy(path_name, "E:\\cj\\"); 	strcat(path_name, fn); 	return path_name; } 注：别忘记要free,tnasb同理 都有正确答案了，我就来打个酱油吧，楼上正解。

user: user-0
content: @小灸舞 大牛！！编译器有对这个问题提出警告的！被我无视了！我一会改下试试，谢谢你啦！

user: user-2
content: LZ你的fnasb函数有问题，你不能返回一个局部变量的地址，这个值很有可能是个垃圾值 不信你可以打印一下fnasb(filename)的值 应该改成用new或者malloc char *fnasb(char *fn) { 	char *path_name =  (char *)malloc(300); 	strcpy(path_name, "E:\\cj\\"); 	strcat(path_name, fn); 	return path_name; } 注：别忘记要free,tnasb同理
user-0 提问: 关于指针数组解引用（*）问题

回复:
user: user-1
content: char *name[]={"Follow me","Good job","My GOd","Hello world"}; 这样的写法， []的优先级比*的优先级高,代表name是一个指针数组, 此时name相当于是一个二级指针 p也是一个二级指针，name+1代表一个地址数值，不能取地址,&只能对变量使用  你要么p=name+1,要么就是 char **p=NULL;	 char **p1 = name +1; // 中间转换一下  char ***p2 = &p1; cout << *p1 <<  "  " <<**p2 << endl;

user: user-2
content: 楼上正解，数组的名字是常量，数组名字类似指针但是和指针不同，指针存地址，数组名字就是个地址，而地址是个常量！

user: user-3
content: &用于取变量的地址，name+1不是变量。

user: user-4
content: #include <stdlib.h> #include <stdio.h>  int main(int argc, char *argv[]) {     char *name[] = {"aaaa", "bbbb", "cccc"};     char **p = NULL;     p = name + 1;     printf("%s\n", *p);     return 0; }
user-0 提问: 马踏棋盘问题运行不出来

回复:
user: user-1
content: 有空的话再帮你研究一下。。。。。。

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

user: user-3
content: 出错时点中断，定位到相应代码，然后观察分析原因
user-0 提问: 将控制台程序隐藏后，cpu占用率增加

回复:
user: user-1
content: 你这个隐藏方法不对。 应该用 nircmd win hide title "你要隐藏窗口的标题" 这种方法隐藏。 http://www.nirsoft.net/utils/nircmd.html
user-0 提问: C语言求大神，这个简单程序为什么是一个死循环？

回复:
user: user-1
content: 楼主，你是 if （j =1）这边出错 ，应该是 if ( j == 1)，判断等于的时候是要有两个等于号，一个等于号代表了赋值不是用来判断的。 大于或者等于 ： >=  小于或者等于 ：<=  判断等于：== ，还有不明白的，可以随时私信

user: user-2
content: 写成  if(1 == j)  会好一点吧

user: user-3
content: for (i = 0;i < 11;++i) {     for (j = 1;j < 5;++j)     {         if (j == 1)  //粗心内。。。。             data[i][j] = 1.0/pow((data[i][0]),1);         else             data[i][j] = pow((data[i][0]),j);	     } }

user: user-0
content: 我明白了，谢谢大家了

user: user-4
content: C语言新学者可以请问一下if(i=1)和if(i==1)和if(1=i)有什么不同吗

user: user-5
content: 哈哈哈哈,J永远等于1，当然死循环

user: user-6
content: 建议if中的判断写成1 == j，这种写法虽然很痛苦，但出错率低。虽然本人也不喜欢用这种倒着写的方式写程序。

user: user-7
content: 写判断的时候常量写在前面，养成一个好习惯！

user: user-8
content: 引用 1 楼 qq423399099 的回复:if (j = 1)LZ少些了个=,应该是if (j == 1),j一致被赋值成1，然后++以后是2，恒小于5，跳不出for循环 ++  == 和 =  差别太小，很容易笔误，必须仔细检查。 简单的办法时常量在前，让编译器给你检查。

user: user-9
content: if (j = 1)  楼主想表达的意思应该是 if (j == 1)吧

user: user-10
content: if (j = 1)LZ少些了个=,应该是if (j == 1),j一致被赋值成1，然后++以后是2，恒小于5，跳不出for循环
user-0 提问: C语言如何实现用for循环求阶乘的倒数和

回复:
user: user-1
content: //e=1/1!+1/2!+1/3!+1/4!+...+1/n!+..., n→∞ ，分两个函数计算正数的加法和除法 //bit为精确到小数点后的位数，datas为需要输出到的字符串的指针（datas至少要有bit+3个元素） void add(char *data,char *dataed,int bit); void reciprocal(char *data,int bit,int num);  void get_loge(int bit,char* datas) { 	bit++; 	char *data=new char[bit];     char *dataed=new char[bit]; 	memset((void*)dataed,0,bit); 	for(int i=0;i<bit;i++)     { 		reciprocal(data,bit,i+1);         add(data,dataed,bit);     } 	delete[] data;     dataed[0]=dataed[0]+1; 	//输出处理 	datas[0]=dataed[0]+'0'; 	datas[1]='.';     for(int j=2;j<=bit;j++) 		datas[j]=dataed[j-1]+'0'; 	datas[bit+1]='\0';     delete[] dataed; }   //以下2个函数是get_loge函数内调用的函数，实现加法和除法运算 void reciprocal(char *data,int bit,int num) { 	int quotient,remainder;     memset(data,0,bit);     *data=1;     for(int i=1;i<=num;i++)     { 		remainder=0;         for(int k=0;k<bit;k++)         { 			quotient=remainder*10+data[k]; 			remainder=quotient%i; 			quotient=quotient/i; 			data[k]=quotient; 		}     } }  void add(char* data,char* dataed,int bit) {     int flag=0,b_flag;     for(int i=bit-1;i>=0;i--)     { 		if(data[i]+dataed[i]+flag>=10) 			b_flag=1;         else 			b_flag=0; 		dataed[i]=(dataed[i]+data[i]+flag)%10; 		flag=b_flag;          }      }

user: user-2
content: #include <stdlib.h> #include <stdio.h>  int main(int argc, char *argv[]) {     int i = 1;     double sum = 1.0;     //前50项和     for(i = 1; i < 50; i ++)     {         sum +=(1.0/(double)i);     }     printf("%10.10f\n", sum);     i = 1;     sum = 1.0;     //值小于10的-6次方的和     while(i <= 1000000)     {         sum += (1.0/(double)i);         i ++;     }     printf("%10.10f\n", sum);     return 0; }

user: user-3
content: 简单些直接相除，相加,注意要用浮点除法 复杂的（要求严格精确的求出到某一位的值）采用大数运算（+，-,*,/）

user: user-4
content: #include <stdio.h> void main() { 	int i,N; 	N=50; 	float  e=1.0; 	float count=1; 	for (i=1;i<N;i++) 	{ 		count*=i; 		e+=1/count; 	} 	printf("前%d项得到的e的值为：%f",N,e); } #include <stdio.h> void main() { 	int i; 	i=1; 	float  e=1.0; 	float count=1; 	do  	{ 		count*=i++; 		e+=1/count; 	} while (1/count>=1e-6f); 	printf("前%d项得到的e的值为：%f",i,e); }

user: user-5
content: 我这里都保留了10位小数，以下是代码 #include "stdio.h" int main() { 	int i,n; 	double sum = 0.0, last_fact = 1.0; 	printf("请输入要计算前几项的和:"); 	scanf("%d", &n); 	for(i = 1; i <= n; i++) 	{ 		sum += 1 / last_fact; 		last_fact = last_fact * i; 	} 	printf("前%d项的倒数和为:%.10lf\n", n, sum); 	printf("------------------分隔----------------------\n"); 	i = 1; 	sum = 0.0; 	last_fact = 1.0; 	while((1 / last_fact) >= 0.000001) 	{ 		sum += 1 / last_fact; 		last_fact = last_fact * i; 		i++; 	} 	printf("前%d项的倒数和为:%.10lf\n", i, sum); } 运行结果：
user-0 提问: C语言李白打酒蓝桥杯  真的不太懂递归调用，希望大神帮帮我 感激不尽

回复:
user: user-1
content: int fum(int i, int store, int flower, int wine) {     if(store > 5 || flower > 9)     {         return sum;     }     else if(wine == 1 && store == 5 && flower == 9)     {         printf("%s\n", str);         return ++ sum;     }     str[i] = 'a';     fum(i + 1, store + 1, flower, wine * 2);     str[i] = 'b';     fum(i + 1, store, flower + 1, wine - 1);     return sum; }  int main(int argc, char *argv[]) {     str[14] = 'b';     printf("%d\n", fum(0, 0, 0, 2));     return 0; }  1、楼主的返回条件稍微有点问题，这个if((store>5)(flower>10))return;中间不加||可以运行么？ 2、其实楼主不需要判断i是多少，因为按照正常情况store和flower减完，i刚好是这个值，如果某一个数不减完a也不会越界，如果减完了就直接返回了。 3、a[14]='b'是必然条件，因此无需进行判断。

user: user-2
content: #include<stdio.h>  int sum=0; int f(int a,int b,int c){  // a:店的总数 b:花的总数减1 c:酒的初值 // 任何初始状况，都有两个可能：先遇到店，或者先遇到花    if(a>0)      f(a-1,b,c*2); // 逢店加一倍    if(b>0)      f(a,b-1,c-1); // 遇花喝一斗    if(a==0&&b==0&&c==1) //这个是满足要求的终止条件。没有店剩下，还剩一朵花和一斗酒      sum=sum+1;     return sum; } int main() { 	int numstore,numflower,jiu; 	printf("输入遇到店的次数："); 	scanf("%d",&numstore); 	printf("输入遇到花的次数："); 	scanf("%d",&numflower); 	printf("输入酒的初值："); 	scanf("%d",&jiu);     f(numstore,numflower-1,jiu);     printf("%d\n",sum); 	return 0; }

user: user-3
content: 加几个断点调试下  看看参数变化  在纸上自己画画逻辑
user-0 提问: C语言如何在一个32位数据中让第15位置0

回复:
user: user-1
content: 低位从0位开始的话，那就把1右移15位，变成...0000 1000 0000...，再按位取反变成...1111 0111 1111...，再和目标数按位与，就ok啦。      int ua = 01;     int nA = 0x1c001;     int nB = (~(ua<<15))&nA;     printf("%8x\n%8x\n", nA, nB);

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

user: user-3
content: 引用 8 楼 qq_15437221 的回复:怎么不是移动14位？1向左移动14位，结果就是15位上是1，其余都是0

user: user-0
content: 怎么不是移动14位？

user: user-2
content: a &= ~(1 << 15);

user: user-4
content: 让这个数与一个15位为0，其他位为1的数作 & 运算，至于这个数的十六进制或者十进制是多少，用可以用系统计算器 或者一个更好的办法就是直接移位取反得到这个数

user: user-5
content: 有专用的汇编指令   	int a = 0xfefe; 	__asm 	{ 		lea eax, a 		btr dword ptr [eax], 14 //把第15位设为0,0....14 	}

user: user-3
content: 第一行改成这样比较好 unsigned int n = 1UL << 14; // 二进制就是 0000 0000 0000 0000 0100 0000 0000 0000

user: user-6
content: a &= ~(1 << 14);

user: user-3
content: 仅供参考 	unsigned int n = 0X4000; // 二进制就是 0000 0000 0000 0000 0100 0000 0000 0000 	n = ~n ;			     // 取反，用来与原数据与操作 	int x = 0XFF00;          // 示例数据x      0000 0000 0000 0000 1111 1111 0000 0000 	x &= n;					 // 按位与之后就是 0000 0000 0000 0000 1011 1111 0000 0000 	return 0;

user: user-7
content: 用二进制bit操作
user-0 提问: 关于有些算法的困惑

回复:
user: user-0
content: 引用 1 楼 qq_34026771 的回复:知道买油翁吧，有句话叫唯手熟尔，编程也一样，写的多了，看得多了，就能摸到他的思想，进而掌握甚至创新，加油！！！我也基本上想通了，为什么说学习编程数学很重要，就像数学中的难题，有时候某些题目别人能想出来的自己就是想不出来，就如这个算法一般，想不出来这个算法，就是不知道为什么别人这样想，怎么样得到的这个思路能把这个算法写出来，其实说数学号重要的是是思想，哈哈，自嘲一下，还是算法水平不够，以后多加油

user: user-0
content: 引用 1 楼 qq_34026771 的回复:知道买油翁吧，有句话叫唯手熟尔，编程也一样，写的多了，看得多了，就能摸到他的思想，进而掌握甚至创新，加油！！！嗯嗯，谢谢你

user: user-0
content: 引用 2 楼 kulouzuan 的回复:我也是这样，估计和高中有些难题一样   都是有套路的，我们估计是记住这些固有的套路    熟了之后再去灵活运用。嗯，是的，就像你说的这些难题，只是记住了套路，记住作者写出的这个算法的让数据的变化过程，而不是根据像已经理解，脑海中有深刻印象，已经掌握的算法来根据思路写代码，谢谢你，这个套路我觉得你说的应该是数学，这里用好像不太准确，数学做题的话某种类型的有某种类型的套路，但是算法千变万化有很多个问题需要去想出不同的算法，当然有的类型想象的稍微修改一下已知的算法就可以，可能你说的某种意义上也是对的！

user: user-1
content: 我也是这样，估计和高中有些难题一样   都是有套路的，我们估计是记住这些固有的套路    熟了之后再去灵活运用。

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

user: user-3
content: 知道买油翁吧，有句话叫唯手熟尔，编程也一样，写的多了，看得多了，就能摸到他的思想，进而掌握甚至创新，加油！！！
user-0 提问: C语言，函数怎么返回完整的字符数组,实现值传递？

回复:
user: user-1
content: C++比C方便的一个地方就是 C语言中，动态分配 内存，手工管理，很麻烦  C++直接用构造函数，析构函数，解决了，动态内存的分配和释放问题 可以不必手动写代码，单独释放每块内存， 一个类只需要一次分配，一次释放， 就可以解决每个对象的一个指针成员的内存分配释放问题。  用C的话，很难达到这个目的

user: user-2
content: 既然赵老师都发言了，朕也来说几句。 楼主的这个问题，不是C的问题，是人的问题。这个问题压根儿就不该分三个函数解决，在一个函数内解决最好。真不知道楼主是怎么想的。如果说是搭框架，只能说这个框架搭得不合理。

user: user-0
content: 感谢各位高手的指点！我小结下大家的建议： 1======.firmbank的方法在子函数内部定义静态的全局数组，感觉数组大小也不能准确确定，并且耗费空间大===============  function1  function2  function3   里的返回字符串使用静态就好，比如： char * function1 ( char * s ) {     static char ret[100];     ......     return ret; } 2.=====iyomumx的方法感觉是常用的方法，但在主函数中怎么能事先分配刚好返回结果那么大的空间让我困惑====== 如果一个C++函数是： string F(const string&) 那么对应C函数应该像这样： int F(char * dst, const char * src) 内存分配不由函数负责，而是外部传入预先分配好的内存的指针在函数里使用 3.==================lm_whales的方法很有新意，模拟的“string”,形式上与c++，c#习惯类似，不知道这是不是最好的==== typedef struct  { int len; char *s; } dynString;  /// 用这样一个结构模拟 string 就可以了 /// 例如 合并字符串  dynString mergeStr( dynString *a,dynString *b){ dybString ds;   if(a==NULL||b==NULL){ ds->len =0; ds->s=NULL; return ds;                                        }   ds.len= a->len+b->len; ds.s =malloc(ds.len+1); strcpy(ds->s,a->s); strcat(ds->s,b->s);  return ds; } ========================= 再次感谢各位的耐心指点！

user: user-1
content: typedef struct  { int len; char *s; } dynString;  /// 用这样一个结构模拟 string 就可以了 /// 例如 合并字符串  dynString mergeStr( dynString *a,dynString *b){ dybString ds;  if(a==NULL||b==NULL){ ds->len =0; ds->s=NULL; return ds;                                        }  ds.len= a->len+b->len; ds.s =malloc(ds.len+1); strcpy(ds->s,a->s); strcat(ds->s,b->s);  return ds; }  注意，返回值在不用的时候，释放内存。

user: user-3
content: 要操作的先申请好内存吧

user: user-4
content: 思考一下为什么不把整个互联网内容当作函数参数传来传去呢？

user: user-0
content: 引用 6 楼 lee790608 的回复:动态分配？！ 不要太基础吧。。。 (char*)malloc( n * sizeof(char)) 关键是调用函数之前就分配内存，怎么知道这里的n,等于多少呢？

user: user-5
content: 动态分配？！ 不要太基础吧。。。 (char*)malloc( n * sizeof(char))

user: user-0
content: 引用 3 楼 iyomumx 的回复:如果一个C++函数是： string F(const string&) 那么对应C函数应该像这样： int F(char * dst, const char * src) 内存分配不由函数负责，而是外部传入预先分配好的内存的指针在函数里使用 另外，还请教下，如果统计用这种格式，要调用系统函数 extern char *strcat (char *s1, char *s2); 由于这个函数形式不一样，是返回一个指针，那怎么统一呢？谢谢

user: user-0
content: 引用 3 楼 iyomumx 的回复:如果一个C++函数是： string F(const string&) 那么对应C函数应该像这样： int F(char * dst, const char * src) 内存分配不由函数负责，而是外部传入预先分配好的内存的指针在函数里使用 谢谢指点！感觉你的写法就是C的标准库常用的手段，但这样在外部分配内存时，我一般只会用定义字符数组的方式，char shuz[100],这里的100是估计的一个值，有可能大了，也可能小了，有什么办法能动态分配吗？确实基础差，请教了。

user: user-6
content: 如果一个C++函数是： string F(const string&) 那么对应C函数应该像这样： int F(char * dst, const char * src) 内存分配不由函数负责，而是外部传入预先分配好的内存的指针在函数里使用

user: user-7
content: function1  function2  function3   里的返回字符串使用静态就好，比如： char * function1 ( char * s ) {     static char ret[100];     ......     return ret; }

user: user-8
content: 那你应该需要重新分配内存了啊
user-0 提问: 关于指向字符指针（字符串数组）的指针问题

回复:
user: user-0
content: 我对二级指针已经明白了，p和name+1一致是因为我在程序中写的p=name+1;  那为什么写p=&(name+1),会报错？  错误类型：error C2102: '&' requires l-value  ，说&需要一个左值？

user: user-0
content: 也就是说用指针指向字符串再用%c会导致溢出，是因为*p中存放的是字符串的首地址，  还有一个问题，p是指向指针的指针，那name是因为作为字符数组指针，才和p的作用一致的么？可是p指向name，为什么他们的作用一样？   请见程序倒数第二行和第四行，其中**p等同于**（name+1），为什么？

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

user: user-2
content: printf("%c",*p) ；把字符串 “Good job”的地址，当作字符输出, 该地址被截断，其中(最低)8Bits 被看成字符'\\' 所以 输出\

user: user-0
content: 确实，没注意到，可即使改成char,结果也没有变化的

user: user-3
content: 你知不知道你的指针O是用int 写的？

user: user-0
content: 顶   "快来人啊"
user-0 提问: hdu 2078 超级水， 但就是不对，找不到错误啊

回复:
user: user-1
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-0 提问: 为什么强制类型转换中间打印出来的数字不对，最后函数返回值又是对的？

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

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

user: user-2
content: 哦，还可以这样。。。。之前没见过

user: user-3
content: 你存放的是int类型，但是你在使用打印的时候按照float类型来解释而已。就这么简单。你可以试试这句printf("%f",3);你就能理解了。

user: user-4
content: 传入参数类型与所需打印的参数类型不一致，导致printf根本不知道该怎么打印。

user: user-5
content: 这个和强制转换没有关系啊。。你把整型用%f格式打，，编译器就不开心了呗。。打0给你看。。 这个就好比，你叫你女朋友（假设有），叫成她闺蜜的名字，，她会给你好脸色。。。  至于最后的结果。。其实你只是叫对了她的名字或者你对这她闺蜜叫对了闺蜜的名字。。。（函数返回float，你用%f的格式。。）
user-0 提问: typedef后为什么还要用stuct XXX*   定义指针

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:因为它出现在完整的typedef前，编译器还不认识StNode；但struct StNode的声明已经出现，可以使用。  原来是这样，谢谢了

user: user-1
content: 因为它出现在完整的typedef前，编译器还不认识StNode；但struct StNode的声明已经出现，可以使用。
user-0 提问: 请求程序代码

回复:
user: user-1
content: 楼上干的挺好的

user: user-2
content: #include<iostream> using namespace std;  int main() { 	int min_num,max_num,sum_num = 0,people_num,cur_num; 	cout << "输入评委人数："; 	cin >> people_num; 	for(int i = 0; i < people_num; i++) 	{ 		cout << "输入评分："; 		cin >> cur_num; 		sum_num += cur_num; 		if(i == 0) 		{ 			min_num = cur_num; 			max_num = cur_num; 		} 		if(cur_num < min_num) 			min_num = cur_num; 		else if(cur_num >max_num) 			max_num = cur_num; 	} 	cout << "平均分是：" << double(sum_num - min_num - max_num) / (people_num - 2) << endl; 	system("pause"); 	return 0; }
user-0 提问: 为什么strlen的记过不正确？

回复:
user: user-1
content: 引用 5 楼 qq_34057138 的回复:谢谢提醒。对对，哎。人一时糊涂，什么错误都容易犯了。尾零\0忘记了。现在正确了。上正确的代码  #include <stdio.h> #include <string.h> int main() {         char character,a[81];         int n=0;         while (character != '\n')         {                    character = getchar();                 a[n]=character;                 n++;         }            n=n-1;         a[n]='\0';//这个地方需要注意的。添加'\0'，才能正确计算。         printf("%d\n",strlen(a));         printf("%d\n",strlen("helloworld"));         printf("%s",a); }    楼主其实最好char a[81] = {0}; 对数组一开始就初始化

user: user-0
content: 谢谢提醒。对对，哎。人一时糊涂，什么错误都容易犯了。尾零\0忘记了。现在正确了。上正确的代码  #include <stdio.h> #include <string.h> int main() {         char character,a[81];         int n=0;         while (character != '\n')         {                    character = getchar();                 a[n]=character;                 n++;         }            n=n-1;         a[n]='\0';//这个地方需要注意的。添加'\0'，才能正确计算。         printf("%d\n",strlen(a));         printf("%d\n",strlen("helloworld"));         printf("%s",a); }

user: user-2
content: a[n] = '\0';

user: user-3
content: 有bug，strlen()是以'\0'结束的，但是你定义的数组a都没有'\0'，所以计算strlen(a)结果是不确定。

user: user-0
content: 我将a[/n]=0注释掉了，结果还是11

user: user-1
content: 因为你最后手动的加入了一个\n,这个换行符是会被计算在strlen的长度里的，所以是11 而"helloworld"末尾会自动加入一个'\0',这个是不会被计算在strlen里的，所以是10
user-0 提问: 为什么我用网上下的bmp的图片没有效果？用自己在资源Bitmap画的图就有效果了？

回复:
user: user-0
content: 主要是图片大小问题，貌似自己写的Window编程只可以要32一下的，但是MFC可以较大的

user: user-1
content: 因为一个是16位一个不是16位？

user: user-2
content: 谁知道你那个 bmp 只是有着 bmp 扩展名的皮还是真的 bmp (文件头2字节为BM) 文件

user: user-3
content: 网上下载的要注意一下格式，我一直都是用用GIMP打开并导出为24bits的格式，再使用的。

user: user-4
content: hinst：处理包含被装载图像模块的实例。若要装载OEM图像，则设此参数值为0。 lpszName：处理图像装载。如果参数hinst为non-NULL ，而且参数fuLoad省略LR_LOADFROMFILE的值时，那么参数lpszName是一个指向保留在hinst模块中装载的图像资源名称，并以NULL为结束符的字符串。 如果参数hinst为空，并且LR_LOADFROMFILE未被指定，那么这个参数低位字一定是被装载的OEM图像标识的。OEM图像标识符是在WINUSER.H头文件中定义的，下面列举出前缀的含义： OBM_ OEM：位图；OIC_OEM图标；OCR_OEM：光标。 如果参数fuLoad包含LR_LOADFROMFILE值，那么参数lpszName是包含有图像的文件名。 uType：指定被装载图像类型。此参数可以为下列值，其含义如下： IMAGE_BITMAP：装载位图；IMAGE_CURSOR：装载光标；IMAGE_ICON：装载图标。 cxDesired：指定图标或光标的宽度，以像素为单位。如果此参数为零并且参数fuLoad值为LR_DEFAULTSIZE，那么函数使用SM_CXICON或SM_CXCURSOR系统公制值设定宽度；如果此参数为零并且值LR_DEFAULTSIZE没有被使用，那么函数使用目前的资源宽度。 cyDesired：指定图标或光标的高度，以像素为单位。如果此参数为零并且参数fuLoad值为LR_DEFAULTSIZE，那么函数使用SM_CXICON或SM_CXCURSOR系统公制值设定高度；如果此参数为零并且值LR_DEFAULTSIZE没有被使用，那么函数使用目前的资源高度。 fuLoad：根据下面复合值列表指定函数值，值含义如下： LR_DEFAULTCOLOR：缺省标志；它不作任何事情。它的含义是“无LR_MONOCHROME”。 LR_CREATEDIBSECTION：当参数uType指定为IMAGE_BITMAP时，使得函数返回一个DIB部分位图，而不是一个兼容的位图。这个标志在装载一个位图，而不是映射它的颜色到显示设备时非常有用。 LR_DEFAULTSIZE：若 cxDesired或cyDesired被设为零，使用系统指定的公制值标识光标或图标的宽和高。如果这个参数不被设置且cxDesired或cyDesired被设为零，函数使用实际资源尺寸。如果资源包含多个图像，则使用第一个图像的大小。 LR_LOADFROMFILE：根据参数lpszName的值装载图像。若标记未被给定，lpszName的值为资源名称。 LR_LOADMAP3DCOLORS：查找图像的颜色表并且按下面相应的3D颜色表的灰度进行替换。 颜色替代：Dk Gray RGB（128，128，128）COLOR_3DSHADOW；Gray RGB（192，192，192）COLOR_3DFACELt Gray RGB（223，223，223） COLOR_3DLIGHT LR_LOADTRANSPARENT；找到图像中的一个像素颜色值并且根据颜色表中系统的缺省颜色值替代其相应接口的值。图像中所有使用这种接口的像素的颜色都变为系统的缺省窗体颜色。此至仅用来申请相应的颜色表。 若fuLoad包括LR_LOADTRANSPARENT和LR_LOADMAP3DCOLORS两个值，则LRLOADTRANSPARENT优先。但是，颜色表接口由COLOR_3DFACE替代，而不是COLOR_WINDOW。 LR_MONOCHROME：装载黑白图。 LR_SHARED：若图像将被多次装载则共享。如果LR_SHARED未被设置，则再向同一个资源第二次调用这个图像时就会再装载一遍这个图像且返回不同的句柄。 不要对不同标准尺寸的图像使用LR_SHARED，装载后可能会有改变，或是从文件中被装载。

user: user-5
content: 试试_T("bitmap1.bmp"),
user-0 提问: 帮我看一下什么意思啊？似乎好像是说未声明标示符

回复:
user: user-1
content: Gamemaps没定义，如果在其他文件中定义，请包含该头文件，或者extend

user: user-2
content: 提示说的很明白，你没有定义过Gamemaps这个变量

user: user-0
content: c:\users\administrator\desktop\贪吃蛇.cpp(7) : fatal error C1083: Cannot open include file: 'resource.h': No such file or directory 又出现这个

user: user-3
content: 一般是没有包含资源文件，在这个对话框的头文件首位包含：#include "resource.h"可以解决 附网络上的其他人解释1： 1.出错文件中没有包含资源文件ID声明的resource.h文件。在出错文件中加入#include "resource.h"语句。 2.工程附件包含目录的路径下没有resource.h文件。修改路径即可。 3. 工程所在文件夹下存在resource.h文件，但其中没有资源ID的定义，导致真正的resource.h没有包含进去，删除之。一个解决方案里面有多 个工程，可能会把所有资源ID的声明放到一个文件中。在各个工程中实现对话框功能的文件中，只需包含该文件即可。但是，当新增某个资源以后，工程中会自动 生成一个resource.h(不知道为什么会这样)，而不是在已有的resource.h文件中添加ID的定义。由于工程编译的时候先从本地搜索头文 件，会包含了自动生成的头文件，于是出现了上述错误。 4.有个用QT的，XXX.h 里面添加 include “ui_XXX.h”，然后在对应的XXX.cpp文件中，添加 include “XXX.h”  （注 XXX表示自己取名的项目名称）
user-0 提问: atoi函数利用atof转s为整型

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

user: user-2
content: 结果是123，如果要转换浮点数用atof

user: user-3
content: 结果是：123

user: user-4
content: 一般都是截断取整，除非整数范围溢出
user-0 提问: 关于syslog打印出来日志太短的问题

回复:
user: user-1
content: 引用 4 楼 yupengchen1985 的回复:我是楼主， 有没有人知道呀 ？如果 syslog要一次打印一些比较长的日志，需要做什么参数配置的？ 先暂时将超长日志分成多条不超长的日志，这是我给你的一条建议。

user: user-0
content: 我是楼主， 有没有人知道呀 ？如果 syslog要一次打印一些比较长的日志，需要做什么参数配置的？

user: user-0
content: 谢谢楼上 。。。但还是要用到syslog比较好，毕竟是系统封装好的日志。

user: user-1
content: 改用我这个土造MyLog！ #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-78行添加到你带main的.c或.cpp的那个文件的最前面 //81-85行添加到你的main函数开头 //89-93行添加到你的main函数结束前 //在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中  尺有所短，寸有所长。

user: user-0
content: 是不是系统默认syslog的写入缓冲区太小，导致一次性不能写入太长的日志？
user-0 提问: 怎样用C编程解这道智力游戏题？

回复:
user: user-1
content: 状态空间搜索。

user: user-2
content: 1，设置坐标，移动一次相应的坐标（x、y）进行改变，红色坐标设为（0，0），然后根据条件进行判断就行了， 2，图遍历算法

user: user-3
content: 把格子用数组存取在栈中，然后遍历就可以了
user-0 提问: atoi函数 关于return sign*n

回复:
user: user-1
content: 如果我的s[]是 空格-5空格-5空格4空格3 那结果输出什么? 得到的结果是-5 首先跳过开头的所有空格，往后走 接下来，如果有正负号，就记下来，往后走；如果不是正负号，就作为正数，往后走 最后，把连续的数字字符转换成一个数 遇到非数字字符，就不再往后检查了 返回加上符号的结果

user: user-2
content: -5  第一条for语句跳过空格，执行之后i是第一个负号的下标。  if语句跳过符号，执行之后i是第一个5的下标。  第二条for语句计算一串数字的值，碰到非数字结束，执行之后i是第二个空格的下标。

user: user-1
content: 引用 4 楼 labuboco 的回复:引用 3 楼 labuboco 的回复:能不能写个调用函数的代码 我想试一下这个函数，自己写的总是无法运行想写个main调用这个函数测试一下，自己不会，能帮写一下吗  #include <stdio.h>  int main() {     char    s[20] = "    -56abc 34";     int    i;      i = atoi(s);     printf("%d\n", i);      return 0; }

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

user: user-0
content: 引用 3 楼 labuboco 的回复:能不能写个调用函数的代码 我想试一下这个函数，自己写的总是无法运行想写个main调用这个函数测试一下，自己不会，能帮写一下吗

user: user-0
content: 引用 2 楼 wang0635 的回复:如果我的s[]是 空格-5空格-5空格4空格3 那结果输出什么? 得到的结果是-5 首先跳过开头的所有空格，往后走 接下来，如果有正负号，就记下来，往后走；如果不是正负号，就作为正数，往后走 最后，把连续的数字字符转换成一个数 遇到非数字字符，就不再往后检查了 返回加上符号的结果想写个main调用这个函数，总运行不了 能帮写一下吗举手之劳 好人一生平安

user: user-0
content: 能不能写个调用函数的代码 我想试一下这个函数，自己写的总是无法运行
user-0 提问: Int问题 

回复:
user: user-1
content: 出错的原因是你的i没有初始化，和你定义变量几行没关系

user: user-2
content: 显然和放一行或两行没有关系。

user: user-3
content: 楼主的i没有赋初值就使用，有些编译器会提前处理然后给出错误。跟是否是int m,n;无关。

user: user-4
content: 你两个都是错的原因都一样 i 没有初始化

user: user-5
content: 试着将i 初始化为0

user: user-6
content: 是不是i变量等没有初始化

user: user-7
content: LZ我用VS2012编译运行以后，两种方式都是报错的。。。。
user-0 提问: 飞机游戏代码逻辑问题

回复:
user: user-1
content: 这是错误是不是逻辑上的

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

回复:
user: user-1
content: 不是点运算，只是一种声明同时给结构体赋值的简易写法，否则你只能写成下面这样， debugconf_t debugconf ;  debugconf.syslog_facility = 0; debugconf.log_stderr = 1; debugconf.log_syslog = 0;  不用分什么内核不内核

user: user-2
content: http://blog.csdn.net/wenlifu71022/article/details/4146521

user: user-3
content: 定义+初始化

user: user-4
content: 这个一般是内核会用到的代码 它是ISO C99标准 内核采用这种方式的优势就在于由此初始化不必严格按照定义时的顺序，这带来了极大的灵活性，你以后会体会到的~~~ 你也可以如下面这样写： debugconf_t debugconf = { .syslog_facility = 0 .log_stderr = 1, .log_syslog = 0, }; 顺序可以调换，也可以部分成员初始化
user-0 提问: 关于链表保存进文件的问题

回复:
user: user-1
content: 内存中的next是内存地址 文件中的next是文件偏移量

user: user-2
content: 想保存什么东西， 看着怎么想保存指针，不是应该是内容么？

user: user-3
content: 乱码数据应该是Stu结构体中的变量struct studentnod *next;导致的。 因为这个变量是个地址，不可显示，所以乱码。  只要写文件时不写这个变量就好了。

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

user: user-4
content: 链表的指针不能保存的，需要将读出来的结构体装入malloc的空间后再接起来。不是说你看到乱码就是读写有问题，除非是文本文件，否则不要在意什么乱码

user: user-5
content: 楼主可以理解 1、fwrite就是相当于从结构体head开始，读取sizeof(head)字节数据，写入到文件。 2、在C语言中结构体还涉及到内存对其的问题。sizeof(head)=28 3、根据以上想法，楼主在写出的时候，如果不希望出现乱码，就需要将写出的所有内存空间填入字符。才能保证没有写出乱码的情况。  按照楼主的写法，肯定会出现乱码。如果楼主不需要最后next的内存空间，在赋值之前，使用memset将&head地址开始的内存空间赋值为'\0'。  	memset(p, '\0', sizeof(Stu)); 	strcpy(p->NO ,"abcd"); 	strcpy(p->password ,"efgh");  fwrite(head, sizeof(Stu) - sizeof(struct studentnod *), 1, fp); 这样写出的结果就是这个样子的： 十六进制查看：  正常查看：

user: user-6
content: 链表有两种写入文件的方式 1）第一种非常简单 把所有数据存入文件，不管链表结构 2）第二种，维持链表结构存入文件 需要记录每个节点在文件中的位置，用以代替指针 不论如何，不能把内存指针存入文件。
user-0 提问: 求助：从文件读取数据并排序的问题

回复:
user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:在现实世界中，除时间和空间可能是无限的以外，其它任何事物都是有限的。 也是哈。谢谢。

user: user-1
content: 在现实世界中，除时间和空间可能是无限的以外，其它任何事物都是有限的。

user: user-0
content: 引用 3 楼 user-2 的回复:[quote=引用 2 楼 chengeng_jd 的回复:] 感觉这个步骤太繁琐了，在判断下一步该读A还是读B的同时还夹杂判断当前文件是否结束。 不知道有无更好的简洁的思路。 那就用C++吧： merge(istream_iterator<int>(ifstream("a.txt")), istream_iterator<int>(), istream_iterator<int>(ifstream("b.txt")), istream_iterator<int>(), ostream_iterator<int>(ofstream("c.txt"), " ")); 你觉得C实现这一行需要写多少代码？[/quote]  谢谢。

user: user-2
content: 引用 2 楼 chengeng_jd 的回复:感觉这个步骤太繁琐了，在判断下一步该读A还是读B的同时还夹杂判断当前文件是否结束。 不知道有无更好的简洁的思路。 那就用C++吧： merge(istream_iterator<int>(ifstream("a.txt")), istream_iterator<int>(), istream_iterator<int>(ifstream("b.txt")), istream_iterator<int>(), ostream_iterator<int>(ofstream("c.txt"), " ")); 你觉得C实现这一行需要写多少代码？

user: user-0
content: 引用 1 楼 user-2 的回复:你的思路没有什么问题，把读取和写入分开一点就好了： 1.从A读取一条记录，填入缓冲区A；从B读取一条记录，填入缓冲区B。 2.比较AB缓冲区的内容，选择一条写入文件C，再从对应的文件读取一条记录填充对应的缓冲区。 3.如果AB任何一个文件达到EOF，就重复读取、写入操作，直到另一个文件也达到EOF。  感觉这个步骤太繁琐了，在判断下一步该读A还是读B的同时还夹杂判断当前文件是否结束。 不知道有无更好的简洁的思路。

user: user-2
content: 你的思路没有什么问题，把读取和写入分开一点就好了： 1.从A读取一条记录，填入缓冲区A；从B读取一条记录，填入缓冲区B。 2.比较AB缓冲区的内容，选择一条写入文件C，再从对应的文件读取一条记录填充对应的缓冲区。 3.如果AB任何一个文件达到EOF，就重复读取、写入操作，直到另一个文件也达到EOF。
user-0 提问: 求解C语言复试真题

回复:
user: user-1
content: 根据表达式构建表达式二叉树。 符合展开形式的二叉树，每个结点的右子结点不是空就是数字，或者比当前结点优先的高级运算符，不会是同级或者低级运算符。 对不符合展开形式的结点，做变换。
user-0 提问: 菜鸟求助，关于C语言gets函数问题，很奇怪！

回复:
user: user-1
content: 引用 3 楼 galiniur0u 的回复:经常有人问这个问题啊，请参考zhao4zhong1老师的答复：http://bbs.csdn.net/topics/390942458。 新版在此：  在每个最后不带\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: 经常有人问这个问题啊，请参考zhao4zhong1老师的答复：http://bbs.csdn.net/topics/390942458。

user: user-3
content: 不用纠结这类问题，不同的系统对应的输入方式也会不同，如果是应对考试的话那记住就行了，不用深究

user: user-4
content: 程序的输入都建有一个缓冲区，即输入缓冲区。 假设楼主按下45回车，输入缓冲区就保存了45\n,然后scanf从输入流缓冲区中读取值，而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(\n)而结束，这个回车(\n)并没有被读取掉，所以第一次接受输入时取走字符后会留下字符\n(此时输入缓冲区只剩一个\n) 此时执行到gets这里了,gets可接受回车键之前输入的所有字符,并将回车读走，.回车键不会留在输入缓冲区中,所以a里并没有读取到数据，看起来像是跳过了 所以解决方法是将输入缓冲区中的\n给读走,这里我一般是用以下两种方法的: 1.scanf("%d", &n);改成scanf("%d%*c", &n); //%*c匹配任意一个字符，这里是匹配\n,这样输入缓冲区中的\n就没有了 2.scanf("%d", &n);下面加一句getchar(); //道理也是一样的，读取掉\n
user-0 提问: 使用结构声明了两个同样的变量，第一个可以用，第二个不可以了，望大神指导。

回复:
user: user-0
content: 引用 7 楼 galiniur0u 的回复:楼主之前运行打印出ccccccc也是楼主人品比较高么？我直接就崩溃了。 结构体指针各种不申请内存空间就用，这样不好吧..... int main(){     LinkQueue* q = (LinkQueue*)malloc(sizeof(LinkQueue));     InitQueue(q);     BiTree p = (BiTree)malloc(sizeof(BiTreeNode));     p->data = 'a';     printf("cccccccccccccccccc\n");     BiTree t = (BiTree)malloc(sizeof(BiTreeNode));;     t->data = 'c';     return OK; }  谢谢您的指导，嗯，确实是这个原因

user: user-0
content: 引用 6 楼 hzk745 的回复:贴的这个代码是不是不是最终运行的代码啊？ 这个代码应该 编译不过啊  首先谢谢您的指导。现在知道是哪里错了，不过当初我也不知道他怎么还能运行，不过确实是相应的代码的运行结果

user: user-1
content: InitQueue(q);  这里传入的参数类型都和形参不一至

user: user-2
content: 楼主之前运行打印出ccccccc也是楼主人品比较高么？我直接就崩溃了。 结构体指针各种不申请内存空间就用，这样不好吧..... int main(){     LinkQueue* q = (LinkQueue*)malloc(sizeof(LinkQueue));     InitQueue(q);     BiTree p = (BiTree)malloc(sizeof(BiTreeNode));     p->data = 'a';     printf("cccccccccccccccccc\n");     BiTree t = (BiTree)malloc(sizeof(BiTreeNode));;     t->data = 'c';     return OK; }

user: user-3
content: 贴的这个代码是不是不是最终运行的代码啊？ 这个代码应该 编译不过啊

user: user-0
content: 引用 2 楼 qq423399099 的回复:我用的LZ给的代码，跑到InitQueue(q);就崩了  应该如何解决您知道吗 ，为什么会出现这样的错误呢

user: user-0
content: 引用 1 楼 user-5 的回复:可以执行!=没有错误 使用指针之前请保证它有合法值。 main里的三个指针都没有合法值。  不好意思，还有一个问题忘了写，为什么第27行的指针q，没有使用malloc分配空间，但是却可以对他的元素front和rear进行操作呢。

user: user-0
content: 引用 1 楼 user-5 的回复:可以执行!=没有错误 使用指针之前请保证它有合法值。 main里的三个指针都没有合法值。  非常感谢大神的指导，写了一个为指针分配空间的函数(使用malloc),问题就解决了。非常感谢，但是奇怪的是没有写之前第一个竟然可以通过。。还想请教大神一个问题，在声明了结构体的指针后，系统是怎么为指针分配空间的。

user: user-4
content: 我用的LZ给的代码，跑到InitQueue(q);就崩了

user: user-5
content: 可以执行!=没有错误 使用指针之前请保证它有合法值。 main里的三个指针都没有合法值。
user-0 提问: uva227求教。

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

user: user-2
content: 建议自己单步调试程序，看程序一步步怎么执行的，而不要看着代码空想

user: user-0
content: 刚学没多久，希望能够指点