Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 请问怎么用C编写一个记事本,一定要用其他的东西才能完成吗?单独用C可以完成吗?具体的思路是怎么样的呢?求高手指点!

回复:
user: user-1
content: 参考Notepad++源代码。

user: user-2
content: 刚在你那个帖子里面回了下，这里就提到API了。  可以查下windows api的资料 XD

user: user-3
content: 看来是不懂，找本windows程序设计的书看吧，里面有现成的

user: user-4
content: 熟悉系统API就行, Edit控件从底层开始写那是相当费时间。 lz看来是几乎没有基础就来找建议的，不过这东西，多练练自然就会了

user: user-5
content: 你涉及到窗口等东西就和平台有关，就需要用平台提供的API等来实现
user-0 提问: 一个非常小的C程序，却找不出错误在哪里？帮帮我吧

回复:
user: user-1
content: 引用 7 楼 zhangxiangDavaid 的回复:读入两个整数，直接  scanf("%d%d\n",&a,&b);  即可 个人觉得还是不要再scanf语句里用上\n尾号，不然输入的时候其实很大程度上会忘记末尾\n

user: user-2
content: scnaf里面多了一个回车\n

user: user-3
content: scanf("   \n");这个\n去掉，不去掉系统无法判断你是否输入的数字完整了，然后你再输入你个数字，系统检测到了这个数字就判定你前面的输完了。

user: user-4
content: 仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-5
content: 引用 8 楼 grtorange 的回复:[quote=引用 7 楼 zhangxiangDavaid 的回复:] 读入两个整数，直接  scanf("%d%d\n",&a,&b);  即可  直接%d%d怎么判断输入的是一个数还是两个数……[/quote] 依据scanf的返回值

user: user-6
content: 引用 7 楼 zhangxiangDavaid 的回复:读入两个整数，直接  scanf("%d%d\n",&a,&b);  即可  直接%d%d怎么判断输入的是一个数还是两个数……

user: user-5
content: 读入两个整数，直接  scanf("%d%d\n",&a,&b);  即可

user: user-7
content: 1.从缓冲区读走一个字符，相当于清除缓冲区 2.前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'（输入完s[i]的值后按回车键所致），所以如果不在此加一个getchar()把这个回车符取走的话，gets(）就不会等待从键盘键入字符，而是会直接取走这个“无用的”回车符，从而导致读取有误 3. getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab) getchar()使用不方便,解决方法： （1）使用下面的语句清除回车： while(getchar()!='\n'); （2）用getche()或getch()代替getchar()，其作用是从键盘读入一个字符（不用按回车），注意要包含头文件<conio.h> 4. getchar()是stdio.h中的库函数，它的作用是从stdin流中读入一个字符，也就是说，如果stdin有数据的话不用输入它就可以直接读取了，第一次getchar()时，确实需要人工的输入，但是如果你输了多个字符，以后的getchar()再执行时就会直接从缓冲区中读取了。 实际上是 输入设备->内存缓冲区->程序getchar 你按的键是放进缓冲区了,然后供程序getchar 你有没有试过按住很多键然后等一会儿会滴滴滴滴响,就是缓冲区满了,你后头按的键没有存进缓冲区. 键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到'\n'.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符.如果需要取消'\n'的影响,可以用getchar();来清除,这里getchar();只是取得了'\n'但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符.还要注意的是这里你在键盘上输入ssss看到的回显正是来自于getchar的作用,如果用getch就看不到你输入了什么.

user: user-8
content: Scanf中尽量不要使用非输入控制符，尤其是不要用\n

user: user-9
content: 去掉scanf里的\n 因为用空白符结尾时，scanf会跳过空白符去读下一个字符，所以你必须再输入一个数   #include<stdio.h> int main() { 	int a,b; 	printf("please input number by accident:\n"); 	scanf("%d,%d",&a,&b);/*此处容易忘记a.b前的&，取值符*/   	printf("the result is:%d.\n",(a>=b)?a:b); }

user: user-10
content: scanf("%d,%d",&a,&b);中的%d,%d中的逗号去掉为最好。

user: user-11
content: scanf("%d,%d",&a,&b);

user: user-12
content: scanf("%d,%d",&a,&b);
user-0 提问: 今天因为不是很懂gets用法和strlen然后就破天荒想了一种东西

回复:
user: user-1
content: 要确定前面输入的回车会不会被赋值到c

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

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

user: user-0
content: 引用 8 楼 弓长羊羽的回复:[quote=引用 6 楼 KEYboarderQQ 的回复:] [quote=引用 4 楼 弓长羊羽的回复:]gets()会在最后加上结束符， 而你这里没有这个操作。 还是wa......zoj 2851那样的输入[/quote] gets()以换行作为结束标志，空格不行，所以wa......zoj 2851会被一次性读入。[/quote] 我的那个循环也是以换行作为标志，把一个字符串塞进一个数组。

user: user-3
content: 引用 6 楼 KEYboarderQQ 的回复:[quote=引用 4 楼 弓长羊羽的回复:]gets()会在最后加上结束符， 而你这里没有这个操作。 还是wa......zoj 2851那样的输入[/quote] gets()以换行作为结束标志，空格不行，所以wa......zoj 2851会被一次性读入。

user: user-4
content: 引用 5 楼 花海_的回复:你用gets(s[i])的话，编译器会自动在最后加一个'\0'，表示字符串终止。你要是用上面那循环的话，就没有这个。 赞同，需要你加上最后的结束标志

user: user-0
content: 引用 4 楼 弓长羊羽的回复:gets()会在最后加上结束符， 而你这里没有这个操作。 还是wa......zoj 2851那样的输入

user: user-5
content: 你用gets(s[i])的话，编译器会自动在最后加一个'\0'，表示字符串终止。你要是用上面那循环的话，就没有这个。

user: user-3
content: gets()会在最后加上结束符， 而你这里没有这个操作。

user: user-3
content: 至少  s[i][j]=c;  改为  s[i][k]=c;

user: user-6
content: 引用 1楼花海_ 的回复:你for循环的判断条件都没有，你确定程序没报错吗那里不是有个break么……

user: user-5
content: 你for循环的判断条件都没有，你确定程序没报错吗
user-0 提问: if, else if, else中，else下面的scanf函数为什么不执行？

回复:
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: user-0
content: 引用 6 楼 qq_31984717 的回复:1.从缓冲区读走一个字符，相当于清除缓冲区 2.前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'（输入完s[i]的值后按回车键所致），所以如果不在此加一个getchar()把这个回车符取走的话，gets(）就不会等待从键盘键入字符，而是会直接取走这个“无用的”回车符，从而导致读取有误 3. getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab) getchar()使用不方便,解决方法： （1）使用下面的语句清除回车： while(getchar()!='\n'); （2）用getche()或getch()代替getchar()，其作用是从键盘读入一个字符（不用按回车），注意要包含头文件<conio.h> 4. getchar()是stdio.h中的库函数，它的作用是从stdin流中读入一个字符，也就是说，如果stdin有数据的话不用输入它就可以直接读取了，第一次getchar()时，确实需要人工的输入，但是如果你输了多个字符，以后的getchar()再执行时就会直接从缓冲区中读取了。 实际上是 输入设备->内存缓冲区->程序getchar 你按的键是放进缓冲区了,然后供程序getchar 你有没有试过按住很多键然后等一会儿会滴滴滴滴响,就是缓冲区满了,你后头按的键没有存进缓冲区. 键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到'\n'.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符.如果需要取消'\n'的影响,可以用getchar();来清除,这里getchar();只是取得了'\n'但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符.还要注意的是这里你在键盘上输入ssss看到的回显正是来自于getchar的作用,如果用getch就看不到你输入了什么. 大致明白是怎么回事了。我又试了下scanf("%d", &number);这种情况下就不存在自动跳过的情况，是不是因为'\n'是%c型而不能转换成%d型的缘故啊？

user: user-0
content: 引用 4 楼 qq_31984717 的回复:你是else的那个scanf被跳过了吗 对的，整个else都执行就是不执行scanf()。

user: user-2
content: 1.从缓冲区读走一个字符，相当于清除缓冲区 2.前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'（输入完s[i]的值后按回车键所致），所以如果不在此加一个getchar()把这个回车符取走的话，gets(）就不会等待从键盘键入字符，而是会直接取走这个“无用的”回车符，从而导致读取有误 3. getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab) getchar()使用不方便,解决方法： （1）使用下面的语句清除回车： while(getchar()!='\n'); （2）用getche()或getch()代替getchar()，其作用是从键盘读入一个字符（不用按回车），注意要包含头文件<conio.h> 4. getchar()是stdio.h中的库函数，它的作用是从stdin流中读入一个字符，也就是说，如果stdin有数据的话不用输入它就可以直接读取了，第一次getchar()时，确实需要人工的输入，但是如果你输了多个字符，以后的getchar()再执行时就会直接从缓冲区中读取了。 实际上是 输入设备->内存缓冲区->程序getchar 你按的键是放进缓冲区了,然后供程序getchar 你有没有试过按住很多键然后等一会儿会滴滴滴滴响,就是缓冲区满了,你后头按的键没有存进缓冲区. 键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到'\n'.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符.如果需要取消'\n'的影响,可以用getchar();来清除,这里getchar();只是取得了'\n'但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符.还要注意的是这里你在键盘上输入ssss看到的回显正是来自于getchar的作用,如果用getch就看不到你输入了什么.

user: user-3
content: 后面的那个可以这样写 scanf(" %c", &character_command); 就把前面的回车跳过去了

user: user-2
content: 你是else的那个scanf被跳过了吗

user: user-0
content: 引用 2 楼 zhangxiangDavaid 的回复:在每个scanf前加上 rewind(stdin); 可以了，非常感谢。 查了下百科，没看明白，能通俗的解释下是怎么回事吗？

user: user-4
content: 在每个scanf前加上 rewind(stdin);

user: user-0
content: 这个是运行的结果：
user-0 提问: 研究RSA的时候发现的一个BUG，很有意思，希望大家帮忙找找这个BUG是什么原因

回复:
user: user-0
content: 哎  试过了 看不出什么东西 在调试内存的时候 发现realloc会多覆盖两个字节 估计是这个原因 当主函数 tmp分配的空间大的时候 则不会出现这个问题 我在想 估计是realloc覆盖造成的

user: user-1
content: 点最左边那个中断按钮，然后通过调用堆栈、变量窗口等观察分析原因
user-0 提问: Linux下thread,fork, 直接调用速度比较，为什么直接调用快好多阿？

回复:
user: user-1
content: pthread_create 创建线程 fork 创建进程

user: user-0
content: 计时时间开始在循环里的

user: user-2
content: 很简单，创建线程或进程也是需要时间的嘛
user-0 提问: （1 3 2 17 6 5 4 18 19 10）帮我构建平衡二叉树

回复:
user: user-1

user: user-2
content: 平衡树的插入算法，根据数据结构与算法写的 http://blog.csdn.net/liehu232/article/details/50577243

user: user-3
content: 参看《算法导论》中红黑树部分
user-0 提问: C语言 小数用乘法变成整数小问题

回复:
user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-2
content: 浮点不能精确表示,不能重复乘10,这样会造成累积误差,如下处理试一下        long long i;         for(i=1;;i*=10){             double z =a*i;             if(z-(int)z<1e-12)                 break;         }        z=a*i;

user: user-3
content: #include<stdio.h> int main() { float a; int z; while(scanf("%f",&a)!=EOF) { do { a=a*10; } while((int)a!=a); z=(int)a;//强制转换一下吧 printf("%d\n",z); } return 0; }

user: user-4
content: 用完scanf记得加getchar（）或者fflush（stdin）清空字符流

user: user-5
content: 浮点数在内存中是有误差的，所以比较浮点数不要直接比较是否相等，应该比较两数相减后绝对值是否足够小  单步跟踪你程序就会发现，程序比较：2345与2345.0000000000005得出不相等，所以循环一直继续

user: user-6
content: 一种“偷懒”的做法：  #include <stdio.h> #include <string.h> char str[50]; double d; int r; char *removePoint(char *s) { 	if (NULL == s)return s; 	int i = 0; 	while (s[i] && s[i] != '.') { 		i++; 	} 	if (s[i]) { 		memmove(s + i, s + i + 1, strlen(s) - i + 1); 	} 	return s; } int main(void){ 	while (1) { 		r = scanf("%lf", &d); 		if (r != 1)break; 		sprintf(str, "%g", d); 		printf("%s\n", removePoint(str)); 	} 	return 0; } //1.2345 //12345 //123.456 //123456
user-0 提问: 简单的helloworld程序，gcc链接出错

回复:
user: user-1
content: 应该是编译器问题，你重新转gcc，不然就找别人的系统来编一下 不然就重新找个linux系统来装起试试看

user: user-2
content: 后面写错，argv

user: user-2
content: int  main (int argc,char** argc )试试

user: user-3
content: gcc是编译汇编链接的一脚本，链接阶段出现的crash是因为编译阶段出现了异常，传递给链接器的地址存在问题，是编译器的问题，请重新安装gcc，设置一下再试试

user: user-4
content: 这哥们跟你一样的错误，看看吧http://zhidao.baidu.com/link?url=MqTPJmKukI75glDFUuhQzB5R4cb7ND2rNiyUphfNXYhTx2LOGAvuY5q2vVvGYoTrIcWlIpwexAnpWAywvFx_o_

user: user-5
content: 用的啥版本的ubuntu？啥版本的gcc？看来是你的ld不能运行，重装gcc不行就重装ubuntu

user: user-0
content: 引用 9 楼 Z_R_Z_798205 的回复:ld --verbose 输出之后看链接文件有没有错误  段错误（核心已转存）

user: user-6
content: ld --verbose 输出之后看链接文件有没有错误

user: user-7
content: 重新安装gcc

user: user-8
content: 把这个文件放别的机器上试试

user: user-9
content: 吧多余的空行去掉试试。

user: user-0

user: user-0
content: 引用 3 楼 ynsenyu 的回复:用root，很不好的习惯，试试普通用户编译看看  没有解决问题

user: user-5
content: 用root，很不好的习惯，试试普通用户编译看看

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:这种代码出错了，百度吧，太离谱了！  ------------------------------  你确定这个是简单的问题？ 我弄了一段时间，查过的方向：GCC版本问题——升级无果；GCC安装环境——重新配置无果

user: user-10
content: 这种代码出错了，百度吧，太离谱了！
user-0 提问: C语言高手请进：这个分块求和C语言程序问题出在哪里？​对一组无规律数据按正数、负数和零分块求和

回复:
user: user-1
content: 引用 8 楼 topxjl 的回复:[quote=引用 7 楼 zhangxiangDavaid 的回复:] [quote=引用 6 楼 topxjl 的回复:] David 大师的代码让人惊奇！ 哪里惊奇？是哪里错了吗？[/quote] 您的代码是专家级别，水平高，大赞！！！[/quote] 哎，这年头专家可多了！不值一提

user: user-1
content: 引用 6 楼 topxjl 的回复:David 大师的代码让人惊奇！ 哪里惊奇？是哪里错了吗？

user: user-0
content: David 大师的代码让人惊奇！

user: user-2
content: 引用 3 楼 topxjl 的回复:[quote=引用 2 楼 paschen 的回复:] 数组初始化赋值用大括号：int source[100] = { 2, 3, 8, 6, 0, 0, -2, -1, -4, 0, 5, 6, 7, -5, -2 };  target[i] = target[i - 1] + source[i] 这句后面没有分号  r 变量 没有定义  for循环用的是分号不是逗号  for (j = 1, j <= 100, j++)  楼主先把基础打好先  谢谢版主！我用文本文件编辑的，没有编译。我的程序还有问题，希望能得到您的帮助！[/quote]  你先改了这些，看还有什么问题再回复

user: user-1
content: 简单处理即可：  #include <stdio.h> #define M 15 int source[M] = { 2, 3, 8, 6, 0, 0, -2, -1, -4, 0, 5, 6, 7, -5, -2 }; int target[M]; int i, s, sum; int main(void) { 	sum = target[0] = source[0]; 	//统计求和 	for (i = 1; i < M; i++) { 		s = source[i] * source[i - 1]; 		if (s <= 0) { //有0出现或异号 			sum = target[i] = source[i]; 		} 		else { //同号 			sum += source[i]; 			target[i] = sum; 		} 	} 	//打印source 	for (i = 0; i < M; i++) { 		printf("%3d", source[i]); 	} 	printf("\n"); 	//打印target 	for (i = 0; i < M; i++) { 		printf("%3d", target[i]); 	} 	return 0; } // 2  3  8  6  0  0 -2 -1 -4  0  5  6  7 -5 -2 // 2  5 13 19  0  0 -2 -3 -7  0  5 11 18 -5 -7

user: user-0
content: 引用 2 楼 paschen 的回复:数组初始化赋值用大括号：int source[100] = { 2, 3, 8, 6, 0, 0, -2, -1, -4, 0, 5, 6, 7, -5, -2 };  target[i] = target[i - 1] + source[i] 这句后面没有分号  r 变量 没有定义  for循环用的是分号不是逗号  for (j = 1, j <= 100, j++)  楼主先把基础打好先  谢谢版主！我用文本文件编辑的，没有编译。我的程序还有问题，希望能得到您的帮助！

user: user-2
content: 数组初始化赋值用大括号：int source[100] = { 2, 3, 8, 6, 0, 0, -2, -1, -4, 0, 5, 6, 7, -5, -2 };  target[i] = target[i - 1] + source[i] 这句后面没有分号  r 变量 没有定义  for循环用的是分号不是逗号  for (j = 1, j <= 100, j++)  楼主先把基础打好先

user: user-0
content: 引用 7 楼 zhangxiangDavaid 的回复:[quote=引用 6 楼 topxjl 的回复:] David 大师的代码让人惊奇！ 哪里惊奇？是哪里错了吗？[/quote] 您的代码是专家级别，水平高，大赞！！！

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

回复:
user: user-1
content: for之后的分号让for成为一个空循环了

user: user-2
content: for(t=0;t<i&&a[t]!='.';t++);后面的分号去掉

user: user-3
content: for 的循环体部分是空语句（;） for 后面的大括号是迷惑人的，跟没有一样。后面的代码它们与 for 没关系

user: user-0
content: 原来如此，谢谢各位啦~
user-0 提问: 关于char *s的问题

回复:
user: user-1
content: switch中中的case 是标号 因此，执行很简单，符合条件转到标号执行 break,return ，goto 等跳转语句后，跳转到别处执行 break 跳出switch 块 return 跳出函数（函数返回） goto 跳到对应 的位置。 不过，一般switch 只有break,return 。很少用goto   switch 块内的语句，除了进入switch 块做个选择外，顺序执行。 遇到到break,return ，goto 等则跳转。

user: user-2
content: 1.char *s与char s的区别 答：前者是指向字符类型的指针变量，存放的是地址，后者是字符变量，存放的是字符。  2.s初始地址是49，为什么当k=2时，又回到了初始地址49呢 答：图中说明了S的地址是49么？图中是*S，不是S，*S是读取指针S指向的元素值。这也就是为什么当K=2时，又回到49的原因了。  3、switch是开关语句，特性是如有break语句跳出该语句，没有从上往下执行一遍退出。

user: user-3
content: switch中每个case后不加break会一直往下执行  char是一个字符，char*是指向字符的指针

user: user-4
content: 1.char *s与char s的区别 答：类型显然不同 2.s初始地址是49，为什么当k=2时，又回到了初始地址49呢 49是字符'1'的ASCII值，不是地址。  关于指针 http://blog.csdn.net/zhangxiangdavaid/article/details/37885275

user: user-5
content: 看书去吧 1，字符串和字符 2.‘49’是第一个值和第三个值，都是1，不是地址。 3，单步调试
user-0 提问: Windows 下 c文件无法使用结构体struct stat

回复:
user: user-1
content: 因为这个结构体在 sys/stat.h 头文件中，这是Linux环境下的头文件。

user: user-2
content: 试试看能不能蹭分

user: user-3
content: 包含头文件 #include<sys/stat.h>

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

user: user-0
content: 是c文件函数必须变量定义在函数前的原因，忘了
user-0 提问: if else 小问题！求解答！

回复:
user: user-1
content: 是的，就算执行else，char max[100]的生命周期也仅仅在else范围中

user: user-2
content: 函数体内的变量的生命周期在函数体内都可以访问。  vs2008 int _tmain(int argc, _TCHAR* argv[]) { 	//进入main函数后就在栈上开辟好了变量所需的空间。 	int a=4; 	//通过变量a的地址推算出数组imax,max的地址。 	memset((char*)((int)&a-8-100),0,100); 	//修改imax数组字符串"vvvvvvv"。 	strcat((char*)((int)&a-8-100),"vvvvvvv"); 	memset((char*)((int)&a-8-100-8-100),0,100); 	//修改max数组字符串"kkkkkkkkk"。 	strcat((char*)((int)&a-8-100-8-100),"kkkkkkkkk"); 	if (a!=0) 	{ 		char imax[100] ; 		//打印imax字符串"vvvvvvv"。 		printf("%s\n",imax); 	} 	else { 		char max[100];  		//打印max字符串"kkkkkkkkk"。 		printf("%s\n",max); 	} 	return 0; }

user: user-3
content: 看编译生成的汇编代码
user-0 提问: hdu1003Runtime Error (ACCESS_VIOLATION)

回复:
user: user-0
content: 能不能通俗点比如想法有问题还是哪一步代码有问题

user: user-1
content: 运行出错时点中中断，通过调用堆栈、变量窗口等观察分析原因

user: user-0
content: Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 195914    Accepted Submission(s): 45729   Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.    Input The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and 1000).    Output For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence. If there are more than one result, output the first one. Output a blank line between two cases.    Sample Input 2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5   Sample Output Case 1: 14 1 4  Case 2: 7 1 6
user-0 提问: 求大神帮忙 LeetCode two sum c语言问题

回复:
user: user-1
content: int * ret = malloc(sizeof(int) * 2); ret[0] = index1; ret[1] = index2; return ret;

user: user-2
content: 注释的意思应该是，返回值必须放在一个数组，这个数组的空间要动态开辟，且假定主函数中已经释放malloc开辟的内存。

user: user-3
content: 返回的通过malloc分配的, 看起来这代码没有返回 专门去看了一下题目好像没有要求, 要快一点可以排序或者hash

user: user-4
content: 这种 n^2 的方法肯定过不去 lc 时间限制的。 引用 楼主 qq_31933059 的回复:还有，我也不理解注释中的： * Note: The returned array must be malloced, assume caller calls free(). 这句是什么意思 lc 说的是返回的指针应该指向一个数组，包含两个元素。这个数组由你在函数内分配，然后由 oj 负责 free。
user-0 提问: 4个字节16进制数转换成十进制浮点数

回复:
user: user-1
content: char p[4] = { 0x1e,0x0d,0xa8,0x3c }; 	float* f = (float*)p; 	//之后*f将是0.0205140673 	//之后可以直接判断*f是否大于0.0f来分别正负

user: user-2
content: float类型内存表示 请阅读 IEEE 754-2008 国际标准。计算机按此标准存放float数据。 数据传输和存放，涉及字节流序列。小端码和大端码 字节序列不同。

user: user-2
content: #include <stdio.h> int main(void) {      float a=0.0f; 	unsigned char * b = (unsigned char*)&a; 	char c[4] = {0x1e,0x0d,0xa8,0x3c};      int i = 0;     //printf("b1:%d\n",b);     for(i = 0; i<4; i++){ 		b[i] = (unsigned char)c[i]; 	} 	//printf("b2:%d\n",*b); 	printf("结果为：\n");     printf("%f\n", a);     //printf("a:%d\n",a); }

user: user-3
content: 浮点数格式 http://bbs.csdn.net/topics/390676437
user-0 提问: C++怎么提取时间信息 2016/1/21

回复:
user: user-1
content: int nYear,nMonth,nDay; sscanf("2016/1/21","%d/%d/%d/",&nYear,&nMonth,&nDay);

user: user-2
content: 参考：  #include <stdio.h> #include <string.h> int main(void) { 	char date[] = "2016 1 21"; 	int r, d; 	char *p = strtok(date, " "); 	printf("%s\n", p); 	while (1) { 		if (NULL == (p =  strtok(NULL, " "))) break; 		printf("%s\n", p); 	} 	return 0; } //2016 //1 //21
user-0 提问: windows编程开发 C语言描述 使用listview和treeview实现资源管理器

回复:
user: user-1
content: 引用 1 楼 wzwwql 的回复:MFC些的要不要求发邮箱873857547@qq.com

user: user-2
content: MFC些的要不要

user: user-3
content: #由Windows版移至C语言#
user-0 提问: 用结构体建立链表，为什么输出一个链表，就自动结束运行了？

回复:
user: user-1
content: 引用 7 楼 why444216978 的回复:[quote=引用 6 楼 paschen 的回复:] [quote=引用 5 楼 why444216978 的回复:] [quote=引用 4 楼 paschen 的回复:] 加一个getchar(); 接收回车产生的'\n'   	while (c == 'Y' || c == 'y') 	{ 		getchar(); //接收回车产生的'\n' 		head = AppendNode(head); 		DispLink(head);      //显示当前链表各结点信息 		printf("Do you want to append a new node(Y/N)?"); 		scanf("%c", &c); 		i++; 	}      还是不行[/quote]  自己加断点单步调试分析原因 [/quote]   codeblocks怎么加断点分布调试啊。。。百度了好久百度不出来[/quote]  http://www.shangxueba.com/jingyan/1837645.html

user: user-0
content: 引用 6 楼 paschen 的回复:[quote=引用 5 楼 why444216978 的回复:] [quote=引用 4 楼 paschen 的回复:] 加一个getchar(); 接收回车产生的'\n'   	while (c == 'Y' || c == 'y') 	{ 		getchar(); //接收回车产生的'\n' 		head = AppendNode(head); 		DispLink(head);      //显示当前链表各结点信息 		printf("Do you want to append a new node(Y/N)?"); 		scanf("%c", &c); 		i++; 	}      还是不行[/quote]  自己加断点单步调试分析原因 [/quote]   codeblocks怎么加断点分布调试啊。。。百度了好久百度不出来

user: user-1
content: 引用 5 楼 why444216978 的回复:[quote=引用 4 楼 paschen 的回复:] 加一个getchar(); 接收回车产生的'\n'   	while (c == 'Y' || c == 'y') 	{ 		getchar(); //接收回车产生的'\n' 		head = AppendNode(head); 		DispLink(head);      //显示当前链表各结点信息 		printf("Do you want to append a new node(Y/N)?"); 		scanf("%c", &c); 		i++; 	}      还是不行[/quote]  自己加断点单步调试分析原因

user: user-0
content: 引用 4 楼 paschen 的回复:加一个getchar(); 接收回车产生的'\n'   	while (c == 'Y' || c == 'y') 	{ 		getchar(); //接收回车产生的'\n' 		head = AppendNode(head); 		DispLink(head);      //显示当前链表各结点信息 		printf("Do you want to append a new node(Y/N)?"); 		scanf("%c", &c); 		i++; 	}      还是不行

user: user-1
content: 加一个getchar(); 接收回车产生的'\n'   	while (c == 'Y' || c == 'y') 	{ 		getchar(); //接收回车产生的'\n' 		head = AppendNode(head); 		DispLink(head);      //显示当前链表各结点信息 		printf("Do you want to append a new node(Y/N)?"); 		scanf("%c", &c); 		i++; 	}

user: user-0
content: 引用 1 楼 Z_R_Z_798205 的回复:head 没有分配内存 不对啊。。。每次循环都动态分配内存了  运行的时候  是显示第二次   Do you want to append a new node(Y/N)?   的时候 他结束运行，  如果是没有分配内存的话，应该直接就退出了吧。。。。

user: user-0
content: 引用 1 楼 Z_R_Z_798205 的回复:head 没有分配内存 在 struct Link *AppendNode(struct Link *head)这个函数里   每循环一次分配一次么？ 分配的大小是多大啊

user: user-2
content: head 没有分配内存
user-0 提问: 菜鸟求助！急盼解答！

回复:
user: user-1
content: 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！

user: user-0
content: 各位大神，能否给个C版本（不是C++版本）的答案？谢谢各路大神的配合！

user: user-2
content: #include <iostream> #include<string> using namespace std;  void print_x(char x,int m,int n){ 	while(m!=0){ 		cout<<"\t"; 		m--; 	} 	cout<<x; 	while(n!=0){ 		cout<<"\t"; 		n--; 	} } void number_x(int num,char char_num){ 	int ix=0,var=num-1; 	for(;var!=0;var--,ix++){ 		print_x((char_num-var),ix,var); 		print_x((char_num-var),var,ix); 		cout<<endl; 	} 	print_x((char_num-var),ix,var); 	cout<<endl; 	ix=1,var=num-2; 	for(;var>=0;var--,ix++){ 		print_x((char_num-ix),var,ix); 		print_x((char_num-ix),ix,var); 		cout<<endl; 	} } int main(){ 	char x;int num; 	cout<<"请输入一个数字，ctr+z结束"<<endl; 	cin>>num; 	cout<<"请输入一个字母,ctr+z结束"<<endl; 	cin>>x; 	cout<<"结果是"<<endl; 	number_x(num,x); 	system("pause"); }
user-0 提问: vs2010编译没有错误，运行会显示Unable to start program的问题。	

回复:
user: user-1
content: DLL需要有宿主EXE才能运行

user: user-2
content: 在MSDN里面搜“调试DLL”

user: user-1
content: dll文件不能独立运行

user: user-3
content: 你编译的是一个库文件，不是一个可执行程序。

user: user-0
content: 看我的工程文件，这就是一个正常的工程，是因为这个工程就是用来生成.DLL文件的，所以不能第二次运行吗？
user-0 提问: linux下如何判断文件被占用

回复:
user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:独占打开失败即被占用。我觉得。 如果已经被其他进程采用非独占的方式打开了，这个就没有用了。

user: user-2
content: java中没有独占打开linux中的文件的方法，有人知道怎么才能在java代码中独占打开文件吗？

user: user-3
content: 引用 2 楼 zhao4zhong1 的回复:独占打开失败即被占用。我觉得。  赵老师，linux上怎么独占打开文件？目前没有找到合适方式。

user: user-0
content: 最后还是用lsof判断文件夹，然后使用脚本过滤筛选出未被占用的文件。。。。。。没时间看lsof的源代码，应该有底层接口判断方法

user: user-1
content: 拷贝之前用flock()锁住，拷贝玩用flock()解锁。

user: user-0
content: 额，我整理了下这方面的资料，linux下是没有直接的api或者对应的标识符来判断文件是否被占用，因为难以保证其他的进程对文件的操作，linux下没有对文件做这方面的功能；所以必须在业务层自己判断： 1.独占方式打开失败 2.文件锁--建议锁锁文件失败 3.文件内容hash，2s钟后比对失败  目前只想到了上述3中方法判断。。。。

user: user-4
content: 返回打开文件的状态。

user: user-5
content: 独占打开失败即被占用。我觉得。

user: user-0
content: 刚刚又想到一个思路，linux所有非正常关闭的文件都会有一个以swp结尾的备份文件，可以判断该文件是否存在来判断文件的状态，但是这个方法比较取巧，还是想知道有没有对应的api或者对应的状态标识符来获得文件是否被占用？
user-0 提问: 这个问题困扰了我很久，请各位大神帮忙

回复:
user: user-1
content: 听1楼筒子的 7楼说的好热闹

user: user-2
content: 看看啦。。。。。

user: user-3
content: 引用 7 楼 gwbzx 的回复:任何的技巧或方式都是为解决问题而衍生的，如果解决不了现实中的问题所有的努力都是狗屁 ，大学生或是教授级别解决不了问题的人同样会被淘汰！ 佛说：苦难面前众生平等！ 恐龙灭绝了，因为它被自己的屁熏死了，苍蝇活到了现在，因为它有吃不完的大便。  任何如今看似规模宏大的大型企业都是由当初的苍蝇般的臭虫活过来的，只应为他们只吃大便 ，如果你想统一天下，请吃大便吧！！

user: user-4
content: 任何的技巧或方式都是为解决问题而衍生的，如果解决不了现实中的问题所有的努力都是狗屁 ，大学生或是教授级别解决不了问题的人同样会被淘汰！ 佛说：苦难面前众生平等！ 恐龙灭绝了，因为它被自己的屁熏死了，苍蝇活到了现在，因为它有吃不完的大便。  任何如今看似规模宏大的大型企业都是由当初的苍蝇般的臭虫活过来的，只应为他们只吃大便 ，如果你想统一天下，请吃大便吧！！

user: user-5
content: EOF定义为-1，所以只是一般输入字符或者回车的话是无法跳出循环的。可以用0XA(即enter键)判断输入是否结束，作为跳出循环的依据。

user: user-6
content: 是想统计输入了多少个字符吧，不过每次按回车，还会多产生一个'\n'

user: user-7
content: EOF用来标识文件尾，windows中头文件可能是这样定义的#define EOF -1 你可以printf("EOF = %d",EOF); 查看EOF具体的值； 而当getchar从键盘获取输入的时候，一般是检测到回车结束 ，所以getchar最后一个读取的是''\n' ASCII值为10，所以getchar最后一个获取到的值是10，10 != -1 所以又会进入循环体，导致死循环。 但如果把输入重定向到文件的话getchar就能读取到标识结束符的EOF,你可以把以上代码编译为160121.exe， 然后cmd下进入其所在目录，运行160121.exe< 160121.txt，其中160121.txt是一个包含有限文本的文档。 而如果你是要从键盘获取到输入，判断条件可以改为getchar() != '\n'

user: user-8
content: printf("%ld\n", nc);

user: user-9
content: 在ws下按楼上的方式输入结束符~

user: user-3
content: Enter、Ctrl+Z、Enter
user-0 提问: 【请问】如果不加锁，修改基本类型的数据在多线程下安全吗？

回复:
user: user-0
content: 引用 2 楼 mLee79 的回复:如果 a 在 4字节边界对齐， 现在能见到的32位及以上的处理器上不会， 但是会出现一些线程读出 0xCCDDEEFF 同时另一些线程读出 0x01020304 的情况。  要避免这种情况， 需要刷新各核心的高速缓存 比如加  lock 前缀啊， 用 ldrex 啥的指令啊什么的。。。  你提到一个条件，就是“ 4字节边界对齐”。 如果是1字节对齐，那么就有可能出现只修改部分字节的情况，是吗？

user: user-1
content: 如果 a 在 4字节边界对齐， 现在能见到的32位及以上的处理器上不会， 但是会出现一些线程读出 0xCCDDEEFF 同时另一些线程读出 0x01020304 的情况。  要避免这种情况， 需要刷新各核心的高速缓存 比如加  lock 前缀啊， 用 ldrex 啥的指令啊什么的。。。

user: user-2
content: 基本类型（值类型）应该不会出现读到只修改部分的情况

user: user-3
content: 不安全

user: user-1
content: 引用 3 楼 HeBanBei 的回复:[quote=引用 2 楼 mLee79 的回复:] 如果 a 在 4字节边界对齐， 现在能见到的32位及以上的处理器上不会， 但是会出现一些线程读出 0xCCDDEEFF 同时另一些线程读出 0x01020304 的情况。  要避免这种情况， 需要刷新各核心的高速缓存 比如加  lock 前缀啊， 用 ldrex 啥的指令啊什么的。。。  你提到一个条件，就是“ 4字节边界对齐”。 如果是1字节对齐，那么就有可能出现只修改部分字节的情况，是吗？[/quote]  没4字节对齐是未定义行为， 在很多RISC的处理器上会直接crash， 在单CPU的 x86 处理器上应该能正常工作， 在多CPU的 x86  SMP上即使加了 lock 前缀也是未定义行为， 有可能会读到部分修改的值。

user: user-4
content: 不安全。  编译器如何处理的代码，与 CPU 如何处理得到的指令，都会带来潜在的危险。
user-0 提问: c语言如何将一个十进制负整数转换成四字节的十六进制？？？

回复:
user: user-1
content: 引用 2 楼 paschen的回复:http://blog.chinaunix.net/uid-20776242-id-1846735.html 这个链接打不开，是怎么回事

user: user-2
content: 可以用一个uint8_t的指针指向这个int整数，然后挨个printf %x,如果你真需要四个字节显示的话

user: user-3
content: http://blog.chinaunix.net/uid-20776242-id-1846735.html

user: user-4
content: #include "stdio.h" int main(){ 	int a;     printf("输入一个整数：\n");     scanf("%d",&a); 	printf("十六进制输出为：\n");     printf("0x%hhx\n", a);     return 0;  }

user: user-5
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉
user-0 提问: getchar这个函数是会等待用户输入但是又会继续循环吗？

回复:
user: user-1
content: 仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-2
content: 你怎么知道是回到13行让你输入数据，而不是一直卡在getchar让你输入？   问题一：%d是无法读取走scanf输入结束后的换行符的，因为类型不匹配，%d要读取的是整形的数，读取到换行符这个非整形的字符之后就不读了，并且不会清除换行符，因此换行符一直存在缓冲区里面。所以程序下面使用了getchar去读走这个换行符   问题二：如果输入的是-10，那么确实如你所想，if中的getchar把缓冲区中的换行符读取走了之后，下面的while中的getchar是会一直卡在那里等你输入的，不过不是你说的那样能调回13行，而是getchar的效果，一直等你输入换行符之后才能结束本次循环回到13行，不信你在13行前面加个printf提示。    对本程序的建议：14行  15行那里，把day>=0和getchar=='\n'互相换下。如果不满足，不会getchar了。

user: user-3
content: 你运行一下不就知道了吗！

user: user-4
content: 你写得太复杂！
user-0 提问: 代码没有写错，总是提示debug assertion failed是什么原因

回复:
user: user-0
content: 我找到原因了，谢谢

user: user-1
content: 遇到问题点中断，然后通过调用堆栈、变量窗口等观察分析原因 代码没写错只是编译没有错误，运行时仍然可能有错误 实在检查不出把代码发上来

user: user-2
content: 原因是，你觉得没写错，但是实际上确实写错了。
user-0 提问: linux下的read系统调用，什么时候，会返回0或者负数

回复:
user: user-1
content: 比如对方把 socket 关了。

user: user-2
content: 查MSDN是Windows程序员必须掌握的技能之一。 查man是Linux程序员必须掌握的技能之一。

user: user-3
content: read返回读到的字节数 返回0，表明读到了文件结尾； 返回-1，表明出错。  把socket等同于文件。

user: user-3
content: 看man page http://man7.org/linux/man-pages/man2/read.2.html

user: user-4
content: 引用 8 楼 user-5 的回复:收到fin返回0，错误返回-1。错误信息看strerror(errno)，Interrupted system call是系统中断，不是真正的错误，直接continue继续read。  返回-1， 系统调用被中断，说明有信号产生 ,  错误码是einter， 确实可以继续调用read， 不需要重新建立socket。    返回0，是fin，已经和web服务器断开连接了。

user: user-5
content: 收到fin返回0，错误返回-1。错误信息看strerror(errno)，Interrupted system call是系统中断，不是真正的错误，直接continue继续read。

user: user-0
content: 引用 2 楼 zhangxiangDavaid 的回复:read返回读到的字节数 返回0，表明读到了文件结尾； 返回-1，表明出错。  把socket等同于文件。  帮忙看看5楼

user: user-0
content: 引用 5 楼 u012879787 的回复:[quote=引用 4 楼 fefe82 的回复:] 比如对方把 socket 关了。 我打印了错误码，发现read return  -1的时候，strerror(errno)后提示：  Interrupted system call，  我这个程序是一个web压力测试源码，难道网站服务器，检测到我做压力测试，就强制关闭我的系统调用？  凭什么关闭，它什么理由？  我是压力腾讯的新闻网站，试试我的压力测试代码。  第2个问题： read return 0的时候 ， strerror(errno)提示success。   百思不得其解，按照1的说法，返回0，则说明已经到了文件尾部，数据都取出了，所以是成功，  我晕，这个解释，不能让人满意吧，你自己想想， 套接字我没有做任何设置，没有数据，就返回0！！！  我的理解是，没有数据， 就堵塞，这才对！！！毕竟是我没有套接字设置过属性嘛。不是吗？    [/quote]  第2个问题： read return 0的时候 ， strerror(errno)提示success。   百思不得其解，按照1楼的说法，

user: user-0
content: 引用 4 楼 fefe82 的回复:比如对方把 socket 关了。 我打印了错误码，发现read return  -1的时候，strerror(errno)后提示：  Interrupted system call，  我这个程序是一个web压力测试源码，难道网站服务器，检测到我做压力测试，就强制关闭我的系统调用？  凭什么关闭，它什么理由？  我是压力腾讯的新闻网站，试试我的压力测试代码。  第2个问题： read return 0的时候 ， strerror(errno)提示success。   百思不得其解，按照1的说法，返回0，则说明已经到了文件尾部，数据都取出了，所以是成功，  我晕，这个解释，不能让人满意吧，你自己想想， 套接字我没有做任何设置，没有数据，就返回0！！！  我的理解是，没有数据， 就堵塞，这才对！！！毕竟是我没有套接字设置过属性嘛。不是吗？
user-0 提问: *（3+doses）怎么就等于3[doses]了

回复:
user: user-1
content: doses[3] 被编译器理解成 *(doses + 3) 3[doses] 被编译器理解成 *(3 + doses) 所以是一样的  http://blog.csdn.net/paschen/article/details/47315449

user: user-0
content: 引用 3 楼 paschen 的回复:doses[3] 被编译器理解成 *(doses + 3) 3[doses] 被编译器理解成 *(3 + doses) 所以是一样的  http://blog.csdn.net/paschen/article/details/47315449  我刚好结帖了，没有给到分，抱歉。

user: user-2
content: C语言中，数组和下标可以互换，这是由数组下标的指针定义决定的，由于存在加法交换律，只要一个是指针，另一个是整型就行，而无关顺序，doses[3]等价于3[doses]，等价于*(doses+3)，等价于*(3+doses)。只要知道有这么回事就行，不推荐3[doses]这种写法。

user: user-3
content: 这是语法糖 http://blog.csdn.net/zhangxiangdavaid/article/details/38085743
user-0 提问: 求解C语言一道基础题

回复:
user: user-1
content: 1<=x<=2. 很明显的一个错误

user: user-2
content: 不能连续比较吧

user: user-3
content: 真的是基础没学好啊，while (1 <= x <= 2); 这写，没有哪里这么教你的吧 把基础书籍再看一遍的好

user: user-4
content: 引用 6 楼 zhao4zhong1 的回复:哪几种语言有对一个数据连续比较的用法？我想知道。 lisp 如：(< 1 2 3 4 5)

user: user-5
content: 其实就是人脑在比较数字大小的时候也是拆成两部分分别比较的，更何况机器呢==

user: user-2
content: 没有语言能够进行连续比较吧

user: user-6
content: 哪几种语言有对一个数据连续比较的用法？我想知道。

user: user-7
content: C语言中没有对一个数据连续比较的用法，所以使用逻辑运算符对数据进行比较

user: user-8
content: 1 <= x <= 2 被程序理解成了 1<=x 得到的bool值（0或1）来比较是否小于2，显然变成了死循环 应该写成 x >= 1 && x <= 2

user: user-0
content: 那while (1 <= x <= 2)  是指x>=1 || x<= 2吗？？？？

user: user-9
content: 不只C语言，好多语言中都没有1 <= x <= 2这种写法，而是要用逻辑与代替，比如1 <= x && x <= 2

user: user-10
content: 修改如下：  #include <stdio.h> #include <stdlib.h> int main() { 	int x, y; 	x = 3; 	do 	{ 		y = x--; 		if (!y) { printf("x"); continue; } 		printf("#"); 	} while (1 <= x && x <= 2); //while (1 <= x <= 2);  	return 0; } //###
user-0 提问: 求历年c语言课程设计（自己做的，任何内容）谢谢了，复制给我一个

回复:
user: user-1
content: http://www.csm66.com到这个网站看看吧，上面的课程设计都是原创的，而且编程质量也很好，有很大的启发性！

user: user-2
content: 至少500

user: user-3
content: 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！

user: user-4
content: 这个最好是自己动手写写，大有裨益。如果实在不知道怎么写，可以从网上百度一个，一般这种网上都是有的，但是自己一定要看懂

user: user-0
content: 最好新颖一点的，独特，比如一个同学给自己家洗衣店做的一个系统，实用，新颖
user-0 提问: visual studio 2015 scanf_s

回复:
user: user-1
content: \n  空格和制表符，是空白符。 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。 只有输入一个非空白符的时候才能终止scanf的输入。

user: user-0
content: 谢谢，受教啦

user: user-1
content: scanf_s("%d\n",&n);  改成 scanf_s("%d",&n);
user-0 提问: 后根遍历与后序遍历区别是什么呢···

回复:
user: user-1
content: 树后根遍历的顺序和中序遍历顺序是一样的，后根遍历是从做到右，不是字面的意思

user: user-1
content: 树后根遍历的顺序和中序遍历顺序是一样的，后根遍历是从做到右，不是字面的意思

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:[quote=引用 3 楼 jjaisgm 的回复:] [quote=引用 2 楼 ghx287524027 的回复:] 这没什么区别啊，只是一个别名而已，原理是一样的   那帮我看一下这道题： 树的后根遍历序列等同于该树对应的二叉树的（     ) A.先序遍历序列 B.中序遍历序列 C.后序遍历序列[/quote] C[/quote]    昨天下午的考试考了这道题·····，我按照那本练习册给的答案选了B······哎······

user: user-2
content: 引用 3 楼 jjaisgm 的回复:[quote=引用 2 楼 ghx287524027 的回复:] 这没什么区别啊，只是一个别名而已，原理是一样的   那帮我看一下这道题： 树的后根遍历序列等同于该树对应的二叉树的（     ) A.先序遍历序列 B.中序遍历序列 C.后序遍历序列[/quote] C

user: user-3
content: 无区别 二叉树的各种遍历： http://blog.csdn.net/zhangxiangdavaid/article/details/37115355

user: user-0
content: 引用 2 楼 ghx287524027 的回复:这没什么区别啊，只是一个别名而已，原理是一样的   那帮我看一下这道题： 树的后根遍历序列等同于该树对应的二叉树的（     ) A.先序遍历序列 B.中序遍历序列 C.后序遍历序列

user: user-4
content: 这没什么区别啊，只是一个别名而已，原理是一样的

user: user-5
content: 名字不同。 后序遍历（LRD）是二叉树遍历的一种，也叫做后根遍历、后序周游，可记做左右。 http://baike.baidu.com/link?url=3HC3f_Vs74RtCYB6l2RCOplmKVuVzZa0v5gys8II59ZOTJGkGD6BhUkxMZTlVtvY3pi5Z8doM7btjayeSHThtK
user-0 提问: strcpy函数的问题

回复:
user: user-1
content: 先弄清楚copy和move的语义： copy的语义是操作结束后，新目的的内容和旧源的内容一致，且保证旧源的内容不变。 move的语义是操作结束后，新目的的内容和旧源的内容一致，但不保证旧源的内容不变。 于是乎，当操作的内存重叠时，无论如何也不可能实现copy！

user: user-2
content: 好问题，楼上已经解答了， 以后注意就行、

user: user-3
content: 引用 3 楼 z878669112的回复:刚才查了下重叠时strcpy的不确定性，在执行这段代码时，实际上是一次性复制4个字节，所以输出为aabcd。这种说法是否正确呢？ 既然已经是不确定的，你再分析为什么得到这个结果也没有意义了，在你这里是这个结果，在别人那里也许就不是这个结果，也或许根本就执行不了，所以不能因为结果去分析原因

user: user-4
content: 引用 3 楼 z878669112 的回复:刚才查了下重叠时strcpy的不确定性，在执行这段代码时，实际上是一次性复制4个字节，所以输出为aabcd。这种说法是否正确呢？  没明白你说的一次性是什么意思，不确定表示可能得到任意结果，包括你希望得到的与不希望得到的

user: user-0
content: 刚才查了下重叠时strcpy的不确定性，在执行这段代码时，实际上是一次性复制4个字节，所以输出为aabcd。这种说法是否正确呢？

user: user-3
content: 如1楼所说，当内存重叠时strcpy()的行为不确定，你可以用memcpy（），这个的内存块是可以重叠的

user: user-4
content: https://msdn.microsoft.com/en-us/library/kk6xf663.aspx  MSDN上已经说了，如果复制源和目的字符串有重叠，行为不确定  The strcpy function copies strSource, including the terminating null character, to the location that's specified by strDestination. The behavior of strcpy is undefined if the source and destination strings overlap.
user-0 提问: 谁能帮我看看哪里出问题了

回复:
user: user-1
content: fscanf每次是从fp指向的位置（也就是文件开始处）读取五个数，所以每次输出的结果都是一样的。要想继续往下读取，需要在每次读取后重新设置文件流指针的位置（也就是下次开始读取的位置）。可以利用fseek()进行设置。原型如下： int fseek( FILE *stream, long offset, int origin );   第一个参数stream为文件指针   第二个参数offset为偏移量，整数表示正向偏移，负数表示负向偏移   第三个参数origin设定从文件的哪里开始偏移,可能取值为：SEEK_CUR、 SEEK_END 或 SEEK_SET   SEEK_SET： 文件开头   SEEK_CUR： 当前位置   SEEK_END： 文件结尾

user: user-1
content: 因为你fscanf只读取了五个数呀

user: user-0
content: 一直都是读取文件内的前五个数，而不是接着向下读取
user-0 提问: 不确定个数的界面制作问题。。求教

回复:
user: user-0
content: 引用 8 楼 user-2 的回复:[quote=引用 6 楼 q1306436808 的回复:] 。。想当于每次改文件或更新文件内容都要再改下代码么，，能不能有其他方法实现改变文件内容，不用加代码，运行时菜单自动也随着改变  不需要加代码啊，你不会用循环啊，读到什么显示什么不就行了！ 建议先去把基础打好！[/quote]  。。我自己玩出来了，，谢谢你啊

user: user-0
content: 引用 8 楼 user-2 的回复:[quote=引用 6 楼 q1306436808 的回复:] 。。想当于每次改文件或更新文件内容都要再改下代码么，，能不能有其他方法实现改变文件内容，不用加代码，运行时菜单自动也随着改变  不需要加代码啊，你不会用循环啊，读到什么显示什么不就行了！ 建议先去把基础打好！[/quote]  就是不会用这个循坏啊，，switch肯定不行，我也试了for循环，不会玩啊

user: user-1
content: 想的太多了太美了不如不想怀抱初心直接做。

user: user-2
content: 引用 6 楼 q1306436808 的回复:。。想当于每次改文件或更新文件内容都要再改下代码么，，能不能有其他方法实现改变文件内容，不用加代码，运行时菜单自动也随着改变  不需要加代码啊，你不会用循环啊，读到什么显示什么不就行了！ 建议先去把基础打好！

user: user-0
content: 引用 3 楼 user-2 的回复:[quote=引用 2 楼 q1306436808 的回复:] 能不能举个例。。  void showmenu(char**p, int n) { 	for(int i = 0; i < n; ++i) 		printf(p[i]); }  int main() { 	char*p[100] = {"1、XXX\n", "2、YYY\n"}; 	int n = 2; //现在有两个菜单项 	showmenu(p, n);  	printf("\n\n");  	//现在加上一个菜单 	p[n++] = "3、ZZZ\n"; 	showmenu(p, n);  	return 0; } [/quote] 再次求教啊，，我不想用这个方法。

user: user-0
content: 。。想当于每次改文件或更新文件内容都要再改下代码么，，能不能有其他方法实现改变文件内容，不用加代码，运行时菜单自动也随着改变

user: user-2
content: 引用 4 楼 q1306436808 的回复:这个懂了，，但我是要根据文件里的内容做，我那个菜单要将这个文件的学校列出来，然后选对应的序号得到相应的信息，这个学校个数可以随意改变。。 	int i,count; 	FILE *fpp; 	fpp = fopen("school.txt","w"); 	if(fpp == NULL){ 		printf("文件打开失败\n"); 	}  	 	printf("请输入参赛学校个数:"); 	scanf("%d",&count); 	fprintf(fpp,"%d\n",count); 	printf("\n"); 	 	for(i=0; i<count; i++){ 		printf("请输入第%d个学校的名称:",i+1); 		scanf("%s",s[i].name); 		fprintf(fpp,"%s\n",s[i].name); 	} 	fclose(fpp);  一样的，学会举一反三，你要添加一个菜单就在添加一个字符串

user: user-0
content: 这个懂了，，但我是要根据文件里的内容做，我那个菜单要将这个文件的学校列出来，然后选对应的序号得到相应的信息，这个学校个数可以随意改变。。 	int i,count; 	FILE *fpp; 	fpp = fopen("school.txt","w"); 	if(fpp == NULL){ 		printf("文件打开失败\n"); 	}  	 	printf("请输入参赛学校个数:"); 	scanf("%d",&count); 	fprintf(fpp,"%d\n",count); 	printf("\n"); 	 	for(i=0; i<count; i++){ 		printf("请输入第%d个学校的名称:",i+1); 		scanf("%s",s[i].name); 		fprintf(fpp,"%s\n",s[i].name); 	} 	fclose(fpp);

user: user-2
content: 引用 2 楼 q1306436808 的回复:能不能举个例。。  void showmenu(char**p, int n) { 	for(int i = 0; i < n; ++i) 		printf(p[i]); }  int main() { 	char*p[100] = {"1、XXX\n", "2、YYY\n"}; 	int n = 2; //现在有两个菜单项 	showmenu(p, n);  	printf("\n\n");  	//现在加上一个菜单 	p[n++] = "3、ZZZ\n"; 	showmenu(p, n);  	return 0; }

user: user-0
content: 能不能举个例。。

user: user-2
content: 把菜单项放到一个字符指针数组中，每次循环显示所有的，需要添加菜单时就在字符指针数组中再添加一个
user-0 提问: 二级指针的自增问题.

回复:
user: user-1
content: 如果p是单纯的二级指针char**p，那么p+1是增加1个sizeof(char*)即1个指针所占字节数4， 而(*p)+1 只是增加sizeof(char)即1个字节。  这种二级指针跟数组指针如char (*p)[N]是有区别的，此时p指向的是一维数组，p+1就是增加sizeof(char) * N，而(*p)+1依旧是增加sizeof(char)即1个字节。  简单说一个二维数组char a[M][N]，数组名a就是一个常量一维数组指针char (* const a)[N]，a+1就是增加sizeof(char) * N

user: user-2
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-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执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-3
content: 二维数组 int a[][size]     a+1   增加的是 sizeof(int)*size

user: user-3
content: 引用 1楼user-8 的回复:因为p和*p存放的都是地址，而**p存放的是char，所以p++加了4；*p++加了1是char*还是char[]  ？

user: user-4
content: 同意。 引用 4 楼 paschen 的回复:对于T* t  增加的是sizeof(T) 所以： 第一个增加sizeof(char*) 第二个增加sizeof(char) 观察一把：  int main(void)//52 { 	char *strs[] = { 		"David", 		"zx", 	}; 	char **p = strs; 	printf("p=%x,p+1=%x\n", p, p + 1); 	printf("*p=%x,*p+1=%x\n", *p, *p + 1); 	return 0; } //p=18f7fc,p+1=18f800 //*p=fece74,*p+1=fece75

user: user-5
content: 对于T* t  增加的是sizeof(T) 所以： 第一个增加sizeof(char*) 第二个增加sizeof(char)

user: user-6
content: 对于 T *p; ，p + 1 增加 sizeof(T)。  char **p; p +1 增加 sizeof(char *) 。(*p) + 1 对 *p 增加 sizeof (char)

user: user-7
content: 指针+1的效果和指针类型有关，char**类型的指针用来指向字符串数组，即这样使用char**p={"abc","d""efgh"}; 首先是p，p的指针类型可以称作字符串数组指针。也就是p指向一个数组，数组元素为字符串。开始时，p指向第一个字符串即“abc”，这也是字符串数组的第一个元素（整个字符串是一个元素）。那p+1就应该指向第二个元素即“d”，从中可以看出增加了几个字节，还可以看出这个增加的长度是不确定的（和第一个字符串长度有关）。 然后就是*p，它的指针类型可以称作字符串指针。也就是它也指向一个数组，但这个数组里放的是字符。当p指向“abc”时，*p就指向 ‘a’，而(*p)++应该指向第二个字符即‘b’，也就是增加了一个字节

user: user-8
content: 因为p和*p存放的都是地址，而**p存放的是char，所以p++加了4；*p++加了1
user-0 提问: 很简单的程序，怎么运行后卡死，求帮忙分析~

回复:
user: user-1
content: 卡在 While 循环了，你在 for(j=2....)那里的break，只是退出了 for(j=2....) 层的循环，并没有退出While循环，所以一直在 i=2 时的while循环中卡住。

user: user-0
content: #include<stdio.h> int main() { 	int i, j, k = 1, h=0,m; 	for (i = 1; i <= 1000; i++) 	{ 		m=i; 		while (1) 		{ 			if (m == 1) 				break; 			for (j = 2; j <= m; j++) 			{ 				if (m%j == 0) 				{ 					m = m / j; 					k += j; 					break; 				} 			} 		} 		if (k == i) 		{ 			printf("%d\t", i); 			h++; 			if (h>5) 			{ 				printf("\n"); 				h = 0; 			} 		} 		k=1;  	} 	return 0; }       貌似i值没有判断好，还忘记给k值置1。给了一个中间变量m，break能跳出来的，谢谢楼上帮忙~写代码太粗心惹。

user: user-2
content: 引用 6 楼 qq_28061217 的回复:但是我上面还有一个break啊~上面那个break是当为1的时候才跳出的，如果i不是1就不起作用了

user: user-0
content: 但是我上面还有一个break啊~

user: user-2
content: while循环没有跳出来，后面的一个break只是跳出了for循环，while没有结束

user: user-3
content: 循环一直出不来，单步跟踪一下就知程序实际怎么走的了

user: user-0
content: 能具体说说是哪条语句开始陷入死循环了吗~

user: user-4
content: 不是卡死，是陷入了死循环

user: user-0
content: 附上程序： #include<stdio.h> int main() { 	int i, j, k = 1, h = 0; 	for (i = 1; i <= 1000; i++) 	{ 		while (1) 		{ 			if (i == 1) 				break; 			for (j = 2; j <= i; j++) 			{ 				if (i%j == 0) 				{ 					i = i / j; 					k += j; 					break; 				} 			} 		} 		if (k == i) 		{ 			printf("%d\t", i); 			h++; 			if (h>5) 			{ 				printf("\n"); 				h = 0; 			} 		}  	} 	return 0; }
user-0 提问: C 关于结构的问题。。

回复:
user: user-0
content: 。。是的我知道了，谢谢各位了

user: user-1
content: 没有问题、没有问题、没有问题……

user: user-2
content: 这个定义没有问题，不知你是哪出问题了

user: user-3
content: 光看这个是没有错误的，错误的地方不在这里

user: user-4
content: 如果你程序中有man_project .NAme类似的程序会出现这种错误 换为man_project ->NAme

user: user-5
content: 只有这点代码吗？这里是不应该报错的
user-0 提问: 关于while的一个问题，很基础

回复:
user: user-1
content: 答案错了，是个死循环，如果写成while(k==10) k--; 那么就是执行一次

user: user-0
content: 引用 7 楼 zhangxiangDavaid 的回复:[quote=引用 6 楼 zhangxiangDavaid 的回复:] [quote=引用 5 楼 legal_high 的回复:] [quote=引用 4 楼 zhangxiangDavaid 的回复:]  while(k  = 10; k--; );  以上这种while写法可以循环10次 ou，不好意思没打好是k=10;while(k=1) k--;[/quote] 你的写法显然是无限循环[/quote] 因为循环条件k=1，一直都是true[/quote] en 我也是这么觉得 但是答案是循环一次 看来有可能是答案错了

user: user-2
content: 引用 5 楼 legal_high 的回复:[quote=引用 4 楼 zhangxiangDavaid 的回复:]  while(k  = 10; k--; );  以上这种while写法可以循环10次 ou，不好意思没打好是k=10;while(k=1) k--;[/quote] 你的写法显然是无限循环

user: user-2
content: 引用 6 楼 zhangxiangDavaid 的回复:[quote=引用 5 楼 legal_high 的回复:] [quote=引用 4 楼 zhangxiangDavaid 的回复:]  while(k  = 10; k--; );  以上这种while写法可以循环10次 ou，不好意思没打好是k=10;while(k=1) k--;[/quote] 你的写法显然是无限循环[/quote] 因为循环条件k=1，一直都是true

user: user-0
content: 引用 4 楼 zhangxiangDavaid 的回复: while(k  = 10; k--; );  以上这种while写法可以循环10次 ou，不好意思没打好是k=10;while(k=1) k--;

user: user-2
content: while(k  = 10; k--; );  以上这种while写法可以循环10次

user: user-0
content: 能过，但是printf不出的

user: user-3
content: 这个能编译过嘛 ...

user: user-0
content: 引用 1 楼 user-3 的回复:这个能编译过嘛 ... 能过，但是printf不出的
user-0 提问: 求详解，谢谢！

回复:
user: user-1
content: #include <stdio.h> int a=13,b=5;	        //程序中并没有用到，所以可以删除 int max(int x,int y)	              { return x>y?x:y;       //返回x和y较大的一个数，重点是? :运算符，可搜索了解 } void main() {                             //局部变量和全局变量、函数同名时，局部变量覆盖其他 int a=18;                                      int b=7;	 printf("max=%d\n",max(a,b));   //此时传递的是main函数私有变量ab }

user: user-2
content: 如果楼主打算访问的是全局变量，可以这样写：  printf("max=%d\n",max1(::a,::b));

user: user-3
content: 局部变量直接覆盖了全局变量

user: user-4
content: 重点理解全局变量和局部变量

user: user-5
content: 楼上说的很好，自己在电脑上调试一下就知道了！我想你想问的是为什么会这样，建议你找本书看看，系统的学习一下，不然就算别人给你讲了，你还是一知半解！

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

user: user-7
content: 覆盖只是现象，变量查找规则才是本质。
user-0 提问: 链表的尾插法一定需要声明头指针以及另外两个指针吗???能不能把这段代码中的s指针去掉

回复:
user: user-1
content: 假设头结点Head已经建好，并且 genNode(data);返回新创建的节点，数据为data;不初始化next指针。 input();返回 输入数据 isValid(data) 返回数据是否有效 头插法   Head ->next =NULL; data =input(); while(isValid(data)){  p=genNode(data); p->next =Head->next; Head->next =p; data =input(); } 尾插法  Head ->next =NULL; p = Head; data =input(); while(isValid(data)){ p->next  = genNode(data); p = p->next; p->next  = NULL; data =input(); }

user: user-1
content: 不论头插法，尾插法，都不需要额外的指针。 不过如何实现，看你自己想怎么做。

user: user-2
content: 在还没有正确实现功能之前，临时变量越多逻辑越清晰。

user: user-3
content: 插入节点总是找到待插位置的前驱。
user-0 提问:  PAT乙级——1002 数字分类 (C/C++)一直报错，请大神指点

回复:
user: user-1
content: 引用 9 楼 jianjiu7 的回复:[quote=引用 8 楼 u013575812 的回复:] 输出第四类的数是 楼主您的代码是这样的： printf("%.1lf ",A4); 改为这样： printf("%.1lf ",A4/a4);  因为是要求平均数。  再试试。应该可以AC了。谢谢，原来在这。。。[/quote] 恩恩 没事没事 简单的小问题难免会出错 这种题多注意一下细节应该就没什么  加油~

user: user-0
content: 引用 8 楼 u013575812 的回复:输出第四类的数是 楼主您的代码是这样的： printf("%.1lf ",A4); 改为这样： printf("%.1lf ",A4/a4);  因为是要求平均数。  再试试。应该可以AC了。谢谢，原来在这。。。

user: user-2
content: #include<stdio.h> int main() {     int n,i;     int num;     int A1=0,A2=0,A3=0,A5=0;     double A4=0.0;     int a1=0,a2=0,a3=0,a4=0,a5=0;     int ibus=1; 	printf("请输入数字个数：\n");     scanf("%d",&n); 	printf("请输入数字：\n");     for(i=0;i<n;i++)     {         scanf("%d",&num);         int r = num%5;         if(r==0&&num%2==0)         {             a1++;             A1+=num;         }        else if(r==1)         {             a2++;             A2+=ibus*num;             ibus=-ibus;         }        else if(r==2)         {             a3++;             A3++;         }       else if(r==3)         {             a4++;             A4+=num;         }         else if(r==4)         {             a5++;             if(num>A5)                 A5=num;         }     } 	printf("结果如下：\n");     if(a1!=0)        printf("A1=%d \n",A1);     else         printf("A1=N  \n");     if(a2!=0)        printf("A2=%d  \n",A2);     else         printf("A2=N  \n");     if(a3!=0)        printf("A3=%d  \n",A3);     else         printf("A3=N  \n");     if(a4!=0)        printf("A4=%.1lf  \n",A4/a4);     else         printf("A4=N  \n");     if(a5!=0)        printf("A5=%d \n",A5);     else         printf("A4=N \n");     return 0; }

user: user-2
content: 没报错啊，只是输出结果和你说的不一样

user: user-3
content: 没人评论你敢信？？？？？？

user: user-1
content: 输出第四类的数是 楼主您的代码是这样的： printf("%.1lf ",A4); 改为这样： printf("%.1lf ",A4/a4);  因为是要求平均数。  再试试。应该可以AC了。

user: user-1
content: 楼主你好，不知测试用例报错时是否有给出测试用例。 若有 可以贴出来一起讨论下。

user: user-0
content: 引用 5 楼 zhangxiangDavaid 的回复:貌似木有问题~但是在刷pat时，pat系统总是报错，看了别人的代码思想也差不多，就是能完全通过，唉，想不懂

user: user-4
content: 貌似木有问题~

user: user-0
content: 引用 2 楼 ghx287524027 的回复:不是，在编译器上不报错，但结果不对，在pat上系统报错，想不出来错在哪 没报错啊，只是输出结果和你说的不一样
user-0 提问: while的问题 很基础 刚刚的没打清楚不好意思

回复:
user: user-0
content: 引用 2 楼 paschen 的回复:答案错了，是个死循环，如果写成while(k==10) k--; 那么就是执行一次 ok谢谢啊

user: user-1
content: 答案错了，是个死循环，如果写成while(k==10) k--; 那么就是执行一次

user: user-2
content: 无限次、无限次、无限次……
user-0 提问: 请教各位大神关于数据结构 图 的问题

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

user: user-2
content: https://www.baidu.com/s?wd=%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%20%E5%9B%BE&rsv_spt=1&rsv_iqid=0xf77de6cd00059997&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_t=8ad1Ut%2B0No6MwUaGoquDgkkYaWlUkqCVhG%2FVxgmKo2WJ3%2FStC2QqPSVj2eY0bgMW%2BYC3&oq=%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%9B%BE&rsv_pq=bbcc72be000001b9&rsv_sug3=135&rsv_sug1=83&rsv_sug2=1&prefixsug=%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%9B%BE&rsp=1&rsv_sug7=100&rsv_sug4=3744&rsv_sug=1  学会搜索

user: user-0
content: 还有那个遍历，，那个递归调用没搞懂

user: user-3
content: 从基础概念看起： 图论基础 http://blog.csdn.net/zhangxiangdavaid/article/details/37915329

user: user-4
content: 不知道你想知道什么？
user-0 提问: 有没有人做过OPNET和VS的联合仿真啊？

回复:
user: user-1
content: 想请教您一些问题~

user: user-1
content: 你好，请问您联合仿真成功了吗？、我最近也在做这个方向

user: user-0
content: 注释掉不可以，因为用到了这个头文件。请问您做过OPNET和VS的联合仿真吗？

user: user-2
content: 注释掉试试
user-0 提问: 声明在一个文件里，定义在一个文件，调用在一个文件。咋还错误

回复:
user: user-1
content: 谢谢大家，已经解决啦，用双引号就可以了、真心谢谢

user: user-2
content: 把两部分代码贴出来看看吧

user: user-3
content: 换个函数名试下， max可能和其他宏重名了

user: user-4
content: 你max的cpp里包含了max的头文件吗？

user: user-5
content: 看下错误提示~