Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 文件掩码（umask）无效

回复:
user: user-0
content: 引用 2 楼 xiaomi163 的回复:[quote=引用 1 楼 u011779875 的回复:] 常用的umask值及对应的文件和目录权限umask值                       目录         文件 022               755          644 027               750          640 002               775          664 006               771          660 007               770          660 文件和目录是不同的 第一 第二umask 可能只是继承当前进程 当前目录 不一定是所有的用户都修改吧  或者你其中有什么错误的操作 没有说出来 你也不知道 你操作错了 仅个人意见 搞不清楚[/quote] 但是我的/etc/bashrc配置里面umask是： [root@centOS5 client]# vim /etc/bashrc  if [ $UID -gt 99 ] && [ "`id -gn`" = "`id -un`" ]; then umask 002 else umask 022 fi

user: user-0
content: 引用 1 楼 u011779875 的回复:常用的umask值及对应的文件和目录权限umask值                       目录         文件 022               755          644 027               750          640 002               775          664 006               771          660 007               770          660 文件和目录是不同的 第一 第二umask 可能只是继承当前进程 当前目录 不一定是所有的用户都修改吧  或者你其中有什么错误的操作 没有说出来 你也不知道 你操作错了 仅个人意见 搞不清楚

user: user-1
content: 常用的umask值及对应的文件和目录权限umask值                       目录         文件 022               755          644 027               750          640 002               775          664 006               771          660 007               770          660 文件和目录是不同的 第一 第二umask 可能只是继承当前进程 当前目录 不一定是所有的用户都修改吧  或者你其中有什么错误的操作 没有说出来 你也不知道 你操作错了 仅个人意见
user-0 提问: 新人求救

回复:
user: user-1
content: google

user: user-2
content: 引用 2 楼 u012511807 的回复:那在哪里找demo呢？我在csdn下载的RS485通信程序也不知道怎么用啊…  那就比较难帮你了

user: user-0
content: 那在哪里找demo呢？我在csdn下载的RS485通信程序也不知道怎么用啊…

user: user-3
content: 你说的这个太笼络了,最好的办法是到网上找个完整的demo,比着葫芦画个瓢!
user-0 提问: 为啥scanf("%*[^\n]%*c")清除键盘缓冲区失败呢？

回复:
user: user-0
content: 谢谢各位兄弟关注，尤其感谢lin5161678兄指导。结贴。

user: user-1
content: 受教了

user: user-2
content: 用这个来清除键盘缓冲区呗  fflush(stdin);

user: user-3
content: stdin 里面只有1个\n的时候  scanf("%*[^\n]%*c");第一个格式控制字符串 不接受\n 直接返回 后面的 %*c不能读取\n 而对于 scanf("%*[^\n]");一样\n失败了 直接返回 scanf("%*c");这时候 stdin里面是 \n %*c 发挥作用读取了 这个\n  达到目的

user: user-4
content: rewind(stdin);

user: user-3
content: 引用 3 楼 woshihuzi 的回复:对于合体的那个语句：scanf("%*[^\n]%*c");我是不是可以这样理解？ 一旦格式控制字符串"%*[^\n]"接收不到什么东西的时候，scanf函数就直接返回，后面的格式控制字符串"%*c"就不再考虑跟'\n'这个字符匹配的问题了？嗯是的 对于合体的那一句 必须一个一个的匹配 前面失败了 后面的也就无效了 %*[^\n] 需要至少1个非\n给他匹配 后面的%*c 才会发挥作用

user: user-3
content: 引用 2 楼 wangdahu888 的回复:用这个来清除键盘缓冲区呗  fflush(stdin);fflush 用于刷新输出流的 stdin是输入流 别乱用

user: user-0
content: 引用 2 楼 wangdahu888 的回复:用这个来清除键盘缓冲区呗  fflush(stdin);这个语句和rewind(stdin);在windows下都是可以的，但是在linux下不行。 setbuf(stdin, NULL); 在linux下行，但是在windows下不行。 我就百度了一个通用的办法： scanf("%*[^\n]"); scanf("%*c"); 发现在windows下可以，linux下没测试。 进一步想为啥不能把这两句合并为一句呢，结果发现不行了。可我想不明白道理，就来问问高手们。

user: user-0
content: 引用 1 楼 lin5161678 的回复:stdin 里面只有1个\n的时候  scanf("%*[^\n]%*c");第一个格式控制字符串 不接受\n 直接返回 后面的 %*c不能读取\n 而对于 scanf("%*[^\n]");一样\n失败了 直接返回 scanf("%*c");这时候 stdin里面是 \n %*c 发挥作用读取了 这个\n  达到目的  对于合体的那个语句：scanf("%*[^\n]%*c");我是不是可以这样理解？ 一旦格式控制字符串"%*[^\n]"接收不到什么东西的时候，scanf函数就直接返回，后面的格式控制字符串"%*c"就不再考虑跟'\n'这个字符匹配的问题了？
user-0 提问: 子函数返回值问题--临时变量&非临时变量

回复:
user: user-1
content: c 语言 函数间传递参数的本质都是by value, 关键是这个value 代表的是一个数值，还是一个变量的地址

user: user-2
content: 1 ：没问题，返回一句数值而已！ 2 ：有问题，返回局部变量地址，当函数结束后，变量空间也是释放，所以数据丢失，     无法访问到有效数据(即使能访问到，可能是内存未擦除而已) 3 ：分配堆内存，用户自己分配自己释放，拷贝"hello"的内容到空间上而已，地址未改变，     后面当不需要再使用的时候，直接free就好 4 ：堆内存，后面 p = "hello"是把"hello"的首地址赋值给p，导致malloc分配的内存空间首地址丢失，      无法正常访问到，导致这片堆空间丢失，从而出现内存泄露

user: user-3
content: char *func(void) {     char *p = (char*)malloc(sizeof(char) * 6);     p = "Hello";     return p; }  char *p = func();  free(p)，不会出问题的，关键是要记得，要释放。。。

user: user-3
content: //子函数2, 这里也是返回的临时变量，好像返回的用法不对。 char* aaitoa(int num) {   union intch {   int a;   char p[10];   } temp;     temp.a = num;     return temp.p; }  分配数据在 栈上，函数调用的过程，会吧数据保存在栈上，用完了，栈上的数据会被释放。。  //子函数3，这样子函数返回的应该不是临时变量，这样用好像对了。 char *func(void) {     char *p = (char*)malloc(sizeof(char) * 6);     strcpy(p, "Hello");     return p; }   //子函数4， 这里p在栈里，但我觉着p指向了常量存储区，子函数返回的用法应该是对的。不过这里应该有内存泄露了吧？ char *func(void) {     char *p = (char*)malloc(sizeof(char) * 6);     p = "Hello";     return p; } malloc(c) new(c++)的数据的调用，会申请堆上的空间，系统会分配堆上的数据给调用者，直到你z主动调用申请free(对应malloc)\delete(对应new)释放申请的资源，系统才会释放掉资源，否则它会一直保持这个申请记录。  所以函数2的数据已释放，返回的char*会出错。。函数3，4则不会出问题。。。拿到地址，即使在函数内部申请的资源，你在函数外部依然可以释放。。

user: user-4
content: 更正一下,是eax寄存器    char *p = (char*)malloc(sizeof(char) * 6);     p = "Hello"; 你这分配的空间没释放,当然有泄露了

user: user-4
content: 不知道,你所说的临时变量所谓何物? 如何返回的是内置类型如int char,指针类型等,返回时直接就放在eax内存中了,没有什么临时变量之说.
user-0 提问: C语言中链表合并的基础问题

回复:
user: user-1
content: http://wenku.baidu.com/view/e71df1cda1c7aa00b52acb60.html

user: user-2
content: 对于链表 你需要理解链表的概念！还有一些常用操作 增删改查吧！知道怎么去 从头到尾的全部输出。这样的话就好办了！假设两个链表 有序 需要合并！你需要做的是 从两个链表 各取一个 比较选择合适的放入新的链表中 就行。  如果是 无序的两个链表 你首先要将他们排序 即可。

user: user-1
content: 都把链表排序后再合并

user: user-3
content: 楼主可以这样做，不分三种情况，直接将两个链表合并，链表1的尾指针指向链表2的头指针即可，最后根据要求在对合并后的链表进行排序即可。这样容易理解吧。
user-0 提问: 结构指针、字符指针

回复:
user: user-0
content: 引用 7 楼 wangdahu888 的回复:囧... 上述有点多余 下面就可以   	char* p=*(char**)(ptr); 	char c=p[0]; 	char* p1=*(char**)(ptr)+1; 	char c1=p1[0]; 谢谢啦！但这个我一时还没看明白，我研究会！

user: user-1
content: 囧... 上述有点多余 下面就可以   	char* p=*(char**)(ptr); 	char c=p[0]; 	char* p1=*(char**)(ptr)+1; 	char c1=p1[0];

user: user-1
content: char* p=reinterpret_cast<char*>(*(reinterpret_cast<char**>(ptr))); 	char c=p[0]; //字符 n 	char* p1=reinterpret_cast<char*>(*(reinterpret_cast<char**>(ptr))+1); 	char c1=p1[0]; //字符 a

user: user-1
content: 打开vs中的内存查看内能,查看一下ptr地址中的内存内容,再根据你的表达式实际分析一下,就明白了 *((char*)ptr+1)  本来ptr起始地址处中的值是指向那个字符串的,你一进行算术操作,就指偏了,所以得不到你想要的输出.

user: user-0
content: 引用 3 楼 wangdahu888 的回复:上面这样可以输出结构首地址的指向的字符及下个字符。 printf("%c\n%c\n", *ptr->p,*(ptr->p+1));  *(ptr+1)指向的整个结构体的下一个地址,是个未知的内存空间,我也就不打印了嗯，我用指针类型转换把结构体指针转换成字符指针(char*)ptr，我想*(char*)ptr这样应该和*ptr->p输出值是一样的吧？可是实际结果是不一样，不知道为啥不一样呢？

user: user-1
content: 上面这样可以输出结构首地址的指向的字符及下个字符。 printf("%c\n%c\n", *ptr->p,*(ptr->p+1));  *(ptr+1)指向的整个结构体的下一个地址,是个未知的内存空间,我也就不打印了

user: user-0
content: 引用 1 楼 wangdahu888 的回复:printf("%c\n%c\n%c\n", ptr->p,*((char*)ptr+1),*(ptr+1)); 你把一个char*指针，当作char输出，只会把指针的低字节按ascii码解析成对应的char"把一个char*指针，当作char输出"是指“ptr->p”吧？p是地址。  那是要再加个*变为*ptr->p，这样输出“n”是对的，*(ptr->p + 1)输出“a”也是对的。  上面这样可以输出结构首地址的指向的字符及下个字符。  这两句*((char*)ptr+1),*(ptr+1))要怎么理解呢？ *((char*)ptr+1)应该和*(ptr->p + 1)输出一样的值啊？*(char*)ptr应该和*ptr->p输出一样的值啊？可是输出的值不一样，为什么呢？

user: user-1
content: printf("%c\n%c\n%c\n", ptr->p,*((char*)ptr+1),*(ptr+1)); 你把一个char*指针，当作char输出，只会把指针的低字节按ascii码解析成对应的char
user-0 提问: 这个数据结构如何理解？

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> char buf[17]; union U {   unsigned short int aa;   struct S {     unsigned int bb:7;//(bit 0-6)     unsigned int cc:6;//(bit 7-12)     unsigned int dd:3;//(bit 13-15)   } s; } u; void main() {                 //bbbbbbbbbbbbbbbb                 //iiiiiiiiiiiiiiii                 //tttttttttttttttt                 //111111                 //5432109876543210                 //::::::::::::::::     u.aa=0xE07F;//1110000001111111     printf("bb==%d,cc==%d,dd==%d\n",u.s.bb,u.s.cc,u.s.dd);     u.s.bb=0x41;     u.s.cc=0x21;//dddccccccbbbbbbb     u.s.dd=5;   //1011000011000001     printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2)); } //bb==127,cc==0,dd==7 //aa==0xB0C1==1011000011000001(2)

user: user-2
content: 位域我也很迷茫，有试着使用过，但是总是出现种种问题。 有时是声明的时候不对，有时是使用变量的时候不行。  难道是楼上所说的“其实现严重依赖具体的平台”？

user: user-3
content: 位域在语法书中是有讲的，但其实现严重依赖具体的平台，所以讲得很粗略

user: user-0
content: 我给的这个例子的结构体里面数据类型都是uint16_t， 那如果换成如下这样呢 typedef union _ATCR_TypeDef {   uint16_t d16;   struct   {     uint16_t TRC:         5;     uint16_t MODE:        1;     char FRE:         2;     char SAT:         6;     uint16_t SYS:         2;   }   b; }ATCR_TypeDef; 这回得到什么结果呢

user: user-4
content: 这是位域呀,给个例子,你就明白了,还是原来楼上那位大神教我的   struct   bs              {                  int   a:8; //这里标识int 4个字节，32位 只占8位而已                 int   b:2; // 这里 表示值占 2位，                 int   c:6;  //6位            //只要后面没有用完 32位的话， 整个结构体大小就只是4个字节大小而已！           //全部换成char的话， char 8个字节， 结构体旧只占2个字节～             };

user: user-5
content: 引用 3 楼 laomig 的回复:能不能详细解释一下，这个共用体到底占用几个字节？结构体中的各项到底怎么分配数据位  struct { uint16_t TRC:         5;  //占5个二进制位 uint16_t MODE:        1;  //占1个二进制位 uint16_t FRE:         2;  //占2个二进制位 //上面占满8位，就是一个字节的内存空间了 //下面也是8位 也占了一个字节的内存空间 uint16_t SAT:         6;  // 占6个二进制位 uint16_t SYS:         2;  // 占2个二进制位 }

user: user-0
content: 能不能详细解释一下，这个共用体到底占用几个字节？结构体中的各项到底怎么分配数据位

user: user-6
content: google位域或者位段
user-0 提问: C语言读取配置文件

回复:
user: user-1
content: fopen，fgets，字符串函数配合解决

user: user-2
content: 一行一行读入分析， 上百项也很快， 如果文件配置项无序，什么算法都失灵

user: user-3
content: 1.使用确定的字节对齐格式，使用二进制文件读写。C语言初学者推荐这种。  2.不使用字节对齐格式，使用文本方式格式读写文件，配合各种IO函数。C语言初学者推荐这种。  2.不使用确定字节对齐格式，使用正则表达式。不过这不是C语言的强项。要自己写。  3.使用windows系统提供的api，读写ini文件。

user: user-4
content: 自己实现一个split函数呗，把每一行，以=为间隔，分成两段

user: user-5
content: 以及GetPrivateProfileSection() 和 GetPrivateProfileInt()等函数，具体可参看MSDN。

user: user-5
content: Windows平台可以直接利用GetPrivateProfileString()函数 + .ini格式。
user-0 提问: 求1000！的未尾有几个0

回复:
user: user-1
content: 第一个事实：如果两数a和b相乘，末尾有0，那么a或者b必然有5和2的因子（a有5的因子，b有2的因子；或者反过来；或者a同时有5和2的因子；又或者b同时有5和2的因子）。  第二个事实：如果两数a和b相乘，末尾有几个0，那么就至少有几个5和2的因子（末尾一个0，至少有一个5的因子，一个2的因子；末尾两个0，至少有两个5的因子，两个2的因子；……）。  那么10!末尾有几个0？  只有10和5有5的因子，所以只有两个5的因子，而含有2的因子的个数远大于两个，所以，10!末尾有两个0。  1到n中，因子2的个数远大于因子5的个数，故求n!末尾0的个数，实际上就是求1到n中，因子5的个数。

user: user-2
content: 看看《编程之美》吧，原题

user: user-3
content: 引用 3 楼 wangdahu888 的回复:分析  5的1次幂5的倍数增加1个0 (5,10,15,20,25,30,.....) 5的2次幂25的倍数增加2个0(必然是5的倍数)(25,50,75,100,125.....) 5的3次幂125的倍数增加3个0(必然是25的倍数)(125,250,375,500.....) 5的4次幂625的倍数增加4个0(必然是125的倍数)(625,1250,1875,2500.....) ........... 所以先求出5的倍数 加上25的倍数(2个0,其中1个已记入5的倍数) 加上125的倍数(3个0,其中1个已记入5的倍数1个已记入25的倍数) 加上625的倍数(4个0,其中....................................)  1000/5=200  (1000里面含有200个5的倍数，但同时也包含了25倍数，125的倍数，625的倍数各一次)  1000/25=40(1000里面含有40个25的倍数，同时也含有125的倍数，625的倍数各一次)  1000/125=8(1000里面含有8个125的倍数，同时也含有625的倍数)  1000/625=1（1000里含有1个625的倍数）     所以1000！里面含 有0的个数为200+40+8+1=249个还是搞不懂

user: user-4
content: 仅供参考 #include <stdio.h> int main(int argc,char *argv[]) { 	int inum=1000,i=0,j=0,icount=1,temp,jinwei,result=0; 	int ires[50000]={0}; 	for(i=2;i<inum;i++) 	{ 		jinwei=0; 		for(j=1;j<icount;j++) 		{ 			temp=ires[j]*i+jinwei; 			ires[j]=temp%10; 			jinwei=temp/10;	 		} 		while(jinwei) 		{ 			ires[++icount]=jinwei%10; 			jinwei/=10; 		} 	} 	for(j=1;j<=icount;j++) 	{ 		if(ires[j]==0) 		{ 			result++; 		} 		else 		{ 			printf("总共有%d个0",result);		 			return 0; 		} 		 	} 	return 0; }

user: user-5
content: 也就是说1000！能被5^X正除，就有X个0

user: user-6
content: 引用 3 楼 wangdahu888 的回复:分析  5的1次幂5的倍数增加1个0 (5,10,15,20,25,30,.....) 5的2次幂25的倍数增加2个0(必然是5的倍数)(25,50,75,100,125.....) 5的3次幂125的倍数增加3个0(必然是25的倍数)(125,250,375,500.....) 5的4次幂625的倍数增加4个0(必然是125的倍数)(625,1250,1875,2500.....) ........... 所以先求出5的倍数 加上25的倍数(2个0,其中1个已记入5的倍数) 加上125的倍数(3个0,其中1个已记入5的倍数1个已记入25的倍数) 加上625的倍数(4个0,其中....................................)  1000/5=200  (1000里面含有200个5的倍数，但同时也包含了25倍数，125的倍数，625的倍数各一次)  1000/25=40(1000里面含有40个25的倍数，同时也含有125的倍数，625的倍数各一次)  1000/125=8(1000里面含有8个125的倍数，同时也含有625的倍数)  1000/625=1（1000里含有1个625的倍数）     所以1000！里面含 有0的个数为200+40+8+1=249个 正解，学习了

user: user-7
content: 分析  5的1次幂5的倍数增加1个0 (5,10,15,20,25,30,.....) 5的2次幂25的倍数增加2个0(必然是5的倍数)(25,50,75,100,125.....) 5的3次幂125的倍数增加3个0(必然是25的倍数)(125,250,375,500.....) 5的4次幂625的倍数增加4个0(必然是125的倍数)(625,1250,1875,2500.....) ........... 所以先求出5的倍数 加上25的倍数(2个0,其中1个已记入5的倍数) 加上125的倍数(3个0,其中1个已记入5的倍数1个已记入25的倍数) 加上625的倍数(4个0,其中....................................)  1000/5=200  (1000里面含有200个5的倍数，但同时也包含了25倍数，125的倍数，625的倍数各一次)  1000/25=40(1000里面含有40个25的倍数，同时也含有125的倍数，625的倍数各一次)  1000/125=8(1000里面含有8个125的倍数，同时也含有625的倍数)  1000/625=1（1000里含有1个625的倍数）     所以1000！里面含 有0的个数为200+40+8+1=249个

user: user-8
content: 由于2*5=10，有一个0，（10可以分解成2、5来看），只要求得1000！中可分解为多少个5相乘（2太多）； 1000/5=200，意思是：1000个数可分解为有一个5的有200个：5,10,15。。。。。。。 200/5=20，意思是，200个数中还能继续分解出5的有25、50。。。。。。。 后面都是一样的道理 也就相当于你说的被5、25、125这些整除

user: user-8
content: 1000/5=200; 200/5=40; 40/5=8; 8/5=1; 200+40+8+1=249；
user-0 提问: 折半查找，不能输出的原因

回复:
user: user-0
content: 谢谢，找出来了。有几个地方写错了  #include<stdio.h>  #include<stdlib.h>  #include<time.h> #define N 8 int isearch(int a[], int n, int x); void kuaisu(int *a, int n); void quick(int *a, int left, int right);  int main() {   int arr[N],x,n,i;   srand(time(NULL));   for(i=0;i<N;i++)      {        arr[i]=rand()/1000+100;                  }            kuaisu(arr,N);      printf("输入要查找的数：");   scanf("%d", &x);   n=isearch(arr,N,x);      printf("\n数据序列：\n");   for(i=0;i<N;i++)      {        printf("%d ",arr[i]);                   }     printf("\n\n");     if(n<0)      printf("没有找到数据：%d\n",x);    else      printf("数据：%d位于数组的第%d个元素处。\n",x,n+1);     system("pause");   return 0;    }   void kuaisu(int *a,int n) {   quick(a,0,n-1);      }  void quick(int*a, int left, int right) {   int f, l, r, t;   l=left;   r=right;   f=a[(left+right)/2];   while(l<r)   {     while(a[l]<f)         ++l;     while(a[r]>f)        --r;       if(l<=r)       {t=a[l];a[l]=a[r];a[r]=t; ++l; --r;       }         if(l==r) l++;       if(left<r)          quick(a,left,l-1);       if(l<right)          quick(a,r+1,right);    }      } int isearch(int a[],int n,int x) {   int mid,low,high;     low=0;     high=n-1;     while(low<=high)       {         mid=(low+high)/2;         if(a[mid]==x)           return mid;         else           if(a[mid]>x)             high=mid-1;           else             low=mid+1;                                  }      return -1; }

user: user-1
content: 输入一个小尺寸的数组，debug

user: user-2
content: a[l]<f??
user-0 提问: 为什么不能改成str + i ?

回复:
user: user-1
content: 楼主可以看一下谭浩强《C程序设计》第4版，讲的很清楚。

user: user-1
content: 引用 8 楼 u010165006 的回复:如果是一维数组str[10]，就是： str等于&str[0]等于str+0 str+i等于&str[i] 二维数组的每一个元素就是一个一维数组，代进去就可以了，这样就比较容易理解。 补充：这里意思就是数组名str就是数组的首地址，str+i就是数组（从0开始）第i个元素的地址。

user: user-2
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-3
content: 8楼说得比较清楚了。  但是楼主你要注意一点啊，你那个疑问是在一个函数sort() 里面的，str 是一个输入参数，虽然你写的是char str[][], 但是编译器会把这个认为是一个char **str, 所以str + i 就是一个指针的加减法操作，这里的str + i 指的是从str 这个地址往后偏移sizeof(char *) * i个字节之后的一个地址。

user: user-4
content: str[i]等价于*（str+i）,本身就是取内容了。而str+i是&str[i],是str[i]的地址。两者根本就不是一个概念。

user: user-1
content: 引用 5 楼 u010165006 的回复:str[i]等于*(str+i) str[i][j]等于*(*(str+i)+j) 多维数组可以一直这样套。 左边取地址，右边去掉一个*号： &str[i]等于str+i &str[i][j]等于*(str+i)+j 指针的加减运算也是根据这个公式。

user: user-1
content: 如果是一维数组str[10]，就是： str等于&str[0]等于str+0 str+i等于&str[i] 二维数组的每一个元素就是一个一维数组，代进去就可以了，这样就比较容易理解。

user: user-1
content: 补充： str[i]等于&str[i][0] 即： *(str+i)等于*(str+i)+0

user: user-5
content: 楼上回答很正确！ 楼主我觉得你搞混了啊，你这里是要对字符串进行操作，应该是char *a[10]啊（指针数组）！ void sort ( char str[ 10 ][ 10 ] )等价于void sort ( char （*str）[ 10 ] )也就是说二维数组做形参的时候已经退化为数组指针了！ 有疑问加我Q1179675084

user: user-1
content: str[i]等于*(str+i) str[i][j]等于*(*(str+i)+j) 多维数组可以一直这样套。 左边取地址，右边去掉一个*号： &str[i]等于str+i &str[i][j]等于*(str+i)+j

user: user-6
content: if ( strcmp ( str[ i ] , str[ j ] > 0 ) /* 这里为什么不能写成 if ( strcmp ( (str + i) , (str + j) ) > 0 )*/  //上面的那个函数用的，写错了吧   if ( strcmp ( str[ i ] , str[ j ] ) > 0 )  //这样吧！    至于你说的为什么不用str+ i，这里是不行的！因为这里是二维数组了！ str[i] 和str+ i是不一样的，地址不一样了， 可以把地址打印出来看看，就明白了！

user: user-0
content: 引用 1 楼 user-7 的回复:str[ i ]  和 str+i 一样吗？还是*（str+i）？ 请指点迷津！

user: user-7
content: str[ i ]  和 str+i 一样吗？还是*（str+i）？
user-0 提问: 文件读取及字符串处理

回复:
user: user-1
content: 用shell或者perl等脚本语言更容易。 c++的话直接getline

user: user-2
content: 很明显是作业题，而且连范例都没有 用c++11的regex，不用5分钟  #include <iostream> #include <iterator> #include <regex> #include <string>  int main() { std::string const strs("one,two,three,four,five,six,seven,eight,nine,ten,eleven,NNNN");     std::regex reg_extract(R"(([a-z]*),([a-z]*),([a-z]*),([a-z]*),([a-z]*),([a-z]*),([a-z]*),([a-z]*),([a-z]*),([a-z]*),([a-z]*),(NNNN)\n?)");     std::smatch match;     std::regex_search(strs, match, reg_extract);     for(size_t i = 1; i != match.size() - 1; ++i){         std::cout<<match[i]<<std::endl;     }      std::regex reg_replace_comma(",");     std::cout<<std::regex_replace(strs, reg_replace_comma, "-")<<std::endl;      std::regex reg_replace_newline(R"(\n|\r)");     std::cout<<std::regex_replace(strs, reg_replace_newline, " ")<<std::endl; }   不过这应该不能成为你作业的答案 自己找个regex的lib 或者用标准的c parse 在遇到NNNN以及","不为11之前不停的读入char memory不够了就realloc,一直重复这个步骤直到读入NNNN并检查后面是否跟着\n 剩下来的就是判断“,”的位置，用char**储存各资料 置换 "," "\n" "\r"

user: user-0
content: 假设报文中内容没有NNNN，怎样去读取11个数据项，主要是不知道每个数据项的长度，有没有好的思路

user: user-3
content: 感觉你老师给你出的这道题,不严谨!

user: user-3
content: 如果报文中的正常报文包含NNNN这样的字符,那如何区分这是结束符,还是正常的报文段呢

user: user-4
content: 作业题？
user-0 提问: 求解，使用VS2005的两个问题

回复:
user: user-0
content: 引用 8 楼 xiaohuh421 的回复:1. 调试器只能在当前被调试进程内单步.不能跨进程. 2. 看不到, 说明已经不在范围内了. (注意:全局变量没有特别声明,都是在.cpp范围内有效,其它地方要能查看, 需要以extern声明) 你说看不到, 多半是当前执行到其它.cpp中了.  多谢！

user: user-0
content: 引用 5 楼 caozhy 的回复:我估计是你自己概念不清楚。  别乱扣帽子啊，有事说事

user: user-1
content: 学会使用WinDbg

user: user-2
content: 1. 调试器只能在当前被调试进程内单步.不能跨进程. 2. 看不到, 说明已经不在范围内了. (注意:全局变量没有特别声明,都是在.cpp范围内有效,其它地方要能查看, 需要以extern声明) 你说看不到, 多半是当前执行到其它.cpp中了.

user: user-0
content: 引用 15 楼 caozhy 的回复:[quote=引用 14 楼 jiaoyun007 的回复:] [quote=引用 12 楼 caozhy 的回复:] [quote=引用 10 楼 jiaoyun007 的回复:] [quote=引用 5 楼 caozhy 的回复:] 我估计是你自己概念不清楚。  别乱扣帽子啊，有事说事[/quote]  就是说你的事啊。[/quote]  要向8F的兄弟学习[/quote]  我表达的和他不是一个意思么。[/quote]  经过鉴定，是一个意思

user: user-3
content: 引用 14 楼 jiaoyun007 的回复:[quote=引用 12 楼 caozhy 的回复:] [quote=引用 10 楼 jiaoyun007 的回复:] [quote=引用 5 楼 caozhy 的回复:] 我估计是你自己概念不清楚。  别乱扣帽子啊，有事说事[/quote]  就是说你的事啊。[/quote]  要向8F的兄弟学习[/quote]  我表达的和他不是一个意思么。

user: user-0
content: 引用 12 楼 caozhy 的回复:[quote=引用 10 楼 jiaoyun007 的回复:] [quote=引用 5 楼 caozhy 的回复:] 我估计是你自己概念不清楚。  别乱扣帽子啊，有事说事[/quote]  就是说你的事啊。[/quote]  要向8F的兄弟学习

user: user-4
content: 8楼正解

user: user-3
content: 引用 10 楼 jiaoyun007 的回复:[quote=引用 5 楼 caozhy 的回复:] 我估计是你自己概念不清楚。  别乱扣帽子啊，有事说事[/quote]  就是说你的事啊。

user: user-3
content: 引用 6 楼 user-5 的回复:[quote=引用 5 楼 caozhy 的回复:] 我估计是你自己概念不清楚。 曹帅涉猎范围好广啊！哈哈[/quote]  呵呵，你头像的小狗好萌啊。

user: user-5
content: 引用 5 楼 caozhy 的回复:我估计是你自己概念不清楚。 曹帅涉猎范围好广啊！哈哈

user: user-3
content: 我估计是你自己概念不清楚。

user: user-3
content: 1） 使用单步跟踪，要是系统调用跨进程了，断点还会继续跟踪到吗 什么叫跨进程，肯定不能直接调试别的进程，除非另一个进程本身也处在调试状态。 2） 一个全局变量的值，开始可以看到，程序运行到一定时候之后，再想通过点右键选择watch，想查看它的值就不成功了，这是为何？ 你确认是“全局变量”么？按理说不会。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390439995  谢了，不过内容太多了，现在就想知道问题的答案，呵呵

user: user-1
content: http://bbs.csdn.net/topics/390439995

user: user-0
content: UP,顶下哎
user-0 提问: 把数字转化成字符串，用共用体实现时遇到的问题

回复:
user: user-1
content: 引用 7 楼 yaxiya 的回复:个人常用：sprintf()函数；非常简单 英雄所见略同。

user: user-2
content: 引用 8 楼 u012174761 的回复:引用 5 楼 abclovem 的回复:引用 4 楼 abclovem 的回复:[quote=引用 2 楼 BruceXiaotao 的回复:] 你这样写是不对的  但是在进行内存解析的时候是把数据转换成为了ASCII码了   比如如果你输入49的话  那么转换出来的字符就是1.谢谢啦！一语中的，查看内存空间就是这样！大神，帮忙看看我的子函数返回用法是不是有问题啊？返回临时变量了？ 你只是返回值而已，没什么啊[/quote] 额，看错了，确实是返回了临时变量，加static吧

user: user-2
content: 引用 5 楼 abclovem 的回复:引用 4 楼 abclovem 的回复:引用 2 楼 BruceXiaotao 的回复:你这样写是不对的  但是在进行内存解析的时候是把数据转换成为了ASCII码了   比如如果你输入49的话  那么转换出来的字符就是1.谢谢啦！一语中的，查看内存空间就是这样！大神，帮忙看看我的子函数返回用法是不是有问题啊？返回临时变量了？ 你只是返回值而已，没什么啊

user: user-3
content: 个人常用：sprintf()函数；非常简单

user: user-4
content: itoa sprintf boost::lexical_cast

user: user-0
content: 引用 4 楼 abclovem 的回复:引用 2 楼 BruceXiaotao 的回复:你这样写是不对的  但是在进行内存解析的时候是把数据转换成为了ASCII码了   比如如果你输入49的话  那么转换出来的字符就是1.谢谢啦！一语中的，查看内存空间就是这样！大神，帮忙看看我的子函数返回用法是不是有问题啊？返回临时变量了？

user: user-0
content: 引用 2 楼 BruceXiaotao 的回复:你这样写是不对的  但是在进行内存解析的时候是把数据转换成为了ASCII码了   比如如果你输入49的话  那么转换出来的字符就是1.谢谢啦！一语中的，查看内存空间就是这样！

user: user-0
content: 引用 1 楼 user-6 的回复:union intch {         int a;         char p[10];     } temp; 首先你定义变量就没有初始化  你的代码应该和下面是一样的 char p【10】= {0} int a = 12345 memcpy（p，&a,4）谢谢啦！对了，这里还有个问题，就是我的子函数返回用法是不是有问题啊？返回临时变量了？

user: user-5
content: 你这样写是不对的  但是在进行内存解析的时候是把数据转换成为了ASCII码了   比如如果你输入49的话  那么转换出来的字符就是1.

user: user-6
content: union intch {         int a;         char p[10];     } temp; 首先你定义变量就没有初始化  你的代码应该和下面是一样的 char p【10】= {0} int a = 12345 memcpy（p，&a,4）
user-0 提问: 求教！！！ 关于三连棋游戏编程问题

回复:
user: user-1
content: 你只给出程序的一个处理部分 注释是英语写的 没人知道你游戏的规则是什么 估计没人会回答你这个问题 因为它既复杂 又不是太好解决  只能说明你描述问题的方式 和准确程度不是很好
user-0 提问: 连续使用内存拷贝函数

回复:
user: user-1
content: #include <stdio.h> #include <string.h>  int main(void) { 	char *src = "helloworld"; 	char *dst = "hello"; 	char tmp[20] = {0}; 	memcpy(tmp, dst, 5); 	memcpy(tmp+5, src, 10); 	 	printf("%s\n", tmp);  	return 0; }
user-0 提问: 请教一个算法：有N个介于1到100之间的数,设计一种算法能最快的找出所有的这些数的组合,是该组合内的所有的数之和大于100

回复:
user: user-1
content: 有2^N种排列，全部计算一遍，效率奇低，N不能大于30. #define N=10; main() { int i,j,s=1<<N, a[N]={30,31,32,33,34,35,36,37,38,39},sum,result=0;   for(i=0;i<s;i++)   { sum=0;     for(j=0;j<N;j++)     {  if(i>>j&1) sum+=a[j]; }     if(sum>100) result++;    }  printf("%d\n",result); }

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

user: user-3
content: 实测可用  #include "stdafx.h" #include <iostream> #include <string> #include <stdio.h> using namespace std; void GetBiggerThan(int* arr,int arrnum,int start,int bigthan,string curres) { 	char buffer[5]; 	for(int i=start;i<arrnum;i++){ 		if(arr[i]<bigthan){ 			sprintf_s(buffer,"%d ",arr[i]); 			GetBiggerThan(arr,arrnum,i+1,bigthan-arr[i],curres+string(buffer)); 		} 		else 		{ 		  sprintf_s(buffer,"%d ",arr[i]); 		  curres+=string(buffer); 		  cout<<curres<<endl; 		}  	} }  int _tmain(int argc, _TCHAR* argv[]) { 	int a[10]={23,24,25,26,27,28,29,30,31,32}; 	GetBiggerThan(a,10,0,100,string("")); 	getchar(); 	return 0; }

user: user-4
content: 用递归应该简单些 先考虑2个数的情况，先定一个比较小的，那么大数的数目随之确定 三个的话类似，先定一个最小的,然后调用2个数的情况

user: user-5
content: 有N个介于1到100之间的数 先对这N个数进行排序 之后从大到小一次扣点

user: user-6
content: 昨天笔试竟然看到这道题了

user: user-7
content: 每次先挑n个数中一定能够满足，n个至少比他的大的数的和>x 的那个数，比他大的其他个数也一定满足 然后，每找出一个组合算一种。         这种组合的第一个数,从n/x~ 最大数中挑选。即从 n/x ~100 中挑选  每次只找一个数。n个数需要找n-1步，才能找到一个组合。 这样从1个数到N个数,都查找一遍,就得到所有组合的个数.

user: user-7
content: 1 个数不用考虑 2个数,不用考虑,都在在 50 之内 3个数,不要考虑,都在 33 以内选数 4个数,不要考虑,都在 25 以内选数 n个数,不要考虑,都在 100/n 以内选数  n 个数,不要考虑,都在 sum/n 以内,使得 sum>100 按照这个规律,每次挑一个数x满足 x>= sum/n

user: user-8
content: 想了一个，觉得不好。。。 先排列得到a<=b<=e<=........f<=g; 以最大数为基准（g），向前遍历，先找一个的可以满足的情况(比如可能有f+g>100）。直到找到不能满足的停止。每一组满足的组合算一种，而且与当前这个数之前的任意n个数都是满足情况的。 对于找到的第一个不满足得数，可以以2个数为一步进行遍历，比如（b+e+g），还是以上的规律，找到一组，则这组数与这组数之前的任意数或几个数都能构成满足的情况。 对于第一组不满足2个数便利的情况，再分为3个数一组。。。。。这样。 然后以次大数为基准。。。。。。 效率貌似奇低。。。

user: user-9
content: 引用 1 楼 lm_whales 的回复:1 个数不用考虑 2个数,不用考虑,都在在 50 之内 3个数,不要考虑,都在 33 以内选数 4个数,不要考虑,都在 25 以内选数 n个数,不要考虑,都在 100/n 以内选数  n 个数,不要考虑,都在 sum/n 以内,使得 sum>100 按照这个规律,每次挑一个数x满足 x>= sum/n ls的算法有问题，x>=sum/n只是平均情况
user-0 提问: 请问，这个非递归快速排序程序在子函数中为什么要用top作为循环终止的条件？

回复:
user: user-0
content: 为什么要让Stack[top]在Stack[0]与Stack[1]中来回赋值，不让它住上加，就像Stack[2]，Stack[3]等等？

user: user-0
content: 第二个网址会出现“未找到此网页”的提示。

user: user-0
content: 我的电脑下载不了；会出现：  错误  您所请求的网址（URL）无法获取。  的信息。

user: user-1
content: 先 http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装  再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\qsort.c
user-0 提问: scanf的输入格式问题

回复:
user: user-1
content: 自己输入12就行了。

user: user-2
content: scanf函数格式输入函数，匹配输入！

user: user-3
content: 引用 2 楼 j0903 的回复:#include<stdio.h>   int main() {     int a,b;        scanf("%d %d",&a,&b);      printf("%d\n",a+b);       return 0; }应该不是那个问题

user: user-4
content: 引用 楼主 zwb8848happy 的回复: #include<stdio.h>  int main() { 	int a,b;       scanf("%d,%d",&a,&b);      printf("%d\n",a+b);  	return 0; }   这个代码，我输入1 2时，b就是乱码。 我知道输入格式不对，但是具体为什么就不知道了，求大神  输入格式 一定要和 格式符  匹配

user: user-5
content: 你的scanf("%d,%d",&a,&b);中加了逗号 就要按照你规定的来输入。 建议不要在scanf("")里面不要加逗号，空格。 通常都是scanf("%d%d",&a,&b);

user: user-6
content: 使用scanf 输入 它严格要求输入一样，否则，输入缓冲区导致错误，得到结果就是错的

user: user-7
content: 楼主应该看一下scanf()；函数的用法，如果你在scanf()；函数的输入里面包含了一些除了标准控制符（%d,%s,%c）以外的东西,比如其他的标点符号，那么你在输入的时候就要把这个符号也输入进去，因为它是按顺寻读入的，你在上面的例子中输入1（空格）2，因为没有输入“，”（逗号）,scanf()；就会出错了。

user: user-8
content: 当你遇到 问题是 要学会自己调试 F11 或F10 都可以

user: user-9
content: 逗号换成空格

user: user-9
content: #include<stdio.h>   int main() {     int a,b;        scanf("%d %d",&a,&b);      printf("%d\n",a+b);       return 0; }

user: user-10
content: 1,2 具体想知道为什么不对，分析scanf源代码
user-0 提问: core dump问题

回复:
user: user-1
content: warning: core file may not match specified executable file. 说明你这个core不是这个程序产生的

user: user-0
content: http://dpaste.com/hold/1420712/

user: user-2
content: 引用 4 楼 wufei80 的回复:signal 11指的是无效的内存引用，该问题产生的根源非常多  从你贴的那些东东，只能知道是因为引用内存失败，得接着往下看堆栈啊。  比较常见的是指针没有初始化， 数组越界

user: user-3
content: signal 11指的是无效的内存引用，该问题产生的根源非常多  从你贴的那些东东，只能知道是因为引用内存失败，得接着往下看堆栈啊。

user: user-4
content: Program terminated with signal 11, Segmentation fault. #0  0x00007f13f0b1b5a2 in _int_malloc () from /lib64/libc.so.6  如果是内存泄漏导致malloc失败，排除内存泄漏。 如果是内存不够用，用mmap或用文件读写模拟内存读写。

user: user-4
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令
user-0 提问: 数组中，讲最小的数与第一个交换，最大的与最后一个交换遇到的一个问题

回复:
user: user-1
content: temp=number[0];number[0]=*min;*min=temp; ／／这时number位置已经变成最小值了，min是原来number位置的值     if(max==number)man=min;   //如果原来number位置是最大值，现在min就是最大值     temp=number[9];number[9]=*max;*max=temp;

user: user-0
content: 嗯  代码是这样的  打错了  犯了低级错误

user: user-1
content: if(max==number)man=min;
user-0 提问: 矩阵，算法，在线测试题，求牛人解答，非常感谢。

回复:
user: user-1
content: 引用 4 楼 lelieven 的回复:多源多点最短路径问题，用floyd算法。 代码如下 int i,j,k; int a[n-1][n-1]; //n为顶点数 将上述数组初始化，初值为2^32-1; for(k=0;k<n;k++) {    for(i=0;i<n;i++)    {    for(j=0;j<n;j++)    {       if(a[i][j] < a[i][k] +a[k][j])          a[i][j] < a[i][k] +a[k][j];    }    } } 写错了，是这个 int i,j,k; int a[n-1][n-1]; //n为顶点数 将上述数组初始化，初值为2^32-1; for(k=0;k<n;k++) {    for(i=0;i<n;i++)    {    for(j=0;j<n;j++)    {       if(a[i][j] < a[i][k] +a[k][j])          a[i][j] = a[i][k] +a[k][j];    }    } }

user: user-1
content: 多源多点最短路径问题，用floyd算法。 代码如下 int i,j,k; int a[n-1][n-1]; //n为顶点数 将上述数组初始化，初值为2^32-1; for(k=0;k<n;k++) {    for(i=0;i<n;i++)    {    for(j=0;j<n;j++)    {       if(a[i][j] < a[i][k] +a[k][j])          a[i][j] < a[i][k] +a[k][j];    }    } }

user: user-2
content: 求大牛解答。

user: user-0
content: 牛人哪里去了啊

user: user-3
content: 加权最短路径？
user-0 提问: 文件操作

回复:
user: user-0
content: 谢谢  各位我解决了，那个回车键  我们按下会返回两个值分别为 \r\n   我就加在字符串后面 就ok了   char str1[N] = "C:\\Documents \r\n"; char str2[N] = "and Settings\\ \r\n"; char str3[N] = "Administrator";

user: user-1
content: 三楼我看行！！

user: user-2
content: 3楼的应该可以吧

user: user-3
content: #include <stdio.h> #define N 256  int main(void) { 	char str1[N] = "C:\\Documents "; 	char str2[N] = "and Settings\\"; 	char str3[N] = "Administrator"; 	FILE *fp; 	 	if( !(fp = fopen("新建文件.txt","wb+"))) 	{ 		printf("打开失败!\n"); 		exit(1); 	} 	 	fputs(str1,fp);         fputc('\r',fp);         fputc('\n',fp);  	fputs(str2,fp);         fputc('\r',fp);         fputc('\n',fp);  	fputs(str3,fp);	         fputc('\r',fp);         fputc('\n',fp); 	fclose(fp); 	return 0; } 楼主试试

user: user-4
content: #include <stdio.h> #define N 256   int main(void) {     char str1[N] = "C:\\Documents \n";       char str2[N] = "and Settings\\ \n";     char str3[N] = "Administrator\n";     FILE *fp;           if( !(fp = fopen("新建文件.txt","wb+")))     {         printf("打开失败!\n");         exit(1);     }           fputs(str1,fp);     fputs("\n",fp);     fputs(str2,fp);     fputs("\n",fp);     fputs(str3,fp);     fclose(fp);     return 0; }

user: user-5
content: 在LINUX下试了，在每个字符串后面加个\n就可以换行的
user-0 提问: 关于x86 gcc2.9 变量对齐

回复:
user: user-0
content: 引用 3 楼 max_min_ 的回复:[quote=引用 2 楼 insisted_search 的回复:] 你说的我已经试过了，我们试了很多种，最后觉得应该是编译器的问题，因为我们用的编译器是tornado2.2里面的，这个编译器是风河修改gcc2.9.6得来的，可能修改了某些东西，我们不知道。现在我们决定还是把变量进行初始化，放在data段。[quote=引用 1 楼 turingo 的回复:] 应该这样用，你的写法是结构体内部的对齐：  #include <stdio.h>  typedef struct { 	int x; 	int y; }point_t;  point_t pt[5] __attribute__((__aligned__(0x1000)));  int main(int argc, char* argv[]) { 	printf("%p\n", &pt[0]);  	return 0; }   [quote=引用 楼主 insisted_search 的回复:] 在头文件中定义  typedef struct { xxxx； xxxx }structname __attribute__((__aligned__(0x1000)));  在源文件中使用：  structname yyyy[5];  yyyy 的地址没有按照4k进行对齐。 请问怎么才能让它在编译的时候进行对齐。 如果声明成：  structname yyyy[5] ={0};  可以进行对齐，但是我不希望yyyy被放在data段。 请各位帮忙，在gcc2.9下如何才能让yyyy在bss段，并地址按照4k进行对齐。[/quote][/quote] 换了方式测试结果达到要求了么？为什么不放在data段呢？[/quote] 如果放在data段，bin文件会变得比较大，这样加载的时间也会变得更长。

user: user-1
content: 引用 2 楼 insisted_search 的回复:你说的我已经试过了，我们试了很多种，最后觉得应该是编译器的问题，因为我们用的编译器是tornado2.2里面的，这个编译器是风河修改gcc2.9.6得来的，可能修改了某些东西，我们不知道。现在我们决定还是把变量进行初始化，放在data段。[quote=引用 1 楼 turingo 的回复:] 应该这样用，你的写法是结构体内部的对齐：  #include <stdio.h>  typedef struct { 	int x; 	int y; }point_t;  point_t pt[5] __attribute__((__aligned__(0x1000)));  int main(int argc, char* argv[]) { 	printf("%p\n", &pt[0]);  	return 0; }   [quote=引用 楼主 insisted_search 的回复:] 在头文件中定义  typedef struct { xxxx； xxxx }structname __attribute__((__aligned__(0x1000)));  在源文件中使用：  structname yyyy[5];  yyyy 的地址没有按照4k进行对齐。 请问怎么才能让它在编译的时候进行对齐。 如果声明成：  structname yyyy[5] ={0};  可以进行对齐，但是我不希望yyyy被放在data段。 请各位帮忙，在gcc2.9下如何才能让yyyy在bss段，并地址按照4k进行对齐。[/quote][/quote] 换了方式测试结果达到要求了么？为什么不放在data段呢？

user: user-0
content: 你说的我已经试过了，我们试了很多种，最后觉得应该是编译器的问题，因为我们用的编译器是tornado2.2里面的，这个编译器是风河修改gcc2.9.6得来的，可能修改了某些东西，我们不知道。现在我们决定还是把变量进行初始化，放在data段。引用 1 楼 turingo 的回复:应该这样用，你的写法是结构体内部的对齐：  #include <stdio.h>  typedef struct { 	int x; 	int y; }point_t;  point_t pt[5] __attribute__((__aligned__(0x1000)));  int main(int argc, char* argv[]) { 	printf("%p\n", &pt[0]);  	return 0; }   [quote=引用 楼主 insisted_search 的回复:] 在头文件中定义  typedef struct { xxxx； xxxx }structname __attribute__((__aligned__(0x1000)));  在源文件中使用：  structname yyyy[5];  yyyy 的地址没有按照4k进行对齐。 请问怎么才能让它在编译的时候进行对齐。 如果声明成：  structname yyyy[5] ={0};  可以进行对齐，但是我不希望yyyy被放在data段。 请各位帮忙，在gcc2.9下如何才能让yyyy在bss段，并地址按照4k进行对齐。[/quote]

user: user-2
content: 应该这样用，你的写法是结构体内部的对齐：  #include <stdio.h>  typedef struct { 	int x; 	int y; }point_t;  point_t pt[5] __attribute__((__aligned__(0x1000)));  int main(int argc, char* argv[]) { 	printf("%p\n", &pt[0]);  	return 0; }  引用 楼主 insisted_search 的回复:在头文件中定义  typedef struct { xxxx； xxxx }structname __attribute__((__aligned__(0x1000)));  在源文件中使用：  structname yyyy[5];  yyyy 的地址没有按照4k进行对齐。 请问怎么才能让它在编译的时候进行对齐。 如果声明成：  structname yyyy[5] ={0};  可以进行对齐，但是我不希望yyyy被放在data段。 请各位帮忙，在gcc2.9下如何才能让yyyy在bss段，并地址按照4k进行对齐。
user-0 提问: windows下SYSTEMTIME如何转换成毫秒数

回复:
user: user-1
content: time_t SystemTimeToTimet(SYSTEMTIME& st)  {      FILETIME ft;      SystemTimeToFileTime( &st, &ft );      LONGLONG nLL;      ULARGE_INTEGER ui;      ui.LowPart = ft.dwLowDateTime;      ui.HighPart = ft.dwHighDateTime;      nLL = (ft.dwHighDateTime << 32) + ft.dwLowDateTime;      time_t pt = (long)((LONGLONG)(ui.QuadPart - 116444736000000000) / 10000);      return pt;  }

user: user-2
content: UINT CMyButton::GetDownUpInterval() { 	COleDateTime start(m_downTime); 	COleDateTime end(m_upTime); 	COleDateTimeSpan interval = end - start;  	return interval.GetTotalSeconds() * 1000 + m_upTime.wMilliseconds - m_downTime.wMilliseconds; }

user: user-2
content: SYSTEMTIME  m_sysTime,m_time; COleDateTime dTimeF(m_sysTime); 转换为COleDateTimeSpan，然后GetTotalSeconds即可得到秒数 最后在加上m_sysTime的毫秒即可

user: user-3
content: 引用 3 楼 jha334201553 的回复:那么麻烦，C标准函数 time( <ime );得到的就是毫秒数sorry，秒数

user: user-3
content: 那么麻烦，C标准函数 time( <ime );得到的就是毫秒数

user: user-4
content: 引用 7 楼 zhao4zhong1 的回复:有可能差8小时。  那时时区的原因

user: user-5
content: long long get_wMilliseconds((&newtime) {  return 毫秒加秒× 1000 +。。。。。 } 1970-1-1以来的毫秒数 这个数用毫秒表示太大了吧 没意义得多从1970-1-1以来的毫秒数 GetTickCount(); 得到操作系统开始运行到现在的毫秒数

user: user-5
content: typedef struct _SYSTEMTIME {     WORD wYear;     WORD wMonth;     WORD wDayOfWeek;     WORD wDay;     WORD wHour;     WORD wMinute;     WORD wSecond;     WORD wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;  WORD wMilliseconds;取出来

user: user-6
content: 有可能差8小时。

user: user-6
content: 不一定对，仅供参考： #include <stdio.h> #include <windows.h> int main() {     SYSTEMTIME st;     FILETIME ft,ft19700101;     LARGE_INTEGER *pli,*pft,ms_from_19700101;      st.wYear=1970;     st.wMonth=1;     st.wDay=1;     st.wHour=0;     st.wMinute=0;     st.wSecond=0;     st.wMilliseconds=0;     SystemTimeToFileTime(&st,&ft19700101);     pft=(LARGE_INTEGER *)&ft19700101;       GetLocalTime(&st);     SystemTimeToFileTime(&st,&ft);     pli=(LARGE_INTEGER *)&ft;     ms_from_19700101.QuadPart=(pli->QuadPart - pft->QuadPart)/100000i64;     printf("ms_from_19700101==%I64d\n",ms_from_19700101.QuadPart);     return 0; } //ms_from_19700101==138210430332 //
user-0 提问: c程序

回复:
user: user-0
content: c就可以呀 ，我记得还可以调用cpu的运行速度，控制硬盘的读取速度。以前有过丢了

user: user-1
content: 困难　为什么要这么做

user: user-2
content: 门外哟开关·

user: user-3
content: 你想让intel 上吊

user: user-4

user: user-5
content: 这个是硬件条件的关系吧！用户层搞不定了的吧！

user: user-6
content: 我也想要，呵呵！

user: user-7
content: 同求.............
user-0 提问: 结构体变量占用空间大小的疑惑

回复:
user: user-0
content: 感谢各位大牛的细心指导。小白明白了。。

user: user-1
content: 内存对齐·！~

user: user-2
content: google 对齐

user: user-2
content: google 对齐

user: user-3
content: 一般不会一样的 首先成员和内存，不对齐的成员会被调整到对齐的位置 其次，如何包含虚函数，会生成虚表入口指针

user: user-4
content: 献丑了http://blog.csdn.net/zshuaiqin/article/details/8897430

user: user-5
content: 第一点：结构中每个成员的对齐开始地址必须是自身的整数倍，不是的话就向后补齐 二：结构体的总大小必须是成员中最大对齐量的整数倍  你的例子： no，4byte num，10byte a， 1byte b，开始值15,不是自身4的倍数，向上取整16,加上4 总共4+10+1+（1）+4=20, 20是4（最大对齐量）的倍数，不用不齐了。完毕。  ps。这是google来的。。。。。。。。。。。。

user: user-6
content: 4字节内存对齐,char a; 后补一个字节。       struct student     {         int no;         char num[10];         char a;         int b;     }stu;

user: user-7
content: struct student     {         int no;         char num[10]; //这里有个对齐的！         char a;          char resver; //加上这个字节就对了 这里空余的一个字节不够放一个int字节的         int b;     }stu;

user: user-8
content: google一下内存对齐

user: user-0
user-0 提问: 输入多组字符，为什么老是输入不进去每一组的最后一个字符？

回复:
user: user-0
content: 嗯，明白啦。 顺便找个算法必须改成这样才正确。 	while(n--) 	{ 		ch1=getchar();ch2=getchar();ch3=getchar();getchar(); 		exchange(ch1,ch2); 		exchange(ch2,ch3); 		exchange(ch1,ch2); 		printf("%c %c %c\n",ch1,ch2,ch3); 	}

user: user-1
content: 应该是每次的回车符引起的！修改下程序

user: user-2
content: 因为 你每次都要getchar()一次。循环第一次是正确的   第二次开始getchar会获取回车符，所以ch1，ch2，ch3当中有一个 是回车。  修改方法你在ch1=getchar();ch2=getchar();ch3=getchar();这句后面再加个getchar();就OK了
user-0 提问: 本人菜鸟，，，头擦法建立链表，编译没有问题执行结果有点出入，求指教！

回复:
user: user-1
content: 引用 6 楼 gerrard0616 的回复:帮你调试了一下，你的createlist()函数写的有问题，getchar只能接收到一个字符，把getchar放入 while((ch=getchar())!='\n')接收， 创建时r = head 放到 head = NULL判断里; 还有main函数输出时 do ... while中while改成while(newlist != NULL ）； 楼上正解

user: user-2
content: 帮你调试了一下，你的createlist()函数写的有问题，getchar只能接收到一个字符，把getchar放入 while((ch=getchar())!='\n')接收， 创建时r = head 放到 head = NULL判断里; 还有main函数输出时 do ... while中while改成while(newlist != NULL ）；

user: user-3
content: 引用 4 楼 u012222078 的回复:麻烦你们帮我看看这个 编译运行都没问题就是不能显示结构。。用尾插法建立链表 #include <stdio.h> #include <stdlib.h> typedef	char datatype;//用datatype定义数据域数据类型 //创建结构体来表示结点 typedef struct node { 	datatype data;//数据域 	struct node *pNext;//指针域 }listnode ; typedef listnode *linklist; listnode *p; //用createlist函数创建链表  linklist createlist (void )  { 	 char ch; 	 linklist head;//定义头结点 	 listnode *p,*r;//r表示末尾指针 	 head = NULL;//头指针的初始化 	 r = NULL;//末指针的初始化 	 r = head ;// 让头指针和末指针指向同一个地址 	 ch  = getchar(); 	 while(ch != '\n'){ 		 p = (listnode *)malloc(sizeof(listnode));//为p循环赋值 		 p->data = ch;//为数值域赋值 		 if(head ==NULL){ 			 head = p;//令head指向以一个结点 		 } 		 else{ 			 r->pNext = p;//把p擦人到链表的尾部 			 r = p;//末尾指针后移一位 		 }  	 } 		if(head != NULL) 			r->pNext = NULL; 		return(head);  }  main(void )  { 	 linklist newlist = createlist();//newlist链表的声明和建立 	 //链表的输出 	 do{ 		 printf("%c",newlist->data); 		 newlist = newlist->pNext;  	 }while(newlist->pNext != NULL); 		 printf("\n"); 		 return 0;  } 这个有什么问题呢  是编译不过，还是运行崩溃？r=NULL;r->pnext=XXX;这样写似乎不行！

user: user-0
content: 麻烦你们帮我看看这个 编译运行都没问题就是不能显示结构。。用尾插法建立链表 #include <stdio.h> #include <stdlib.h> typedef	char datatype;//用datatype定义数据域数据类型 //创建结构体来表示结点 typedef struct node { 	datatype data;//数据域 	struct node *pNext;//指针域 }listnode ; typedef listnode *linklist; listnode *p; //用createlist函数创建链表  linklist createlist (void )  { 	 char ch; 	 linklist head;//定义头结点 	 listnode *p,*r;//r表示末尾指针 	 head = NULL;//头指针的初始化 	 r = NULL;//末指针的初始化 	 r = head ;// 让头指针和末指针指向同一个地址 	 ch  = getchar(); 	 while(ch != '\n'){ 		 p = (listnode *)malloc(sizeof(listnode));//为p循环赋值 		 p->data = ch;//为数值域赋值 		 if(head ==NULL){ 			 head = p;//令head指向以一个结点 		 } 		 else{ 			 r->pNext = p;//把p擦人到链表的尾部 			 r = p;//末尾指针后移一位 		 }  	 } 		if(head != NULL) 			r->pNext = NULL; 		return(head);  }  main(void )  { 	 linklist newlist = createlist();//newlist链表的声明和建立 	 //链表的输出 	 do{ 		 printf("%c",newlist->data); 		 newlist = newlist->pNext;  	 }while(newlist->pNext != NULL); 		 printf("\n"); 		 return 0;  } 这个有什么问题呢

user: user-0
content: 大神们，，，我知道了是我太愚昧，，，}while(newlist->pNext != NULL);改成}while(newlist != NULL);就好了。

user: user-0
content: 引用 1 楼 user-4 的回复:楼主再循环语句while(newlist->pNext != NULL);后面再加一条输出一句printf("%c",newlist->data);就可以了 这是什么原因呢？

user: user-4
content: 楼主再循环语句while(newlist->pNext != NULL);后面再加一条输出一句printf("%c",newlist->data);就可以了
user-0 提问: 请教一个C语言中的问题

回复:
user: user-0
content: 引用 5 楼 AnYidan 的回复:[quote=引用 1 楼 z1179675084 的回复:] scanf("%c,%c",&year,&month);year，和month是什么类型？  数据类型很重要[/quote]  引用 4 楼 syrchina 的回复: /* 输入年月，判断该月天数！                        */ #include <stdlib.h> #include <stdio.h>  int main(void) {     int year,month;     int days=20;     printf("请输入:\n");     scanf("%d%d",&year,&month);//←      if(year%4==0&&year%100!=0||year%400==0)     {         if(month==2)             printf("days=29");         else if(month==4||month==6||month==9||month==11)             printf("days=30\n");         else             printf("days=31\n");     }     else     {         if(month==2)             printf("days=28");         else if(month==4||month==6||month==9||month==11)             printf("days=30");         else             printf("days=31");      }          system("PAUSE");     return 0; } 引用 3 楼 max_min_ 的回复: //格式化输入函数，int类型对应用%d， 如果是 char 类型对应才用%c scanf("%d  %d", &year, &month); 引用 2 楼 u011717322 的回复:你定义的int year,month; 输出的%c？ 匹配的到 ？ 还有你最后 return 0; system("PAUSE"); return了，你的窗口能停？ 改：system("PAUSE");    return 0; 引用 1 楼 z1179675084 的回复:scanf("%c,%c",&year,&month);year，和month是什么类型？   多谢各位大哥大姐，谢谢！那个PAUSE我检查出来了，可是我也太马虎了，那个数据类型没注意 ！谢谢！

user: user-1
content: 引用 1 楼 z1179675084 的回复:scanf("%c,%c",&year,&month);year，和month是什么类型？  数据类型很重要

user: user-2
content: /* 输入年月，判断该月天数！                        */ #include <stdlib.h> #include <stdio.h>  int main(void) {     int year,month;     int days=20;     printf("请输入:\n");     scanf("%d%d",&year,&month);//←      if(year%4==0&&year%100!=0||year%400==0)     {         if(month==2)             printf("days=29");         else if(month==4||month==6||month==9||month==11)             printf("days=30\n");         else             printf("days=31\n");     }     else     {         if(month==2)             printf("days=28");         else if(month==4||month==6||month==9||month==11)             printf("days=30");         else             printf("days=31");      }          system("PAUSE");     return 0; }

user: user-3
content: //格式化输入函数，int类型对应用%d， 如果是 char 类型对应才用%c scanf("%d  %d", &year, &month);

user: user-4
content: 你定义的int year,month; 输出的%c？ 匹配的到 ？ 还有你最后 return 0; system("PAUSE"); return了，你的窗口能停？ 改：system("PAUSE");    return 0;

user: user-5
content: scanf("%c,%c",&year,&month);year，和month是什么类型？
user-0 提问: 写入文件的路径的问题

回复:
user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:int tid = 01002356;//如果确认此处是八进制数 sprintf(pathfile,"md D:\\gdptb\\adr\\fppcfg\\%08o", tid);//将%d改为%08o ？ 多谢赵老师！

user: user-1
content: int tid = 01002356;//如果确认此处是八进制数 sprintf(pathfile,"md D:\\gdptb\\adr\\fppcfg\\%08o", tid);//将%d改为%08o ？

user: user-1
content: 引用 3 楼 shiguojie19892 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] char pathfile[100]; int tid = 01002356;//八进制数？ sprintf(pathfile,"md D:\\gdptb\\adr\\fppcfg\\%d", tid); system(pathfile);//创建目录   sprintf(pathfile,"D:\\gdptb\\adr\\fppcfg\\%d\\fppcfh.ini", tid); FILE* fp; if(NULL ==(fp = fopen(pathfile,"w"))) return false; 如果目录存在会怎么样？是覆盖是还放过？[/quote] 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:char pathfile[100]; int tid = 01002356;//八进制数？ sprintf(pathfile,"md D:\\gdptb\\adr\\fppcfg\\%d", tid); system(pathfile);//创建目录   sprintf(pathfile,"D:\\gdptb\\adr\\fppcfg\\%d\\fppcfh.ini", tid); FILE* fp; if(NULL ==(fp = fopen(pathfile,"w"))) return false; 如果目录存在会怎么样？是覆盖是还放过？

user: user-1
content: char pathfile[100]; int tid = 01002356;//八进制数？ sprintf(pathfile,"md D:\\gdptb\\adr\\fppcfg\\%d", tid); system(pathfile);//创建目录   sprintf(pathfile,"D:\\gdptb\\adr\\fppcfg\\%d\\fppcfh.ini", tid); FILE* fp; if(NULL ==(fp = fopen(pathfile,"w"))) return false;

user: user-2
content: 1 int tid = 01002356;这里有问题的吧！0开头 八进制会有问题的 2 char pathfile[100] = {0}; 清零下
user-0 提问: 学习makefile的一个问题

回复:
user: user-1
content: 抱歉抱歉，俺以为第一句话是你说的，没注意是楼主说的。你敢再懒一点吗？用个引用会死啊。 引用 5 楼 FancyMouse 的回复:>而且从.c文件中读取include语句，自动推导对头文件的依赖很难实现吗？ 你可以gcc -M然后把生成的文件给Makefile去import

user: user-1
content: make还要去解析.c文件中的include？那是不是接下来还要分析c的语法？自己实现编译？自己再实现链接？然后再创建一个环境，让生成的代码执行？ 请不要脱离了make的本意。make只是用来做批处理的，除了makefile之外，它可以根据文件名来简单推导一些东西，但你让它去读include，我只能说这很操蛋。 引用 5 楼 FancyMouse 的回复:>而且从.c文件中读取include语句，自动推导对头文件的依赖很难实现吗？ 你可以gcc -M然后把生成的文件给Makefile去import

user: user-2
content: >而且从.c文件中读取include语句，自动推导对头文件的依赖很难实现吗？ 你可以gcc -M然后把生成的文件给Makefile去import

user: user-1
content: 一般情况下，每一个.c都会生成一个.o，而一个.o也通常由一个.c生成。  但你的.c和.h能做到一一对应么？这显然是不可能的。

user: user-3
content: 有专研精神挺好的！

user: user-4
content: unix的设计哲学是一个程序做好一件事情就好，make并不限定程序和语言的，shell命令/java/python都是支持的，你这样会使得make局限性很大。你要想偷懒的话，可以直接写程序对C文件进行分析，然后自动产生makefile文件。  引用 楼主 baipv008 的回复:makefile会自动推导 .o对.c依赖的规则，但为什么不会自动推导对.h的依赖规则？ 写makefile时还要根据.c文件包含的各个头文件来自己写依赖，不是很麻烦吗？ 而且从.c文件中读取include语句，自动推导对头文件的依赖很难实现吗？

user: user-5
content: .o对.h 的依赖不是自己写的，也不能自己写。具体请看  《跟我一起写 Makefile》  如果嫌对 h 文件的处理麻烦，可以试试 scons
user-0 提问: 一元多项式如何冲文件读取数据！

回复:
user: user-1
content: 其实我都看不懂你文件的内容。。。 fscanf可以从文件输入。 像scanf一样好用 fgetc也可以。但要转化，吧字符型数字，转化成数值型数字。

user: user-0
content: 文件内容
user-0 提问: 两个小程序的区别

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

user: user-2
content: 表示有点想法，坐等大神

user: user-3
content: 引用 6 楼 ForestDB 的回复:Return value Number of receiving arguments successfully assigned, or EOF if read failure occurs before the first receiving argument was assigned.  EOF is true as it is non-zero.  你无法退出循环

user: user-4
content: scanf 的返回值 1、格式参数中的格式项用完-----正常结束; 2、发生格式项与输入域不匹配时---非正常结束;   函数也是具有返回值的，功能相似。如果错误或者读到文件结尾，返回EOF（-1），否则返回实际转换并赋值的输入项的数目  EOF是-  1返回的是匹配的数 scanf("%d %d",&a,&b) 当不匹配0个就返回0了 比如你输出0.1 0.1 结束  这个是和EOF -1比较是出错的情况  问题的答案往往不是关键 关键是解决问题的思路 菜鸟飘过

user: user-5
content: Return value Number of receiving arguments successfully assigned, or EOF if read failure occurs before the first receiving argument was assigned.  EOF is true as it is non-zero.

user: user-6
content: 报错的程序是无法退出循环吧

user: user-7
content: 1 报错程序： 遇到EOF， 程序继续循环 2 AC程序：   遇到EOF， 程序结束循环

user: user-8
content: 报错的程序因为超时

user: user-8
content: 题目是不是说要求多行输入输出的？？
user-0 提问: 想向诸位讨教关于c文件操作的问题

回复:
user: user-1
content: 推荐看C标准库和UNIX系统编程。

user: user-0
content: 引用 5 楼 turingo 的回复:带缓冲区的操作方式读写的时候大多在缓冲区中进行，这样操作IO的次数会变少，效率当然比较高。  引用 4 楼 niannixv 的回复:引用 楼主 niannixv 的回复:c的文件操作分为流式文件操作和I/O文件操作，两者本质区别在哪里？性能优劣各是什么？如果我在移动设备上开发，应该选择哪一种？ 引用 1 楼 turingo 的回复:C的文件操作都需要通过I/O操作，区别只是在于直接读写还是通过缓冲区缓冲，移动设备上建议用带缓冲区的操作方式，也就是通过fopen/fclose/fread/fwrite等函数来操作。  引用 楼主 niannixv 的回复:c的文件操作分为流式文件操作和I/O文件操作，两者本质区别在哪里？性能优劣各是什么？如果我在移动设备上开发，应该选择哪一种？多谢！能不能具体说下“用带缓冲区的操作方式”的原因？“直接读写”主要用于哪里？“带缓冲区的操作方式读写的时候大多在缓冲区中进行这样操作IO的次数会变少，效率当然比较高。”对于写文件，是不是意味着，只在fclose时候，才把缓冲区的数据写到i/o设备上？对于读文件操作，是不是意味着，无论你fread的字节数是多少，系统都会把整个文件读到缓冲区？（PS:问的是不是太多，只是看你等级应该是高手，所以忍不住多问几句，想彻底搞清楚，希望见谅）

user: user-2
content: 带缓冲区的操作方式读写的时候大多在缓冲区中进行，这样操作IO的次数会变少，效率当然比较高。  引用 4 楼 niannixv 的回复:引用 楼主 niannixv 的回复:c的文件操作分为流式文件操作和I/O文件操作，两者本质区别在哪里？性能优劣各是什么？如果我在移动设备上开发，应该选择哪一种？ 引用 1 楼 turingo 的回复:C的文件操作都需要通过I/O操作，区别只是在于直接读写还是通过缓冲区缓冲，移动设备上建议用带缓冲区的操作方式，也就是通过fopen/fclose/fread/fwrite等函数来操作。  引用 楼主 niannixv 的回复:c的文件操作分为流式文件操作和I/O文件操作，两者本质区别在哪里？性能优劣各是什么？如果我在移动设备上开发，应该选择哪一种？多谢！能不能具体说下“用带缓冲区的操作方式”的原因？“直接读写”主要用于哪里？

user: user-0
content: 引用 楼主 niannixv 的回复:c的文件操作分为流式文件操作和I/O文件操作，两者本质区别在哪里？性能优劣各是什么？如果我在移动设备上开发，应该选择哪一种？ 引用 1 楼 turingo 的回复:C的文件操作都需要通过I/O操作，区别只是在于直接读写还是通过缓冲区缓冲，移动设备上建议用带缓冲区的操作方式，也就是通过fopen/fclose/fread/fwrite等函数来操作。  引用 楼主 niannixv 的回复:c的文件操作分为流式文件操作和I/O文件操作，两者本质区别在哪里？性能优劣各是什么？如果我在移动设备上开发，应该选择哪一种？多谢！能不能具体说下“用带缓冲区的操作方式”的原因？“直接读写”主要用于哪里？

user: user-0
content: 引用 2 楼 ForestDB 的回复:“c的文件操作分为流式文件操作和I/O文件操作” 哪里讲的？可能说的不准确，那么c的文件操作可以分类吗？如果有，怎么表述这个分类

user: user-1
content: “c的文件操作分为流式文件操作和I/O文件操作” 哪里讲的？

user: user-2
content: C的文件操作都需要通过I/O操作，区别只是在于直接读写还是通过缓冲区缓冲，移动设备上建议用带缓冲区的操作方式，也就是通过fopen/fclose/fread/fwrite等函数来操作。  引用 楼主 niannixv 的回复:c的文件操作分为流式文件操作和I/O文件操作，两者本质区别在哪里？性能优劣各是什么？如果我在移动设备上开发，应该选择哪一种？

user: user-3
content: APUE
user-0 提问: 对flash.bin文件做处理，如果出错，就打不开，怎么搞

回复:
user: user-1
content: 做个checksum什么的。  个人建议，仅供参考。

user: user-0
content: 能不能提个具体方案，要达到一个目的就是，如果错一个字节.bin文件就打不来，无法下载到flash中去，没错字节能正常下载到flash中还可以使用

user: user-2
content: md5

user: user-3
content: md5sum check
user-0 提问: 使用C语言开发办公自动化系统好吗？一般需要设计几个模块，界面怎么实现呀？

回复:
user: user-1
content: 个人感觉用DELPHI比较合适。  引用 楼主 u012474809 的回复:做毕业设计老师给的题目，但是学的是C语言，感觉这个用java开发比较好，用C语言实现好吗？

user: user-2
content: VBA for Office帮助大全.chm 在Office内置的帮助里面搜索界面不够爽，而且没有书签功能。 这个是我重新整合到一起的chm。查起来方便多了！ http://download.csdn.net/detail/zhao4zhong1/1383274

user: user-2
content: VBA for Office

user: user-3
content: 看看相关论文
user-0 提问: 函数参数传递

回复:
user: user-1
content: 声明什么就传递什么是编译器在帮助你防止出错的机制，除非你明确的进行类类型转换

user: user-0
content: 引用 2 楼 worldy 的回复:就是这样，传人是地址的副本，不管传值还是传指针事实上就是在栈中分配适当数量存储器，存储传人的值，那肯定就是某个东西的副本。。。。不是值就是地址  还有一个麻烦解答下,谢谢！~  既然 传指针也是传副本也就是传一个值,那为什么当我传入一个地址的副本的时候,假设形参是int类型的就会报错呢？我认为既然都是一个副本值,地址只不过是一个特殊的值(比如可能int 类型的值为1,而指针的副本的012314一个比较特殊的值),为什么会报错.

user: user-2
content: 是的引用实际上改变了缺省的按值传递参数的传递机制，在按值传递时函数操纵的是实参的本地拷贝。如果参数是引用时函数接收的是实参的左值而不是值的拷贝，这意味着函数知道实参在内存中的位置因而能够改变它的值或取它的地址。

user: user-1
content: 就是这样，传人是地址的副本，不管传值还是传指针事实上就是在栈中分配适当数量存储器，存储传人的值，那肯定就是某个东西的副本。。。。不是值就是地址

user: user-3
content: 我认为正确，可以把指针类型看成和int等类似的基本数据类型，也就是传值而已。