Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求大神帮忙看看这个编程应该怎么编写 求指点

回复:
user: user-1
content: 你应该先想好一个小的框架来写这个代码，而不是一个while（1）。 再小的代码都需要设计。

user: user-0
content: #include"stdio.h"  int main() { int q,m,i,a,b,c,x,y,run1;  	while(run1) 	printf("请选择您所需要的商品类型序号：\n"); 	printf("1:日用品 2:零食类 3:饮品类\n");	 	scanf("%d,&q"); 	m=q; 	switch(m) 	printf("*******************************\n");  	printf("1:毛巾(20元/张) 2:牙刷(10元/支) 3:牙膏(15/支)\n");   	printf("*******************************\n");  	printf("从1~3中选择按键：\n");  	scanf("%d", &i);  	switch(i)  		{  			case 1:  			{ 				printf("你选择了毛巾，请输入您选择的商品数量\n"); 				scanf("%d", &a);  				x=20*a; 				printf("您所购买的商品总价为：%d\n",x); 				break;  				case 2:  				printf("你选择了牙刷，请输入您选择的商品数量\n"); 				scanf("%d", &b);  				x=10*b; 				printf("n您所购买的商品总价为：%d\n",x);  				break;  				case 3:  				printf("你选择了牙膏，请输入您选择的商品数量\n");  				scanf("%d", &c);  				x=15*c; 				printf("您所购买的商品总价为：%d\n",x); 				break;  				default: printf("选择错误\n"); 				break;  				case '0':   				{ 				 					{ 					run1=0; 					} 				}break; 						  			} 		}   	 	printf("继续购买请按 1 退出请按 2 \n",y); 	if (y==1)	 	return m; 	else 	scanf ("谢谢光临 \n"); 	 }
user-0 提问: 16行代码莫名奇妙多了输出

回复:
user: user-1
content: #include<stdio.h> int main() {     int n,i;     double x;     char sex;      scanf("%d",&n);     getchar();     for(i=0;i<n;i++)     {         scanf("%c %lf",&sex,&x);         if(sex=='M') 		{ 			printf("%.2lf\n",x/1.06); 		} 		else { 			printf("%.2lf\n",x*1.06); 		}     }     return 0; }
user-0 提问: GNU11无法给结构体整体赋值，编译语法出错

回复:
user: user-1
content: 引用 2 楼 wang0635 的回复:A structA =(A) {1,2,3,4};  不错，这个正解！

user: user-1
content: 不错，这个正解！

user: user-2
content: A structA =(A) {1,2,3,4};

user: user-3
content: 百度搜相关关键字。
user-0 提问: 希望大神能用建立一个线程的方法解决我这个问题

回复:
user: user-1
content: 楼主, 新线程里面是无法接收标准输入的, cin 或 scanf只能在main函数所在的主线程里面使用

user: user-2
content: 瞧人家1楼就没问什么平台。

user: user-0
content: 引用 2 楼 kacyquan的回复:什么平台，windows的还是linux的。 windows的，谢谢了！

user: user-3
content: 什么平台，windows的还是linux的。

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h>     #include <process.h>     #define  MYVOID             void #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf     #define  MYVOID             void * #endif int a=0; int No_Loop=0; void sleep_ms(int ms) { #ifdef WIN32     Sleep(ms); #else     usleep(ms*1000); #endif } MYVOID testThread(void *pcn) {     int n,i;      n=(int)pcn;     i=0;     while (1) {         scanf("%d",&a);         i++;         if (i>=5) {No_Loop=1;break;}     } } int main() {     int i; #ifndef WIN32     pthread_t threads[1];     int threadsN;     int rc; #endif #ifdef WIN32     _beginthread((void(__cdecl *)(void *))testThread,0,(void *)1); #else     threadsN=0;     rc=pthread_create(&(threads[threadsN++]),NULL,testThread,(void *)1); #endif     i=0;     while (1) {         sleep_ms(1000);         printf("a=%d\n",a);         if (No_Loop==1) break;//     }     return 0; } //a=0 //a=0 //a=0 //a=0 //1 //a=1 //a=1 //a=1 //2 //a=2 //a=2 //a=2 //3a=2 // //a=3 //a=3 //a=3 //4 //a=4 //a=4 //a=4 //a=4 //5 //a=5 //
user-0 提问: 初始化结构体成员时定义为全局变量报错，定义为局部两边是正常

回复:
user: user-0
content: 谢谢各位的答复！马上给分；）

user: user-1
content: p.sem_num=0; p.sem_op=-1; p.sem_flg=0;   v.sem_num=0; v.sem_op=1; v.sem_flg=0;  这样的语句要写去函数内，不能在全局范围，你可以放在主函数里的开头位置  或者定义全局结构体对象的时候，用大括号初始里面的成员

user: user-2
content: “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

user: user-3
content: 可以给全局变量初始化，定义时后跟等号，等号后面是初始化的值。 其他的等号就是赋值了，是赋值运算，函数外是不允许的。

user: user-0
content: 好像找到答案了，但还是不太理解。 http://bbs.bccn.net/thread-343840-1-1.html
user-0 提问: 写的代码通不过oj，望大佬帮忙看下问题出在哪

回复:
user: user-1
content: 找到第三个删除第二个，然后迭代。

user: user-1
content: void do_it (char* str) { 	char* ptmp = NULL; 	char* ptmpNext = NULL;  	ptmp = strstr(str, "*"); 	if (!ptmp) 		return;  	ptmp = strstr(ptmp + 1, "*"); 	while (ptmp) { 		ptmpNext = strstr(ptmp+1, "*"); 		if (ptmpNext){ 			for (int i = 0; i <= strlen(ptmp+1); i++) { 				*(ptmp + i) = *(ptmp + (i + 1)); 			} 			ptmp = ptmpNext -1; 		} else { 			 ptmp = NULL; 		} 	} }

user: user-2
content: a*a 字数补丁

user: user-3
content: 边界条件 输入输出格式 ……

user: user-4
content: 1.确定下输入的字符串有多长char c[80];这个长度能不能存储题目要求的最长字符串 2.看下题目要求处理几组输入数据，你这只处理了一组输入数据，一般Oj都会要求处理多组输入数据
user-0 提问: 将if-else语句转为 ? : 三目条件表达式

回复:
user: user-1
content: 奇技淫巧！

user: user-2
content: 引用 18 楼 baijiaheizhiganmao 的回复:[quote=引用 17 楼 zenny_chen 的回复:] [quote=引用 16 楼 lgbxyz 的回复:] 你来试试用一条 return 语句？ void 函数 return 个毛线啊[/quote]  你不会写就别BB～[/quote] 代码始终还是要给人看的.过度优化未必就是"好"的代码[/quote] 楼上那句"你不会写就别BB～"不是写的,csdb的bug

user: user-2
content: 引用 17 楼 zenny_chen 的回复:[quote=引用 16 楼 lgbxyz 的回复:] 你来试试用一条 return 语句？ void 函数 return 个毛线啊[/quote]  你不会写就别BB～[/quote] 代码始终还是要给人看的.过度优化未必就是"好"的代码

user: user-1
content: 脑筋操

user: user-3
content: 这种代码对工作有意义吗？

user: user-4
content: return  不是不行  但挺无聊的 return (void)printf(a>0?"Above zero! a + 1 = %d\n":"Below zero! a - 1 = -%d\n", abs(a)+1);

user: user-0
content: 引用 16 楼 lgbxyz 的回复:你来试试用一条 return 语句？ void 函数 return 个毛线啊[/quote]  你不会写就别BB～

user: user-4
content: printf(a>0?"Above zero! a + 1 = %d\n":"Below zero! a - 1 = -%d\n", abs(a)+1);

user: user-5
content: 广告贴

user: user-5
content: 引用 15 楼 zenny_chen 的回复:[quote=引用 13 楼 lgbxyz 的回复:] 广告贴  你来试试用一条 return 语句？[/quote] void 函数 return 个毛线啊

user: user-0
content: 引用 13 楼 lgbxyz 的回复:广告贴  你来试试用一条 return 语句？

user: user-6

user: user-7
content: #define PRINT(a) ((a) > 0 ? printf("Above zero! a + 1 = %d\n", (a)+1) : printf"Below zero! a - 1 = %d\n", (a)-1))  void foo (int a) { 	PRINT(a); }

user: user-7
content: #define PRINT ((a) > 0 ? printf("Above zero! a + 1 = %d\n", (a)+1) : printf"Below zero! a - 1 = %d\n", (a)-1))  void foo (int a) { 	PRINT(a); }

user: user-8
content: a > 0 ? printf("Above zero! a + 1 = %d\n", a + 1) : printf("Below zero! a - 1 = %d\n", a - 1);

user: user-9
content: qianlaicanguanxuexi

user: user-6

user: user-0
content: 楼上几位答得都不错，谁来试试用一条 return 语句？

user: user-10
content: void foo(int a) { 	a > 0 ? printf("Above zero! a + 1 = %d\n", a + 1) : printf("Below zero! a - 1 = %d\n", a - 1); }

user: user-11
content: void foo(int a) { 	a > 0 ? printf("Above zero! a + 1 = %d\n", a + 1) : printf("Below zero! a - 1 = %d\n", a - 1); }
user-0 提问: 数组赋值问题（C语言）

回复:
user: user-0
content: 引用 4 楼 starytx 的回复:仅供参考 	for (int m = 0; m != i; ++m) 	{ 		for (int n = 0; n != j; ++n) 		{ 			if (a[m][n] == 9) 			{                                 //自己在此记录m,n 				if (m > 0)		// 上 				{ 					a[m - 1][n] = 0; 				} 				if (m <i-1)		// 下 				{ 					a[m + 1][n] = 0; 				} 				if (n > 0)		// 左 				{ 					a[m][n - 1] = 0; 				} 				if (n < j-1)		// 右 				{ 					a[m][n + 1] = 0; 				} 			} 		} 	}感谢！

user: user-1
content: 首先这个位置肯定不是边界值，因为边界没有左边或右边，或者上面和下面元素；因此循环的i,j下标需要去掉边界；  for (i = 1; i < MAX_ROW - 1; i++)     for (j = 1; j < MAX_COL-1; j++) {         if (arr[i][j] == 9) {             arr[i-1][j] = 0;             arr[i][j+1] = 0;             arr[i+1][j] = 0;          }     }

user: user-2
content: 边界条件

user: user-3
content: 仅供参考 	for (int m = 0; m != i; ++m) 	{ 		for (int n = 0; n != j; ++n) 		{ 			if (a[m][n] == 9) 			{                                 //自己在此记录m,n 				if (m > 0)		// 上 				{ 					a[m - 1][n] = 0; 				} 				if (m <i-1)		// 下 				{ 					a[m + 1][n] = 0; 				} 				if (n > 0)		// 左 				{ 					a[m][n - 1] = 0; 				} 				if (n < j-1)		// 右 				{ 					a[m][n + 1] = 0; 				} 			} 		} 	}

user: user-4
content: 这个还是比较容易的，for嵌套循环，加上条件判定

user: user-5
content: 先记录9对应的所有下标，后加条件置0。防止把9置0

user: user-6
content: 双重循环，遍历中判断如果a[ i ][ j ]  == 9，设置：  a[ i-1 ][ j ] = 0; a[ i+1 ][ j ] = 0; a[ i ][ j-1 ] = 0; a[ i ][ j+1 ] = 0;  执行上述每条赋值前，先检查i-1  i+1  等会不会越界，如果越界则不执行
user-0 提问: c语言和C++混合编程的问题

回复:
user: user-1
content: 在类中加一个plulic的方法：Void SetNalArray(TNAL* pnal_array) {     m_pNalArray = pnal_array; }在外部通过类的对象或者指针调用这个方法设置就行了。

user: user-2
content: 把这个成员设置成public的，就可以直接赋值了  aaa.bbb = ccc;  //aaa是类对象，,bbb是你要设置的成员变量，ccc是要赋的值

user: user-3
content: 引用 2 楼 faihung 的回复:[quote=引用 1 楼 qq_36782456 的回复:] 使用构造函数对类成员初始化，在初始化列表时把ringbuf传给你想要初始化的变量 也就是说，我在这个派生类的构造函数定义的地方，将NULL换成ringbuf就可以了。  MyH264VideoStreamFramer::MyH264VideoStreamFramer(UsageEnvironment& env,      FramedSource* inputSource, H264EncWrapper* pH264Enc, H264DecWrapper* pH264Dec):       H264VideoStreamFramer(env, inputSource),        m_pNalArray(NULL/ringbuf), m_iCurNalNum(0), m_iCurNal(0), m_iCurFrame(0),       m_pH264Enc(pH264Enc), m_pH264Dec(pH264Dec) {  }[/quote]  嗯呢，就是这样

user: user-0
content: 引用 1 楼 qq_36782456 的回复:使用构造函数对类成员初始化，在初始化列表时把ringbuf传给你想要初始化的变量 也就是说，我在这个派生类的构造函数定义的地方，将NULL换成ringbuf就可以了。  MyH264VideoStreamFramer::MyH264VideoStreamFramer(UsageEnvironment& env,      FramedSource* inputSource, H264EncWrapper* pH264Enc, H264DecWrapper* pH264Dec):       H264VideoStreamFramer(env, inputSource),        m_pNalArray(NULL/ringbuf), m_iCurNalNum(0), m_iCurNal(0), m_iCurFrame(0),       m_pH264Enc(pH264Enc), m_pH264Dec(pH264Dec) {  }

user: user-3
content: 使用构造函数对类成员初始化，在初始化列表时把ringbuf传给你想要初始化的变量
user-0 提问: C语言实现的万年历里面的逻辑是怎么推算的,看不懂,求指教

回复:
user: user-1
content: date[1][20]; 这个是什么意思?

user: user-2
content: 年月日的轮换交替变化有一定规律，  比如month>12时，month=1； 线按照规律写一个，再把特殊的提取出来，比如2月的天数

user: user-3
content: /****************************************************************************/ /* Function Name    :    getWeekdayFromGrogoryDate                          */ /* Description      :    通过格里高利日期获取星期                               */ /*--------------------------------------------------------------------------*/ /* Parameter        :    1) year        :    年(阳历)                        */ /*                       2) month       :    月(阳历)                        */ /*                       3) day         :    日(阳历)                        */ /*--------------------------------------------------------------------------*/ /* Return            :    星期几(0~6)[0为星期天,1~6 为星期一至星期六]            */ /* Remark            :    使用 基姆拉尔森计算公式                               */ /*                        W = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1) mod 7   */ /*                        把1月和2月看成是上一年的13月和14月                     */ /****************************************************************************/ int getWeekdayFromGrogoryDate(int year, int month, int day) {     if ((1 == month) || (2 == month))     {         month += 12;    /* 13/14月 */         year -= 1;        /* 上一年 */     }          return (day + 2 * month + 3 * (month + 1)/5 + year + year/4 - year/100 + year/400 + 1) % 7; }

user: user-4
content: char WEEK[9],date[1][20];     printf("请输入日期:");     scanf("%s",date[0]); 注意，date[1]二维数组的运用都越界了，date[0]才可以。因为数组的行数是1，那么下标是从0开始，所以date[1]都是越界操作。

user: user-5
content: 四年一闰，百年不闰，四百年再闰

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

回复:
user: user-1
content: 是Windows还是Linux下得程序? Linux下会比较麻烦，Windows用_kbhit(), VC++6.0大致如下： while(1) { if(_kbhit())      {      // 有按键      ch = getchar()....      } // 其他移动程序 // 延时程序 }

user: user-1
content: kbhit是POSIX函数，在Winodows下是_kbhit。

user: user-1
content: 引用 5 楼 AngryWang 的回复:@tomsoft  这个函数在哪个头文件里？  该函数在conio.h中，VS++可用，记得要有下划线 #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <conio.h>         // <<<====!!!!!  int main() { 	while(1) 		{  		char ch = 0; 		if(_kbhit()) 			{ 			ch = getchar();                         .... 			}                 .... 		} }

user: user-2
content: 回复贴错了。。。

user: user-0
content: @tomsoft  这个函数在哪个头文件里？

user: user-2
content: 注意fread返回值！

user: user-3
content: windows下使用winapi循环判断按键按下状态，而不是使用输入动作

user: user-4
content: 得用定时器才行，如果是linux系统的话，用alarm定时发信号， 用signal指定alarm信号触发一个函数就行了
user-0 提问: 关于printf()函数运算问题

回复:
user: user-1
content: 类似这样的运算，都是有副作用的，不建议这么写，或者不要去研究了。因为a++,a--是跟编译器有关系的。

user: user-2
content: 编译器不同，结果也不通。++a, 在运算之前把a+1， a++, a先做运算，之后a+1

user: user-3
content: 未定义行为，编译器爱怎么都行  关于C,C++表达式求值顺序  http://bbs.csdn.net/topics/370153775

user: user-4
content: 这说明你的编译器先编译了第二个a++，此时a=6，然后编译了第一个a++，a= 7，最后编译了第三个a++，最后a = 8. 楼主你把按顺序一个一个输出就不会错了。

user: user-5
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775
user-0 提问: 一个小问题

回复:
user: user-0
content: 谢谢，现在明白了

user: user-1
content: for(i = 39; i == -1; --i)  i 的 初值为39，然后判断循环执行表达式是 : i == -1  显然表达式求值结果为false，所以循环体不执行。

user: user-2
content: 是不会被执行 for( i = 39; i >= 0; i--) .....
user-0 提问: 求助，关于判断文件是否读取到文件结尾

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

user: user-1
content: 语义的二义性有人还没理解。

user: user-2
content: 引用 5 楼 zhao4zhong1 的回复:不要使用 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;  //... } 类似的例子还可以举很多。   题主是要解决文件尾的问题 赵老师你这个偷换概念了啊    fgetc执行多次

user: user-0
content: 试过不可以，读完最后一组，feof还是返回零认为没到文件尾，要再读一次才行，可那样就多malloc了一块空间。。 不过我想起来之前做过的一个作业，照着改了改，程序已经过了 但现在还是有点想知道那个fseek到底肿么肥四。。

user: user-3
content: 文件本身不具有结束符标志，eof只是程序读取失败后向流里面添加的 所以，你这种方式用eof有些问题 1，你可以采取判断fread返回值于要读取的数据长度来判断

user: user-4
content: 用feof(fp1)函数就可以判断文件尾了， 赶紧改改，还可以装

user: user-0
content: 我是不是描述的不清楚啊 我的意思是如果我fread读到了最后一组数，那么我文件指针当前位置的后一位不就是结束标志嘛 那我fseek(fp1,2,SEEK_CUR)应该会出错返回非零吧(超出文件结束位置应该会非零吧?)那不就能进入if然后退出了吗 这么想有错没有呢 。。。我还说帮同学改代码呢，眼瞅着就要装逼失败了，早知道就不强行使用链表了，哭哭...
user-0 提问: error C2143: syntax error : missing ';' before 'type'

回复:
user: user-1
content: 函数声明要放在函数外，另外，程序有问题，建议将代码都贴出来。

user: user-2

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

user: user-0
content: 改之前和改之后完整代码太长上传不了

user: user-4
content: 引用 2 楼 qingmuzhe 的回复:[quote=引用 1 楼 BadCat2000的回复:]int stu_num(FILE *fq);    放在menu2外边 我也这么改过然后出现好几个警告，直接运行不了了[/quote] 函数定义必须在函数体外，C不支持函数嵌套定义。因此，您之前写法本身就是错的 另外，请确认stu_num这个函数是否被实现 如果修改后仍有警告无法运行，请贴出新的警告错误，或给出完整的程序代码

user: user-0
content: 引用 1 楼 BadCat2000的回复:int stu_num(FILE *fq);    放在menu2外边 我也这么改过然后出现好几个警告，直接运行不了了

user: user-4
content: int stu_num(FILE *fq);    放在menu2外边

user: user-4
content: 未引用变量，是警告信息，不打紧； 只是说这些变量定义后没有被引用，通常不需要改，若一定要修改，根据警告行号找相应代码就可以了。 （我没有用过VC++6.0，我通常用clang，提示信息会清楚一些，但大同小异）  如果只是这类错误，造成结果不对，请仔细检查您程序的逻辑
user-0 提问: 遇到了个从没遇到的问题

回复:
user: user-0
content: 引用 1 楼 qq_20553613 的回复:[quote=引用 楼主 tc1hen 的回复:] 操作系统（AIX 64位），一个函数完成的功能是，发送和接收XML报文，存储这个XML报文的局部变量最大长度是1024 * 96，这个函数中还定义了其他局部变量，发送之前还有值，非常疑惑的一点是，当接收到报文时，大概40000多字节，那些其他这个函数中局部变量的内容都被冲成返回的XML报文字符串的内容了，这是我从来没遇到过的，谁能帮我解释下为何会出现这种情况，每个局部变量的名字都不一样，难道地址还会冲突吗？ 这么大的内存，要从堆上分配，手动malloc一段内存呗。[/quote] 之前也是想这样做来的，但是我这次对系统架构的改造，通讯这块能不动尽量不动，至于为什么不动，你懂得

user: user-0
content: 引用 3 楼 tomsoft 的回复:Sorry，想了一下，不是堆栈溢出，刚在我系统中看了一下，我的64位系统的堆栈大小是8M，而从现象上看并不像堆栈溢出。您仍可以用ulimit -a确认一下，我相信栈大小应该足够了。通常32位系统可能会有栈的问题。如果是堆栈不够，则程序在返回时会崩溃，而非简单破坏临时变量。 因为临时变量和您定义的数组都是在堆栈中，因此，产生这个问题很显然是数组越界。结合您所说，数组大小96K，而大约读入40K个字符出错，那请您注意检查： 1）96K的数组是字节大小还是字大小。即是96KBytes还是96KWord 2）40K个字符串，请问字串是单字节的吗？如果是多字节的，如汉字或UTF等，40K就会造成读入96KBytes的字符出现数组越界的问题。 是一个宏的用法出现了问题，这个数组实际上定义的长度大小是10240，我改过之后好了，两个宏一个名字，那个发送XML报文的函数所包含的头文件里的宏定义是1024 * 96

user: user-0
content: 引用 3 楼 tomsoft 的回复:Sorry，想了一下，不是堆栈溢出，刚在我系统中看了一下，我的64位系统的堆栈大小是8M，而从现象上看并不像堆栈溢出。您仍可以用ulimit -a确认一下，我相信栈大小应该足够了。通常32位系统可能会有栈的问题。如果是堆栈不够，则程序在返回时会崩溃，而非简单破坏临时变量。 因为临时变量和您定义的数组都是在堆栈中，因此，产生这个问题很显然是数组越界。结合您所说，数组大小96K，而大约读入40K个字符出错，那请您注意检查： 1）96K的数组是字节大小还是字大小。即是96KBytes还是96KWord 2）40K个字符串，请问字串是单字节的吗？如果是多字节的，如汉字或UTF等，40K就会造成读入96KBytes的字符出现数组越界的问题。 谢了兄弟问题找到了，就是数组越界了，把这个函数栈里的内容都覆盖了，

user: user-1
content: 学会使用数据断点：#include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-2
content: Sorry，想了一下，不是堆栈溢出，刚在我系统中看了一下，我的64位系统的堆栈大小是8M，而从现象上看并不像堆栈溢出。您仍可以用ulimit -a确认一下，我相信栈大小应该足够了。通常32位系统可能会有栈的问题。如果是堆栈不够，则程序在返回时会崩溃，而非简单破坏临时变量。 因为临时变量和您定义的数组都是在堆栈中，因此，产生这个问题很显然是数组越界。结合您所说，数组大小96K，而大约读入40K个字符出错，那请您注意检查： 1）96K的数组是字节大小还是字大小。即是96KBytes还是96KWord 2）40K个字符串，请问字串是单字节的吗？如果是多字节的，如汉字或UTF等，40K就会造成读入96KBytes的字符出现数组越界的问题。

user: user-2
content: AIX的堆栈限制是32768，即实际在差不多这个数值后（比这个值略小），就会破坏堆栈 可以使用ulimit -a看以下您堆栈的设置 试一下ulimit -s unlimited

user: user-3
content: 引用 楼主 tc1hen 的回复:操作系统（AIX 64位），一个函数完成的功能是，发送和接收XML报文，存储这个XML报文的局部变量最大长度是1024 * 96，这个函数中还定义了其他局部变量，发送之前还有值，非常疑惑的一点是，当接收到报文时，大概40000多字节，那些其他这个函数中局部变量的内容都被冲成返回的XML报文字符串的内容了，这是我从来没遇到过的，谁能帮我解释下为何会出现这种情况，每个局部变量的名字都不一样，难道地址还会冲突吗？ 这么大的内存，要从堆上分配，手动malloc一段内存呗。
user-0 提问: 关于数组求解

回复:
user: user-0
content: 谢谢上面的两位

user: user-1
content: #include <stdio.h> #include <ctype.h>  #define MAX_STR_LEN     32  int get_digit(char (*digit)[4], char *str);  int main(void) {     char str[MAX_STR_LEN];     char digit[MAX_STR_LEN/3+1][4] = { { 0 } };     int i, cnt;          fgets(str, MAX_STR_LEN, stdin);               cnt = get_digit(digit, str);     printf("total digit number: %d\n", cnt);     for (i = 0; i < cnt; i++)         puts(digit[i]);     return 0; }  int get_digit(char (*digit)[4], char *str) {     int cnt = 0, idx = 0, i = 0;          puts(str);     while (str[i]) {         if (isdigit(str[i])) {             digit[cnt][idx] = str[i];             idx++;             if (idx == 3) {                 digit[cnt][idx] = 0;                 idx = 0;                 cnt++;             }         }         i++;     }     return cnt; } 作为一个参考吧

user: user-2
content: 这题不难，分三个思路： 第一：提取数字 第二：将提取的数据分组 第三：输出 我有一个系列专栏，里面的上string里面涉及了很多这类的问题，我网址发你http://blog.csdn.net/redrnt/article/details/72761861 你这个问题我刚刚写完了 代码发你： #include <iostream> #include <string> #include <cctype> using namespace std; /*函数原型*/  string selectNumbers(string str); int main(){ 	string str,line; 	int j = 0; 	getline(cin,str); 	line = selectNumbers(str); 	const int LENGTH = line.length(); 	/*下面把line存进数组中，然后用substr方法截取长度为3的字符串 	 *然后存进数组a[j]中，每次循环，数组的下标加1*/  	string a[LENGTH]; 	for(int i = 0; i < LENGTH; i += 3){ 		a[j] = line.substr(i, i + 3); 		cout << a[j] << endl; 		j++; 	} 	cout << "共有" << j << "个这样的数";  	 } /*  *函数： selectNumbers  *用法： string line = selectNumbers(str);  *--------------------------------------  *作用: 提取字符串中的数字，并返回新的由数字组成的字符串  */  string selectNumbers(string str){ 	string line = ""; 	for(int i = 0; i < str.length(); i++){ 		if(isdigit(str[i])){ 			line += str[i]; 		} 	} 	return line; } 测试结果：
user-0 提问: 请问 k&r 定义的函数格式，有工具能自动转换为ansi 的吗？

回复:
user: user-1
content: 如果这样子的很多而且很乱，可以自己写个小程序专门处理这个

user: user-2
content: 如果这样的函数定义格式不多，建议手动改吧，暂没听说过有这样的软件。
user-0 提问: 数据结构链表出错，链表无限输出数据，求大神

回复:
user: user-1
content: InitList函数里面的  (*ll)->data = NULL; 改成  (*ll)->next = NULL;

user: user-2
content: void InitList(LinkList *ll,int n){     int i;     *ll = (LinkList)malloc(sizeof(LinkList));     (*ll)->data = 0;   /* 若将NULL赋值给data，我想编译器应该会提示警告吧 */     (*ll)->next = NULL;    /*我想你是初始化next的，但是却初始化了data */     for(i=1;i<10;i++){         LinkList p=(LinkList)malloc(sizeof(LinkList));         p->data = n*i;         p->next = (*ll)->next;         (*ll)->next = p;     }     LinkList p=(*ll)->next;     while(p){          printf("p: %d ,",p->data);         p=p->next;     }     printf("\n"); } 注意即使是编译程序时提示警告，也尽可能的去掉警告
user-0 提问: 变参函数加打印

回复:
user: user-1
content: http://www.cnblogs.com/caosiyang/archive/2012/08/21/2648870.html

user: user-2
content: #define printf_func(a, ...)  (printf("the first parameter is %d\n",a), func(a, ##__VA_ARGS__))

user: user-3
content: 试试  int printf_func(int a, ...) {     va_list args;     va_start(args, a);     func(a, args);     va_end(args); }

user: user-4
content: Calls with a Variable Number of Arguments A partial parameter list can be terminated by the ellipsis notation, a comma followed by three periods (, ...), to indicate that there may be more arguments passed to the function, but no more information is given about them. Type checking is not performed on such arguments. At least one parameter must precede the ellipsis notation and the ellipsis notation must be the last token in the parameter list. Without the ellipsis notation, the behavior of a function is undefined if it receives parameters in addition to those declared in the parameter list.   To call a function with a variable number of arguments, simply specify any number of arguments in the function call. An example is the printf function from the C run-time library. The function call must include one argument for each type name declared in the parameter list or the list of argument types.   All the arguments specified in the function call are placed on the stack unless the __fastcall calling convention is specified. The number of parameters declared for the function determines how many of the arguments are taken from the stack and assigned to the parameters. You are responsible for retrieving any additional arguments from the stack and for determining how many arguments are present. The STDARGS.H file contains ANSI-style macros for accessing arguments of functions which take a variable number of arguments. Also, the XENIX®- style macros in VARARGS.H are still supported.  This sample declaration is for a function that calls a variable number of arguments:    int average( int first, ...);  Microsoft Specific —>  To maintain compatibility with previous versions of Microsoft C, a Microsoft extension to the ANSI C standard allows a comma without trailing periods (,) at the end of the list of parameters to indicate a variable number of arguments. However, it is recommended that code be changed to incorporate the ellipsis notation.  END Microsoft Specific
user-0 提问: C语言创建链表问题

回复:
user: user-1
content: 你要在函数中修改指针本身，那你需要传入一个二级指针

user: user-1
content: 你的CreateList参数是按值传递的  函数中的headList只是一个复制品  LNode *headNode = new LNode; headList = headNode;  上面语句及之后的语句只是对一个复制品进行修改  主函数中的指针当然不会有变化

user: user-2
content: #include"Student.h" #include<iostream> using namespace std;  void CreateList(LNode **headList) {     //LNode *headList;     LNode *headNode=new LNode;     *headList=headNode;     LNode *stu1=new LNode;     LNode *nodeTemp=NULL;  //定义临时变量     stu1->ptrNext=NULL;     headNode->ptrNext=stu1;     cout<<"Please input Student Information (If finish,please input 0 on Student Number )"<<endl;     cout<<"Input form: Number Name birthYear birthMonth birthday gender(Male or Female)  "<<endl;     cin>>stu1->stuInfomation.nNumber;      //输入第一个学号     int ntmpNumber=stu1->stuInfomation.nNumber;     while(ntmpNumber!=0)     {         cin>>stu1->stuInfomation.strName;         cin>>stu1->stuInfomation.birthDate.nYear>>stu1->stuInfomation.birthDate.nMonth>>stu1->stuInfomation.birthDate.nDay;         cin>>stu1->stuInfomation.strGender;         nodeTemp=stu1;         stu1=new LNode;         nodeTemp->ptrNext=stu1;         cin>>stu1->stuInfomation.nNumber;         ntmpNumber=stu1->stuInfomation.nNumber;     }     delete stu1; //当用户输入0结束后,stu1没有任何信息，应先释放;     nodeTemp->ptrNext=NULL; //由于释放了stu1，所以nodeTemp是最后一个结点，给next指针赋NULL;  }  int main() {     LNode *L = NULL; //记得delete     CreateList(&L);     cout<<"Why"<<endl;     L=L->ptrNext;     cout<<L->stuInfomation.nNumber<<endl;     L=L->ptrNext;     cout<<L->stuInfomation.nNumber<<endl;     cin.get();     cin.get();     return 0;  } 试试传递二重指针，另外，main函数里的L指向NULL； 若函数在调用函数之前，就不用再声明了。

user: user-3
content: 你在函数外面new了一个，到里面又new一个，你要么直接把外面new的那个当成头结点不存数据，把数据都挂在这个头结点的后面，要么就传指针的引用进去，全部在函数内部加数据。
user-0 提问: 按值插入有序单链表，使之依旧有序

回复:
user: user-1
content: while(s->next->data<m) s=s->next; //这里s->next可能为空，s->next->data这样访问会崩溃的 s->next && s->next->data < m;//应该改成这样

user: user-2
content: #include <stdio.h> #include<malloc.h>   typedef struct Node {     int data;     struct Node *next; }Node,*LinkList;  void InsertList(LinkList *L,int m) {     Node *t,*s;     s = *L;       while (s->next && s->next->data < m) {         s = s->next;     }      //while(s->next->data < m)     //    s = s->next;     t = (Node *)malloc(sizeof(Node));     t->data = m;     t->next = s->next;     s->next = t; } void Print(LinkList L) {     Node *p;     p = L->next;     while(p->next)     {         printf("%d ",p->data);         p = p->next;     }     printf("%d\n", p->data); } int main() {     LinkList L;     int i,a,m,n;     Node *last,*p;     L=(LinkList)malloc(sizeof(Node));     L->data = 0;     L->next = NULL;     last = L;     //输入个数和待插入数     scanf("%d%d", &n, &m);     //输入序列     for(i=0;i<n;i++)     {         scanf("%d",&a);         p=(Node*)malloc(sizeof(Node));         p->data=a;         p->next=NULL;         last->next=p;         last=p;     }     InsertList(&L,m);     Print(L);      return 0; }   while (s->next && s->next->data < m) {         s = s->next;     } //对比一下     //while(s->next->data < m)     //    s = s->next; 若不判断s->next是否为NULL，那么s->next->data < m就可能导致段错误。因为s->next可能为NULL

user: user-3
content: 这个程序不是可以实现么？
user-0 提问: 为什么下面这个数据结构里把结构体声明为Node，结构体中的指针域也是一个Node

回复:
user: user-1
content: 你完全可以声明为 void * 每次再转一遍，只要你不嫌麻烦。

user: user-2
content: 引用 3 楼 sleep_s 的回复:链表是有数据和指向下一个地址的指针组成的。无论结构体里多少个数据，必须要有一个地址指针 那为什么这个地址指针是用他本身声明的呢？→因为链表的节点都是同一种类型。

user: user-2
content: 链表啊。Node类型指针next指向下一个节点，如此类推，形成链式结构

user: user-3
content: 建议看一下链表的相关知识，看别人如何写链表的。

user: user-4
content: 引用 4 楼 u011342403 的回复:[quote=引用 3 楼 sleep_s 的回复:] 链表是有数据和指向下一个地址的指针组成的。无论结构体里多少个数据，必须要有一个地址指针 那为什么这个地址指针是用他本身声明的呢？[/quote] 因为用本身结构体声明后，这个指针指向的地址也是一个具有数据和指针的结构体（也就是是本身结构体里面的内容）

user: user-0
content: 引用 3 楼 sleep_s 的回复:链表是有数据和指向下一个地址的指针组成的。无论结构体里多少个数据，必须要有一个地址指针 那为什么这个地址指针是用他本身声明的呢？

user: user-4
content: 链表是有数据和指向下一个地址的指针组成的。无论结构体里多少个数据，必须要有一个地址指针

user: user-5
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-6
content: int  *p = malloc(10); 分配了10个int的空间，没有说是10个char空间。 同样链表中一个节点可以看着|--data--|--next--|，这是一个空间，而next是一个point，是指向下一个节点的指针，下一个节点是什么， 是一个struct node结构体，所以这个node也要是对应的类型。

user: user-7
content: 有什么问题吗  结构体中是一个Node*的指针，可以指向下一个对象，这样可以形成一个链

user: user-0
content: 引用 1 楼 user-8 的回复:首先指针本身的大小是固定的，不是4字节就是8字节（编译器选x86就是4字节，选x64就是8字节），其次结构体本身中存放一个本身数据类型的指针，其目的显而易见，就是形成链表，可方便顺序访问查找。 为什么存放一个本身数据类型的指针就是为了形成链表，有什么原因吗。能详细说一下吗？

user: user-8
content: 首先指针本身的大小是固定的，不是4字节就是8字节（编译器选x86就是4字节，选x64就是8字节），其次结构体本身中存放一个本身数据类型的指针，其目的显而易见，就是形成链表，可方便顺序访问查找。
user-0 提问: 请教printf缓冲区。

回复:
user: user-1
content: 你说的这种情况只是指逗留在缓冲区的数据  它不保证数据能立即输出，也不能保证全部的数据都能立即输出。 但是到遇到那几种情况下，缓冲区会被清空  C追求性能，所以输出时机由更系统自由地控制，遇到某些情形之下才进行干涉。 类似于医院的门诊和急症？

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

user: user-3
content: 只是说 当缓冲区满、遇到换行字符或需要输入的时候 会清空缓冲区  但没说其他时候一定不会清空  编译器和系统可以进行优化  控制台的输出一般都会直接看得到，但对文件的输出可能就不会立即写入了，可能就会等到缓冲区满才写入

user: user-4
content: 该程序只是打印test就执行结束了。既然程序执行结束了，那么系统就要回收它占用的内存。回收的过程中，将停留在内存的数据刷到文件中（标准输出也是文件），将输出缓冲区里的数据也一并清除，所以它肯定会输出的。

user: user-5
content: int main(void) {     printf("test");     sleep(5); } 这样要等5秒后才能看到test，5秒之前test一直是在系统的buffer里的，之于你的问题，这些都是由操作系统帮你处理的。因为return 0，这时你的main程序都结束了，这时操作系统自然会对Main程序占用的buffer要做flush处理。具体的可以看看linux系统编程相关的书。
user-0 提问: 在创建管道应用时，strcat函数时灵时不灵，大多数会报错？

回复:
user: user-0
content: 好像不是这个原因，我刚改了result字符串的长度就行了，好像是result字符串长度不够，无法全部接受str的字符，导致溢出

user: user-1
content: strcat 的两个参数都要求是以\0结尾的字符串，你的第二个参数不一定满足  http://en.cppreference.com/w/c/string/byte/strcat
user-0 提问: 关于 c  头文件枚举使用的问题

回复:
user: user-1
content: 要编译得有一个完整的程序，你可以添加将你的头文件添加到工程，并写一个main函数，函数中可以什么都不写，如果你前面的定义没问题的话是可以通过编译的，有问题的话就会提示错误

user: user-2
content: 只有实际编译一下，才会知道。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-3
content: // main.c int main() {     acctngInterfaceEntry_PARAM_S aps = { true };     return 0; }

user: user-4
content: 做好的方法就是写个简单的小程序，然后通过输出测试一下；如下：  #include <stdio.h>  typedef enum {     true = 1,     false = 2 }TRUEORFALSE_E;  typedef struct acctngInterfaceEntry_Table_PARAM {     TRUEORFALSE_E  acctngInterfaceEnable; }acctngInterfaceEntry_PARAM_S;   int main(void) {     acctngInterfaceEntry_PARAM_S param;      param.acctngInterfaceEnable = true;      printf("param = %d\n", param.acctngInterfaceEnable);      return 0; }  另外，TRUEORFALSE_E是枚举类型的变量，不是类型。如果想做为类型，需要typedef一下： typedef enum  flag {     true = 1,     false = 2 }TRUEORFALSE_E;
user-0 提问: 一道线性表的oj题编译出错

回复:
user: user-1
content: 应该是oj上的编译选项较高，也就是更为严格。普通编译器，void *转其他指针类型是不需要强转的。这也是为什么你用VC++可以编译通过的原因； l = (struct sheet *)malloc(sizeof(struct sheet)); 还有： p = (struct sheet *)malloc(sizeof(struct sheet)); 这个地方是错误的，应去掉前面的& scanf("%s", choice); 数组名本身就是数组的首地址，可以看成指针常量。

user: user-2
content: 兄弟，行号不都给你了吗，13行和29行，malloc函数返回的是void*，你要显式地转成sheet*才行，有的编译器是会报这种错的。
user-0 提问: 编译原理-讨论

回复:
user: user-1
content: 无源码，无技术含量。

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:[quote=引用 6 楼 jiftlixu 的回复:] 因为开发的是脚本解释器，代码需要解释执行的。 参考Lua源代码？[/quote]  太无语了,这些代码都在研究... 只是探讨下理论,能不能回答问题有点技术含量.

user: user-2
content: 计算表达式本身也是等价变换。常数折叠是一种常见的提早发生的表达式求值。 没什么应该不应该，就看语言是怎么设计的，需求是怎么样的。

user: user-1
content: 引用 6 楼 jiftlixu 的回复:因为开发的是脚本解释器，代码需要解释执行的。 参考Lua源代码？

user: user-0
content: 因为开发的是脚本解释器，代码需要解释执行的。

user: user-3
content: 语义分析时太早了  词法分析 语义分析 词义分析与中间代码产生 优化 目标代码生成   在优化阶段再对表达式求值  http://blog.csdn.net/alextan_/article/details/51246794

user: user-1
content: 参考Tiny C Compiler源代码。

user: user-4
content: 一般简单的就求，  复杂点的还是到代码生成， 编译优化的时候求。

user: user-5
content: 编译的时候，宏定义会被替换（但是仅是等价替换），也不会计算表达式的值。

user: user-5
content: 编译阶段是不会对表达式求值的，因为计算（表达式）是需要在内存里，运行阶段才会做的事情。
user-0 提问: 数据结构的实现里，SqList L和SqList *L有什么区别

回复:
user: user-1
content: 第一种参数是传结构体变量，但是SeqlistInsert之后，不能将新的插入数据带回（或者说是更新）； 第二种参数是传结构体指针，调用SeqlistInsert之后，能将新的插入带回调用函数；因为它传递的是地址，在SeqlistInsert函数里对L的操作就是对调用函数里L的操作。  引用 7 楼 u011342403 的回复:[quote=引用 6 楼 paschen 的回复:] 第一种是传值，相当于函数中只能使用这个结构体的数据，但修改并不会生效，因为是复制传递的  第二种是传址，传的是地址，函数中可以使用结构体数据，也可以修改结构体数据 那为什么还会有人用第一种方式去做数据结构的实现呢?如果修改都实现不了，那不是没意义吗？[/quote] 主要是函数，根据函数功能来确定是否要传指针。比如你的这个函数是插入，那么就要修改L的内容，并要获得修改之后的数据，那就需要传指针。

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:第一种参数是传结构体变量，但是SeqlistInsert之后，不能将新的插入数据带回（或者说是更新）； 第二种参数是传结构体指针，调用SeqlistInsert之后，能将新的插入带回调用函数；因为它传递的是地址，在SeqlistInsert函数里对L的操作就是对调用函数里L的操作。  也就是说第一种方式对原来的数据结构没有改变。第二种才是真正的插入了数据？

user: user-0
content: 引用 6 楼 paschen 的回复:第一种是传值，相当于函数中只能使用这个结构体的数据，但修改并不会生效，因为是复制传递的  第二种是传址，传的是地址，函数中可以使用结构体数据，也可以修改结构体数据 那为什么还会有人用第一种方式去做数据结构的实现呢?如果修改都实现不了，那不是没意义吗？

user: user-2
content: 第一种是传值，相当于函数中只能使用这个结构体的数据，但修改并不会生效，因为是复制传递的  第二种是传址，传的是地址，函数中可以使用结构体数据，也可以修改结构体数据

user: user-3
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-1
content: 第一种参数是传结构体变量，但是SeqlistInsert之后，不能将新的插入数据带回（或者说是更新）； 第二种参数是传结构体指针，调用SeqlistInsert之后，能将新的插入带回调用函数；因为它传递的是地址，在SeqlistInsert函数里对L的操作就是对调用函数里L的操作。

user: user-4
content: struct结构也是一种数据类型，所以这里你可以对照函数传参去理解，按值传参与按地址传参这两个能分清，这个问题也就理解了。

user: user-0
content: 引用 1 楼 user-5 的回复:一种是传值，一种是传指针，后者在函数里改变结构体的数据后上级函数里也能得到修改后的数据 引用 1 楼 user-5 的回复:一种是传值，一种是传指针，后者在函数里改变结构体的数据后上级函数里也能得到修改后的数据  我看了别人的实现方式，用*L声明的在用的时候还是对L进行的操作，那么这个时候的*L代表什么，L又代表什么。 nt InsertSeqList(SeqList* L,int i,DataType x) //对顺序表进行插入操作，插入格式如(1,a) { int j; if (L->length==L->listsize)     {       cout<<"\t\t\t顺序表已满";       return 0;     } else {    if (i<1||i>L->length+1) {        cout<<"\t\t\t位置不合法";        return 0;     }     else       {         for(j=L->length;j>=i;j--)           {             L->elem[j+1]=L->elem[j];           }    L->elem[i]=x;    L->length++;         return 1;       } } }

user: user-5
content: 一种是传值，一种是传指针，后者在函数里改变结构体的数据后上级函数里也能得到修改后的数据

user: user-2
content: 引用 8 楼 u011342403 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] 第一种参数是传结构体变量，但是SeqlistInsert之后，不能将新的插入数据带回（或者说是更新）； 第二种参数是传结构体指针，调用SeqlistInsert之后，能将新的插入带回调用函数；因为它传递的是地址，在SeqlistInsert函数里对L的操作就是对调用函数里L的操作。  也就是说第一种方式对原来的数据结构没有改变。第二种才是真正的插入了数据？[/quote]  是的，第一种只是复制了一个一样的结构体到函数中，函数中使用的参数只是一个复制品，修改并不会反映到原结构体对象上
user-0 提问: 数据结构与算法分析

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

user: user-1
content: 《数据结构（C语言描述）》 《算法精解（C语言描述）》 为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-0
content: 适合初学数据结构的计算机学生吗？

user: user-2
content: 《数据结构与算法》、《C和指针》

user: user-3
content: 代码少的，理论性比较强，建议理论多联系实践，这样更有利于提高对理论的理解。

user: user-4
content: 能给自己带来技能的书都是好书
user-0 提问: 新手学C语言有道题目不会

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

user: user-0
content: 谢谢，最下面那个for是什么用，没看懂

user: user-2
content: #include<stdio.h> #include<string.h>  #define N 80  int main(void) {     char s[N];     int i, j;     int len, pos;      printf("Enter a sentence:");     for(i = 0; i < N; i++) {         s[i] = getchar();         if ((s[i] == '.') || (s[i] == '!') || (s[i] == '?'))             break;     }      len = strlen(s);     pos = len - 1;     for (i = strlen(s) - 1; i >= 0; i--) {         if (s[i] == ' ') {             for(j = i + 1; j < pos; j++)                 printf("%c", s[j]);             printf(" ");             pos = i;         }      }     for(j = i + 1; j < pos; j++)         printf("%c", s[j]);      printf("%c", s[len - 1]);     printf("\n");     return 0; }
user-0 提问: 从文件中读取数据到数组中

回复:
user: user-1
content: fscanf 将3个数先读到3个临时变量中，然后进行赋值

user: user-2
content: fscanf/fprintf，  int i, j, val; fscanf(fp, "%d %d %d\n", i, j, val);  array[i][j] = val;
user-0 提问: c  两个不同的枚举类型里的成员不能重名么

回复:
user: user-1
content: 引用 8 楼 LM165678 的回复:楼主,枚举是一种类,可以看成是常量表的类,在外部中无法定义两个拥有同样成员的枚举类,在函数中也无法定义两个拥有相同成员的枚举类,但是可以在外部和内部定义拥有同样成员的枚举类,如下: enum cheks{A = 0};//在全局中定义一个外部枚举类,成员有A /*enum cheks1{A = 1};//那么无法在全局中再定义一个外部枚举类,成员也有A的枚举类*/ /*enum cheks1{A = 0};*/ void test2() { 	enum chek {A = 0, MyName, Hellow};//但是可以在内部函数中定义一个枚举类,成员为A 	enum testEnum {A = 0, A1 = 1, MyName1, Hellow1};//如果testEnum中有一个A值,那么无法编译通过  	enum chek chek1; 	enum testEnum testEnum1;  	chek1 = A;//因为局域变量里面有一个chek的枚举值为A,所以会引用chek的A值,而不会引用外部的cheks的A值 	printf("chek1 = %d", chek1); 	 	testEnum1 = A1; 	printf("testEnum1 = %d", testEnum1); } 楼主,请忽略我说的"类",因为我习惯用java的术语来描述,类就是一种数据结构,请这么理解

user: user-1
content: 楼主,枚举是一种类,可以看成是常量表的类,在外部中无法定义两个拥有同样成员的枚举类,在函数中也无法定义两个拥有相同成员的枚举类,但是可以在外部和内部定义拥有同样成员的枚举类,如下: enum cheks{A = 0};//在全局中定义一个外部枚举类,成员有A /*enum cheks1{A = 1};//那么无法在全局中再定义一个外部枚举类,成员也有A的枚举类*/ /*enum cheks1{A = 0};*/ void test2() { 	enum chek {A = 0, MyName, Hellow};//但是可以在内部函数中定义一个枚举类,成员为A 	enum testEnum {A = 0, A1 = 1, MyName1, Hellow1};//如果testEnum中有一个A值,那么无法编译通过  	enum chek chek1; 	enum testEnum testEnum1;  	chek1 = A;//因为局域变量里面有一个chek的枚举值为A,所以会引用chek的A值,而不会引用外部的cheks的A值 	printf("chek1 = %d", chek1); 	 	testEnum1 = A1; 	printf("testEnum1 = %d", testEnum1); }

user: user-2

user: user-3
content: http://en.cppreference.com/w/cpp/language/enum  Each enumerator becomes a named constant of the enumeration's type (that is, name), visible in the enclosing scope, and can be used whenever constants are required.

user: user-3
content: 是的，不能，除非写在两个不同的名字空间中

user: user-4
content: 枚举，你可以认为是宏，宏定义是不允许重名的，那么枚举也是一样的。

user: user-0
content: 那我又多个枚举，可能里面的成员会有相同的，难道每个都设置namespace  ？？

user: user-5
content: 对于不同枚举值，取不同名称，例如加前缀  typedef enum {     cact_active = 1, }CREATEORACTIVE_E;  typedef enum {     act_notActive = 1,     act_active = 2 }ACTIVENO_E;

user: user-6
content: 这么写是不行的，一般用不同的namespace包起来
user-0 提问: 在windows窗体程序中用opengl画三维图，把代码蓝色部分注释掉就是动图，不然就是一个静态的图，问题出在哪了啊！！求路过的大神救助！！！

回复:
user: user-1
content: windows下程序的绘制使用到DC（设备上下文），opengl也是使用该HDC进行绘制的 而且PAINT重绘消息里总是（或者说几乎）有如下形式  hDC =BeginPaint(hWnd,&ps); //绘制代码 EndPaint (hWnd,&ps);
user-0 提问: if()的问题

回复:
user: user-1
content: 引用f(a.y==4||a.y==6||a.y==9||a.y==11) a.r=30;   //这个可以写成if(a.y==(4,6,9,11))吗  不可以，那样就是逗号表达式了，实际比较的只是11这个数

user: user-1
content: 引用这个(a.y>=1&&a.y<=12)能用，这个(a.r>=1&&a.r<=31)怎么没用  || 运算符在第一个表达式为真的情况下不会再判断第二个

user: user-2
content: if(a.y==(4,6,9,11)) 写成这样，这里就是要注意一个逗号表达式的问题，逗号表达式即做后一个逗号后面的表达式是最终表达式。即写成这样，就是下面的意思： if (a.y == 11)

user: user-2
content: 因为你用的是||，若||前面的表达式为真，则||后面的表达式则不会计算和判断，因为前面的表达式为真，则真个||表达式为真，除非||前面的表达式为假，才会继续判断||后面的表达式。因此，若要想两个表达式都为真则执行if语句，建议改成&&

user: user-3
content: 2.a.y==（4，6，9，11）；不能这样写，没有这样的语句，如果去掉一个等号变成赋值语句倒是可以，这样右边是逗号表达式。

user: user-4
content: if((a.y>=1&&a.y<=12) && (a.r>=1&&a.r<=31))   逻辑与&&：前后都为真才为真，否则为假，如果前一个表达式为假，则后一个表达式不再执行与判断。 逻辑或||：前后都为假才为假，否则为真，如果前一个表达式为真，则后一个表达式不再执行与判断。

user: user-3
content: 1. if（xxx || yyy）为什么yyy不起作用，这是||这个逻辑符的陷阱，如果xxx是真的话，编译器就不会计算yyy，只有当xxx为假时，才会计算yyy。
user-0 提问: 才学C语言，找不到自己的错误，请教一下，谢谢

回复:
user: user-1
content: 先看一下C语言变量定义的要求吧，带括号的都是函数吧。

user: user-0
content: 那我可不可以写成这样："f(a),f(b),a=n-1,b=n-2"

user: user-2
content: f（n-1），f（n-2）这不是变量名，变量是以数字、字母或下划线命名。如果要这样用，只能定义一个函数名为f的函数。

user: user-3
content: f应该是函数，不能定义成变量； #include<stdio.h>  unsigned int f(int n);  int main() {     int n;      printf("Please input a number: ");     scanf("%d", &n);      printf("%u\n", f(n));   return 0; }  unsigned int f(int n) {     unsigned int fn;      if (n == 1 || n == 2)         return 1;     else         fn = f(n-1) + f(n-2);      return fn; }

user: user-0
content: 感谢感谢

user: user-4
content: f定义成数组或者函数吧 ，用变量肯定不行啊

user: user-5
content: 首先你要实现什么功能？我就从代码规范上说说吧。f一般是float类型变量，fn,fun一般是函数名。 printf("f1=%d,f2=%d,f=%d\n",f1,f2,fn);
user-0 提问: assert的应用

回复:
user: user-1
content: assert是在debug模式下才起作用，在release下不会被编译的。至于i++，这完全是自增的语法，加加在前是先加后运用，如果在后就先运用后加加。

user: user-2
content: assert内是要避免修改数据的 release下assert的代码是不编译进去的

user: user-3
content: 引用 2 楼 wanggui2015 的回复:assert只做判断，不做处理，这代码在debug下没啥问题，但是到release下，assert语句不执行，i++也不会执行了，逻辑就会有问题了 不过，可能跟这个release版本时，assert不执行有关

user: user-3
content: 引用 2 楼 wanggui2015 的回复:assert只做判断，不做处理，这代码在debug下没啥问题，但是到release下，assert语句不执行，i++也不会执行了，逻辑就会有问题了 release版本里，assert是仍然有效的吧，除非把debug在编译的时候关了，这样才会不执行assert语句 http://blog.csdn.net/yeyuboy/article/details/593736

user: user-4
content: assert只做判断，不做处理，这代码在debug下没啥问题，但是到release下，assert语句不执行，i++也不会执行了，逻辑就会有问题了

user: user-3
content: 但从你的这些描述看不出是assert应用本身问题，而倒是++（后增）和<优先级的问题。是否要将i++放到assert外面还要看环境和逻辑。因此，可以贴出更多一些的代码。
user-0 提问: c语言，数组作为自定义函数参数，如果要实现原数组内部数据的改变

回复:
user: user-1
content: 引用 4 楼 weixin_37923716 的回复:引用 3楼weixin_37923716 的回复:数组作为函数的实参传递，传递的数组的首地址，所以自定义函数操作形参就是在操作实参数了，数组的传递一般都是值传递，除非操作单个数组元素，只传一个值(例如传递a[0])，就是值传递，传递数组名称a就是地址传递，数组名称本来就是一个指针常量，所以你要传递数组时声明自定义函数时声明形参时数组的那个形式参数是声明为指针的，就是这么一回事了不好意思，打错一个地方了，第三行那里应该是“数组的传递一般是地址传递”，手机打字不方便…… 地址值也是值，一次参数传递可以统一归结为值传递。只不过这个值是地址值。

user: user-2
content: 引用 3楼weixin_37923716 的回复:数组作为函数的实参传递，传递的数组的首地址，所以自定义函数操作形参就是在操作实参数了，数组的传递一般都是值传递，除非操作单个数组元素，只传一个值(例如传递a[0])，就是值传递，传递数组名称a就是地址传递，数组名称本来就是一个指针常量，所以你要传递数组时声明自定义函数时声明形参时数组的那个形式参数是声明为指针的，就是这么一回事了不好意思，打错一个地方了，第三行那里应该是“数组的传递一般是地址传递”，手机打字不方便……

user: user-2
content: 数组作为函数的实参传递，传递的数组的首地址，所以自定义函数操作形参就是在操作实参数了，数组的传递一般都是值传递，除非操作单个数组元素，只传一个值(例如传递a[0])，就是值传递，传递数组名称a就是地址传递，数组名称本来就是一个指针常量，所以你要传递数组时声明自定义函数时声明形参时数组的那个形式参数是声明为指针的，就是这么一回事了

user: user-1
content: 形参其实就是一个指针，即使你定义的形参是int array[]，编译器也是将其看成指针。 如果将数组作为实参传给自定义函数，那么自定义形参（指针）就指向了数组的首地址（因为传递的时候是数组名），那么在自定义函数里所有的修改，都是修改原数组的内容。所以，自定义函数处理结束后，原数组的数据也就变化了。

user: user-3
content: 如果传入的是数组指针，在函数里修改之后原始的数组也会被修改
user-0 提问: 请教问题

回复:
user: user-1
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-2
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] #include<stdio.h> #include <string.h>  int main() {     char a[80];     int i;      for(i=1;i<=3;i++)     {         gets(a);         if(strcmp(a,"628628")==0)         {             printf("输入正确请稍后......\n");             break;         }         else         {             printf("输入错误按任意键继续\n");             getch();         }         if(i == 3)         {             printf("您的卡已冻结\n");         }     }     return 0; } 两处拼写错误，分别是main，printf； 若输入匹配应break处循环，不然逻辑说不通。 #include<stdio.h> #include <string.h>   int main() {     char a[80];     int i;       for(i=1;i<=3;i++)     {         gets(a);         if(strcmp(a,"628628")==0)         {             printf("输入正确请稍后......\n");             break;         }         else         {             printf("输入错误按任意键继续\n");             getch();         }     }     if(i == 3)     {         printf("您的卡已冻结\n");     }      return 0; } if判断是否为3，应放在循环外。[/quote] 如果放在外面，if (i == 4)才可以。上面回复我太过草率

user: user-2
content: 引用 1 楼 cfjtaishan 的回复:#include<stdio.h> #include <string.h>  int main() {     char a[80];     int i;      for(i=1;i<=3;i++)     {         gets(a);         if(strcmp(a,"628628")==0)         {             printf("输入正确请稍后......\n");             break;         }         else         {             printf("输入错误按任意键继续\n");             getch();         }         if(i == 3)         {             printf("您的卡已冻结\n");         }     }     return 0; } 两处拼写错误，分别是main，printf； 若输入匹配应break处循环，不然逻辑说不通。 #include<stdio.h> #include <string.h>   int main() {     char a[80];     int i;       for(i=1;i<=3;i++)     {         gets(a);         if(strcmp(a,"628628")==0)         {             printf("输入正确请稍后......\n");             break;         }         else         {             printf("输入错误按任意键继续\n");             getch();         }     }     if(i == 3)     {         printf("您的卡已冻结\n");     }      return 0; } if判断是否为3，应放在循环外。

user: user-2
content: #include<stdio.h> #include <string.h>  int main() {     char a[80];     int i;      for(i=1;i<=3;i++)     {         gets(a);         if(strcmp(a,"628628")==0)         {             printf("输入正确请稍后......\n");             break;         }         else         {             printf("输入错误按任意键继续\n");             getch();         }         if(i == 3)         {             printf("您的卡已冻结\n");         }     }     return 0; } 两处拼写错误，分别是main，printf； 若输入匹配应break处循环，不然逻辑说不通。
user-0 提问: memcmp判断空字符串

回复:
user: user-1
content: 引用 6 楼 cfjtaishan 的回复:对于空串，只有一个'\0'，没有两个字节失误失误，脑子一直想的是只有一个字符的字符串。

user: user-2
content: 引用 5 楼 SXJIAKE 的回复:引用 3 楼 github_27546213 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 因为你比较了8个字符，已经越界了。它会判断a字符串的8个字节与""比较，第三个参数建议用strlen你好，谢谢，明白了。不过我自己试验了一下应该是前一个字节是一样的，不是前2个字节。 第二个字节是 0，这个也是一样的……[/quote] 对于空串，只有一个'\0'，没有两个字节

user: user-1
content: 引用 3 楼 github_27546213 的回复:引用 1 楼 cfjtaishan 的回复:因为你比较了8个字符，已经越界了。它会判断a字符串的8个字节与""比较，第三个参数建议用strlen你好，谢谢，明白了。不过我自己试验了一下应该是前一个字节是一样的，不是前2个字节。 第二个字节是 0，这个也是一样的……

user: user-2
content: 引用 2 楼 SXJIAKE 的回复:memcmp 是比较指定字节的内容是否完全相同。所以你这是比较 a 和 "" 的 8个字节的二进制是否相同。其前两个字节是相同的，后面的话就不知道了。作为字符串，a 的后面 6 字节可以是任意内容，而 "" 只有 2 字节是你可以访问的，之后的内容你可能不一定有写权限，甚至没有读权限。strcmp 是比较字符串，只要其中一个字符串结束 (遇到 0 字符为止)，比较就结束。这个例子中，实际上只比较了 2 字节。 memcmp是不会判断字符串的'\0'的，所以，它是要比较8个字节， 对于第二个字符串，8个字节很明显是越界了吗？ 注意:memcmp和strncmp是不一样的

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:因为你比较了8个字符，已经越界了。它会判断a字符串的8个字节与""比较，第三个参数建议用strlen你好，谢谢，明白了。不过我自己试验了一下应该是前一个字节是一样的，不是前2个字节。

user: user-1
content: memcmp 是比较指定字节的内容是否完全相同。所以你这是比较 a 和 "" 的 8个字节的二进制是否相同。其前两个字节是相同的，后面的话就不知道了。作为字符串，a 的后面 6 字节可以是任意内容，而 "" 只有 2 字节是你可以访问的，之后的内容你可能不一定有写权限，甚至没有读权限。strcmp 是比较字符串，只要其中一个字符串结束 (遇到 0 字符为止)，比较就结束。这个例子中，实际上只比较了 2 字节。

user: user-2
content: 因为你比较了8个字符，已经越界了。它会判断a字符串的8个字节与""比较，第三个参数建议用strlen
user-0 提问: 使用C语言的强制类型转换将基类指针转换成子类指针如何判断是否合法？

回复:
user: user-0
content: 已经写代码验证，基类如果没有虚函数，确实不可使用dynamic_cast，而且delete这样的基类的指针也不会判断指针的实际对象类型而是忠实地调用基类的析构。

user: user-0
content: 如果有个基类Base和派生类Derived,然后有一个Base *arr[4] 里面放了4个Base类型对象指针，实际上都是指向Derived类型的实例的。 假设我的Base和Derived都没声明任何虚函数。 不考虑编译环境不支持dynamic_cast的问题，我使用这些指针时不可以使用dynamic_cast吗？ 这时基类的析构相当于没有virtual的是吗？使用完了这个数组，我要delete[] arr，是不是会析构不完整呢？

user: user-1
content: dynamic_cast 是基于虚函数表的，即使在c++中，没有虚函数的类或结构对象也是不能用dynamic_cast的

user: user-2
content: 好奇怪的C，居然有继承关系

user: user-1
content: C语言有基类子类的概念？？？

user: user-3
content: 不想用dynat_cast，自己小心使用指针就是了

user: user-0
content: AIX的机器，gcc编译器，由于版本有一点旧，要支持dynamic_cast需要在编译选项中注明。 编译选项的配置是另一个产品组的，我们项目组不能修改。 C里面看来没有考虑过这种继承关系的问题，没办法解决就算了，只能写的时候时刻记住指针的类型了。

user: user-4
content: 引用 1 楼 jianwen0529 的回复:指针这东西没办法，完全靠写作者本身的细心 能想到的就是实现运行时类型机制  类你都用了，为什么不能使用dynamic_cast？难道你的代码的编译器是古董级别？

user: user-4
content: 指针这东西没办法，完全靠写作者本身的细心
user-0 提问: Dev c++中第二次运行程序提示“Program received signal SIGSEGV，Segmentation fault.”是什么原因，求指导。

回复:
user: user-1
content: fread(&date,sizeof(struct tm),9,fp); 这一句读了9个tm出来，而date只能保存1份数据， 所以把后面的变量都搞乱了，fp数据被改写，所以fclose的时候就出错了

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:可以这样理解，但是，struct tm成员都得是int类型（占四个字节）才可以。这样做有一个缺点，就是如果struct tm添加或者减少一个成员或者某个成员的类型变了，比如编程char，或者double，那么还是有问题。 所以，建议写成这样形式： fwrite(local,sizeof(struct tm),1,fp); fread(&date,sizeof(struct tm),1,fp); 除了安全以外，也能提高程序的可移植性。  明白了，谢谢！

user: user-2
content: 引用 4 楼 longquan0315 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] fwrite(local,sizeof(struct tm),1,fp); 不清楚楼主为什么要传fwrite第三个参数为9，根据你的需要，一个就可以了。 i = fread(&date,sizeof(struct tm),1,fp); 感谢楼上两位的回答，我像下面这样理解对吗？ struct tm中有9个int型数据，在fread和fwrite两个函数的参数中，如果第二个参数是sizeof（int）的话，第三个参数就应该是9。 fwrite(local,sizeof(int),1,fp); fread(&date,sizeof(int),1,fp); 如果第二个参数是sizeof（struct tm）的话，第三个参数就应该是1 fwrite(local,sizeof(struct tm),1,fp); fread(&date,sizeof(struct tm),1,fp); 这样对吗？[/quote] 可以这样理解，但是，struct tm成员都得是int类型（占四个字节）才可以。这样做有一个缺点，就是如果struct tm添加或者减少一个成员或者某个成员的类型变了，比如编程char，或者double，那么还是有问题。 所以，建议写成这样形式： fwrite(local,sizeof(struct tm),1,fp); fread(&date,sizeof(struct tm),1,fp); 除了安全以外，也能提高程序的可移植性。

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:fwrite(local,sizeof(struct tm),1,fp); 不清楚楼主为什么要传fwrite第三个参数为9，根据你的需要，一个就可以了。 i = fread(&date,sizeof(struct tm),1,fp); 感谢楼上两位的回答，我像下面这样理解对吗？ struct tm中有9个int型数据，在fread和fwrite两个函数的参数中，如果第二个参数是sizeof（int）的话，第三个参数就应该是9。 fwrite(local,sizeof(int),1,fp); fread(&date,sizeof(int),1,fp); 如果第二个参数是sizeof（struct tm）的话，第三个参数就应该是1 fwrite(local,sizeof(struct tm),1,fp); fread(&date,sizeof(struct tm),1,fp); 这样对吗？

user: user-0
content: 引用 1 楼 ckc 的回复:fread(&date,sizeof(struct tm),9,fp); 这一句读了9个tm出来，而date只能保存1份数据， 所以把后面的变量都搞乱了，fp数据被改写，所以fclose的时候就出错了 感谢楼上两位的回答，我像下面这样理解对吗？ struct tm中有9个int型数据，在fread和fwrite两个函数的参数中，如果第二个参数是sizeof（int）的话，第三个参数就应该是9。 fwrite(local,sizeof(int),1,fp); fread(&date,sizeof(int),1,fp); 如果第二个参数是sizeof（struct tm）的话，第三个参数就应该是1 fwrite(local,sizeof(struct tm),1,fp); fread(&date,sizeof(struct tm),1,fp); 这样对吗？

user: user-2
content: fwrite(local,sizeof(struct tm),1,fp); 不清楚楼主为什么要传fwrite第三个参数为9，根据你的需要，一个就可以了。 i = fread(&date,sizeof(struct tm),1,fp);
user-0 提问: [资源优选]第十九期：20个热门的C语言源码

回复:
user: user-1
content: 我是进来学习的🙄

user: user-2
content: 谢谢分享

user: user-3
content: 好贵啊，买不起，

user: user-4
content: 需要的积分有点多啊

user: user-5
content: 收了 这么好的资源

user: user-6
content: 谢谢楼主分享。

user: user-7
content: 谢谢分享6666

user: user-8
content: 佩服佩服666666666666666666666666666666

user: user-9

user: user-10
content: 不知道为什么打开后404

user: user-11
content: 谢谢分享sdadsf

user: user-12
content: 666  很喜欢  正在学

user: user-13
content: 下载要积分 全部差评

user: user-14

user: user-15

user: user-16
content: C-FREE不错，小巧实用，功能不失强大

user: user-17
content: C语言怪异代码大赛历届作品大全 1984～1996，1998，2000，2001，2004～2006，2011，2012http://download.csdn.net/detail/zhao4zhong1/5538847

user: user-18
content: 赞一个，收藏了。

user: user-19
content: 分享是美

user: user-20