Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: strlen函数返回值为？

回复:
user: user-1
content: 我发现如果拿一个字面量常数直接和strlen(p)比较，就会自动把这个strlen(p)换成整型的，但是如果我拿一个整型变量和strlen(p)比较大小，就会出错！调试的时候说无法显示他们比较结果的类型，必须加个强制类型转换！惊呆了，写了两年，头一次发现

user: user-2
content: 引用 9 楼 weixin_37836059 的回复:调试的时候能看到plan里面是我输入的一串数字 我之前把LINE-1改成30了，现在运行特别正常，就是调试的时候能看到strlen还是返回<void> 真搞不明白明明都是<void>了，还能跟30比较大小= = 你调试的时候是不是没有输入，所以strlen得到是null

user: user-3
content: 1、tcp->content[i].plan空间要大于30，否则输入时会越界  2、在DEBUG下调试程序，strlen返回值是int，你看到的可能是个假象

user: user-4
content: strlen(tcp->content[i].plan)  调用这一句之前, 你需要检查这些东西: 1.   tcp  这个指针是否为空 2.  content中到底有几个数据,  i是否会导致越界. 3. plan 到底是什么数据, 是否会有\0结尾.

user: user-0
content: 调试的时候能看到plan里面是我输入的一串数字 我之前把LINE-1改成30了，现在运行特别正常，就是调试的时候能看到strlen还是返回<void> 真搞不明白明明都是<void>了，还能跟30比较大小= =

user: user-5
content: 使用前给plan初始化一下试试 memset(tcp->content[i].plan ,0 ,TXT);

user: user-2
content: 还有一个办法定位，那就是输出tcp->content[i].plan的值，看看是否是你输入的内容。

user: user-2
content: 不是strlen的问题，这个库函数大家都在用，不可能会有问题；还是你的代码哪儿有点问题， 个人的怀疑是gets(tcp->content[i].plan); 这句前面应该还有输入，上次输入之后的回车残留在输入缓冲区，而gets遇到回车直接返回，什么数据也没输入到plan里，所以strlen的返回值是0

user: user-6
content: 请参考一下这个资料 http://blog.csdn.net/libing403/article/details/73086588

user: user-7
content: 随便建个工程测试下strlen 比如 int len = strlen("Why is void?");

user: user-0
content: 试了还是不行，strlen还是<void>,length=strlen（...）那里调试会蹦到汇编代码那去

user: user-0
content: 结构体也在这了typedef union{ 	struct{ 		int hour:6; 		int min:7; 	}; 	int _time; }UNI;  typedef struct { 	int num; 	struct 	{ 		UNI _clock[2]; 		char plan[TXT]; 	}content[LINE]; 	time_t Ftime;     time_t Stime;     time_t Etime;     char id[ID]; }_calendar;

user: user-8
content: 确定返回类型：  gets(tcp->content[i].plan); int length=strlen(tcp->content[i].plan); if(length>LINE-1) {     puts("字数超出上限!");     exit(1); }
user-0 提问: 【debug】 使用指针给十个数排序

回复:
user: user-1
content: 错误的选择。

user: user-2
content: 引用 3 楼 adusuccessfully 的回复:1楼说的对，楼主的函数声明没有分号。 楼主写的排序代码是冒泡排序吧，感觉没有问题。  不太像冒泡排序啊，感觉更像是选择排序。

user: user-3
content: #include<stdio.h>  void num(int*a, int n);  int main(void) {     int a[10] = {1, 3, 4, 5, 7, 8, 9, 22, 77, 79};     int i;      num(a, 10);      for (i = 0; i < 10; i++)         printf("%d ", a[i]);     printf("\n");      return 0; }  void num(int *a, int n) {     int i, j, t;      for (i = 0; i < n; i++)         for (j = i + 1; j < n; j++)             if (*(a + i) < *(a + j))             {                 t = *(a + i);                 *(a + i) = *(a + j);                 *(a + j) = t;             } } 函数声明也是一条语句，所以应该加分号；

user: user-4
content: 如图，把定义的void num函数申明位置改一下，就全对了

user: user-5
content: 1楼说的对，楼主的函数声明没有分号。 楼主写的排序代码是冒泡排序吧，感觉没有问题。

user: user-6
content: 你那两个循环怎么嵌套的？没有问题？

user: user-7
content: 第2行函数声明后面少了分号 void num(int*a, int n)；
user-0 提问: 凑行数

回复:
user: user-1
content: 多写一些printf之类的东西嘛

user: user-2
content: 1.默默地写一写些没有实际意义函数 2.把你们老师骂一顿，哪有实现了功能还要求代码行数的，当然如果可以精简，让我减少行数还可以，可是还有要求跟多行数的，无语！！！

user: user-3
content: 想请问一下这是哪个学校？……

user: user-4
content: 引用 9 楼 ipqtjmqj 的回复:[quote=引用 7 楼 cfjtaishan 的回复:] [quote=引用 6 楼 ipqtjmqj 的回复:] 超级简单的办法：不要用include，而是直接把头文件的内容复制到源文件 代码的行数是包含头文件（自定义的头文件）里的代码的。 如果加上头文件里的代码还不够，那么建议加功能，这个是即加分也会提高自己的办法[/quote] 我的意思是把stdio.h中的代码复制过来，或者手写也可以，比如用printf,只需写extern int printf(const char *, ...);不是一定要写include[/quote] 不建议这么做，标准头文件里的毕竟不是自己写的，如果被老师发现，岂不是画蛇添足；还不如做些其他功能能加分

user: user-5
content: 什么时候写代码跟写作文一样要求行数了, 这种老师不是sb是什么?

user: user-5
content: for(int i=0;i<100;i++)  printf("\nMy computer teacher is SB!");

user: user-5
content: 拒绝满足老师的无理要求

user: user-6
content: 能换行的尽量换行

user: user-7
content: 引用 7 楼 cfjtaishan 的回复:[quote=引用 6 楼 ipqtjmqj 的回复:] 超级简单的办法：不要用include，而是直接把头文件的内容复制到源文件 代码的行数是包含头文件（自定义的头文件）里的代码的。 如果加上头文件里的代码还不够，那么建议加功能，这个是即加分也会提高自己的办法[/quote] 我的意思是把stdio.h中的代码复制过来，或者手写也可以，比如用printf,只需写extern int printf(const char *, ...);不是一定要写include

user: user-8
content: 《Visual C++ 游戏开发经典案例详解》

user: user-4
content: 引用 6 楼 ipqtjmqj 的回复:超级简单的办法：不要用include，而是直接把头文件的内容复制到源文件 代码的行数是包含头文件（自定义的头文件）里的代码的。 如果加上头文件里的代码还不够，那么建议加功能，这个是即加分也会提高自己的办法

user: user-7
content: 超级简单的办法：不要用include，而是直接把头文件的内容复制到源文件

user: user-9
content: 也是醉了！！

user: user-10
content: 加需求，加功能

user: user-11
content: 问下，你们老师要求你们400行的理由是什么？ 不是代码越简洁越好么？ 老师要求的需求和功能，你都实现了，不就可以了吗？

user: user-12
content: 1.函数声明和实现分开写， 2.“{”前要换行， 3.多写注释 4.只有一行语句的if..else也要加{} 5.for(int i=0;i<n;i++) {...} 改 int i; .... i=0; for(;i<n;) {     .......     i++; } 6.把一些小的工具类的函数展开写到代码里 7.变量名，函数名取长，然后一行语句太长的就有理由换行 8.函数实现的位置function(int a, int b, int c, int d) { ....}  改 function(     int a,    //this is a     int b,     //this is b     int c,      //this is c     int d)     //this is d  { ....}  。。。。。。 只要不要求代码结构规范，这些太容易了。

user: user-13
content: 加功能，比如做一个成绩排行榜。 注释，用单独的行。适当的空行。
user-0 提问: 水平制表符问题

回复:
user: user-0
content: 引用 1 楼 cfjtaishan 的回复:前面也是执行的了，只不过我们看到的似乎只有一个空格，而不是tab表示的空格数。不然，前9个后面就应该紧跟着“报数”了。 好像是的，有空格，但就是不懂为什么不是TAB，只有一个空格符，而且还是前面9个是空格，后面几个就是tab。

user: user-1
content: 前面也是执行的了，只不过我们看到的似乎只有一个空格，而不是tab表示的空格数。不然，前9个后面就应该紧跟着“报数”了。

user: user-0
content: 引用 3 楼 fight_in_dl 的回复:\t并不输出空格，它告诉光标到达下一个制表符位置。  序号:*9//这里用*代表空格， 一个中文字符占两个char位置，有两个汉字这里一共是4+1个冒号+1个空格+1个'9' = 7 所以只需要加一个空格 = 8 ，到达下一个制表符位置  序号:*10//这里用*代表空格， 一个中文字符占两个char位置，有两个汉字这里一共是4+1个冒号+1个空格+1个'1' +1个'0'= 8 所以需要再加8个空格 ，到达下一个制表符位置  用心回答每个问题，如果对您有帮助，请采纳答案好吗，谢谢！ 懂了，讲的很细，谢谢您。

user: user-1
content: 引用 2 楼 jtidni 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 前面也是执行的了，只不过我们看到的似乎只有一个空格，而不是tab表示的空格数。不然，前9个后面就应该紧跟着“报数”了。 好像是的，有空格，但就是不懂为什么不是TAB，只有一个空格符，而且还是前面9个是空格，后面几个就是tab。[/quote]根据楼上的讲解，如果想得到你想要的输出格式，建议加数据输出宽度； 比如  printf("序号：%5d报数：%d\n", p->num, p->bs123);

user: user-2
content: \t并不输出空格，它告诉光标到达下一个制表符位置。  序号:*9//这里用*代表空格， 一个中文字符占两个char位置，有两个汉字这里一共是4+1个冒号+1个空格+1个'9' = 7 所以只需要加一个空格 = 8 ，到达下一个制表符位置  序号:*10//这里用*代表空格， 一个中文字符占两个char位置，有两个汉字这里一共是4+1个冒号+1个空格+1个'1' +1个'0'= 8 所以需要再加8个空格 ，到达下一个制表符位置  用心回答每个问题，如果对您有帮助，请采纳答案好吗，谢谢！
user-0 提问: c语言问题

回复:
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执行停在该断点处的时候。  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组

user: user-2
content: 运行一下不久OK了吗？

user: user-0
content: 引用 1 楼 zanfeng 的回复:啥意思啊？ v 就是这三道题怎么做啊！？

user: user-3
content: 啥意思啊？ v

user: user-0
content: 呃，，我不太懂这个思路，能给我细细的讲解一下吗

user: user-4
content: 问题是问题是什么

user: user-5
content: 这些程序例子能锻炼一下对C指针的使用； 楼主对这些例程有什么问题吗？
user-0 提问: 写了一个控制台程序模拟鼠标按键，如何不在控制台输入运行程序

回复:
user: user-1
content: 我也想要。

user: user-2
content: RegisterHotKey

user: user-3
content: http://www.autohotkey.com

user: user-4
content: GetAsyncKeyState

user: user-5
content: 网上搜索：注册全局快捷键
user-0 提问: c语言新手，学艺不精，想请教几个关于c语言的问题

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0];

user: user-2
content: 断点、调试 找到哪里出错  在哪里出错，就在哪里只多趴一会  哥只能帮到这么多了

user: user-0

user: user-0
content: 我自个顶一下
user-0 提问: printf语句影响程序的运行

回复:
user: user-1
content: VC十几年，表示没出见过这种情况。 轻轻飘过……

user: user-2
content: 什么平台？ 对比一下printf的实现和汇编的压栈。  压栈的时候是以几byte对齐， 寻变参的时候是以几byte对齐， 看看是否一致。

user: user-3
content: 在每个最后不带\n的printf后面加fflush(stdout);

user: user-4
content: printf后面加个延时，很多时候并不是没有正确跑，而是printf对你系统的通信接口而言，实在太快了，没有显示结果而已

user: user-5
content: 应该是each_ray_home需要一定的间隔才能正确运行，printf()输出的字符串越长，这个调用执行的时间也就越长。你可以不用printf，换成sleep(10),试试。不行的话，再把时间改大一点

user: user-6
content: 汇编级的调试。。。。

user: user-7
content: 引用 3 楼 jianwen0529 的回复:each_ray_home(p_point_one_mesh,  mc, imc, area ,xmin,xmax, ymin, ymax); 查看这个函数有没有使用非法内存，数组越界的情况 printf不会对程序运行造成不一样的影响  [quote=引用 2 楼 cfjtaishan 的回复:] 你是在什么环境下运行的？还没遇到过这么邪乎的代码； 我遇到过，到如今都不明白 http://bbs.csdn.net/topics/392061821[/quote] 你这个问题要看具体的代码，不一定在其他环境下也是这样的问题，所以问题总会解决，只是还在路上。

user: user-8
content: printf是写到缓冲区，没有马上输出到屏幕

user: user-9
content: 这么奇怪的故障 不出正确结果是什么情况？有什么差异？ 遇到这种问题，还是想办法调试一下 或者变换下语句，看看问题到底出在哪

user: user-10
content: each_ray_home(p_point_one_mesh,  mc, imc, area ,xmin,xmax, ymin, ymax); 查看这个函数有没有使用非法内存，数组越界的情况 printf不会对程序运行造成不一样的影响  引用 2 楼 cfjtaishan 的回复:你是在什么环境下运行的？还没遇到过这么邪乎的代码； 我遇到过，到如今都不明白 http://bbs.csdn.net/topics/392061821

user: user-7
content: 你是在什么环境下运行的？还没遇到过这么邪乎的代码；

user: user-10
content: each_ray_home(p_point_one_mesh,  mc, imc, area ,xmin,xmax, ymin, ymax); 查看这个函数有没有使用非法内存，数组越界的情况 printf不会对程序运行造成不一样的影响
user-0 提问: 求解一道面试题，怎么写比较优化。

回复:
user: user-1
content: //你可以参考一下这个代码,我也是刚学习的,有问题的话,还望指教. //这个程序的思想是,既然只是有<$>的地方就多一个<$> 那么 //aaaa<$>bbb<$>cccc //实例字符串 如果找到.<$>,首先记录字符串首个 '<'的索引.一次為基点 将后面的字符串拷贝到'>'的后面 即实现了添加 //字符串从后向前赋值的原因还望你自己推敲.这个对你以后也有帮助,根本原因是,这个思想从前向后赋值 因为只使用同一段内存 //,所以需要保证原本数据的完整 //你看一下把,有问题的话,望指教回复一下我   #define  MAX_SIZE   100 int main(){ 	char strTemp[MAX_SIZE] = "<$>aaaaa<$><$>bbbbb<$>ccccc<$>ddddd"; 	printf("%s\n",strTemp); 	int nLen = 0; 	char * pFirst = strTemp; 	while(*pFirst++){ 		++nLen; 	} 	pFirst = strTemp;				//头指针 	char * pEnd = strTemp+nLen;		//\0 	printf("%d\n",nLen); 	for(int i = 0;i<nLen;++i){ 		if(strTemp[i] == '<' && strTemp[i+1] == '$' && strTemp[i+2] =='>'){ 			char * TempFirst = strTemp+i;	//"<"的指针 			int nPos = pEnd - TempFirst + 1;//"<"到尾部的步长 此处加一是从\0的下一位开始计算,因为\0也要接受赋值 			char * TempEnd = pEnd +3;		//将要赋值的字符串的尾地址 			char * EndStart = pEnd;			//需要複製的起始地址 			//此处赋值 			while(nPos--){ 				*TempEnd-- = *EndStart--; 			} 			//计算新字符串的长度 			nLen = 0; 			while(*pFirst++) ++nLen ; 			pFirst = strTemp; 			pEnd+=3; 			i+=3; 		} 	} 	printf("%s\n",strTemp); 	getchar(); }

user: user-2
content: 思路还是比较简单， 考察的是字符串和数组操作吧。 至于搜索字符串，估计你搞个KMP/AC/BM算法会有加分吧  #include <stdio.h>  int main(void) { 	char Text[100] = {"xxx<$><$>yyy<$>zzz"}; 	int left = 50; //剩余 50个有效字符未处理 	int i = 0, j = 0; 	int count = 0; 	int end = 0; 	 	for (i = 0; (i < 97) && (left > 2); i++) {// 97 = sizeof(Text) - sizeof("<$>") - 1 		if ((Text[i] == '<') && (Text[i+1] == '$') && (Text[i+2] == '>')) { 			end = 50 + count * sizeof("<$>")- 1; 			left -= sizeof("<$>") - 1; 			count++; 			//memmove to insert <$> 			for (j = end - 1; j > (i + 2); j--) { 				Text[j + sizeof("<$>") - 1] = Text[j]; 			}  			Text[i+3] = '<'; 			Text[i+4] = '$'; 			Text[i+5] = '>';  			i+= 4; 		} else { 			left--; 		} 	}  	printf("Text = %s\n", Text); 	return 0; }

user: user-3
content: 遍历一遍这个数组，找出这个模式出现的地方，其实这个时候已经知道每个元素的新位置在哪了，然后从尾部到头赋值即可

user: user-4
content: 上面错了，请楼主无视

user: user-4
content: 同一个数组，两个下标变量，把要求a[i]=a[j],or a[i]='$'其中有个下标肯定不会比另一个快，赋值循环结束，加个尾零就行了

user: user-5
content: 就字符串查找函数strstr的变换

user: user-6
content: 可以考虑用移位的方式来实现这个功能。
user-0 提问: 数组指针

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组

user: user-2
content: 数组名是一个指针，打印数组元素的时候，用数组名+下标，当一个指针指向数组的时候，这个指针就与数组名是等效的了。因此用法就跟数组名一样，即指针名+下标。

user: user-3
content: p[i]里面存的是字符串的地址，如果使用*p[i]打印的就是p[i]的地址

user: user-3
content: p[i]就是表示的一个字符串地址吧

user: user-4
content: printf("%s",*(pa+i)); 还可以这样，不过这个是要加*的

user: user-4
content: 前面加*就是指第二个字符串的第一个字符了，和%s就不匹配了；

user: user-5
content: 因为字符串一般用字符指针来表示和输出的，不同于其他类型（int等）

user: user-0
content: 因为 #include main(){  int i=1; int* a[7]; a[i]=&i; printf("%d",*a[i]); }  中a[i]前要加。。

user: user-6
content: pa[i] 的类型是 char* 字符串，输出一个字符串就是这样子 我是比较好奇你为什么认为需要加（*）呢？
user-0 提问: 递归调用问题

回复:
user: user-1
content: 楼主最好自己体会一下递归过程是如何进行的。

user: user-1
content: 请参考回溯算法的八皇后问题递归代码： #include <stdio.h>  int left[15]={0},right[15]={0},col[8]={0},q[8],cnt=0;  void print()  //按顺序输出  { 	int i,j; 	printf("这是第%d个解:\n",++cnt); 	for(i=0;i<8;i++) 	{ 		for(j=0;j<8;j++) 		{ 			if(q[i]==j) 				printf("O "); 			else printf("X "); 		} 		printf("\n"); 	} 	printf("\n"); }  void Queue (int i) { 	for(int j=0;j<8;j++) 	{ 		if(col[j]==0&&left[i+j]==0&&right[i+7-j]==0) 		{ 			q[i]=j; 			col[j]=left[i+j]=right[i+7-j]=1; 			if(i<7) 			{ 				Queue(i+1); 				col[j]=left[i+j]=right[i+7-j]=0; 			} 			else { 				print(); 				col[j]=left[i+j]=right[i+7-j]=0; 			} 		} 	} }  int main () { 	int i=0; 	Queue(i); 	return 0; }

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

user: user-3
content: 除了permutation是递归函数之外，其他部分，是交换下标i和b的值；调用permutation之后再交换下标为i和b。

user: user-4
content: 全排列 比如abcd 固定a 然后bcd排列.然后再交换即b acd排列,如此类推.
user-0 提问: c语言问题，改了好久还是不知道错在哪，求大神拯救

回复:
user: user-1
content: static float a[80][250],t[80][250],del[80]; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-2
content: 如果实在想不出怎么定义，可以考虑适当的加些注释，比如在算法逻辑方面，可以加一行的注释，也可以在文件头或者函数前加若干行注释用于描述可能不好理解的逻辑

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include<math.h>  int main() {     int i,j,m=0,c=79,d=249;     float t0=226.85,tf=26.85,h=2800.0,Q=0.0,temp=0.0,N=187.0,EPS,X=1.0,e=0.1,f=0.1,delta=0.0001,sum = 0.0;     float a[80][250],t[80][250],del[80];     for(i=0;i<80;i++){         for(j=0;j<250;j++)         {             t[i][j]=100.0;             a[i][j]=100.0;             del[i]=1.0;         }     }      printf("%4.2lf\n",a[1][1]);     while(X>0.01){         m++;         for(i=0;i<=c;i++)         {             for(j=0;j<=d;j++)             {                 if(j==0&&0<=i&&i<=c)                     a[i][j]=t0;                 else if(0<j&&j<d&&i==0)                     a[i][j]=(2*t[1][j]+t[0][j+1]+t[0][j-1]+2*h*N*tf/N)/(4+2*h*delta/N);                 else if(0<j&&j<d&&i==c)                     a[i][j]=(2*t[c][j]+t[c+1][j+1]+t[c+1][j-1]+2*h*delta*tf/N)/(4+2*h*delta/N);                 else if(j==d&&0<i&&i<c)                     a[i][j]=(2*t[i][d]+t[i+1][d+1]+t[i-1][d+1]+2*h*delta*tf/N)/(4+2*h*delta/N);                 else                     a[i][j]=(t[i][j+1]+t[i][j-1]+t[i-1][j]+t[i+1][j])/4;             }         }         a[0][d+1]=(2*h*delta*tf/N+t[0][d]+t[1][d+1])/(2+2*h*delta/N);         printf("%4.2lf\n",a[0][249]);         a[c+1][d+1]=(2*h*delta*tf/N+t[c][d+1]+t[c+1][d])/(2+2*h*delta/N);         printf("%4.2lf\n",a[79][249]);         X=0.0;         for(i=0;i<=c;i++)         {             for(j=0;j<=d;j++)             {                 EPS=fabs(t[i][j]-a[i][j]);                 if(EPS>X) X=EPS;             }         }         if(m>100)             break;     }     if(m<100){         for(i=1;i<=80;i++)             del[i]=(t[i][0]-t[i][1])/delta;         sum+=del[i];         Q=N*sum*delta;         temp=t[40][249];         printf("%4.2lf %4.2lf",Q,temp);         printf("\n");      }     getchar(); } 楼主，看到你定以那么多变量（真需要那么多），并且变量大多以单个字母命令，怎么也才不出来你定义这个变量做什么，自己疯了，让别人看你的代码也感觉摸不着头脑； 程序里有多处越界，数据长度是250，那么其下标是从[0, 249]里，同理，长度是80，那么下标是从[0, 79]; 建议楼主，以后写代码可以先构思，变量不是写多了就好分析和理解了，多了自己看着头大，别人看着更是费劲。从你的程序里也看不出你的逻辑是要做什么。所以，先构思好；其次，对于一些变量有通用的命名的，比如循环变量，i, j, k;一般用在循环和数组下标，另外，n或着num一般是number的缩写，cnt是count的缩写，用于分别标识数字和计数器。总之，除了这些通用的命名法之外，定义变量和函数都建议做到见名知义。

user: user-3
content: 数组越界错误： C语言数组索引从0开始，a[80][250]最大的元素索引只能到a[79][249]。  c = 79, d = 249 a[c+1][d+1]=(2*h*delta*tf/N+t[c][d+1]+t[c+1][d])/(2+2*h*delta/N); //试图设置a[80][250]，不合法。 用心回答每个问题，如果对您有帮助，请采纳答案好吗，谢谢！

user: user-4
content: 引用 4 楼 zhao4zhong1 的回复:static float a[80][250],t[80][250],del[80]; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-5
content: 最简单就是4楼的办法，或者修改项目属性，改为不限制栈大小。
user-0 提问: 奇怪的出错问题 struct 定义的结构体在函数前后的区别！！

回复:
user: user-0
content: 4再增加一种方法 函数声明前加上 typedef struct student Node; //语句也行，有类似3的效果

user: user-0
content: 引用 2 楼 jianwen0529 的回复:使用对象需要声明和定义可见（在前）  struct student //定义 {     char name[20];     float score;     struct student *next; }; void free_node(/*struct*/ student head); //使用对象  使用指针或者引用，需要声明可见（前置声明）  struct student; //前置声明 void free_node(/*struct*/ student *head); //使用指针   而你说一会对一会错的原因  void free_node(struct student* head); //此处的struct student有前置声明的作用，所以没有问题 //void free_node(student* head); //这样子就不行了 [code=c]struct student {     char name[20];     float score;     struct student *next; };  看了你们的回复，对我帮助很大，发贴前我己将代码反复写了十多次，有时正确，有时找不到原因，搞得都有点怀疑人生了  经过你的指点，我又将代码用不同的方法写过几次，并加以验证，总结如下： 1、方法一 ，结构体定义放在函数声明之前 struct student{ 	char name[20]; 	float score; 	struct student *next; 	          };  void input_node(struct student *head); ... 等等函数声明列系;   2、方法二，结构体类型前置声明，类型后面加;（即然这样的语法可以，我又试了，int;这样的声明，测试正确，类型后面加分号） struct student; ... 下面接函数声明;  3、方法3， 将有返回结构体类型或结构体指针类型的函数放前面声明，有类似结构体前置声明的效果 eg: struct student creat_node(struct student *head);  //52行  void input_node(struct student *head); //53行 //52行，一定要在 53行前，不然就出错， 参数类型是结构体没有用， //无法起到声明效果，但函数返回值类型在前， //可以起到声明效果，这个具体叫什么声明方式，没有找到参考资料     上面三种方式都可以正确编译与运行，第二种方式比较好  //jianwen0529 提的最后一点（函数参数类型，形参，无法做声明），我先前有时能正确运行的原因是，我将返回结构体指针函数放在了最上面，就是第三种方法起了作用

user: user-1
content: 引用 4 楼 cfjtaishan 的回复:[quote=引用 2 楼 jianwen0529 的回复:] 使用对象需要声明和定义可见（在前）  struct student //定义 {     char name[20];     float score;     struct student *next; }; void free_node(/*struct*/ student head); //使用对象  使用指针或者引用，需要声明可见（前置声明）  struct student; //前置声明 void free_node(/*struct*/ student *head); //使用指针   而你说一会对一会错的原因  void free_node(struct student* head); //此处的struct student有前置声明的作用，所以没有问题 //void free_node(student* head); //这样子就不行了 struct student {     char name[20];     float score;     struct student *next; };  C语言里不支持定义的结构体是struct student类型，而用student 定义变量的形式，而是C++是支持的。[/quote] 恩，这个我还真是不知道的点。

user: user-2
content: 引用 2 楼 jianwen0529 的回复:使用对象需要声明和定义可见（在前）  struct student //定义 {     char name[20];     float score;     struct student *next; }; void free_node(/*struct*/ student head); //使用对象  使用指针或者引用，需要声明可见（前置声明）  struct student; //前置声明 void free_node(/*struct*/ student *head); //使用指针   而你说一会对一会错的原因  void free_node(struct student* head); //此处的struct student有前置声明的作用，所以没有问题 //void free_node(student* head); //这样子就不行了 struct student {     char name[20];     float score;     struct student *next; };  C语言里不支持定义的结构体是struct student类型，而用student 定义变量的形式，而是C++是支持的。

user: user-2
content: 不论是函数还是变量都要遵循一个先声明后使用的原则； 对于结构体的使用，也是要遵循先声明后使用，虽然声明的是一个结构体类型。

user: user-1
content: 使用对象需要声明和定义可见（在前）  struct student //定义 {     char name[20];     float score;     struct student *next; }; void free_node(/*struct*/ student head); //使用对象  使用指针或者引用，需要声明可见（前置声明）  struct student; //前置声明 void free_node(/*struct*/ student *head); //使用指针   而你说一会对一会错的原因  void free_node(struct student* head); //此处的struct student有前置声明的作用，所以没有问题 //void free_node(student* head); //这样子就不行了 struct student {     char name[20];     float score;     struct student *next; };

user: user-0
content: 卡住发重了，管理员删 一个
user-0 提问: 为什么返回指针的函数不能返回本函数内的数组？？？

回复:
user: user-1
content: 函数调用完成后， 函数栈会被清理， 存在栈内的数据都不能作为返回值。

user: user-2
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执行停在该断点处的时候。

user: user-3
content: 因为本函数内的数组生命周期是函数调用开始到函数调用结束，所以返回函数内的数组是未定义行为； 函数调用结束后，其函数内定义的局部变量都会被释放。使用已经被释放的空间数据是未定义行为。

user: user-4
content: 因为char数组：temp[]是函数内部的局部变量

user: user-5
content: temp是局部变量，退出函数后会被销毁 在内存被销毁之后还使用它是危险的行为

user: user-6
content: static char temp[] ={1,2,3,4,5};这样试一下

user: user-2
content: 栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

user: user-7
content: 因为函数内的数组是局部变量，函数结束后就销毁了，你返回后，指针指向的是已经销毁的数组，所以是乱码

user: user-2
content: 引用 6 楼 K8001 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] 理解和讨论之前请先学会如何观察！  计算机组成原理→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执行停在该断点处的时候。 真心授人以渔.   另外, 为什么是小脑.[/quote] 因为编程是一门实实在在的手艺。

user: user-8
content: 局部变量，出了函数就没了……

user: user-9
content: 引用 5 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  计算机组成原理→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执行停在该断点处的时候。 真心授人以渔.   另外, 为什么是小脑.
user-0 提问: C++新人求教，万分感谢

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

回复:
user: user-1
content: 现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！

user: user-2
content: 程序没有问题，起码在Linux编译和运行都没有问题；程序可以肯定的没有问题，建议你检查一下你的编译和运行环境，或者将同样的代码放到其他人的环境里进行编译和运行，查看结果是否一样。

user: user-3
content: windows看你是怎么运行，你如果直接双击这个程序，那就是你现在的效果。 你如果先打开一个cmd窗口，再去运行程序，那就和你linux差不多，所以，这为什么叫执行的时候总不对？？这个程序执行没有任何问题 你在linux shell里面执行这个程序，这个程序一样是自动退出的，只不过它的输出会留在shell窗口上而已。

user: user-2
content: 引用 7 楼 qwqwqw408 的回复:按照4楼说的去做吧，你都不加个等待，就算有输出，你看得到吗，那3个printf调用显示不过是数毫秒而已，你眼睛都没反应过来，程序就正常退出了，这是正常退出，并不是什么异常，不要自己把自己搞晕了。 这个主要是看编译和运行环境，在Linux下没有这些问题，加不加getchar();都是可以。加了，还得在敲一下回车。 如果楼主是在windows下使用专门软件操作的，建议可以考虑一下上面的建议

user: user-3
content: 按照4楼说的去做吧，你都不加个等待，就算有输出，你看得到吗，那3个printf调用显示不过是数毫秒而已，你眼睛都没反应过来，程序就正常退出了，这是正常退出，并不是什么异常，不要自己把自己搞晕了。

user: user-4
content: #include <stdio.h> int main(void) { float num; printf("Enter a floating-point value: "); scanf("%f", &num); printf("fixed-point notation: %f\n", num); printf("exponential notation: %e\n", num); printf("p notation: %a\n", num); getchar(); //等待用户输入才结束程序，或者“菜单-调试-开始执行（不调试）”，快捷键Ctrl+F5 return 0; }

user: user-0
content: 引用 1 楼 qq_30348181 的回复:要么去掉return或void  自己选 试过了，都不行

user: user-0
content: 试过了。都不行

user: user-5
content: 要么去掉return或void  自己选
user-0 提问: fscanf读csv为什么读出来全是0

回复:
user: user-1
content: 你的fp定义为指针，后面又加取地址干嘛

user: user-0
content: 引用 3楼自信男孩 的回复:是不是node.csv文件格式不是格式化的？ fscanf是格式化的读取。这个我也不懂… 是老师给的 那应该是没问题的吧…

user: user-0
content: 引用 5楼versatts 的回复:以文本方式打开试试也不行…

user: user-0
content: 引用 4楼赵4老师 的回复:请判断fscanf函数的返回值。判断了fscanf==-1 break 这样不可以吗…

user: user-2
content: 以文本方式打开试试

user: user-3
content: 请判断fscanf函数的返回值。

user: user-4
content: 是不是node.csv文件格式不是格式化的？ fscanf是格式化的读取。

user: user-0
content: 引用 1楼user-5 的回复:F://datastructure//data//node.csv => F:\\datastructure\\data\\node.csv好像不是这个原因… 改了也不行

user: user-5
content: F://datastructure//data//node.csv => F:\\datastructure\\data\\node.csv

user: user-3
content: 注意文件编码： In Visual C++ 2005, fopen supports Unicode file streams. A flag specifying the desired encoding may be passed to fopen when opening a new file or overwriting an existing file, like this:  fopen("newfile.txt", "rw, ccs=<encoding>");  Allowed values of the encoding include UNICODE, UTF-8, and UTF16-LE. If the file is already in existence and is opened for reading or appending, the Byte Order Mark (BOM) is used to determine the correct encoding. It is not necessary to specify the encoding with a flag. In fact, the flag will be ignored if it conflicts with the type of the file as indicated by the BOM. The flag is only used when no BOM is present or if the file is a new file. The following table summarizes the modes used in for various flags given to fopen and Byte Order Marks used in the file.  Encodings Used Based on Flag and BOM Flag  No BOM (or new file)  BOM: UTF-8  BOM: UTF-16   UNICODE  ANSI  UTF-8  UTF-16LE   UTF-8  UTF-8  UTF-8  UTF-16LE   UTF-16LE  UTF-16LE  UTF-8  UTF-16LE
user-0 提问: 求大神解答！！！

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  int main() {     int i,a[200],n,k,j,p=0,u=0,sum=0;     char b[200];     scanf("%d",&n);     getchar();     while(n--) {         gets(b);         for(i=0;i<13;i++)             a[i]=b[i]-'0';         k=0;         j=0;         for(i=0;i<13;i++) {             if(i%2==0)                 k+=a[i];             else                 j+=a[i]; //          printf("%d",a[i]);         }         sum=j*3+k;         p=sum%10;         if((10-p)==10)             u=0;         else             u=10-p;         if(u==a[12])             printf("Yes\n");         else             printf("No\n");      }     return 0; }

user: user-2
content: #include <stdio.h> #include <stdlib.h>  int main() {     int i,a[200],n,k=0,j=0,p=0,u=0,sum=0;     char b[200];      scanf("%d",&n);     getchar();     while(n--)     {         gets(b);         for(i=0;i<13;i++)             a[i]=b[i]-'0';         for(i=0;i<13;i++)         {             if(i%2==0)                 k+=a[i];             else                 j+=a[i];             printf("%d",a[i]);         }         sum=j*3+k-a[12];         p=sum%10;         if((10-p)==10)             u = 0;         else             u = 10 - p;         printf("%u = %d, a[12] = %d\n", u, a[12]);         if(u==a[12])             printf("Yes\n");         else             printf("No\n");        /*为了不影响下一次的使用，先将这三个值重新初始化*/         u = 0;         j = 0;         k = 0;      }     return 0; } 原因，就是u, i, k没有重新初始化，没有重新初始化，他们都会带着上一次的计算结果，继续下次的判定和运算

user: user-0
content: ??????????

user: user-1
content: #include <stdio.h> #include <stdlib.h>  int main() {     int i,a[200],n,k,j,p=0,u=0,sum=0;     char b[200];     scanf("%d",&n);     getchar();     while(n--) {         gets(b);         for(i=0;i<13;i++)             a[i]=b[i]-'0';         k=0;         j=0;         for(i=0;i<13;i++) {             if(i%2==0)                 k+=a[i];             else                 j+=a[i]; //          printf("%d",a[i]);         }         sum=j*3+k-a[12];         p=sum%10;         if((10-p)==10)             u=0;         else             u=10-p;         if(u==a[12])             printf("Yes\n");         else             printf("No\n");      }     return 0; }

user: user-0
content: 样例输入 3 6901234567892 0101092900016 0101092900015 样例输出 Yes No Yes
user-0 提问: 求大神帮忙C语言实现3*3图片的卷积

回复:
user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？ 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话，文本文件的格式问题可参考json或xml  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！
user-0 提问: va_arg 使用问题

回复:
user: user-0
content: c89 6.3.15小节清楚的说明了这个转换， c99/c11继续沿用

user: user-1
content: 应该不可能，建议从生成的汇编代码中去看究竟

user: user-2
content: 逻辑短路？ 编译器优化掉了？ 使用gdb查看每句C/C++语句对应的汇编指令。

user: user-0
content: 引用 6 楼 xsklld 的回复:问题不在va_arg，而在条件表达式。 C/C++里的表达式在编译时就需要确定类型，条件表达式也不例外。当条件表达式后两个子表达式类型不一致时会实施类型转化，在这里即前面的int会转换成unsigned int，所以看上去就像无论怎样都会执行false分支。  正解。这里num在编译时既被确定使用unsigned int类型。因为编译器不知道会进true还是false，而num需要确定的类型，所以做了隐含类型转换。但是在32位unsigned类型转64位的过程中，符号位被丢掉了。

user: user-3
content: 问题不在va_arg，而在条件表达式。 C/C++里的表达式在编译时就需要确定类型，条件表达式也不例外。当条件表达式后两个子表达式类型不一致时会实施类型转化，在这里即前面的int会转换成unsigned int，所以看上去就像无论怎样都会执行false分支。

user: user-4
content: 引用 4楼我是你的主体 的回复:问题找到了，两种写法确实是有区别的。为什么呢？

user: user-0
content: 问题找到了，两种写法确实是有区别的。

user: user-0
content: 优化没开，汇编还没跟，直接运行的结果很诡异所以直接贴上来问问。 如果把代码改成 num = sign ? (int)va_arg(args, int) : 123; 那么sign=1, 传入参数是-1时， num能得到-1. 原始代码sign=1,传入参数是-1时，num的值是0xffffffff，而num是unsigned long long，这个值就不是-1了
user-0 提问: 热烈庆祝本人受关注人数即将突破13000大关！散分！！+为什么机器每隔约一个多月就假死一次重启后就好了？

回复:
user: user-1
content: 赵老师帮过一次忙，受益匪浅

user: user-2
content: 大牛啊，不知道为什么，每次我遇到问题的时候，搜出来的帖子，总能看到赵老师的身影，果断关注！

user: user-3
content: 还有分吗，赵老师

user: user-4
content: 接分接分，外带恭喜赵老师

user: user-5
content: 就是来赚点积分好下载的。。。

user: user-6

user: user-7

user: user-8
content: 接分接分，外带恭喜赵老师

user: user-9
content: 赵老师牛逼了！！

user: user-10

user: user-0
content: http://bbs.csdn.net/topics/392174812

user: user-0
content: 引用 44 楼 pre_fection 的回复:赵老师新粉 可惜这一波没分了。

user: user-11
content: 赵老师新粉

user: user-12
content: 因为它累了。

user: user-13

user: user-14
content: 恭喜老师！！！

user: user-15
content: 散多少分啊？

user: user-0
content: http://bbs.csdn.net/topics/392181944

user: user-16
content: 我来接分了，记得给我多些啊

user: user-17
content: 关注一下，靠赵老师解决过不少问题
user-0 提问: 机房管理系统运行process returned -1073741819(0xC0000005)内存分配问题

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

回复:
user: user-0
content: 引用 3 楼 cfjtaishan 的回复:若每个连接需要处理的逻辑不复杂，可以在一个线程里处理，否则要交给其他线程；这样有更多的时间给其他连接； 好的，多谢分享

user: user-1
content: IO多路复用 指的的是使用 select/poll/epoll/kqueen 等函数实现的事件驱动机制, 链接处理的时间长短是不可控的,socket有超时机制,也可以用socketopt指定超时时间. 死循环那是bug不在考虑范围内,IO复用通常是在一个进程内, 具体处理可以使用线程池. 详细了解的话,百度一大堆, 具体可以参考nginx源码

user: user-2
content: 若每个连接需要处理的逻辑不复杂，可以在一个线程里处理，否则要交给其他线程；这样有更多的时间给其他连接；

user: user-0
content: 引用 1 楼 lgbxyz 的回复:IO多路复用 指的的是使用 select/poll/epoll/kqueen 等函数实现的事件驱动机制, 链接处理的时间长短是不可控的,socket有超时机制,也可以用socketopt指定超时时间. 死循环那是bug不在考虑范围内,IO复用通常是在一个进程内, 具体处理可以使用线程池. 详细了解的话,百度一大堆, 具体可以参考nginx源码 引用 1 楼 lgbxyz 的回复:IO多路复用 指的的是使用 select/poll/epoll/kqueen 等函数实现的事件驱动机制, 链接处理的时间长短是不可控的,socket有超时机制,也可以用socketopt指定超时时间. 死循环那是bug不在考虑范围内,IO复用通常是在一个进程内, 具体处理可以使用线程池. 详细了解的话,百度一大堆, 具体可以参考nginx源码 好的，非常感谢，现在有点思路了，IO复用加线程池确实效率要高，业务处理也更合理点。
user-0 提问: 新人

回复:
user: user-0
content: 如果一道计算题放在不用函数我会解决 用函数就不知道怎么下手

user: user-1
content: 上图，还是建议你去看下基础书籍，这个还是基础的东西。

user: user-2
content: 函数就是实现复杂的逻辑关系的集合。比如你要显示屏间隔2秒显示一次信息。你自己手动的话就比较麻烦，用函数就可以自动定时2秒显示了
user-0 提问: 一个小小的算法

回复:
user: user-1
content: 需要将hello.c和sort.c都放入项目树的源文件目录下。

user: user-0
content: 引用 2 楼 赵4老师的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 老师，请教个问题，我用的是ubuntu ，安装了个基本c/c++开发环境 我写了两个文件sort.c和hello.c并且在hello.c中调用了sort.c   头文件中也引入了，但是提示找不到 sort.c 这个是不是需要安装什么插件？

user: user-0
content: 引用 1 楼 paschen的回复:最好的解释也比不上你 单步跟踪程序运行，观察每一步变量的变化情况 嗯，好的，多谢， 顺便再请教一个

user: user-2
content: 题目都错了，数组6，你初始化7个数据

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

user: user-3
content: 最好的解释也比不上你 单步跟踪程序运行，观察每一步变量的变化情况

user: user-4
content: 题目话都说不清楚

user: user-5
content: 仅供参考  #include <stdio.h> #include <stdlib.h>   #define GAME_CNT 7   int calc_min_fine(int endTime[], int fine[], int count, int timeLeft, int total_fine);   int main(int argc, char* argv[]) {  	int endTime[GAME_CNT] = {4, 2, 4, 3, 1, 4, 6}; 	int fine[GAME_CNT]	  = {70,60,50,40,30,20,10}; 	int bouty = 10000; 	 	int min_fine = 0; 	int n = 5;  	if (argc == 2) n = atoi(argv[1]);  	printf("total time is %d\n", n);	 	min_fine = calc_min_fine(endTime, fine, GAME_CNT, n, 0); 	printf("MAX=%d\n", bouty - min_fine);  	return 0; }  int calc_min_fine(int endTime[], int fine[], int count, int timeLeft, int total_fine) { 	int i = 0; 	int index = -1; 	int min = total_fine; 	int sum = 0; 	int front_fine = 0; 	 	for (i = 0; i < count; i++) { 		 		if (timeLeft < endTime[i]) { 			front_fine += fine[i]; 			continue; 		}  		sum = calc_min_fine(endTime+i+1, fine+i+1, count-i-1,  				timeLeft-endTime[i], total_fine + front_fine); 		 		if (index < 0) { 			min = sum; 			index = i; 		} 		 		if (sum < min) { 			min = sum; 			index = i; 		} 		 		front_fine += fine[i]; 	}  	if (index < 0) { 		min += front_fine; 	}  	return min;  }
user-0 提问: 新人求助一个关于函数调用和全局静态变量的问题（C语言）

回复:
user: user-1
content: 你这个是涉及存储类别的问题，请参考这里http://blog.csdn.net/libing403/article/details/72934528

user: user-2
content: 1. 所有函数都是加载到内存里运行的，每隔函数都有自己在内存的首地址，所以调用函数其实是跳转到某个内存地址去执行； 2. static定义的变量有其作用域，在文件里定义的static变量其作用域是本文件内可见，其他文件不能使用，也是未定义和未可见的。 在函数内定义的static变量，起作用域是其所在函数。 3. 能否编译通过，最好的办法是自己尝试一下，这个也不麻烦。验证的结果，应该是能编译通过的，static变量是在函数里使用了，你明白函数调用的原理，这个问题理解起来也会不难了。 4. static定义的变量和全局变量的生命周期是一样的，因为它们都是在数据段上申请的空间，作用域是整个程序开始到结束； 所以，若是多次调用某个函数（函数内有静态变量的读写），那么这个static定义的变量的值可能是变化了，比如若在你说的那个函数里对这个static的变量进行了修改，那么下次再调用该函数，那么它的值就是被修改之后的。  所以的猜测或者理论都是想象中的，没有经过实践的验证理论也只是理论；所以，建议将自己的问题去实践中验证，然后再去理解，这样可能效果更好！

user: user-3
content: 1楼回答的无问题，也不多说了

user: user-4
content: 1：每一个编译单元被编译成可执行的链接对象，所以你说的进入这个文件是不对的说法。 2：其他地方都看不到这个变量怎么可能用？就比如我都不知道你姓甚名啥，我喂的一声你知道我叫你么 PS：static 表示该变量是文件内可见，所以在头文件进行声明它并在其他地方使用是不应该的（是否报错还需验证） 3：（1）当然是可以的，你可以测试下。（2）你怎么样修改它，它就是什么值。
user-0 提问: 程序输入第一个数字的时候是对NULL地址进行操作，为什么对NULL地址操作不报错呢？

回复:
user: user-0
content: 引用 9 楼 paschen 的回复:不是有分配内存吗，第一次输入时data不是NULL啊  楼主可单步跟踪程序运行，观察变量变化情况 没注意，capacity初始值为0

user: user-1
content: 不是有分配内存吗，第一次输入时data不是NULL啊  楼主可单步跟踪程序运行，观察变量变化情况

user: user-2
content: 引用 7 楼 coverlo 的回复:[quote=引用 2 楼 versatts 的回复:]  capacity += CAPACITY_INCREMENT;        // Create new array of pointers        if(!(temp = (double*)realloc(data, capacity*sizeof(double))))        {          printf("Error allocating memory for data values.\n");          exit(1);        }        data = temp; 这里不是分配了内存么 最后没有释放temp，算不算瑕疵[/quote] data和temp指向同一地址，free一个就行了。

user: user-0
content: 引用 2 楼 versatts 的回复:capacity += CAPACITY_INCREMENT;        // Create new array of pointers        if(!(temp = (double*)realloc(data, capacity*sizeof(double))))        {          printf("Error allocating memory for data values.\n");          exit(1);        }        data = temp; 这里不是分配了内存么 最后没有释放temp，算不算瑕疵

user: user-0
content: 引用 4 楼 Cy_Chance 的回复:讲道理如果data如果真的是null是有问题的，但是问题并不是啊 。data后面是做过复制处理的！为了稳妥起见，可以在使用之前确认下是否是null 看错了，如果capacity初始值不为0的话，就会对NULL进行操作 这里capacity初始值为0

user: user-0
content: 引用 2 楼 versatts 的回复:capacity += CAPACITY_INCREMENT;        // Create new array of pointers        if(!(temp = (double*)realloc(data, capacity*sizeof(double))))        {          printf("Error allocating memory for data values.\n");          exit(1);        }        data = temp; 这里不是分配了内存么 这。。。 没看到一开始capacity变量定义为0，所以if语句是满足条件的，一开始要分配 我大意了

user: user-3
content: 讲道理如果data如果真的是null是有问题的，但是问题并不是啊 。data后面是做过复制处理的！为了稳妥起见，可以在使用之前确认下是否是null

user: user-4
content: 强制类型转换

user: user-2
content: capacity += CAPACITY_INCREMENT;        // Create new array of pointers        if(!(temp = (double*)realloc(data, capacity*sizeof(double))))        {          printf("Error allocating memory for data values.\n");          exit(1);        }        data = temp; 这里不是分配了内存么

user: user-0
content: scanf_s(" %lf", data + count++); 第一次输入一个double型的数据，会写入data指针所指的地址 但是data不是指向NULL吗？ 对NULL操作不会报错吗？
user-0 提问: 求助 C语言中如何往txt文件增加数据

回复:
user: user-0
content: 引用 9 楼 cfjtaishan 的回复:[quote=引用 6 楼 leoJD 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] 对于修改，对于普通文件还没有什么捷径直接修改文件里的某行数据，甚至是某个数据（要做到这些，需要专门的软件），只能是将所有数据读出来，在内存里修改，然后在重新写入文件中；  对于增加数据，如果是在文件末尾增加，可以在打开文件时，以追加的形式打开；若在某行数据之后增加，也只能读到内存里，然后在增加。 我在运行这个程序的时候 用修改再重新输出就是修改后的 但如果重新运行的时候 就不对了，txt文件里也会出现乱码，这要如何解决啊 谢谢[/quote] 看到你的写入用fwrite，但是读取用fscanf，读和写的函数不匹配呢。fscanf是格式化的，一个元素一个元素读取，而fwrite是整个结构体进行写的，建议若用fwrite写，那么就要用fread读吧；注意读写函数要匹配[/quote]好的 谢谢了

user: user-1
content: 对于修改，对于普通文件还没有什么捷径直接修改文件里的某行数据，甚至是某个数据（要做到这些，需要专门的软件），只能是将所有数据读出来，在内存里修改，然后在重新写入文件中；  对于增加数据，如果是在文件末尾增加，可以在打开文件时，以追加的形式打开；若在某行数据之后增加，也只能读到内存里，然后在增加。

user: user-2
content: 建议用数据库做这类题目，数据不多可以用access之类的小型DB。 往文件追加数据可以以"a"方式打开文件，然后中fwrite.

user: user-1
content: 引用 6 楼 leoJD 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] 对于修改，对于普通文件还没有什么捷径直接修改文件里的某行数据，甚至是某个数据（要做到这些，需要专门的软件），只能是将所有数据读出来，在内存里修改，然后在重新写入文件中；  对于增加数据，如果是在文件末尾增加，可以在打开文件时，以追加的形式打开；若在某行数据之后增加，也只能读到内存里，然后在增加。 我在运行这个程序的时候 用修改再重新输出就是修改后的 但如果重新运行的时候 就不对了，txt文件里也会出现乱码，这要如何解决啊 谢谢[/quote] 看到你的写入用fwrite，但是读取用fscanf，读和写的函数不匹配呢。fscanf是格式化的，一个元素一个元素读取，而fwrite是整个结构体进行写的，建议若用fwrite写，那么就要用fread读吧；注意读写函数要匹配

user: user-0
content: 引用 7 楼 libing403 的回复:关于c语言对文件的操作，以及输入输出，你可以参考一下这个资料 http://blog.csdn.net/libing403 哦 好的谢谢！

user: user-3
content: 关于c语言对文件的操作，以及输入输出，你可以参考一下这个资料 http://blog.csdn.net/libing403

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:对于修改，对于普通文件还没有什么捷径直接修改文件里的某行数据，甚至是某个数据（要做到这些，需要专门的软件），只能是将所有数据读出来，在内存里修改，然后在重新写入文件中；  对于增加数据，如果是在文件末尾增加，可以在打开文件时，以追加的形式打开；若在某行数据之后增加，也只能读到内存里，然后在增加。 我在运行这个程序的时候 用修改再重新输出就是修改后的 但如果重新运行的时候 就不对了，txt文件里也会出现乱码，这要如何解决啊 谢谢

user: user-0
content: 引用 2 楼 js_gary 的回复:建议用数据库做这类题目，数据不多可以用access之类的小型DB。 往文件追加数据可以以"a"方式打开文件，然后中fwrite. 谢了但目前只学了C

user: user-0
content: 引用 1 楼 jianwen0529 的回复:fp=fopen("e:\\1.txt","a") //a 模式是追加写入，不清楚内容并且从最后位置写入数据 谢谢

user: user-4
content: fp=fopen("e:\\1.txt","a") //a 模式是追加写入，不清楚内容并且从最后位置写入数据
user-0 提问: 求各位大神帮忙看看这程序怎么了，新手求帮忙

回复:
user: user-1
content: 程序很长，除了调试，你可以针对疑惑的地方查一下资料，可以看看这里的资料 http://blog.csdn.net/libing403?viewmode=contents

user: user-2
content: 就算你去医院难道你对医生说：我身体不舒服 然后你让医生一遍遍猜你哪里不舒服或者怎么不舒服吗

user: user-3
content: 同问，你的程序怎么了，建议对于较长的代码先把问题提出来~

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

回复:
user: user-1
content: 1楼回答比较专业！

user: user-2
content: 库函数写的有很多问题,下载作者提供的源码 http://pix.cs.olemiss.edu/csci561/unpv13e.tar.gz ./configure cd ./unpv13e/lib make  然后使用 其下的lib/unp.h 和 libunp.a 编程
user-0 提问: 在没有任何数据时进行无效的读取尝试

回复:
user: user-1

user: user-2
content: try { // string mm = ...; } catch(InvalidOperationException e) { //捕获异常，在这里处理 }  或者判断strReader['密码']的返回值是否为null？  PS：还有这是C#吧，有专门的版块

user: user-0
content: 就是我在输入数据库中没有的账号密码时， 就会出现这个问题。  我想在我输入无效的用户名密码时，返回用户名错误的提示
user-0 提问: 求大佬教我怎么把构造有向图中所输入的数据保存到txt文件中

回复:
user: user-1

user: user-2
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了
user-0 提问: 九度oj 1013 runtime error

回复:
user: user-1
content: 边界条件 输入输出格式 ……

user: user-2
content: 另外,时间比较 直接比较字符串即可

user: user-2
content: 流程有问题吧, 是先输入后输出, 你的是边输入边输出, 另外这个9度看起来挺差,这么多线上ACM怎么就选了这么个玩意

user: user-3
content: 引用 2 楼 Cy_Chance 的回复:建议你变量声明的时候做好初始化。 例如：char num[15]={0},ear_num[15]={0},late_num[15]={0};

user: user-3
content: 建议你变量声明的时候做好初始化。
user-0 提问: 一个windows的窗口，老是出现如下错误，求人帮忙看下，万分感激

回复:
user: user-1
content: 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-0
content: 怎么把这个引进去？就是说去哪里引？谢谢

user: user-2
content: 在项目设置里，将winmm.lib引入到工程中

user: user-3
content: 在源程序开头加上:      #include<mmsystem.h>      #pragma comment(lib,"winmm.lib")

user: user-4
content: 在库依赖里面加上 Winmm.lib
user-0 提问: pthread_t定义

回复:
user: user-1
content: typedef unsigned long int pthread_t少一个分号；因为typedef是一条完整的语句，而不是宏定义。 typedef unsigned long int pthread_t; 这句话的意思是，unsigned int别名是pthread_t，可以用pthread_t定义的变量，就相当与unsigned int定义的变量一样。

user: user-2
content: 相当于pthread_t实际是个unsigned long int，只不过用pthread_t表示线程ID

user: user-0
content: 引用 9楼paschen 的回复:[quote=引用 4 楼 mark_qzh 的回复:] [quote=引用 1 楼 paschen 的回复:] 相当于pthread_t实际是个unsigned long int，只不过用pthread_t表示线程ID 那unsigned long int是个什么类型？无符号长整型？[/quote]  是的，就是long int的无符号型，现在的机器上占4字节[/quote]嗯，我被搞晕了，我在看apue，线程那章节写道实现的时候可用一个结构来代表pthread_t数据类型，所以可移植的操作系统实现不能把它作为整型处理，是不是不同的系统定义不一样？

user: user-3
content: 以前有的机器int 占2个字节,因此要表示 4个字节的int 用long int 类似于64位下的 long long

user: user-2
content: 引用 4 楼 mark_qzh 的回复:[quote=引用 1 楼 paschen 的回复:] 相当于pthread_t实际是个unsigned long int，只不过用pthread_t表示线程ID 那unsigned long int是个什么类型？无符号长整型？[/quote]  是的，就是long int的无符号型，现在的机器上占4字节

user: user-3
content: sizeof(long int)，应该清楚了

user: user-4
content: //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-4
content: typedef typedef type-declaration synonym;  The typedef keyword defines a synonym for the specified type-declaration. The identifier in the type-declaration becomes another name for the type, instead of naming an instance of the type. You cannot use the typedef specifier inside a function definition.  A typedef declaration introduces a name that, within its scope, becomes a synonym for the type given by the decl-specifiers portion of the declaration. In contrast to the class, struct, union, and enum declarations, typedef declarations do not introduce new types — they introduce new names for existing types.  Example  // Example of the typedef keyword typedef unsigned long ulong;  ulong ul;     // Equivalent to "unsigned long ul;"  typedef struct mystructtag {    int   i;    float f;    char  c; } mystruct;  mystruct ms;   // Equivalent to "struct mystructtag ms;"  typedef int (*funcptr)();  // funcptr is synonym for "pointer                            //    to function returning int"  funcptr table[10];   // Equivalent to "int (*table[10])();"

user: user-5
content: unsigned long int  == unsigned long   0-(2^64)-1

user: user-0
content: 引用 1 楼 paschen 的回复:相当于pthread_t实际是个unsigned long int，只不过用pthread_t表示线程ID 那unsigned long int是个什么类型？无符号长整型？

user: user-0
content: 引用 2 楼 weixin_31656265 的回复:typedef 前面有#？  没有的，白纸上写就不淡定了 哈哈

user: user-6
content: typedef 前面有#？
user-0 提问: samba配置文件读取

回复:
user: user-0
content: 引用 3楼LubinLew 的回复:最省时省力的方法就是使用xml作为配置文件嗯，以前做过用xml作为配置文件的项目，但是那时候只是修修改改xml文件，没具体研究过，好像要用到libxml的吧

user: user-1
content: 最省时省力的方法就是使用xml作为配置文件

user: user-0
content: 引用 1楼user-2 的回复:samba 是Linux下的文件共享服务程序 ，读取smb.conf本身不是他的亮点吧？！难道是想解决，samba下访问权限的问题么?!不是，我就是想看看它的方法是不是高效点，我也准备写一个读配置的接口函数

user: user-2
content: samba 是Linux下的文件共享服务程序 ，读取smb.conf本身不是他的亮点吧？！难道是想解决，samba下访问权限的问题么?!
user-0 提问: 最近写C问题越来越多啊啊。

回复:
user: user-0
content: 引用 5 楼 cfjtaishan 的回复:scanf("%s%d %c", x[i].name, &x[i].num, &x[i].sex); 加一个空格即可，因为%c可以匹配空格，所以再输入num之后再输入sex时，你加了一个空格（这个是必要的），但是%c正好匹配到了这个空格，所以现在要在scanf中加一个空格，这样后面的输入就可以匹配%c了 谢谢，谢谢。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; 能解释一下这样的用意吗？不是很懂。 萌新

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

user: user-2
content: scanf("%s%d %c", x[i].name, &x[i].num, &x[i].sex); 加一个空格即可，因为%c可以匹配空格，所以再输入num之后再输入sex时，你加了一个空格（这个是必要的），但是%c正好匹配到了这个空格，所以现在要在scanf中加一个空格，这样后面的输入就可以匹配%c了

user: user-0
content: 引用 12 楼 zhao4zhong1 的回复:[quote=引用 7 楼 jtidni 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; 能解释一下这样的用意吗？不是很懂。 萌新[/quote] 百度搜相关关键字。[/quote] 知道了，谢谢~

user: user-0
content: 引用 10 楼 cfjtaishan 的回复:scanf中sex是字符串吧，既然用%s输入，就没有必要加&  fflush(stdout)和rewind(stdin)没必要加 sex临时改的，我输入的汉字，没用W女M男代替，之前定义的sex 然后%c输入汉字，出错了， 我才把定义成sex[10]的，后面忘改输入了，，哈哈。 谢谢了，我去改正确。 哦，那个不加fflush（stdout）和rewind（stdin）还是没法完成输入。我不知道那应该加，所以我全加了，然后就正确了

user: user-1
content: 引用 7 楼 jtidni 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; 能解释一下这样的用意吗？不是很懂。 萌新[/quote] 百度搜相关关键字。

user: user-1
content: 引用 10 楼 cfjtaishan 的回复:scanf中sex是字符串吧，既然用%s输入，就没有必要加&  fflush(stdout)和rewind(stdin)没必要加

user: user-2
content: scanf中sex是字符串吧，既然用%s输入，就没有必要加&  fflush(stdout)和rewind(stdin)没必要加

user: user-0
content: 谢谢各位大佬，在各位的帮助下，已经调试完成了

user: user-0
content: 知道了明天我试试，谢谢

user: user-3
content: 不加空格， %c 就取到空格了

user: user-3
content: scanf("%s%d%c", x[i].name, &x[i].num, &x[i].sex); //改为（加上空格） scanf("%s %d %c", x[i].name, &x[i].num, &x[i].sex);

user: user-0
content: 在这里谢谢了，谢谢各位大佬，我不想这么轻易就来论坛的，但确实找不到问题。感觉这两天写脑袋越来越昏。
user-0 提问: 总是有这三个错误，找不出来，那位帮看看，谢谢！

回复:
user: user-1
content: if (char a == '\b'||char a =='\t')  改成：  if (a == '\b' || a == '\t')  已经定义过变量，所以不用再写

user: user-2
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-3
content: 引用 8 楼 zhao4zhong1 的回复:偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。 方法学习。

user: user-0
content: 太Low了吧！

user: user-4
content: 这是基本语法，就好像：“你吃了吗？”  和  “你有没有吃了吗？”  这样的区别。。。。计算机无法识别啊亲，语法不对。

user: user-5
content: 引用 10 楼 unswimmingfish 的回复:[quote=引用 9 楼 unswimmingfish的回复:]我感觉是函数只能定义一次 说错了，是变量只能定义一次[/quote] 函数也不能重复定义 相同作用域的变量只需要定义一次，不同作用域可以存储相同变量名

user: user-0
content: 引用 9 楼 unswimmingfish的回复:我感觉是函数只能定义一次 说错了，是变量只能定义一次

user: user-0
content: 我感觉是函数只能定义一次

user: user-6
content: 第一次见这种写法

user: user-7
content: 引用 2楼我是你的主体 的回复:谢谢！But why？C函数参数里的char a具有函数作用域，即函数结束调用以前都是存在的。而且，C里面的变量都是需要先申明再使用，所以，不能放在if语句里面。

user: user-0
content: 那么vs2008是不是在瞎报警？

user: user-0
content: 谢谢！But why？

user: user-4
content: 把if (char a == '\b'||char a =='\t') 里面的两个 char 去掉 写成 if (a == '\b' || a =='\t')
user-0 提问: strcpy函数出错

回复:
user: user-1
content: strcpy(head->number,p[0]);                 strcpy(head->name,p[1]);                 strcpy(head->sex,p[2]);                 strcpy(head->age,p[3]);                 strcpy(head->birthplace,p[4]);                 strcpy(head->GPA,p[5]); 建议判断一下p[0], p[1], p[2], p[3], p[4], p[5]是否为NULL， 现在怀疑p[0]~p[5]有为NULL或者为野指针的。 另外，也可以通过j的值来判定，即j的值若小于等于5，则strcpy就会有问题。

user: user-2
content: 单步调试 估计要么是指针没有指向正确的地址，要么是你内存不足以拷贝源字符串

user: user-0
content: 其实是由于局部变量的作用域的问题，把上面的 char *buf=new char【36】 调到 getline函数下面就解决了问题了。 但是最后出现“屯屯屯”的字样现在还没有解决 搞不懂他是什么时候被读进去的。

user: user-3
content: 不会发图片 你试一下 这个代码就知道了 int m = 20;     printf("%p\n", &m);     {         int m = 30;         printf("%p\n", &m);     }

user: user-3
content: 看下面这个图片

user: user-3
content: while 循环 当中 char  *buf=new char[36];  改为 buf=new char[36];
user-0 提问: 地址赋值指针加强制转换问题

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

user: user-2
content: 因为野指针了, 出错是正常的吧.  char *tables[8];//此数组类型改不了 unsigned int *p = (unsigned int *)0x6800e008; table[0]=（char *）p;  你想要的是不是这个效果.

user: user-3
content: char *tables[8];//此数组类型改不了 unsigned int *p; *p=0x6800e008; //p指向哪里？ “0x6800e008”原本并不占有储存空间。 table[0]=（char *）p;

user: user-4
content: 不能直接给指针赋值，p=0x6800e008 理论上也应该报错。

user: user-0
content: 嗯那，犯了这么基础的错误，已改正，谢谢大家。

user: user-5
content: 引用 3 楼 wang0635 的回复:p=0x6800e008; 不是 *p=0x6800e008; ++ *p=0x6800e008是对指针指向的内存空间（4个字节）赋值。 若是p = 0x6800e008，但是不能确定这个地址是否可以使用呢，建议使用malloc申请

user: user-0
content: 引用 3楼wang0635 的回复:p=0x6800e008; 不是 *p=0x6800e008;对的，我在题目中打错了。马上修改。

user: user-6
content: p=0x6800e008; 不是 *p=0x6800e008;

user: user-0
content: 移植魔方还原算法，它是先手动申请内存，然后遍历，将近20000条指令，为了节省时间，所以现在第一次申请完表格后就直接复制地址。

user: user-7
content: 还有这种操作。。。不能直接手动分配地址，我记得
user-0 提问: 求一个 3×3矩阵两条对角线上元素之和（每个元素只加一次）。

回复:
user: user-1
content: 引用 3 楼 cfjtaishan 的回复:既然是数组，那么中间的那个元素先判断是否为素数，若是素数，那么在总和里减去中间那个计算两次的素数 素数?

user: user-2
content: 引用 4 楼 farmanlinuxer 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] 既然是数组，那么中间的那个元素先判断是否为素数，若是素数，那么在总和里减去中间那个计算两次的素数 素数?[/quote] 嗯？不是要计算对角线上的素数之和吗？

user: user-2
content: 既然是数组，那么中间的那个元素先判断是否为素数，若是素数，那么在总和里减去中间那个计算两次的素数

user: user-3
content: 第一种方法： 在计算之前，脑子里肯定已经知道了那个元素被重复计算了几次了，那么算完之后，再减去相应的次数。 第二种方法： 用一个nxm的（在你这题里是3x3）的bool数组，去标记已经把哪个元素计算过了，因为下标相同，所以很好操作，这样可以不用预先去思考哪些元素被重复加过。

user: user-4
content: 这还不简单，计算完之后，如果N为奇数，再减一次a[N/2][N/2]，N为偶数不处理