Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言关于自增的问题，求解答。

回复:
user: user-1
content: 不要纠结这个了

user: user-2

user: user-3
content: 这种代码不常用吧

user: user-4
content: 5)5+7+7=19  //++j =5 ;（j==5）;b = 5+ ++j +++j; ++j =6 ；++j=7;b = 5 + (7 + 7) = 5 + 14 = 19

user: user-4
content: 引用 7 楼 u013118792 的回复:我就搞不明白了，b为什么会输出19呢？我感觉是：j自增3次，即:5+6+7=18。搞不明白我哪里分析错了。 结果可以是以下任何一个： 1)5+5+5=15  // (j==4;)表达式 ++j   =5 ;（j==5）；b = 5 + 5 + 5 = 15  ;++j ; (j==6); ++j ;(j==7)  2)5+5+6=16    3)5+6+6=17 4)5+6+7=18 5)5+7+7=19  //++j =5 ; ++j =6 ；++j=7;b = 5 + (7 + 7) = 5 + 14 = 19    6)6+6+6=18 7)6+6+7=19  // ++j =5 ; ++j =6 ；6+6 =12 ；++j=7;b = (6 + 6) + 7 = 12 + 7 = 19         8)6+7+7=20 9)7+7+7=21 ;++j;(j==5);++j;(j==6);表达式 ++j   =7  ;b = 7 + 7 + 7 = 21  编译器，可以在任何时候，计算表达式 ++j ，并把 ++j的结果，代入表达式计算表达式的值。  不知道这样说，可以明白不？ 这个计算，和代入是没有规定顺序的。 这就是所谓的，未定义行为。

user: user-5
content: 对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和 寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时 候。

user: user-6
content: debug，要不然就别用了，害死人不偿命

user: user-7
content: 引用 4 楼 u013118792 的回复:我是大一计算机科学与技术专业的学生，这是我们教材里面的题目，把我搞晕了。学了半年C语言，我都不知道究竟学了些什么。 你可以把这本教材扔了。

user: user-8
content: 写项目时会这样写么。。。。。。。。。自己找死。。。。。

user: user-9
content: http://bbs.csdn.net/topics/370153775

user: user-0
content: 引用 8 楼 slovelinux 的回复:教材是谭浩强老师的么虽然不是谭浩强老师的，但是和谭老师的差不多，貌似都是抄的谭老师的。

user: user-0
content: 我就搞不明白了，b为什么会输出19呢？我感觉是：j自增3次，即:5+6+7=18。搞不明白我哪里分析错了。

user: user-10
content: 引用 12 楼 WYW3142731 的回复:# include <stdio.h> int main(void) {     int i = 3, j = 4, a = 0, b = 0, c = 0;     a=(i++)+(i++)+(i++);    //i++是在语句结束后才进行自加运算。所以a=3+3+3=9,语句结束后i=6因为i加了3次。     b=(++j)+(++j)+(++j);    //++j是在语句结束前进行自加运算，所以j在语句结束前是7，此时b=7+7+7=21,j=7     c=i++ - --j;            //i++是在语句结束后才进行自加运算，j是在语句结束前进行自减运算。 							//故语句结束前i=6,j=6，故c=6-6=0，此时i=7,j=6  	//故输出是a=9,b=21,c=0,i=7,j=6     printf("%d,%d,%d,%d,%d\n\n",a,b,c,i,j);      return 0; }错了 先进修一下置顶帖

user: user-11
content: # include <stdio.h> int main(void) {     int i = 3, j = 4, a = 0, b = 0, c = 0;     a=(i++)+(i++)+(i++);    //i++是在语句结束后才进行自加运算。所以a=3+3+3=9,语句结束后i=6因为i加了3次。     b=(++j)+(++j)+(++j);    //++j是在语句结束前进行自加运算，所以j在语句结束前是7，此时b=7+7+7=21,j=7     c=i++ - --j;            //i++是在语句结束后才进行自加运算，j是在语句结束前进行自减运算。 							//故语句结束前i=6,j=6，故c=6-6=0，此时i=7,j=6  	//故输出是a=9,b=21,c=0,i=7,j=6     printf("%d,%d,%d,%d,%d\n\n",a,b,c,i,j);      return 0; }

user: user-12
content: 我Dev-C++ 4.9.9.2也是9,19,0,7,6 等LZ学了编译原理后可能发现问题找出答案吧

user: user-13
content: 那个看错了啊 不好意思 同学  这个 编译器不同导致结果也不同....  我忘了 我vs10运行结果为 9,21,0,7,6

user: user-13
content: 运算符优先级 给你个表 你看一下吧  然后给你解释一下  i++  和 ++i的区别      你说的没错 i++ 返回的是i本身 然后进行自增  ++i  就是先自增 在返回 i = 5; 在第二个表达式中 (i++) + (i++) + (i++) 第一个括号返回的是5 此时i实际值为6  然后 第二个括号返回值是6 此时i实际值为7   之后你自己推算就可以了 那个表你要想学好要背下来的

user: user-14
content: 教材是谭浩强老师的么

user: user-15
content: 赶紧跳过这部分吧，研究这个一点意义都没有。况且对于这种复杂的自增自减不同的编译器给出的结果不一定相同。现实中也没有人会写这样的代码。

user: user-16
content: 引用 4 楼 u013118792 的回复:我是大一计算机科学与技术专业的学生，这是我们教材里面的题目，把我搞晕了。学了半年C语言，我都不知道究竟学了些什么。 才半年而已，读一读置顶帖，你就知道探讨这个问题多没意义 Ps. 你们教材有点坑....
user-0 提问: 利用函数统计文件中的每个字符出现的次数

回复:
user: user-1
content: 现做的 有不好的地方 希望大家 给点意见！ #include <stdio.h> #include <stdlib.h> #include <string.h>  #define MAX 1024 int filelen(FILE *fp,int big[],int small[],int num[]) { 		int i = 0; 		char buf[MAX]={}; 		while(fgets(buf,MAX,fp)!=NULL){ 				puts(buf); 				for(i = 0;buf[i]!='\0';i++){ 						if(buf[i]>='a'&&buf[i]<='z') 								small[(int)(buf[i]-'a')]++; 						if(buf[i]>='A'&&buf[i]<='Z') 								big[(int)(buf[i]-'A')]++; 						if(buf[i]>='0'&&buf[i]<='9') 								num[(int)(buf[i]-'0')]++; 				} 				bzero(buf,MAX); 		} 		return 0; } int main(int argc,char * argv[]) { 		FILE *fp=NULL; 		int big[26]={}; 		int small[26]={}; 		int num[10]={}; 		int i = 0;  		if(argc!=2) { 				printf("请输入 要查询的 文件名!\n"); 				exit(0); 		} 		fp = fopen(argv[1],"r"); 		if(fp == NULL) { 				perror("open file failed!\n"); 				exit(-1); 		} 				filelen(fp,big,small,num);  		for(i = 0;i<26;i++) { 				printf("%c统计结果:%d\n",(char)(i+97),small[i]); 		} 		for(i = 0;i<26;i++) { 				printf("%c统计结果:%d\n",(char)(i+65),big[i]); 		} 		for(i = 0;i<10;i++) { 				printf("%d统计结果:%d\n",i,num[i]); 		} 		return 0; }

user: user-2
content: 读取字符XChar;  if(XChar >= 48 && XChar <=57)     numc[XChar - '0']++; else if(XChar >= 65 && XChar <= 90)     upc[XChar - 'A']++; else if(XChar >= 97 && XChar <= 122)     lowc[XChar - 'a']++; else    continue;  读取文件后循环执行直到结束。 numc从0-9存放的是‘0’-‘9’的个数 upc 从0-25存放的是‘A’-‘Z’的个数 lowc从0-25存放的是‘a’-‘z’的个数 完整的程序自己稍微改一下就可以了。

user: user-0
content: 求C程序指导
user-0 提问: C/C++ 为什么同一个地址存放不同数据？

回复:
user: user-1
content: 引用 5 楼 pathletboy 的回复:[quote=引用 4 楼 ysmz4 的回复:] [quote=引用 3 楼 ws_yqr 的回复:] 答案错了吧，应该都是200，自己编程看一下吧。const只是保证在编译层面变量的值不会被修改。 确实是试过了，感觉不可思议[/quote]  这编译器聪明的结果，你输出的x的值其实根本没从内存里取出，具体可以看反汇编。  [/quote]sorry,答案确实是对的，刚才我用的是C语言试的，在C++的情况下答案是对的。

user: user-2
content: const声明的所谓的常量是可以被修改的 但是一般来说C++编译优化后 不会再去内存中读取修改过后的值 而是直接使用初始的值 所以第一个值还是50是正常现象

user: user-3
content: 引用 4 楼 ysmz4 的回复:[quote=引用 3 楼 ws_yqr 的回复:] 答案错了吧，应该都是200，自己编程看一下吧。const只是保证在编译层面变量的值不会被修改。 确实是试过了，感觉不可思议[/quote]  这编译器聪明的结果，你输出的x的值其实根本没从内存里取出，具体可以看反汇编。

user: user-0
content: 引用 3 楼 ws_yqr 的回复:答案错了吧，应该都是200，自己编程看一下吧。const只是保证在编译层面变量的值不会被修改。 确实是试过了，感觉不可思议

user: user-1
content: 答案错了吧，应该都是200，自己编程看一下吧。const只是保证在编译层面变量的值不会被修改。

user: user-0
content: 引用 1 楼 user-4 的回复:你告诉你的朋友你的房子卖50万，然后你标价200万 你的朋友告诉别人你的房子卖50万，他在说谎吗？不，只是你在欺骗他。  你告诉编译器x是个常量，它的值是50。 所以编译器在很多使用x的地方都直接使用50这个数，以提高运行速度。 术语上，这叫常量折叠。编程上，这叫欺骗编译器的必定自食其果。 谢谢啊，我明白了，但是*y = 200;竟然通过了编译，没有const检查啊

user: user-4
content: 你告诉你的朋友你的房子卖50万，然后你标价200万 你的朋友告诉别人你的房子卖50万，他在说谎吗？不，只是你在欺骗他。  你告诉编译器x是个常量，它的值是50。 所以编译器在很多使用x的地方都直接使用50这个数，以提高运行速度。 术语上，这叫常量折叠。编程上，这叫欺骗编译器的必定自食其果。
user-0 提问: 求高手帮忙（C语言的一个小游戏）

回复:
user: user-1
content: 接着楼上说了， 对于你的数据文件保存问题，你可以看下c 语言中IO 一章，无非就是打开或者创建一个文件，写入预先想好的数据格式，然后就可以对数据进行操作，最后取出也是一样的

user: user-2
content: 现做的，你可以 参考一下，我这里用*当图形了。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h>  char str[6][6]; void game(void) { 		int i,j,k,x,y,n,cout; 		time_t start,end; 		FILE *fp=NULL; 		float timme=0; 		int a1,a2; 		char buf[50]={}; 		n = 0; 		cout = 0; 		start=time(NULL); 		while(n<10) { 				memset(str,'o',36); 				srand(time(NULL)); 				a1 = rand()%6; 				a2 = rand()%6; 				str[a1][a2] = '*'; 				puts("======================="); 				for(i = 0;i < 6;i++){ 						for(j = 0;j < 6;j++) { 								printf("|%c| ",str[i][j]); 						} 						puts(""); 				} 				scanf("%d %d",&x, &y); 				getchar(); 				if(x== (a1+1)&&y ==(a2+1))  						cout++; 				n++; 		} 		puts("======================="); 		end=time(NULL); 		timme=difftime(end,start); 		fp = fopen("log.t","a"); 		if(fp == NULL) 				perror("open log.t failed\n"); 		sprintf(buf,"成绩 ：%d  时间 ：%f(s) \n",cout,timme); 		fputs(buf,fp); 		fclose(fp); } int main(int argc,char *argv[]) { 		game(); 		return 0; }

user: user-3
content: 你应该去查C语言的编程手册, 或者手头放一本C语言标准.  以时间为例, 可以用下面函数获取当前时间 #include <time.h> time_t time(time_t *timer); 然后通过函数 double difftime(time_t time1, time_t time0); 获取两个时间之间的间隔(单位为秒) 这是标准C提供的, 更高精度的时间需要根据你使用的系统来决定.

user: user-0
content: 额，别沉啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
user-0 提问: 请高人 zhou19891113 来回答一个问题

回复:
user: user-0
content: 感谢各位给予我的帮助。 结贴了。

user: user-1
content: 引用 7 楼 truelance 的回复:[quote=引用 4 楼 u013235485 的回复:] [quote=引用 1 楼 truelance 的回复:] condition ? expression1 : expression1  中的expression1 和expression2 都必须是表达式 goto是一条语句, 不是表达式, 所以编译肯定会报语法错误. 引用 2 楼 user-4 的回复:隐约看到汇编的思维方式  感谢回复。  1 == 1 ? printf_s("1==1") : printf_s("1!=1");  print_s也是语句。。[/quote]  print_s()不是语句，是函数，函数是可以做表达式的[/quote]  正理！

user: user-2
content: 引用 4 楼 u013235485 的回复:[quote=引用 1 楼 truelance 的回复:] condition ? expression1 : expression1  中的expression1 和expression2 都必须是表达式 goto是一条语句, 不是表达式, 所以编译肯定会报语法错误. 引用 2 楼 user-4 的回复:隐约看到汇编的思维方式  感谢回复。  1 == 1 ? printf_s("1==1") : printf_s("1!=1");  print_s也是语句。。[/quote]  print_s()不是语句，是函数，函数是可以做表达式的

user: user-3
content: 引用 5 楼 u013235485 的回复:[quote=引用 3 楼 max_min_ 的回复:] 三目用的有问题吧 把goto a， goto b  换成对应的标志位，然后通过对应标志位执行不同的语句块！  感谢回复。c语言我是初学。并不是为了解决实际问题，正好看到goto语句，所以就用三元运算符和goto结合起来试了下。[/quote]  三目后面表达式而已，而不是语句块来的！  另外：建议如果不是特别需要，尽量少用goto语言！

user: user-0
content: 引用 3 楼 max_min_ 的回复:三目用的有问题吧 把goto a， goto b  换成对应的标志位，然后通过对应标志位执行不同的语句块！  感谢回复。c语言我是初学。并不是为了解决实际问题，正好看到goto语句，所以就用三元运算符和goto结合起来试了下。

user: user-0
content: 引用 1 楼 truelance 的回复:condition ? expression1 : expression1  中的expression1 和expression2 都必须是表达式 goto是一条语句, 不是表达式, 所以编译肯定会报语法错误. 引用 2 楼 user-4 的回复:隐约看到汇编的思维方式  感谢回复。  1 == 1 ? printf_s("1==1") : printf_s("1!=1");  print_s也是语句。。

user: user-3
content: 三目用的有问题吧 把goto a， goto b  换成对应的标志位，然后通过对应标志位执行不同的语句块！

user: user-4
content: 隐约看到汇编的思维方式

user: user-2
content: condition ? expression1 : expression1  中的expression1 和expression2 都必须是表达式 goto是一条语句, 不是表达式, 所以编译肯定会报语法错误.
user-0 提问: 求解-交换地址

回复:
user: user-0
content: 我不是想写*（t+i）=*(t+i+1),这样写过了，不行。

user: user-1
content: t+i=t+i+1 语法是有错误的, t + i是不能做左值的 你是想写*(t+i) = *(t+i+1)吧

user: user-1
content: 数组和指针只有在作为函数参数时才等价， 在作为一般变量定义时不能相互替代。 简单说，你可以把 char a[4][20]理解为char (* const a)[20], 而不是char (*a)[20], 因此你不能交换a[1]和a[2]的值

user: user-2
content: 1.p=t+i;  p是指向char类型的指针，t是指向char [20]的指针，指针类型不相同 2. t+i=t+i+1;  int a=3; int i; for(i=0;i<10;i++)       a+i=a+i+1;//和整数是一个道理
user-0 提问: 一段话中的几处不理解的地方，望知晓的醍醐灌顶

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

user: user-2
content: 如果我没记错，这是《算法精解：C语言描述》里的话。书里面画了递归的递推和回归过程栈的变化，对着图看该不难理解。

user: user-3
content: 这几句话已经非常明确了，lz之所以不懂，是因为背景知识不够，建议楼主下载 下面这本书，认真阅读前几章，自然就懂了。  http://download.csdn.net/detail/zhou19891113/3032586

user: user-4
content: 递归的话需要保存很多信息，往栈里压数据，所以很消耗空间

user: user-5
content: 第一句话： 函数调用时，调用函数会将被调用函数的下一条指令地址入栈。进入被调用函数后，将栈基地址压栈，将栈顶指针赋给栈基地址（实现栈帧转换）。函数调用结束后，将栈基地址（被调用函数栈基地址）赋给栈顶指针，此时栈顶指针指向调用函数的栈基地址，根据后进先出原则，首先将该值弹出后栈帧恢复为调用前状态，然后再弹出被调用函数的下一条指令地址，程序向下执行。 第二句话： 由于递归调用为嵌套的函数调用，在函数没有执行完毕返回时，又进行了函数调用。这就会使得栈帧叠加，这种方式会持续压栈而不弹栈造成栈的生长，直到递归条件不满足，才会一层层的弹栈。因此会有占用空间大的缺点。
user-0 提问: C语言到底能干什么？

回复:
user: user-1
content: 这个社会充满了傲慢与偏见。单纯的从c入手，确实很困难。c简单到透明，你唯一要做的就是多读代码。看看人家是怎么实现的。当把c从简单玩到复杂，你就进步了。又从复杂玩到简单，那你就返璞归真了，哈哈，我现在还没达到。  任何语言，当要做个大项目的时候，基本情况都差不多。那就像是个喜马拉雅，你围着它进行铺垫，转啊转。最后只有一瞬间的快感，到顶了。剩下的是长久的不安，会不会出问题。这就是生活。  举个简单的例子，链表是我常用的数据结构。我的脑海里的list，有很多很多的变种，在特定的情况下使用某个特定的方式。这不是我创造的，只是阅读了很多的c的代码。很多代码我当时并不明白，几年后再看才发现它的意图。  但是单纯的c是很难生存的，就像我说的傲慢与偏见。你是否有参与大型项目的机会都很难说。所以说这个问题很难说。至少你在面对面试官的时候，c在95%的情况下不是他关注的。

user: user-0
content: 引用 1 楼 kunkun2013 的回复:嗯，，，这个问题很难回答。一方面大多数open source代码是用c写的，另一方面它好像没那么炫。它就是个很简单，能够满足一定范畴的语言。如果你主攻c，这对于我这种老旧派来说挺喜欢。但是你怎么生存啊？在工程划分上我尽量用c的模式，进行项目拼凑。还要考虑各种技术取向。技术的选择，不能脱离社会环境。c和c++现在都不太妙。这是个混乱的年代。 前辈有什么好的建议吗？说说您的见解，对于技术和生存两方面的。谢谢

user: user-2
content: 改变世界..

user: user-1
content: 嗯，，，这个问题很难回答。一方面大多数open source代码是用c写的，另一方面它好像没那么炫。它就是个很简单，能够满足一定范畴的语言。如果你主攻c，这对于我这种老旧派来说挺喜欢。但是你怎么生存啊？在工程划分上我尽量用c的模式，进行项目拼凑。还要考虑各种技术取向。技术的选择，不能脱离社会环境。c和c++现在都不太妙。这是个混乱的年代。

user: user-0
content: 引用 6 楼 kunkun2013 的回复:这个问题倒是很简单。选择什么在于你的认知。类库和框架不在于你怎么使用，在于你去读懂他。不要崇拜，产生自己的意识。然后，从工程的角度上去分析下，这玩意到底能怎么用。  学以致用，用才能赚钱。我经常听到别人给我一堆一堆的术语，到底怎么用？这才是重要的。从一个项目管理者的角度去学技术。并且能够尽量清晰的给别人阐述。一个人，做不了太多的事情。沟通能力很重要。  如果你在技术上有所成。下面的问题就更重要了。社会关系！就算别人说的话与你的理念不符，也尽量不要去打断。毕竟你自己做不了什么。除非这货太欠揍了，揍一个姓，不要揍太多。  我想我没什么太多的能帮助你的了。 恩，谢谢，从您这里收获很多。

user: user-1
content: 这个问题倒是很简单。选择什么在于你的认知。类库和框架不在于你怎么使用，在于你去读懂他。不要崇拜，产生自己的意识。然后，从工程的角度上去分析下，这玩意到底能怎么用。  学以致用，用才能赚钱。我经常听到别人给我一堆一堆的术语，到底怎么用？这才是重要的。从一个项目管理者的角度去学技术。并且能够尽量清晰的给别人阐述。一个人，做不了太多的事情。沟通能力很重要。  如果你在技术上有所成。下面的问题就更重要了。社会关系！就算别人说的话与你的理念不符，也尽量不要去打断。毕竟你自己做不了什么。除非这货太欠揍了，揍一个姓，不要揍太多。  我想我没什么太多的能帮助你的了。

user: user-0
content: 引用 4 楼 kunkun2013 的回复:这个社会充满了傲慢与偏见。单纯的从c入手，确实很困难。c简单到透明，你唯一要做的就是多读代码。看看人家是怎么实现的。当把c从简单玩到复杂，你就进步了。又从复杂玩到简单，那你就返璞归真了，哈哈，我现在还没达到。  任何语言，当要做个大项目的时候，基本情况都差不多。那就像是个喜马拉雅，你围着它进行铺垫，转啊转。最后只有一瞬间的快感，到顶了。剩下的是长久的不安，会不会出问题。这就是生活。  举个简单的例子，链表是我常用的数据结构。我的脑海里的list，有很多很多的变种，在特定的情况下使用某个特定的方式。这不是我创造的，只是阅读了很多的c的代码。很多代码我当时并不明白，几年后再看才发现它的意图。  但是单纯的c是很难生存的，就像我说的傲慢与偏见。你是否有参与大型项目的机会都很难说。所以说这个问题很难说。至少你在面对面试官的时候，c在95%的情况下不是他关注的。 恩，除了编程语言的基本编程能力，学习编程的道路上需要学那些库或框架什么呢？常用的有哪些？谢谢前辈不厌其烦的回复。
user-0 提问: c字符窜赋值

回复:
user: user-1
content: for(i=0,i<100,i++) { scanf("c%",&input[i]);  }

user: user-2
content: 引用 4 楼 u013231454 的回复:那要申明什么类型的数组才能给每个元素存一串字符窜呢.  char* input[100] 这是一种，当然这个方法的表面意思是 每个元素存一个指针  你利用指针就可以访问到字符串了  当然还有其他很多方法

user: user-0
content: 其实我是想写这么一个程序的,我有一个关键字的文件例如是key.txt 里面存的是一些关键字if else for while等等,每个关键字都是以空格分开的, 然后有一个程序文件例如test.txt 里面是一些程序代码,例如 <?php for ($i = 0; $i < 10; $i++) {     echo $i; } 然后是想统计key文件的关键字在test文件出现了多少次. 因为现在是搞PHP的,所以都是用PHP的思维去做,但是不行 我的思路是读取key文件,每次读取一个字符,然后把读到的字符放在一个数组的一个元素里,遇到空格在将 读到的字符放在数组的第二个元素里,以此类推.然后又读取test文件,方法一样,把读取到的字符放到另一个元素 里面.然后两个数组比较. 能给我说说这种统计关键字是怎么实现的吗

user: user-0
content: 那要申明什么类型的数组才能给每个元素存一串字符窜呢.

user: user-3
content: 用一个临时数组 tmp[];储存你读到的字符 第一次用snprintf(input,"%c",tmp, 1); 第二次strcat(input,tmp); 第三次strcat(input,tmp）；   .   . 用个for循环处理

user: user-4
content: input[i++] = getch(); input[i] = '\0';  引用 楼主 u013231454 的回复:假如我又一个数组 char input[100]; 我从文件中读取字符,每次读取一个 我想把读取的字符放到数组里怎么放 假如我第一次读取了一个字符"a" 我把它数值给数组的第0个元素, 然后又读取一个字符,我还想把它放在数组的第0个元素怎么放啊. 例如 第一次 input[0] = c; 第二次 input[0] = c; 这样就会覆盖了,我想加在一起,怎么写  在线等...求解答,我是刚接触c

user: user-5
content: 二维数组就行了   char a[5][100]; 5是5行 100是可以存100个字符

user: user-2
content: 引用 2 楼 u013231454 的回复:char input[100]这种类型每一个元素只能放一个字符? input[0] = "afasdaf"这样是不行的?  char input[100]的意思是 申请一个100个元素的数组 每个元素一个char  一个char就是一个字母

user: user-0
content: char input[100]这种类型每一个元素只能放一个字符? input[0] = "afasdaf"这样是不行的?

user: user-2
content: 一个位置只能放置一个元素，你只能放在input[1] 也就是第二个位置上 保持两个数据同时存在
user-0 提问: make不更新

回复:
user: user-0
content: 楼上正解啊啊

user: user-1
content: 引用 2 楼 u012909623 的回复:[quote=引用 1 楼 bijiaoben 的回复:] 你的makefile。。。。。。改过了？ 我自己写的[/quote] main.c好像没有加到依赖关系里。改成我上面那个试试看。

user: user-1
content: 1.o: 1.c 1.h     gcc -g -c 1.c main.o: main.c 1.h     gcc -g -c main.c 试试这个，好久不写，忘得差不多了

user: user-0
content: 引用 1 楼 bijiaoben 的回复:你的makefile。。。。。。改过了？ 我自己写的

user: user-1
content: 你的makefile。。。。。。改过了？
user-0 提问: 关于openssl AES/ECB/PKCS5Padding加密 求助

回复:
user: user-1
content: 您好 能把加密修改好的代码以一份么 算法太差 只能看别人的 我邮箱 395969391@qq.com

user: user-0
content: 引用 2 楼 user-2 的回复:你的代码写的够乱的啊，ecb加密方式，其实底层是调用AES_encrypt接口，你可以去看源码。 下面的代码给你一个参考，只不过，我是在调用aes_encrypt外面，自己严格控制了in和out的长度，out的长度大于in，并且必须是大于等于16的整数倍。 int aes_encrypt(char* in, char* key, char* out)//, int olen) {     if(!in || !key || !out) return 0;     AES_KEY aes;     if(AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0)     {         return 0;     }     int len=strlen(in), en_len=0;     while(en_len<len)//输入输出字符串够长，并且是AES_BLOCK_SIZE的整数倍，需要严格限制     {     	AES_encrypt((unsigned char*)in, (unsigned char*)out, &aes);     	in+=AES_BLOCK_SIZE;     	out+=AES_BLOCK_SIZE;     	en_len+=AES_BLOCK_SIZE;     }     return 1; } int aes_decrypt(char* in, char* key, char* out) {     if(!in || !key || !out) return 0;     AES_KEY aes;     if(AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0)     {         return 0;     }     int len=strlen(in), en_len=0;     while(en_len<len)     {     	AES_decrypt((unsigned char*)in, (unsigned char*)out, &aes);     	in+=AES_BLOCK_SIZE;     	out+=AES_BLOCK_SIZE;     	en_len+=AES_BLOCK_SIZE;     }     return 1; } 下面的链接是编程示例。 http://yuanshuilee.blog.163.com/blog/static/21769727520140942826137/ 下面是源码简单解析 http://yuanshuilee.blog.163.com/blog/static/217697275201311314185639/  非常感谢大神指点，我的代码确实太乱了，现在代码的编写能力还是不够，还需要向各位大神学习。  不过，我的那段代码其实运行的结果也是对的，只是我之前没理解好AES加解密，因为我需要加密的内容是字符串，加密后还需要将加密的内容编码成base64，否则看到的就是一串乱码。

user: user-2
content: 你的代码写的够乱的啊，ecb加密方式，其实底层是调用AES_encrypt接口，你可以去看源码。 下面的代码给你一个参考，只不过，我是在调用aes_encrypt外面，自己严格控制了in和out的长度，out的长度大于in，并且必须是大于等于16的整数倍。 int aes_encrypt(char* in, char* key, char* out)//, int olen) {     if(!in || !key || !out) return 0;     AES_KEY aes;     if(AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0)     {         return 0;     }     int len=strlen(in), en_len=0;     while(en_len<len)//输入输出字符串够长，并且是AES_BLOCK_SIZE的整数倍，需要严格限制     {     	AES_encrypt((unsigned char*)in, (unsigned char*)out, &aes);     	in+=AES_BLOCK_SIZE;     	out+=AES_BLOCK_SIZE;     	en_len+=AES_BLOCK_SIZE;     }     return 1; } int aes_decrypt(char* in, char* key, char* out) {     if(!in || !key || !out) return 0;     AES_KEY aes;     if(AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0)     {         return 0;     }     int len=strlen(in), en_len=0;     while(en_len<len)     {     	AES_decrypt((unsigned char*)in, (unsigned char*)out, &aes);     	in+=AES_BLOCK_SIZE;     	out+=AES_BLOCK_SIZE;     	en_len+=AES_BLOCK_SIZE;     }     return 1; } 下面的链接是编程示例。 http://yuanshuilee.blog.163.com/blog/static/21769727520140942826137/ 下面是源码简单解析 http://yuanshuilee.blog.163.com/blog/static/217697275201311314185639/

user: user-0
content: 自己顶下，求大神帮忙！！！！
user-0 提问: 请教一下使用minifilter重定向的问题.

回复:
user: user-1
content: 可否看一下您重定向的代码？我现在初学内核，要做文件重定向，但是我编完后没有任何反应。。。

user: user-0
content: 引用 3 楼 only_lonely 的回复:IRP_MJ_SET_INFORMATION  这里对重命名操作也要进行重定向。  是的 。对irp create和set information都要进行处理。

user: user-2
content: IRP_MJ_SET_INFORMATION  这里对重命名操作也要进行重定向。

user: user-3
content: 按道理应该也有的吧，呵呵 office 重命名，新建，写入，删除 新建和写入都重定向试试

user: user-0
content: 1024 1024
user-0 提问: 二维数组指针的问题

回复:
user: user-1
content: p是指向数组的行的指针的

user: user-2
content: 引用 3 楼 u012453630 的回复:[quote=引用 1 楼 uuuououlcz 的回复:] int (*P)[4]，这里P是一个指向数组（包含4个int值的数组）的指针，使用如下： int a[3][4], (*P)[4] = a; 则此时*P得到的是一个数组（的首地址），在上面的例子中就有*P = *a = a[0]，从而 **P = *a[0] = a[0][0] *P + 1 = a[0] + 1 = &a[0][1]   你的意思就是这个是语法问题 只要记住在这个二维数组指针里面 **P才是取值对吗[/quote]  6点多的回复，lz这么好的作息习惯呀，仰慕仰慕 嗯，就是语法而已，见得多了，自然就记得了

user: user-0
content: 引用 1 楼 uuuououlcz 的回复:int (*P)[4]，这里P是一个指向数组（包含4个int值的数组）的指针，使用如下： int a[3][4], (*P)[4] = a; 则此时*P得到的是一个数组（的首地址），在上面的例子中就有*P = *a = a[0]，从而 **P = *a[0] = a[0][0] *P + 1 = a[0] + 1 = &a[0][1]   你的意思就是这个是语法问题 只要记住在这个二维数组指针里面 **P才是取值对吗

user: user-3
content: *p 等价与p[0]

user: user-2
content: int (*P)[4]，这里P是一个指向数组（包含4个int值的数组）的指针，使用如下： int a[3][4], (*P)[4] = a; 则此时*P得到的是一个数组（的首地址），在上面的例子中就有*P = *a = a[0]，从而 **P = *a[0] = a[0][0] *P + 1 = a[0] + 1 = &a[0][1]
user-0 提问:  请大神们看看这两道题

回复:
user: user-1
content: 题目一 数学公式转C 表达式 定义适当类型的变量 1）Velocity 2）time 3）Acceleration 并把数学表达式转换成 C语言表达式 C没有平方，立方运算符，也没有乘方运算符，所以乘方直接用连乘表示就可以了 x2 --->x*x x3 --->x*x*x 题目2 1 到库里看看--看一下头文件（limits.h,float.h等），并学习使用sizeof 运算符 2 了解short 表示范围，和溢出出错的结果。 这个就是 在主函数中写下一下代码，并编译运行，写出看到的运行结果。  short i; i = 3 + 32767; printf("%d\n", i);  3 叫你讨论（研究） float类型数据， 指数部分，尾数部分的位数（bits）。 知道的话，写出来就行了。 不知道搜一下 IEEE 浮点数

user: user-0
content: 两道初级题 因为本人刚开始学c语言 请大神看看这两道题 谢谢了
user-0 提问: 求助大神！！！这个编程到底哪里错了？麻烦帮我改正~

回复:
user: user-1
content: 你把max返回的值放到了k这个变量中，然后又把k和a[4][2]交换，所以原来在数组中的最大值没变，只是k和a[4][0]变了。这样就好了； #include<stdio.h> int *max(int a[][3],int i,int j); void swap(int *k,int *u);  int main() { 		int a[5][3],i,j; 		int *k; 		printf("输入15个数:"); 		for(i=0;i<5;i++) 		{ 				for(j=0;j<3;j++) 				{ 						scanf("%d",&a[i][j]); 						getchar(); 				} 		} 		k=max(a,i,j); 		swap(k,&a[4][2]); 		for(i=0;i<5;i++) 		{ 				for(j=0;j<3;j++) 				{ 						printf("%d ",a[i][j]); 				} 		} //		printf("\n%d",*k); 		return 0; } void swap(int *k,int *u) { 		int temp; 		temp=*k; 		*k=*u; 		*u=temp; }  int* max(int a[][3],int i,int j) { 		int *max; 		max=&a[0][0]; 		for(i=0;i<5;i++) 		{ 				for(j=0;j<3;j++) 				{ 						if(*max<a[i][j]) max=&a[i][j]; 				} 		} 		return max; }

user: user-0
content: 引用 1 楼 user-2 的回复:找到最大值后，应该去轮询把最大值的位置找到再交换到最后。你现在的错误是找到最大值，然后最大值存在一个变量里，这个变量和数组最后的位置交换，会导致数组最后的位置上的值交换出数组。实际上你完成的是找到最大值，然后把最大值赋值给了最后一个元素。并非你想要的效果 可是我将你的替换进去，有错误耶~（我是一个初学者，不太懂~请见谅）

user: user-0
content: 可是我将你的替换进去，有错误耶~（我是一个初学者，不太懂~请见谅）

user: user-2
content: void swap(int *k,int a[][3]) { int i,j,temp; for(i=0;i<5;i++) { for(j=0;j<3;j++) { if(*k==a[i][j])  { temp=a[i][j]; a[i][j]=a[4][2]; a[4][2]=temp; } } } }

user: user-2
content: 找到最大值后，应该去轮询把最大值的位置找到再交换到最后。你现在的错误是找到最大值，然后最大值存在一个变量里，这个变量和数组最后的位置交换，会导致数组最后的位置上的值交换出数组。实际上你完成的是找到最大值，然后把最大值赋值给了最后一个元素。并非你想要的效果
user-0 提问: 词法分析器的输出是什么

回复:
user: user-1
content: lex&yacc时常用的表达式解析组合。 用lex编辑源代码，将源代码存储为a.l，然后用进行编译，输入flex a.l，编译后生成lex.yy.c(yy 指的是yacc)文件，用c编译器打开（确保example.txt存储在相同目录下），编译运行即可. 输出形式是token：<单词种别，单词符号的属性值>    参考：http://blog.csdn.net/xn4545945/article/details/8273499

user: user-2
content: C++ Tokens A token is the smallest element of a C++ program that is meaningful to the compiler. The C++ parser recognizes these kinds of tokens: identifiers, keywords, literals, operators, punctuators, and other separators. A stream of these tokens makes up a translation unit.  Tokens are usually separated by “white space.” White space can be one or more:   Blanks   Horizontal or vertical tabs   New lines   Formfeeds   Comments  Syntax  token :  keyword identifier constant operator punctuator  preprocessing-token :  header-name identifier pp-number character-constant string-literal operator punctuator each nonwhite-space character that cannot be one of the above  The parser separates tokens from the input stream by creating the longest token possible using the input characters in a left-to-right scan. Consider this code fragment:  a = i+++j;  The programmer who wrote the code might have intended either of these two statements:  a = i + (++j)  a = (i++) + j  Because the parser creates the longest token possible from the input stream, it chooses the second interpretation, making the tokens i++, +, and j.

user: user-0
content: 引用 1 楼 turingo 的回复:token  引用 楼主 u012420493 的回复:一般是保存为什么形式的  编译器的token是什么，具体什么形式，只接触过进程线程的token

user: user-3
content: token  引用 楼主 u012420493 的回复:一般是保存为什么形式的
user-0 提问: 刚试着写C的socket 碰到了一个问题，希望有人帮忙看看～

回复:
user: user-0
content: 引用 5 楼 user-1 的回复:你确定192.168.0.6:8011这个地址端口有等待的accept吗?? 如果你的机器ip是这个192.168.0.6,看看你的网线插好没,系统连不上网络的时候,网络操作的这些函数根本就直接返回错误,这是不用想的,即便你设置了ip也没用,因为理论上你那ip根本没意义 但127这种地址,系统知道你连接的肯定不是网络,所以根本没走套接字那套东西,实际上你使用127的时候系统使用的通信方式是管道,所以不会出错 原来是这样。我用的是wifi ，上午看的时候是.6 ,刚才查了下，变成.9了。整了大半天才弄出这个么小东西，谢谢你了哈。

user: user-1
content: 你确定192.168.0.6:8011这个地址端口有等待的accept吗?? 如果你的机器ip是这个192.168.0.6,看看你的网线插好没,系统连不上网络的时候,网络操作的这些函数根本就直接返回错误,这是不用想的,即便你设置了ip也没用,因为理论上你那ip根本没意义 但127这种地址,系统知道你连接的肯定不是网络,所以根本没走套接字那套东西,实际上你使用127的时候系统使用的通信方式是管道,所以不会出错

user: user-0
content: 引用 1 楼 user-1 的回复:connect(client_socket, (struct sockaddr *)&sAddr, sizeof(sAddr)); 想在问个问题，我改了以后用 192.168.0.6 会出现 connection refused ,但是用 127.0.0.1 就可以通信，这个是为什么呢？

user: user-1
content: 引用 2 楼 Redice_7 的回复:[quote=引用 1 楼 user-1 的回复:] connect(client_socket, (struct sockaddr *)&sAddr, sizeof(sAddr)); 代码都没看清就去查问题，这是我的问题。。。[/quote] 所以你有把分数给我吧

user: user-0
content: 引用 1 楼 user-1 的回复:connect(client_socket, (struct sockaddr *)&sAddr, sizeof(sAddr)); 代码都没看清就去查问题，这是我的问题。。。

user: user-1
content: connect(client_socket, (struct sockaddr *)&sAddr, sizeof(sAddr));
user-0 提问: 如何把字符串作为变量名使用？？？可以吗？或者有解决的方法吗？

回复:
user: user-1
content: c++做不到。。

user: user-2
content: 参考Code Generation

user: user-3
content: 引用 2 楼 xihu1364 的回复:map<char*,num> mapVar;  mapVar.insert("num",1);  printf("%d\n",mapVar["num"]);  这样？

user: user-4
content: 没有可能，看起来你似乎有些脚本方面的需求，可以看看C和Lua的结合。  引用 楼主 u012749695 的回复:如何把字符串作为变量名使用？？？可以吗？或者有解决的方法吗？ 比如已知a[3]="num" 我想定义一个int num 怎么样用已知的字符串完成这个定义

user: user-5
content: map<char*,num> mapVar;  mapVar.insert("num",1);  printf("%d\n",mapVar["num"]);  这样？

user: user-6
content: 如果是编译时候还能用define搞搞，如果运行时基本不可能
user-0 提问: 关于C语言，新手求教。。

回复:
user: user-0
content: 引用 6 楼 bijiaoben 的回复:我没用过啊，求1楼的哥们儿来解答了 引用 1 楼 user-2 的回复:graphics.h？？可以做到吗 谢谢大家乐，用graphics.h可以解决。。至于那个错误问题也解决了，需要编译时文件命名为.cpp而不是.c

user: user-1
content: 我没用过啊，求1楼的哥们儿来解答了

user: user-2
content: graphics.h？？可以做到吗

user: user-0
content: 引用 4 楼 bijiaoben 的回复:头文件中肯定会有接口 调用库函数做事，虽然我不知道有没有符合你要求的函数，但是1楼说的大概就是这么个思路  这样啊，但是我在VC上调用graphics.h时出现错误提示耶：Easyx only for C++

user: user-1
content: 头文件中肯定会有接口 调用库函数做事，虽然我不知道有没有符合你要求的函数，但是1楼说的大概就是这么个思路

user: user-0
content: 引用 1 楼 user-2 的回复:graphics.h？？可以做到吗 ？？？你的意思是用graphics.h这个头文件？？但是具体怎样做呢

user: user-0
content: ？？？你的意思是用graphics.h这个头文件？？但是具体怎样做呢

user: user-1
content: 其实应该给1楼分多点，他的答案直中要害，我就是打打杂，愧受了分数
user-0 提问: 求C项目源码！！

回复:
user: user-1
content: vim源码行不？

user: user-2
content: CSDN里不是有很多..

user: user-3
content: libc(http://ftp.gnu.org/gnu/glibc/)源码比较合适。  引用 楼主 tr3301103 的回复:之前都只是用C敲一些简单的算法代码，现在希望能提升C语言软件开发方面的能力，就想找些源码来学习，在开源中国社区上找了一下，但貌似都很大，以目前本人的水平有点困难，所以求哪位有C语言项目开发经验的前辈指点一下，最好能够提供比较成熟的C项目代码（1万行以内的），或是C项目开发方面比较经典的书也行，谢谢！

user: user-4
content: 接触一个好的项目代码，确实受益很大，但是是好的项目代码哦....

user: user-5
content: 一开始不要搞那么复杂的，别人写的代码，不见得就好，或许你看别人写的一万行代码，得到的收获还比不上看一小段经典书籍中的代码得到的启发大，建议还是看经典的东西。比如《C算法》1-4卷，学习算法的同时，又可以学作者的编程思想，巩固基础。

user: user-6
content: linux源代码中随便摘录一段。

user: user-7
content: ngix, 好像有中文的源码分析书。  http://www.bing.com/search?q=ngix+%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90&qs=AS&form=QBRE&pq=ngix+%E9%B1%BC%E5%95%8A&sc=3-8&sp=2&sk=AS1

user: user-8
content: 这个可以网上看一些开源的小游戏什么的！自己琢磨琢磨！
user-0 提问: 关于fread读取dat文件求助

回复:
user: user-1
content: fread不到文件结束不会不读吧

user: user-2
content: fread是按照指定长度去读取的，fgets才是遇到00结束。  引用 楼主 u010673033 的回复:我用fread去读dat文件时每次读取到00时系统就默认数据读取结束，而这00只是发送的数据，有什么办法可以使得读取dat文件能够完整呢，求各位大神帮忙，谢谢了！

user: user-3
content: fread如果没有到文件结尾的话，调用成功的话，都是按照用户提供的长度去读数据的！ 确认你的代码是否有bug吧！ 贴一部分源码上来看看

user: user-4
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  请检查每个函数的返回值。  不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-5
content: 发代码来看
user-0 提问: 单链表删除节点操作，为什么执行到DeleteList（）时程序异常停止

回复:
user: user-1
content: 引用 4 楼 u012330750 的回复:感谢大奶兔白糖和未注销，大奶兔白糖你讲的很到位，让我恍然大悟，谢谢你。未注销你以代码说话，也戳中了要害。谢谢你们！ 兄弟客气了，咱们就是要互相帮助，多谢给分

user: user-2
content: CreatList(L,n,arr); 	printf("输出链表："); 	LinkList tmp = L; 	for(int i=0;i<n;i++) 	{ 		printf("%d  ",tmp->next->data); 		tmp=tmp->next; 	} 	printf("\n");

user: user-0
content: 感谢大奶兔白糖和未注销，大奶兔白糖你讲的很到位，让我恍然大悟，谢谢你。未注销你以代码说话，也戳中了要害。谢谢你们！

user: user-1
content: 你的void CreatList(LinkList &L,int n,int *arr)函数定义，是要传入一个LinkList的引用？如果是的话，这应该发C++那边去，因为在我的印象中C语言中没有引用。如果不是要传引用的话，这个代码就需要改了吧？ 输出链表的时候更改了L的值: printf("输出链表："); for(int i=0;i<n;i++) {  printf("%d  ",L->next->data);  L=L->next; } 所以后面在Delete链表的时候，L已经没有指向链表头了，而是指向了链表的。。。所以你删除的时候会出错。 while(p&&j<i-1) { p=p->next; printf("%d",p->data); j++; } r=p->next; 如果上面的循环是因为p为空的时候才退出的，下面的代码就完蛋了。

user: user-0
content: 大神帮忙看一下
user-0 提问: 类似QQ聊天对话框

回复:
user: user-1
content: 你自己根据名称什么的管理所有创建的窗口，然后想怎么激活都没问题了

user: user-2
content: 呵呵是什么意思？

user: user-0
content: 有没有做过具体的案例呢呵呵

user: user-3
content: 根据窗口标题FindWindow，找到窗口句柄后SetFocus或者好像有个SetActiveWindow

user: user-4
content: form.focus()?
user-0 提问: 求人指点一下数据结构的学习方向

回复:
user: user-1
content: 用清华出版社严蔚敏写的那本数据结构(c语言版)

user: user-2
content: 当你在选择数据结构的时候，能够产生出心情的时候，这就太棒了。这就像下围棋，我知道局部平衡度，但是我的心情不爽。嘎嘎

user: user-2
content: 前面说到的数据结构是基本必须具备的。麻烦的问题是太多的变种是书上没有的。链表很简单，根据内存开销，至少有4种。这是需要研究的。众所周知，hash表是数组进行散列后的链表结构。如果维护个静态字典，纯粹的单向链表就足够了。在网络应用中，我们有时候想快速的清除一些过期session，hash下的爬表都有点不情愿。这时候需要能够自删除链表节点。这相当的高效。stl不是万能的，它只是普通情况的下的学术性解决方案。如果你开始学习数据结构，linux下的标准头文件目录下有个文件叫queue.h。里面描述了一部分链表的使用方式。

user: user-2
content: 主要是看你是学这个考试比如考研还是致用。如果是致用的话，很简单。STL里有的数据结构都要熟悉。链表，hash表，AVLtree，RBtree，稍微复杂点的B+B-。排序类可以基本忽略太简单也太深，图类涉猎一下，需要的时候补一补。关键的是能灵活的用，每次选择一个数据结构能够提出自己的观点。比如说hash表，有至少16种变种。不同的情况使用不同的结构。

user: user-0
content: 好高端...听都没听过= =。....那就清华的那本，别的几个人也是这么推荐的
user-0 提问: 运行时程序终止~~没有报错~~求指教~~

回复:
user: user-1
content: char *filename="E:\\temp\\mydata.bin"; 文件路径不存在新建一个文件夹temp

user: user-2
content: if(length+1>MAXLEN)         {             if(length+1>MAXLEN)             {                 printf("\nName too long.");                 exit(1);             }             fread(name,sizeof(char),length,pFile);             name[length]='\0';             fread(&age,sizeof(age),1,pFile);             printf(format,name,age);         }  这两个if真心让人看不懂啊。。。。   scanf(" %d",age);  楼上说的这个也是个问题

user: user-3
content: 仅供参考： #include<stdio.h> #include<ctype.h> #include<string.h> #include<stdlib.h> #define MAXLEN 30 void listfile(char *filename); int main(void) {     char *filename="/tmp/test_dir/write.log"; //要有读写权限     char name[MAXLEN];     size_t length=0;     int age=0;     char answer='y';     FILE *pFile=fopen(filename,"wb+");     do     {         fflush(stdin);         printf("\nEnter a name less than %d characters:",MAXLEN);         gets(name);         printf("Enter the age of %s:",name);         scanf(" %d", &age); //这里的第二个参数是指针         length=strlen(name);         fwrite(&length,sizeof(length),1,pFile);         fwrite(name,sizeof(char),length,pFile);         fwrite(&age,sizeof(age),1,pFile);         printf("Do you want to enter another(y or n)?");         scanf("\n%c",&answer);     }while(tolower(answer)=='y');     fclose(pFile);     listfile(filename);     return 0; } void listfile(char *filename) {     size_t length=0;     char name[MAXLEN];     int age=0;     char format[20];     sprintf(format,"\n%%-%ds Age:%%4d",MAXLEN);     FILE *pFile=fopen(filename,"rb");     if(NULL != pFile){ //判断返回指针是否为NULL     	printf("\nThe contents of %s are:",filename);     	while(fread(&length,sizeof(length),1,pFile)==1)     	{     		if(length+1>MAXLEN) //原来这里你的判断逻辑有问题     		{     			printf("\nName too long.");     			exit(1);     		}     		fread(name,sizeof(char),length,pFile);     		name[length]='\0';     		fread(&age,sizeof(age),1,pFile);     		printf(format,name,age);     	}     	fclose(pFile);     } }

user: user-2
content: void listfile(char *filename) {     size_t length=0;     char name[MAXLEN];     int age=0;     char format[20];     sprintf(format,"\n%%-%ds Age:%%4d",MAXLEN);     FILE *pFile=fopen(filename,"rb");     printf("\nThe contents of %s are:",filename);     while(fread(&length,sizeof(length),1,pFile)==1)     {         if(length+1>MAXLEN)         {             if(length+1>MAXLEN)             {                 printf("\nName too long.");                 exit(1);             }             fread(name,sizeof(char),length,pFile);             name[length]='\0';             fread(&age,sizeof(age),1,pFile);             printf(format,name,age);         }         fclose(pFile);     } }  这函数代码很怪啊，fclose（）放在循环里面，fopen放在循环外面。。。。。

user: user-4
content: 请判断每个函数调用的返回值！

user: user-5
content: scanf(" %d",age); scanf(" %d",&age);  另外fopen创建文件路径要先存在

user: user-6
content: 判断下fopen打开是否成功吧！  对应api都判断下返回值！使用句柄前，判断下是否有效！
user-0 提问: 求助：输出单个字符的问题

回复:
user: user-1
content: 可能win下底层自带清空缓存功能了。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:#include <stdio.h> #include <unistd.h>  void delay_play(char *str) {     while(*str)     {         putchar(*str++);         fflush(stdout);         usleep(1000000);     } }  int main(void) {     char *text = "I am chinese";      for(;;)     {         delay_play(text);         puts("");     }       return 0; } 可以简单解释一下吗？为什么清空缓存，而win下却不用

user: user-2
content: Name  usleep - suspend execution for microsecond intervals  Synopsis  #include <unistd.h>  int usleep(useconds_t usec); Feature Test Macro Requirements for glibc (see feature_test_macros(7)): usleep(): Since glibc 2.12: _BSD_SOURCE ||     (_XOPEN_SOURCE >= 500 ||         _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&     !(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) Before glibc 2.12: _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED Description     The usleep() function suspends execution of the calling thread for (at least) usec microseconds. The sleep may be lengthened slightly by any system activity or by the time spent processing the call or by the granularity of system timers.

user: user-1
content: #include <stdio.h> #include <unistd.h>  void delay_play(char *str) {     while(*str)     {         putchar(*str++);         fflush(stdout);         usleep(1000000);     } }  int main(void) {     char *text = "I am chinese";      for(;;)     {         delay_play(text);         puts("");     }       return 0; }

user: user-0
content: 引用 2 楼 max_min_ 的回复:ulseep Linux是微秒级的吧  usleep(100000); //试试 你有没有测试一下啊？我测试还是不行，只是把整行输出延时久一点了。

user: user-3
content: ulseep Linux是微秒级的吧  usleep(100000); //试试

user: user-4
content: usleep(10000);没用过
user-0 提问: cout<

回复:
user: user-1
content: 需要严格控制的自己计算以下，不要依赖实现。

user: user-1
content: 制表位置，根据已经输出的字符个数计算，然后再按照每个制表符占有的字符个数 计算制表符输出后下一个数据的位置。  例如 puts("123\tabcdefg"); 每个制表符 8字符，该行已经输出“123” ，3个字符，那么输出制表符后，下一个位置在（3+8）/8 =8 的位置 再输出 abcdefg 即输出  123_____abcdefg 其中下划线代表输出\t产生的空白。    其他输出也是这么处理的。

user: user-0
content: 具体加在什么地方

user: user-2
content: cout << "...\t...";   不行？

user: user-3
content: cout<<'\t';

user: user-4
content: 01.#include <iostream>   02.#include <iomanip>   03.#include <limits>   04.using std::cout;   05.using std::endl;   06.using std::setprecision;   07.using std::numeric_limits;   08.  09.int main() {   10.  const double pi = 3.14;   11.  cout << endl;   12.  13.  for(double radius = .2 ; radius <= 3.0 ; radius += .2)   14.    cout << "radius = "  15.    << setprecision(numeric_limits<double>::digits10 + 1)   16.    << std::scientific << radius<< "  area = "  17.         << std::setw(10) << setprecision(6)<< std::fixed << pi * radius * radi   18.us << endl;   19.  return 0;   20.}  #include <iostream> #include <iomanip> #include <limits> using std::cout; using std::endl; using std::setprecision; using std::numeric_limits; int main() {   const double pi = 3.14;   cout << endl;   for(double radius = .2 ; radius <= 3.0 ; radius += .2)     cout << "radius = "     << setprecision(numeric_limits<double>::digits10 + 1)     << std::scientific << radius<< "  area = "          << std::setw(10) << setprecision(6)<< std::fixed << pi * radius * radi us << endl;   return 0; }   radius = 2.0000000000000001e-001  area =   0.125600 radius = 4.0000000000000002e-001  area =   0.502400 radius = 6.0000000000000009e-001  area =   1.130400 radius = 8.0000000000000004e-001  area =   2.009600 radius = 1.0000000000000000e+000  area =   3.140000 radius = 1.2000000000000000e+000  area =   4.521600 radius = 1.3999999999999999e+000  area =   6.154400 radius = 1.5999999999999999e+000  area =   8.038400 radius = 1.7999999999999998e+000  area =  10.173600 radius = 1.9999999999999998e+000  area =  12.560000 radius = 2.1999999999999997e+000  area =  15.197600 radius = 2.3999999999999999e+000  area =  18.086400 radius = 2.6000000000000001e+000  area =  21.226400 radius = 2.8000000000000003e+000  area =  24.617600
user-0 提问: 四个输出，你的答案是什么？

回复:
user: user-1
content: 引用 6 楼 libinxian2011 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！“驾船出海时一定只带一个指南针”，赵老师，这句话什么意思？多带一只指南针不是更好吗？[/quote] 万一两只或一只指南针都坏了呢？此时是带一只指南针的船还是带两只指南针的船先靠岸呢？

user: user-2
content: 2230..

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

user: user-3
content: 2 2 3 0

user: user-4
content: 作用域和生命周期  即可判断。

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

user: user-5
content: 哦 纠正 注释有写 全局 那么D是 0

user: user-5
content: 2 2 3 未定义行为 结果不可靠
user-0 提问: md5算法，如果对一个文件生成md5

回复:
user: user-1
content: # time dd if=/dev/urandom ibs=1M count=5 | md5sum    5+0 records in 10240+0 records out c70b84415e6dd943ef1054f4cfdc5839  - 5242880 bytes (5.2 MB) copied, 0.705356 seconds, 7.4 MB/s  real    0m0.759s user    0m0.012s sys     0m0.708s  # time dd if=/dev/urandom ibs=1M count=50 | md5sum  50+0 records in 102400+0 records out 52428800 bytes (52 MB) copied, 7.16639 seconds, 7.3 MB/s 459e2d00b5a06761316caa9093d40b5e  -  real    0m7.184s user    0m0.060s sys     0m6.920s  # time dd if=/dev/urandom ibs=1M count=500 | md5sum  500+0 records in 1024000+0 records out 524288000 bytes (524 MB) copied, 69.3534 seconds, 7.6 MB/s 488c72f1c1e3df27535fc04082902eec  -  real    1m9.362s user    0m0.524s sys     1m7.668s  LZ可以猜猜，如果count继续变大，要算个MD5要多久？

user: user-1
content: 顶16L，LZ确实想多了。  buffer为1024也许效率不是最高，那多少最高呢？  LZ可以自己先想想。  我的答案是，设置成和底层的disk io的一次读的buffer的大小一致，效率最好。  其实对待这个问题，最简单的方式就是先功能，后性能；在功能保证的前提下profile，调优。  而且就MD5来说，问题不在于计算，而是要读50G这么大的文件，天生磁盘IO就很大。

user: user-2
content: 楼主想多了，

user: user-3
content: 引用 10 楼 ForestDB 的回复:int MD5_Init(MD5_CTX *c);         int MD5_Update(MD5_CTX *c, const void *data,                          unsigned long len);         int MD5_Final(unsigned char *md, MD5_CTX *c); 基本操作就是： MD5_CTX c; MD5_Init(&c); // 初始化上下文 char buffer[1024]; // 定义一小块buffer，文件会读入此buffer while (read_1024_byte_of_file_into_buffer()) // 反复读文件内容，只到文件全部读完   MD5_Update(&c, buffer, 1024) // 用每次读到的内容去update md5上下文 char md5_digest[64]; MD5_Final(md5_digest, &c); // 从上下文中提取md5  上述的核心就是while循环，每次读一部分文件，然后根据读到的内容更新MD5值，如此反复，直至全部文件结束。  buffer小心为1024是否合适呢？可能不是效率最高吧

user: user-4
content: 还真不慢，50M/S还不够你读的吗。

user: user-5
content: 反正你眨一下眼睛就可以扫描好几次了

user: user-6
content: 如果是几G的文件，还是要点时间的。

user: user-7
content: do it! you will know the truth

user: user-8
content: linux   md5sum 有源码

user: user-1
content: 是 没你想的慢，比你想的快多了。

user: user-9
content: 能耗多少时间？50MB/s ？

user: user-10
content: 要不然你MD5计算的是什么呢。

user: user-11
content: 需要的，文件中即使多一个空格，md5码也会不一样

user: user-12
content: 必须将整个文件从头到尾读一遍。

user: user-13
content: 当然要整个文件扫描，不会很慢。  引用 楼主 zrdongjiao 的回复:那么，这个算法是不是对整个文件扫描一遍？  如果整个文件扫描的话，那岂不是很慢，很耗时？

user: user-14
content: 整个读取必须的

user: user-1
content: int MD5_Init(MD5_CTX *c);         int MD5_Update(MD5_CTX *c, const void *data,                          unsigned long len);         int MD5_Final(unsigned char *md, MD5_CTX *c); 基本操作就是： MD5_CTX c; MD5_Init(&c); // 初始化上下文 char buffer[1024]; // 定义一小块buffer，文件会读入此buffer while (read_1024_byte_of_file_into_buffer()) // 反复读文件内容，只到文件全部读完   MD5_Update(&c, buffer, 1024) // 用每次读到的内容去update md5上下文 char md5_digest[64]; MD5_Final(md5_digest, &c); // 从上下文中提取md5  上述的核心就是while循环，每次读一部分文件，然后根据读到的内容更新MD5值，如此反复，直至全部文件结束。

user: user-0
content: 引用 3 楼 thefirstz 的回复:需要的，文件中即使多一个空格，md5码也会不一样 引用 6 楼 ForestDB 的回复:是 没你想的慢，比你想的快多了。  是否得开一个很大的缓冲区域，读取整个文件，进行计算？  比如几十g的电影，如何计算呢？
user-0 提问: sqrt

回复:
user: user-1
content: 编译器没有那么智能，看到格式串里有%d并不会自动把double类型转成int型。而是把64位的double数据压到栈上，然后printf函数执行的时候解释栈上的数据，看到%d只会从栈里拿32位的数据。很有可能这个double数据的低32位当整数看待时就是0。

user: user-2
content: 引用 3 楼 u011488256 的回复:[quote=引用 2 楼 ivyvae 的回复:] 因为double sqrt(double)返回类型是double。没有int sqrt（int）的重载。。   也就说你的sqrt（25）得出的结果是double类型，你用"%d"输出，肯定是0。改为"%f"就没问题了。 返回的是double类型，我用%d输出也应该有整数部分啊。就像我把double给了int c  打印C用%d 也是5啊   [/quote]不对，你用int c赋值就会隐试类型准换。"%d"输出则不会。。

user: user-3
content: 我做了几次实验，每次输出都是不同的。我是UBUNTU13.10系统。           听说C语言中的函数参数传递是，C语言中，参数压栈的方向是从右往左。这样的话你的第二个参数 sqrt（25）就先输出。因为你sqrt(25)没有先初始化为int。输出的是人看不懂的乱码。 所以我的机器才会是一时正的很大，一时负的很大。

user: user-4
content: 仅供参考： #include<stdio.h> #include<math.h> int main() {     printf("%d",(int)sqrt(25)); //sqrt返回值是double型的，强制转换成int     return 0; }

user: user-3
content: 我的电脑输出是负数。-1195402056。。。。

user: user-3
content: 我说的不对了。。。。。不懂

user: user-3
content: printf(const char *,....); printf函数是把内存中的值打印出来。  你这个程序 printf("%d\n", sqrt(25)); sqrt(25)是个函数，也是个指针。sqrt（25）指向一个值。  这个并不是你想象的 5.00000或者5什么的。 其实这个值用二进制表示 可能是 000111100111什么一堆乱七八糟的代码。 如果内存中的值不经过格式化。 那么内存的值，对于人来说是毫无意义的。  格式化，是把人眼看不懂的东西，利用输入输出设备强制转换成人眼看得懂的东西。5.0000这个值在CPU的角度看来毫无意义。

user: user-5
content: 那么楼主你希望 printf("%此参数按熊猫的格式输出\n",CSDN中的u011488256); 输出啥呢？

user: user-0
content: 引用 2 楼 ivyvae 的回复:因为double sqrt(double)返回类型是double。没有int sqrt（int）的重载。。   也就说你的sqrt（25）得出的结果是double类型，你用"%d"输出，肯定是0。改为"%f"就没问题了。 返回的是double类型，我用%d输出也应该有整数部分啊。就像我把double给了int c  打印C用%d 也是5啊

user: user-2
content: 因为double sqrt(double)返回类型是double。没有int sqrt（int）的重载。。  也就说你的sqrt（25）得出的结果是double类型，你用"%d"输出，肯定是0。改为"%f"就没问题了。

user: user-6
content: 因为sqrt返回的是double类型 你应该使用printf（“%f”，sqrt（25））   或者printf（“%d”，(int)(sqrt（25）)）
user-0 提问: 对大端小端还有个疑问

回复:
user: user-1
content: 要先转成网络字节顺序吧

user: user-2
content: 是可以不用转换，只要你能保证两端是一致的就可以

user: user-3
content: 对网络数据包的处理，接收到网络数据包，根据字节顺序进行存储，需要在网络字节顺序和主机字节顺序之间进行转换，c语言中提供的转换函数有：  #include <arpa/inet.h> uint32_t ntohl(uint32_t netlong); 　netlong：一个以网络[字节顺序表达的32位数。  uint32_t htonl(uint32_t hostlong);  hostlong：主机字节顺序表达的32位数。  u_short  htons( u_short hostshort);  hostshort：主机字节顺序表达的16位数。  uint16_t ntohs(uint16_t netshort);  本函数将一个32位数从主机字节顺序转换成网络字节顺序。

user: user-4
content: void HexDump(char *buf,int len) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%04x -",i);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-5
content: 如果你都是按字节来处理数据, 就不用管大端还是小端了.

user: user-6
content: 应该是这样

user: user-7
content: 你要是能确定都是小端，按理说不转也没问题。 更普遍的情况是，你不知道对方是大端还是小端机器。  因此 网络传输一般采用大端序，也被称之为网络字节序，或网络序。IP协议中定义大端序为网络字节序。

user: user-8
content: 如果两边确定都是小端，确实可以不转。

user: user-9
content: 如果你是写给自己用的代码, 确实可以不用转换. 但对于正式软件, 以后该代码可能会被移植到其他运行环境, 比如从PC(x86小端)移植到手机(arm大端), 这种假设就不成立了. 所以正式软件不能假设运行环境的字节序是怎样的.

user: user-10
content: 谁说网络是大端模式。 网络不管模式，它是按字节流传输。多字节组合时才有大端小端的问题。

user: user-11
content: 除了网络协议需要的数据（比如端口），用户数据不用转换。
user-0 提问: 单词博弈-这个代码哪里有问题？

回复:
user: user-1
content: “我在VS2012上跑了，都没有问题，似乎没有超过3秒。”  楼主确定自己计算的时间没错？

user: user-0
content: 谁回复一下，给分结贴了。免得浪费。

user: user-0
content: 自己顶上，想搞清楚这个问题。
user-0 提问: 一句难以理解的语句

回复:
user: user-1
content: 前面一句的理解是：任意类型的指针都可以赋给void类型的指针。 后面一句的理解是：通过该指针来操作的数据都是操作数据本身，而不是数据的副本。  回答完毕。。

user: user-2
content: 你想要用内存里面一段数据会怎么做 1. 把那段数据的全部内容拷贝过来再使用 2. 把那段数据的指针，也就是地址的值拷贝过来，使用的时候去访问这个值
user-0 提问: ++和+1的问题

回复:
user: user-1
content: 后++保持表达式的值不变，所以条件不满足进入else事件中；+1表达式则会进1； 打印一下值，一目了然。 如果你的代码是完全正确的话，那么这个++是鸡肋(多余的)；至于书上是+1可能考虑到字符串尾端'\0'，请检查你的程序是否完全正确个人觉得起初定义时候char  str[][40]中应该是41比较符合书上中要表达的意思。  /*在这里打印一下下面if里的判断就一目了然*/ printf("sizeof(str[0])=%d,c1=%d,c2=%d\n",sizeof(str[0]), 	   count[0],count[1]);//40，18，22 //-->可以得出count[0]=strlen(str[0]),count[1]=strlen(str[1]);得到的是字符串的长度。 if(sizeof str[0]<count[0]+count[1]) printf("\nYou can't put a quart into a pint pot."); else { 	count[1]=0; 	while((str[0][count[0]++] = str[1][count[1]++])); 	 	printf("\n%s\n", str[0]); }

user: user-2
content: if (sizeof str[0]<count[0]+count[1]+1) 相当于 int temp = count[0]+count[1]+1; if (sizeof str[0] < temp) ----------------------------------------------- if (sizeof str[0]<count[0]+count[1]++) 相当于 int temp = count[0]+count[1]; count[1] = count[1] + 1; if (sizeof str[0] < temp)
user-0 提问: 一个自己真的完全都写不来的程序，求各位帮个忙

回复:
user: user-1
content: 先写好 kmp 然后输入小说文件名 然后输入词汇集合，排个序（字典序）？ 然后，内部先匹配一下？？ 然后开始匹配。
user-0 提问: 关于TCP长连接

回复:
user: user-1
content: 定时发送心跳包，收不到回应重连。

user: user-2
content: 做应用层心跳。

user: user-3
content: 引用 6 楼 max_min_ 的回复:心跳，保活！ +断线重连 这么多人要建立常连接？

user: user-4
content: 心跳，保活！

user: user-5
content: 但是也还会有意外断开的时候，然后再建立自动重连的机制。这是对长连接的很好的补充。

user: user-6
content: 保持或保活的意思不就是发现断开马上重连吗？

user: user-7
content: 不马上断就进入长连接

user: user-8
content: 不就那几步，楼上说的就很对，保持双方都在线就ok！

user: user-6
content: 引用 1 楼 user-9 的回复:客户端与服务端，心跳保持啊。 没啥可补充的了。

user: user-9
content: 客户端与服务端，心跳保持啊。
user-0 提问: 可变参数列表

回复:
user: user-1
content: 引用 8 楼 u012909623 的回复:[quote=引用 7 楼 bijiaoben 的回复:] *sarrayp++=va_arg(var_arg,int);//KEY problem 这个是先加再赋值还是先赋值再加？ 简单点说，先赋值再加 并且我也单独测试过分开赋值与加，结果一样的[/quote] 先赋值再加的话，你在gdb里看到的应该是未赋值的地址空间

user: user-0
content: 此题已解决了

user: user-0
content: 引用 7 楼 bijiaoben 的回复:*sarrayp++=va_arg(var_arg,int);//KEY problem 这个是先加再赋值还是先赋值再加？ 简单点说，先赋值再加 并且我也单独测试过分开赋值与加，结果一样的

user: user-1
content: *sarrayp++=va_arg(var_arg,int);//KEY problem 这个是先加再赋值还是先赋值再加？

user: user-0
content: 因为我的代码有一部分内容不相干，所以我注释掉了，代码如下： 1.c #include "1.h" int array_offset(int arrayinfo[],...) { 	int loc; 	int low[10]; 	int high[10]; 	int sarray[10]; 	int *lowp=low; 	int *highp=high; 	int *sarrayp=sarray; 	int *arrayinfop=&arrayinfo[1]; 	 	va_list(var_arg); 	va_start(var_arg,arrayinfo); /* 	int dimension=arrayinfo[0]; 	if(dimension<1||dimension>10) 		return -1;  	while(dimension-->0) 	{ 		*lowp=*arrayinfop++; 		*highp=*arrayinfop++; 		if(*lowp>*highp) 			return -1; 		lowp++; 		highp++; 	} */	  	for(dimension=1;dimension<=arrayinfo[0];dimension++) 		*sarrayp++=va_arg(var_arg,int);//KEY problem 	va_end(var_arg);  	lowp=low; 	highp=high; 	sarrayp=sarray;  	//compute the consult; 	loc=*sarrayp++-*lowp++; 	if(arrayinfo[0]==1) 		return loc; 	for(dimension=2;dimension<=arrayinfo[0];dimension++) 	{ 		loc*=*highp++-*lowp+++1; 		loc+=*sarrayp-*lowp++; 	} 	return loc; } main.c #include "1.h" int main(void) { 	int arrayinfo[]={3,4,6,1,5,-3,3}; 	printf("%d\n",array_offset(arrayinfo,4,1,-3)); 	return 0; } 1.h #include <stdarg.h> int array_offset(int arrayinfo[],...);

user: user-2
content: 请帖代码，不要只帖截图。

user: user-1
content: 你看一下你的sarray数组里面的值呢。

user: user-3
content: 引用 2 楼 user-4 的回复:#include <stdarg.h> #include <stdio.h> void foo(int argc,...) {     va_list vl;     va_start(vl,argc);     int* array = va_arg(vl,int*);     while(argc-- > 0)     {      *array++ = va_arg(vl,int);     }      va_end(vl);     }  int main() {   int array[] = {0,1,2,3,4,5},i;   foo(2, array, 10,9);   for(i = 0; i < 6; ++i)   {     printf("%d\n", array[i]);   }   return 0; }  参考一下。++

user: user-4
content: #include <stdarg.h> #include <stdio.h> void foo(int argc,...) {     va_list vl;     va_start(vl,argc);     int* array = va_arg(vl,int*);     while(argc-- > 0)     {      *array++ = va_arg(vl,int);     }      va_end(vl);     }  int main() {   int array[] = {0,1,2,3,4,5},i;   foo(2, array, 10,9);   for(i = 0; i < 6; ++i)   {     printf("%d\n", array[i]);   }   return 0; }  参考一下。

user: user-0
content: 哟哟来人色    。
user-0 提问: 新手问题

回复:
user: user-1
content: char a[100];//a[0..99]里面有内存中原来的不确定值。

user: user-2
content: 你的字符数组没有初始化，里面可能存有任何值的，而你从尾部开始查找非结束符，可能找到的并不是你输入的字符串的结尾。

user: user-3
content: char a[100];没有人为初始化， 对于栈上的变量一般是随机值， 全局的会用0初始化其内存， 最常见的就是访问违例和结果和预料的不一样， 所以要养成良好的编码习惯。
user-0 提问: 数据如何从内存中取出

回复:
user: user-1
content: 如果字节序（写入的字节序和主机字节序)没有发生变化则不用考虑。

user: user-1
content: 看看ntohs, ntohl, htons, htonl等怎么实现的。 提示:网络字节序是大端的。

user: user-2
content: 大端小端是针对数据存放的位置, 在内存或者在磁盘等中. 比如有一个数据: DWORD val = 0xF1F2F3F4; 如果是小端: BYTE *pVal = (BYTE*)&val; pVal[0] == 0xF4 pVal[1] == 0xF3 pVal[2] == 0xF2 pVal[3] == 0xF1 大端就与之相反.  所以读取数据就没有你所说的问题, 大端, 按字节顺序访问,就先得到数据的高位, 如果小端就先得到数据的低位.

user: user-3
content: 跨字节的数据结构需要考虑这个问题

user: user-4
content: 参考http://blog.csdn.net/ce123_zhouwei/article/details/6971544  引用 楼主 mousestuman 的回复:我们知道大端是将数据的低位放入高字节内存中，小端与之相反，那么取数据时是先取低字节内存中的值，还是先取高字节呢？还有取出后高低字节的数据如何组织呢？事实上不同的取法也会导致不同的数据
user-0 提问: 【紧急求解】试写简易c语言网络答题软件时遇到的问题

回复:
user: user-0
content: 已经解决。谢谢

user: user-0
content: 在我之后尝试进行除错时将exit（0）都变成注解。得到结果如图，请问是怎么样的问题导致这样的结果，并且应当如何解决

user: user-1
content: if((select(10,&readfd,NULL,NULL,&tv))<=0) { printf("Select Error：%d\n",GetLastError()); exit(0);  } 错误打印出来看看
user-0 提问: fgets()参数问题。

回复:
user: user-1
content: 安全无公害。

user: user-2
content: 是没有必要，但是那样写也没有错。  引用 楼主 hyp41226 的回复://lianxi9.c 从l开始，根据加入列表的顺序为每个单词编号。当再次运行程序时，确保新的单词编号接着前面的编号开始。 #include <stdio.h> #include <stdlib.h> #define MAX 40 int main(void) {     FILE *fp; 	char words[MAX]; 	int count = 0; 	 	if((fp = fopen("worddy","a+")) == NULL) 	{ 	    fprintf(stderr,"Can't open \"worddy\" file.\n"); 		exit(EXIT_FAILURE); 	} 	rewind(fp); 	while(fgets(words,MAX-1,fp) != NULL)count++;             //这里没看懂，第二个参数有必要-1吗？fgets不是读取MAX-1个字符吗？然后在第MAX个字符加'\0' 	 	puts("Enter words to add to the file: press the Enter"); 	puts("key at the beginning of a line to terminate."); 	while(gets(words) != NULL && words[0] != '\0') 	    fprintf(fp,"%d:%s\n",count++,words);  	puts("File contents: "); 	rewind(fp); 	while(fscanf(fp,"%s",words) == 1) 	    puts(words); 	if(fclose(fp)!=0) 	    fprintf(stderr,"Errorclosing file\n"); 	return 0; }