Question: 想从文本文件里提取字符，输出到屏幕

[quote=引用 3 楼 qq523176585 的回复:] 仅供参考  #include <stdio.h>  int main() { 	FILE *fp; 	int i,a[10] = {0}; 	 	fp=fopen("1.txt","r"); 	for (i=0;i<10;i++) 	{ 		fscanf(fp,"%d",&a[i]); 		printf("%d\n",a[i]); 	}     fclose(fp);  	return 0; }   1.txt的文件内容如下 123 122 212 14511 1251 12514 141251 2524125 1251412 1236541 2145   fscanf遇到空格停止读数据

仅供参考  #include <stdio.h>  int main() { 	FILE *fp; 	int i,a[10] = {0}; 	 	fp=fopen("1.txt","r"); 	for (i=0;i<10;i++) 	{ 		fscanf(fp,"%d",&a[i]); 		printf("%d\n",a[i]); 		fseek(fp,1,1); 	}     fclose(fp);  	return 0; }   1.txt的文件内容如下 123 122 212 14511 1251 12514 141251 2524125 1251412 1236541 2145    fscanf()函数不能是文件指针下移。

fp1=fopen("c:\\test.txt","r"); 你改成这个 读出来的时候 加上空格 printf("%d ",a[i]);

这是我以前写的一个例子 你可以参考下 #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <stdbool.h> // //实现魔塔地图读取器 ，地图编辑器 编辑好地图后存入txt文件  本程序实现读取 // bool write_map(char *filename,char (*pos)[14]) {     FILE * fd;     int i, j ;     fd = fopen(filename,"w");      for(i = 0 ; i < 14 ; i++)         for(j = 0; j < 14 ;j++)                   fprintf(fd,"%d ",pos[i][j]);//必须有空格 要不读的时候会出问题      fclose(fd);      return true;  } bool read_map(char *filename,char (*pos)[14]) {     FILE * fd;     int i, j ;     fd = fopen(filename,"r");      for(i = 0 ; i < 14 ; i++)         for(j = 0; j < 14 ;j++){                    fscanf(fd,"%d",&pos[i][j]);         }     fclose(fd);      return true; } int main() {     int i ;     int j ;      int8_t pos[14][14] ;     int8_t pos1[14][14] ;    read_map("E:\\write.txt",pos1);      for(i = 0 ; i < 14 ;i++)         for(j = 0 ; j < 14 ;j++){             printf("%d\n",pos1[i][j]);         }    // write_map("E:\\wtite.txt",pos1);      return 0; }


Question: atof()转换问题,如何不转换成科学计数法

#include <stdio.h> #include <math.h> #include <stdlib.h> #include <iostream> using namespace std; int main() { char s1[100]="21"; char s3[100]="19"; char *M_show; double num; static char buf[40]; num=atof(s1)+atof(s3); sprintf(buf,"%.15lg",num); M_show=(char *)buf; cout<<M_show;//40 return 0; } 代码很好用，是我错了，问题解决，谢谢给位，让这个计算器程序可以完成了。

double test=10000000000.1111111111111111111; 	int sz=sizeof(double); 	char cDisp[25]; 	sprintf(cDisp, "%.8f", test);   cdisp显示普通形式

一楼的的帮助谢谢，不过没有用，我的错误是数值超过六位，就好用科学计数法表示

5楼的代码也用了，没有效果， std::ios_base::fixed 可以解释是什么意思吗？

7楼的东西没有用，测试代码如下，不知道对不对 	char s1[100]="21"; 	char s3[100]="19"; 	char *M_show=""; 	int num;     num=atof(s1)+atof(s3); 	static char buf[40]; 	sprintf(buf,"%.15lg",num); //	M_show=(char *)buf; 	cout<<M_show;     return 0;

num=atof(s1)+atof(s3); static char buf[40]; sprintf(buf,"%.15lg",num); M_show=(char *)buf;

用 gcvt函数吧

ostringstream oss;     oss<< std::ios_base::fixed << num;     k=oss.str();     M_show=k.c_str();

引用 2 楼 turingo 的回复:跟数值本身没有关系，是输出格式的缘故，可以试试用printf自定义格式输出。 +++

确认下 你的num变量是什么类型！ 用标准输出看看，是否得到正确数值

跟数值本身没有关系，是输出格式的缘故，可以试试用printf自定义格式输出。  引用 楼主 u011930458 的回复:num=atof(s1)+atof(s3);     ostringstream oss;     oss<<num;     k=oss.str();     M_show=k.c_str();  这是程序的部分代码，当输入的数字过大时，num会变为科学计数法表示，如何将科学计数法表示的num变为double类型，大神指导 我要保证double类型转变为字符串类型时，是使用普通的数组表示，谢谢各位了

这样不行吗 加强转不行吗 num = double(atof(s1))+double(atof(s3));


Question: 从语言的整数分割

#include <stdio.h> int main() {     int n, c[10], k, i;     scanf("%d", &n);     k = 0;     while (n){         c[k++] = n%10;         n /= 10;     }     for (i=k-1; i>0; i--)         printf("%d ", c[i]);     printf("%d\n", c[0]);     return 0; }

引用 3 楼 caozhy 的回复:说错了。  是让整数转换成字符。  ascii中0~9字符是连续排列的。 因此 '0' + 0 = '0' '0' + 1 = '1' ...  小白求解：为何不能直接用整型输出，要用字符型输出呢？

看 ASCII 码表

我说错了 ‘0’是字符  是char型的  你加上‘0’ 相对于ASCII 48 在加上取余的 那个 用char输出就是 int     ASCII 0       48 1 。。。 49 2 。。。 50 3 。。。 51 4 。。。 52 5 。。。 53 6 。。。 54 7 。。。 55 。。。。。。

c[k++] = (n%10)+'0'; '0' 是字符串啊 你把整数和‘0’ 相加 等于加上‘0’的ASCII码 就是整形数48 你输出的时候是用char输出的 所有的加上相对的偏移量

C语言规定，用字符数组保存字符串，必须以'0'作为结尾。 表示这是数组的结尾。


Question: 关于C的随机数也随机种子

引用 17 楼 zhao4zhong1 的回复:C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\tidtable.c 386:    ptd->_holdrand = 1L; srand Sets a random starting point.  void srand( unsigned int seed );  Routine Required Header Compatibility  srand <stdlib.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  None  Parameter  seed  Seed for random-number generation  Remarks  The srand function sets the starting point for generating a series of pseudorandom integers. To reinitialize the generator, use 1 as the seed argument. Any other value for seed sets the generator to a random starting point. rand retrieves the pseudorandom numbers that are generated. Calling rand before any call to srand generates the same sequence as calling srand with seed passed as 1.  Example  /* RAND.C: This program seeds the random-number generator  * with the time, then displays 10 random integers.  */  #include <stdlib.h> #include <stdio.h> #include <time.h>  void main( void ) {    int i;     /* Seed the random-number generator with current time so that     * the numbers will be different every time we run.     */    srand( (unsigned)time( NULL ) );     /* Display 10 numbers. */    for( i = 0;   i < 10;i++ )       printf( "  %6d\n", rand() ); }   Output      6929     8026    21987    30734    20587     6699    22034    25051     7988    10104   Floating-Point Support Routine  See Also   rand

种子是为了获得相同的随机数序列。 比如有些科学计算当中，要随机抽样，但又要别人能重复出来。这样可以按种子抽，然后把种子公布出来，别人按种子抽就能得到一样的样本。

引用 1 楼 lin5161678 的回复:你再次运行程序会发现输出的1000个数  和上次输出的1000个数 一模一样  那就是srand的作用 确实如此，试过的

man strand

随即数是随机产生的

引用 14 楼 applegeeE 的回复:记住一点，随机数的值由上一个种子决定。当前返回的值，作为下次的种子 这样做一样不会是随机的。。

引用 7 楼 jianhuxiaoming 的回复:明白了。。  还有一个问题。 使用两次rand会提高他的随机性吗？ 		int b=(rand()+rand())/2; 		printf("num is %d\n", b); 不会，rand()是个伪伪随机数，如果不用srand(),你每次打印出来的rand()都是固定的。

记住一点，随机数的值由上一个种子决定。当前返回的值，作为下次的种子

看看srand的文档

不会。。。。

C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c /*** *rand.c - random number generator * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines rand(), srand() - random number generator * *******************************************************************************/  #include <cruntime.h> #include <mtdll.h> #include <stddef.h> #include <stdlib.h>  /*** *void srand(seed) - seed the random number generator * *Purpose: *       Seeds the random number generator with the int given.  Adapted from the *       BASIC random number generator. * *Entry: *       unsigned seed - seed to seed rand # generator with * *Exit: *       None. * *Exceptions: * *******************************************************************************/  void __cdecl srand (         unsigned int seed         ) {         _getptd()->_holdrand = (unsigned long)seed; }   /*** *int rand() - returns a random number * *Purpose: *       returns a pseudo-random number 0 through 32767. * *Entry: *       None. * *Exit: *       Returns a pseudo-random number 0 through 32767. * *Exceptions: * *******************************************************************************/  int __cdecl rand (         void         ) {         _ptiddata ptd = _getptd();          return( ((ptd->_holdrand = ptd->_holdrand * 214013L             + 2531011L) >> 16) & 0x7fff ); }

引用 11 楼 lin5161678 的回复:b的值是 1  那么2次rand的返回值有3中可能 0 1 1 0 1 1 弄错了 b的值是1 应该对应的  1 1  1 2  2 1  惭愧

引用 7 楼 jianhuxiaoming 的回复:明白了。。  还有一个问题。 使用两次rand会提高他的随机性吗？ 		int b=(rand()+rand())/2; 		printf("num is %d\n", b); 不会 张开点的说  b的值是 1  那么2次rand的返回值有3中可能 0 1 1 0 1 1  b的值是 rand最大值  那么 2次rand的返回值只有1中可能 最大值 最大值  本来 b的值为1 的概率 应该和 b的值为 最大值的概率 是一样的[理想状态下] 现在 最大值出现的概率只有其他数的 1/3  这情况是降低随机性

引用 7 楼 jianhuxiaoming 的回复:明白了。。  还有一个问题。 使用两次rand会提高他的随机性吗？ 		int b=(rand()+rand())/2; 		printf("num is %d\n", b); 当然不会了。

引用 1 楼 lin5161678 的回复:你再次运行程序会发现输出的1000个数  和上次输出的1000个数 一模一样  那就是srand的作用  一针见血

伪随机的！。。

srand()是用来初始化随机种子数的，因为rand的内部实现是用线性同余法做的，他不是真的随机数，只不过是因为其周期特别长，所以有一定的范围里可看成是随机的，式子如下：  rand = rand*const_1 + c_var;   srand函数就是给它的第一个rand值。  不用srand函数，随机种子为1

随机数有伪随机数 它的意思 就是 生命的轨迹是既定的 就是一次为随机 多次会重复第一次的随机  而时间为种子的话 是多次 都为随机 因为 时间的定义为从1990 几月几日(我忘了)0点 到现在经过的秒数 这个值 是永远往下走的一直在加】 直到它溢出为止  但是我感觉我们活不到那时候了


Question: 线程间数据保护问题，求指导

嘿嘿！ Talk is cheap,show me your codes.  ——Linus Torvalds

引用 5 楼 zhao4zhong1 的回复:仅供参考//循环向a函数每次发送200个字节长度（这个是固定的）的buffer, //a函数中需要将循环传进来的buffer，组成240字节（也是固定的）的新buffer进行处理， //在处理的时候每次从新buffer中取两个字节打印 #ifdef WIN32     #pragma warning(disable:4996) #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <process.h>     #include <io.h>     #define  MYVOID             void     #define  vsnprintf          _vsnprintf #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  MYVOID             void * #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } void sleep_ms(int ms) {     Sleep(ms); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } void sleep_ms(int ms) {     usleep(ms*1000); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} #define ASIZE    200 #define BSIZE    240 #define CSIZE      2 char Abuf[ASIZE]; char Cbuf[CSIZE]; CRITICAL_SECTION cs_HEX ; CRITICAL_SECTION cs_BBB ; struct FIFO_BUFFER {     int  head;     int  tail;     int  size;     char data[BSIZE]; } BBB; int No_Loop=0; void HexDump(int cn,char *buf,int len) {     int i,j,k;     char binstr[80];      Lock(&cs_HEX);     for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%03d %04x -",cn,i);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             Log("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         Log("%s\n",binstr);     }     Unlock(&cs_HEX); } int GetFromRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      lent=0;     Lock(cs);     if (fbuf->size>=len) {         lent=len;         if (fbuf->head+lent>BSIZE) {             len1=BSIZE-fbuf->head;             memcpy(buf     ,fbuf->data+fbuf->head,len1);             len2=lent-len1;             memcpy(buf+len1,fbuf->data           ,len2);             fbuf->head=len2;         } else {             memcpy(buf     ,fbuf->data+fbuf->head,lent);             fbuf->head+=lent;         }         fbuf->size-=lent;     }     Unlock(cs);     return lent; } MYVOID thdB(void *pcn) {     char        *recv_buf;     int          recv_nbytes;     int          cn;     int          wc;     int          pb;      cn=(int)pcn;     Log("%03d thdB              thread begin...\n",cn);     while (1) {         sleep_ms(10);         recv_buf=(char *)Cbuf;         recv_nbytes=CSIZE;         wc=0;         while (1) {             pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);             if (pb) {                 Log("%03d recv %d bytes\n",cn,pb);                 HexDump(cn,recv_buf,pb);                 sleep_ms(1);             } else {                 sleep_ms(1000);             }             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef WIN32     pthread_exit(NULL); #endif } int PutToRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      Lock(cs);     lent=len;     if (fbuf->size+lent>BSIZE) {         lent=BSIZE-fbuf->size;     }     if (fbuf->tail+lent>BSIZE) {         len1=BSIZE-fbuf->tail;         memcpy(fbuf->data+fbuf->tail,buf     ,len1);         len2=lent-len1;         memcpy(fbuf->data           ,buf+len1,len2);         fbuf->tail=len2;     } else {         memcpy(fbuf->data+fbuf->tail,buf     ,lent);         fbuf->tail+=lent;     }     fbuf->size+=lent;     Unlock(cs);     return lent; } MYVOID thdA(void *pcn) {     char        *send_buf;     int          send_nbytes;     int          cn;     int          wc;     int           a;     int          pa;      cn=(int)pcn;     Log("%03d thdA              thread begin...\n",cn);     a=0;     while (1) {         sleep_ms(100);         memset(Abuf,a,ASIZE);         a=(a+1)%256;         if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop         send_buf=(char *)Abuf;         send_nbytes=ASIZE;         Log("%03d sending %d bytes\n",cn,send_nbytes);         HexDump(cn,send_buf,send_nbytes);         wc=0;         while (1) {             pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);             Log("%03d sent %d bytes\n",cn,pa);             HexDump(cn,send_buf,pa);             send_buf+=pa;             send_nbytes-=pa;             if (send_nbytes<=0) break;//             sleep_ms(1000);             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef WIN32     pthread_exit(NULL); #endif } int main() { #ifdef WIN32     InitializeCriticalSection(&cs_log);     InitializeCriticalSection(&cs_HEX );     InitializeCriticalSection(&cs_BBB ); #else     pthread_t threads[2];     int threadsN;     int rc;     pthread_mutex_init(&cs_log,NULL);     pthread_mutex_init(&cs_HEX,NULL);     pthread_mutex_init(&cs_BBB,NULL); #endif     Log("Start===========================================================\n");      BBB.head=0;     BBB.tail=0;     BBB.size=0;  #ifdef WIN32     _beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);     _beginthread((void(__cdecl *)(void *))thdB,0,(void *)2); #else     threadsN=0;     rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);     rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void *)2);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1); #endif      if (!access("No_Loop",0)) {         remove("No_Loop");         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     while (1) {         sleep_ms(1000);         if (No_Loop) break;//         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     sleep_ms(3000);     Log("End=============================================================\n"); #ifdef WIN32     DeleteCriticalSection(&cs_BBB );     DeleteCriticalSection(&cs_HEX );     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_BBB);     pthread_mutex_destroy(&cs_HEX);     pthread_mutex_destroy(&cs_log); #endif     return 0; }  赵老师威武霸气，让我好好消化一下

引用 2 楼 max_min_ 的回复:楼主可以换个方式的话，就换吧！ 我也表示用互斥锁会比较方便点 问题是我信号处理函数里的接口必须每隔20ms调用一次 但是我主循环里的有些函数接口，执行一下就100多ms了，所以我才想用信号触发的

引用 1 楼 user-3 的回复:信号永远是最后考虑的，互斥锁条件变量才是正确路子。 问题是我信号处理函数里的接口必须每隔20ms调用一次 但是我主循环里的有些函数接口，执行一下就100多ms了，所以我才想用信号触发的

楼主可以换个方式的话，就换吧！ 我也表示用互斥锁会比较方便点

信号永远是最后考虑的，互斥锁条件变量才是正确路子。


Question: linux一个简单的fork

还有没有大牛了呢？

引用 3 楼 max_min_ 的回复:子进程的输出缓冲阻塞了！没有刷新输出缓冲区！ 加"\n"或者fflush(stdout)都可以！  ps: 上面加法减法程序printf函数少了一个左双引号！  ++

/*子函数修正*/ //add.c #include<stdio.h>  int main()  {              int a=3,b=2;              printf("a+b=%d\n",a+b);                return 0;  }//minus.c #include<stdio.h>  int main()  {               int a=3,b=2;               printf("a-b=%d\n",a-b);                 return 0;  }

printf("child process running , minus sucessed!"); 改为 printf("child process running , minus sucessed!\n"); 试试

//minus函数修正 //minus.c  #include<stdio.h> int main() {     int a=3,b=2;     printf(a-b=%d\n",a-b);      return 0; }


Question: c语言跟文件的关联，没错误但运行不了，求帮忙

3.因为读取的是字符，所以在请使用%c 补充：我已经测试好了的，fscanf和fprintf都用%c

#include <stdio.h> FILE *fp1; FILE *fp2; int a[5],i; int main() {  fp1=fopen("g:\\5.txt","r");  fp2=fopen("g:\\6.txt","w");  if(fp1==NULL)  	printf("fp1 is NULL\n");  if(fp2==NULL)  	printf("fp2 is NULL\n");  for (i=0;i<5;i++) 	fscanf(fp1,"%c",&a[i]);  for (i=0;i<5;i++) 	fprintf(fp2,"%c",a[i]);  fclose(fp1);  fclose(fp2);  return 0; }   /*C-Free5.0编译成功，你要实现的功能应该是将文件的前5个字符从5.txt复制到6.txt吧，若是如此： 1.请保证5.txt存在，最好内容不少于5个字符； 2.一般请不要放在c盘，一般c盘这样是写不进数据的，需要管理员权限才可以； 3.因为读取的是字符，所以在请使用%,你可以用%d测试一下，看看，文件里面显示的内容，那么前面也最好定义为char a[5];。 仅供参考。 */

引用 3 楼 lin5161678 的回复:[quote=引用 2 楼 user-3 的回复:] 加上这几句判断，打印，看看是提示啥错误     perror("main:"); 就可以了 [/quote]对了 冒号是多余的  直接  perror("main");

引用 2 楼 user-3 的回复:加上这几句判断，打印，看看是提示啥错误     perror("main:"); 就可以了

加上这几句判断，打印，看看是提示啥错误  #include <errno.h>  FILE *fp1 = NULL ; FILE *fp2 = NULL ; fp1=fopen("c:\\5.txt","r"); fp2=fopen("c:\\6.txt","w"); if( fp1 == NULL )     printf(" open 5.txt failed :%s\n", strerror(errno)); if( fp2 == NULL )        printf(" open 6.txt failed :%s\n", strerror(errno));

打赌  我读你C盘下 根本没有 5.txt 这个文件  你输了要请我吃饭哈


Question: 求大神解释openssh中数据包的构造！！

一层一层的向里面剥嘛， 先把框架理清楚，再去看实现的细节！

引用 1 楼 wangdahu888 的回复:太笼统了,建议先学一下提问的技巧 我就是想问一下，使用openssh发送数据时数据包的构造的整个过程~~

太笼统了,建议先学一下提问的技巧


Question: STC串口中断问题，请各位老师帮帮我！

引用 2 楼 u011642985 的回复:请问一下 我的串口助手上设置的波特率是19200，然后给它发送数据，没反应。你的检查波特率是检查这个波特率的意思吗？ 检查波特率是指你单片机和上位机设置是否一致。

示波器有没有？看看Tx脚上有没有信号输出

#define BAUD  2400 #define BAUD2 19200  检查波特率


Question: 通过Makefile.am和configure.in自动生成Makefile的问题

这个不是通过时间戳来决定是否重新生成的吗 每个文件都有生成时间 和修改时间的 一个结构体的值 不是判定 当如果修改了 就重新生成 没有的话不会重新生成 貌似 我以前都是 touch *.c 之后一定会重新生成


Question: 刚解除不常时间，问问fopen用法

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

我以前写的例子 你看看 #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <stdbool.h> // //实现魔塔地图读取器 ，地图编辑器 编辑好地图后存入txt文件  本程序实现读取 // bool write_map(char *filename,char (*pos)[14]) {     FILE * fd;     int i, j ;     fd = fopen(filename,"w");      for(i = 0 ; i < 14 ; i++)         for(j = 0; j < 14 ;j++)                   fprintf(fd,"%d ",pos[i][j]);//必须有空格 要不读的时候会出问题      fclose(fd);      return true;  } bool read_map(char *filename,char (*pos)[14]) {     FILE * fd;     int i, j ;     fd = fopen(filename,"r");      for(i = 0 ; i < 14 ; i++)         for(j = 0; j < 14 ;j++){                    fscanf(fd,"%d",&pos[i][j]);         }     fclose(fd);      return true; } int main() {     int i ;     int j ;      int8_t pos[14][14] ;     int8_t pos1[14][14] ;    read_map("E:\\write.txt",pos1);      for(i = 0 ; i < 14 ;i++)         for(j = 0 ; j < 14 ;j++){             printf("%d\n",pos1[i][j]);         }    // write_map("E:\\wtite.txt",pos1);      return 0; }

你的编译器或者是配置有问题，可以试试Code::Blocks(http://www.codeblocks.org/)。  引用 5 楼 xlshu 的回复:[quote=引用 2 楼 turingo 的回复:]  #include <stdio.h>  FILE* fp1; FILE* fp2; int a[5],i;  int main() { fp1=fopen("c:\\1.txt","r"); fp2=fopen("c:\\2.txt","w"); for (i=0;i<5;i++) fscanf(fp1,"%d",&a[i]); for (i=0;i<5;i++) fprintf(fp2,"%d",a[i]); return 0; }   [quote=引用 楼主 xlshu 的回复:] 读1.txt里面的内容，另存到2.txt里面，求在下面程序上修改。  fp1、fp2应该定义成什么类型的？  其他地方是不是有问题，编译没有问题，运行出错  #include <stdio.h> int a[5],i;  void main() { fp1=fopen("c:\1.txt","r"); fp2=fopen("c:\2.txt","w"); for (i=0;i<5;i++) fscanf(fp1,"%d",&a[i]); for (i=0;i<5;i++) fprintf(fp2,"%d",a[i]); }[/quote]  程序看懂了，运行不出来，编译没有错误，ctrl+f5出错。错误如下：  6363.obj : error LNK2005: _main already defined in 8989.obj 6363.obj : error LNK2005: "struct _iobuf * fp1" (?fp1@@3PAU_iobuf@@A) already defined in 8989.obj 6363.obj : error LNK2005: "int i" (?i@@3HA) already defined in 8989.obj 6363.obj : error LNK2005: "int * a" (?a@@3PAHA) already defined in 8989.obj Debug/8989.exe : fatal error LNK1169: one or more multiply defined symbols found 执行 link.exe 时出错.  8989.exe - 1 error(s), 0 warning(s)[/quote]

引用 2 楼 turingo 的回复: #include <stdio.h>  FILE* fp1; FILE* fp2; int a[5],i;  int main() { fp1=fopen("c:\\1.txt","r"); fp2=fopen("c:\\2.txt","w"); for (i=0;i<5;i++) fscanf(fp1,"%d",&a[i]); for (i=0;i<5;i++) fprintf(fp2,"%d",a[i]); return 0; }   [quote=引用 楼主 xlshu 的回复:] 读1.txt里面的内容，另存到2.txt里面，求在下面程序上修改。  fp1、fp2应该定义成什么类型的？  其他地方是不是有问题，编译没有问题，运行出错  #include <stdio.h> int a[5],i;  void main() { fp1=fopen("c:\1.txt","r"); fp2=fopen("c:\2.txt","w"); for (i=0;i<5;i++) fscanf(fp1,"%d",&a[i]); for (i=0;i<5;i++) fprintf(fp2,"%d",a[i]); }[/quote]  程序看懂了，运行不出来，编译没有错误，ctrl+f5出错。错误如下：  6363.obj : error LNK2005: _main already defined in 8989.obj 6363.obj : error LNK2005: "struct _iobuf * fp1" (?fp1@@3PAU_iobuf@@A) already defined in 8989.obj 6363.obj : error LNK2005: "int i" (?i@@3HA) already defined in 8989.obj 6363.obj : error LNK2005: "int * a" (?a@@3PAHA) already defined in 8989.obj Debug/8989.exe : fatal error LNK1169: one or more multiply defined symbols found 执行 link.exe 时出错.  8989.exe - 1 error(s), 0 warning(s)

引用 3 楼 xlshu 的回复: 程序编译没有错，但是提示这个  打开的文件路径 '\' 改成用"\\" ,"\"注意逃逸字符！  另外打开检查返回值fp1 fp2 确认是否已经成功打开，然后在开始其他操作！

程序编译没有错，但是提示这个

#include <stdio.h>  FILE* fp1; FILE* fp2; int a[5],i;  int main() { fp1=fopen("c:\\1.txt","r"); fp2=fopen("c:\\2.txt","w"); for (i=0;i<5;i++) fscanf(fp1,"%d",&a[i]); for (i=0;i<5;i++) fprintf(fp2,"%d",a[i]); return 0; }  引用 楼主 xlshu 的回复:读1.txt里面的内容，另存到2.txt里面，求在下面程序上修改。  fp1、fp2应该定义成什么类型的？  其他地方是不是有问题，编译没有问题，运行出错  #include <stdio.h> int a[5],i;  void main() { fp1=fopen("c:\1.txt","r"); fp2=fopen("c:\2.txt","w"); for (i=0;i<5;i++) fscanf(fp1,"%d",&a[i]); for (i=0;i<5;i++) fprintf(fp2,"%d",a[i]); }

FILE *fp1,*fp2;  建议先学习关于文件操作的知识再来编程，欲速则不达


Question: 【背包问题。】

根据我从这两个连接里面所了解的,你这个问题,不是0,1背包,是二维背包. 他那里给出的是一维数组,如果你的程序,没问题的话,估计就是空间复杂度太高. O(N^2) 我也运行了你的程序,好像是对的. 我对这个问题,理解的和肤浅,还不能具体看出来,你的程序有没有错误.  他那里,好像也有个,用二维数组的,他说,可以改成一维的; 并且说,没有解决,时间复杂度问题,但是解决了,空间复杂度问题了.  如果,你的问题,和他的那个问题,性质相同,那么程序没错,就是空间复杂度问题了. 不知是不是这样.

引用 9 楼 lm_whales 的回复:搜到两个关于背包问题的链接。感觉还可以。 前一个是01背包，后一个泛论一下。觉得可以看一下。 http://www.baidu.com/link?url=4z0M_wdTSkvvx9qjLILOumedEogFKRdjrCb0cQR3oYFPF40rN1gAQjpEps http://baike.baidu.com/view/841810.htm我用的二维数组，知道我的哪里错了吗

1000 个数据，光是输入也累得要死。 所有数据0～1000；n 和V 都可能达到1000 而且还不一定只有一批数据，你用控制台时间够吗？？3000ms 只有3秒 如果数据有100 批光输入数据，也不够。 //w数组表示 输入苹果的价钱，c表示质量。n表示苹果个数，v表示背包容量。  这个注释很不好 题目告诉你， 应该表示苹果的大小，你写的是质量，这个注释简直就是给人添堵的。 一点都没有达到注释的要求。

没有错误，就是时间了。 控制台输入输出太耗时了。 用文件吧。 一般这种问题，都是用文件输入输出的。 文件比控制台快多了。

引用 2 楼 lm_whales 的回复:1）按照体积价值比例排序 ，对分数 价值 / 体积 排序 2）从小到大装包 3）如果，还有苹果没装，但是体积不够装一个的了，查找最值钱的替换方案。 直到 转满或找不到为止。我的那种理解01背包 应该没有错。

引用 1 楼 user-2 的回复:#include <stdio.h> #include <stdlib.h> #define MAX(A,B) ((A)>(B)?(A):(B)) #define SIZE 5 #define MAXVOL 12 int main(void) {  int v[SIZE] = {8,3,4,5,6}; // 体积  int p[SIZE] = {12,4,3,6,8}; // 价值    int kp[MAXVOL + 1] = {0}; // 背包  int i,j,max=0;     for (i=0; i<SIZE; ++i)   {     /* 对各个已经可计算的背包价值进行记录, 已经取了v[i], 计算记录的背包容量范围，必然是从v[i]到 MAXVOL */     for (j=MAXVOL; j>=v[i]; --j)      {        printf("old[%d] = %d, cur[%d] = %d, \n", j, kp[j], j, kp[j-v[i]] +p[i]);        kp[j]=MAX(kp[j], kp[j-v[i]] +p[i]);        max=MAX(kp[j], max);     } }       printf("\n\nMAX VALUE: %d\n", max);  system("Pause");  return 0; } 仅供参考我感觉我按01背包写的没有问题，能帮忙找找我程序的错吗

另外控制台输入输出，是很耗时的，最好用文件输入输出。

2）搞错了，按照 价值 / 体积比例，从大到小装包  还有一种方案，先按体积从小到大装包。 然后按价值查找替换方案。


Question: 用C语言修改bin文件里面的数据

引用 12 楼 qq523176585 的回复:楼主不要忘了添加读取文件失败后的处理嗯，谢谢解决了。

引用 9 楼 zhao4zhong1 的回复:mmap支持大于4GB或者32GB的文件吗？ 4楼代码似乎和文件大小无关。赵老师有什么学习C的经验和总结之类的文章，或者笔记吗？或者是清晰的学习路线。如果有能发下给我吧，阿门！

楼主不要忘了添加读取文件失败后的处理

仅供参考 #include <stdio.h> #include <string.h>  int main() { 	FILE *fp; 	char s[1024];          /*可以设置更大的数组*/ 	char p[6]; 	int ch; 	int i = 0; 	int j; 	char *str = "05 01";    /*假定两个字节之间有一个空格*/ 	p[5] = '\0'; 	fp = fopen("1.txt","r+");    /*用你的文件名代替*.bin  */ 	while ((ch = fgetc(fp)) != EOF) 	{ 		s[i] = ch; 		i++; 	} 	s[i] = '\0'; 	for (i=0; i+5<strlen(s);) 	{ 		for (j=0; j<5; j++) 		{ 			p[j] = s[i+j]; 		} 		if ( strcmp(p,str) == 0) 		{ 			s[i+1] = '1'; 			i += 5; 		} 		else 		{ 			i++; 		} 	}  	if (!fseek(fp,0L,SEEK_SET)) 	{ 		for (i=0; i<strlen(s); i++) 		{ 			fputc(s[i],fp); 		} 	}  	fclose(fp); 	return 0; }

google 文件操作

mmap支持大于4GB或者32GB的文件吗？ 4楼代码似乎和文件大小无关。

引用 3 楼 drlsdrls 的回复:找到组合以后记录下位置，用特定的数据写入就可以了啊  size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream); 注意：这个函数以二进制形式对文件进行操作，不局限于文本文件 返回值：返回实际写入的数据块数目 （1）buffer：是一个指针，对fwrite来说，是要获取数据的地址； （2）size：要写入内容的单字节数； （3）count:要进行写入size字节的数据项的个数； （4）stream:目标文件指针； （5）返回实际写入的数据项个数count。 说明：写入到文件的哪里？ 这个与文件的打开模式有关，如果是w+，则是从file pointer指向的地址开始写，替换掉之后的内容，文件的长度可以不变，stream的位置移动count个数；如果是a+，则从文件的末尾开始添加，文件长度加大。额~不好意思！我找到原因了，我应改用scanf（“%x”，&addr）才对，现在正确了

引用 3 楼 drlsdrls 的回复:找到组合以后记录下位置，用特定的数据写入就可以了啊  size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream); 注意：这个函数以二进制形式对文件进行操作，不局限于文本文件 返回值：返回实际写入的数据块数目 （1）buffer：是一个指针，对fwrite来说，是要获取数据的地址； （2）size：要写入内容的单字节数； （3）count:要进行写入size字节的数据项的个数； （4）stream:目标文件指针； （5）返回实际写入的数据项个数count。 说明：写入到文件的哪里？ 这个与文件的打开模式有关，如果是w+，则是从file pointer指向的地址开始写，替换掉之后的内容，文件的长度可以不变，stream的位置移动count个数；如果是a+，则从文件的末尾开始添加，文件长度加大。赵老师这个问题解决了，现在遇到一个scanf（）的问题，我需要输入一个进制的数 我是这样定义的  int addr； scanf（“%s”&addr）；请问我的键盘要怎么键入了，我分别输入了0x915e ，和915e得到的结果都是错的 如果我换成scanf（“%d”&addr）；然后输入0x915e的十进制数，也就是37214 我程序运行的结果就是正切的

#include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h>  #define handle_error(msg)                               \     do { perror(msg); exit(EXIT_FAILURE); } while (0)  int main(int argc, char *argv[]) {     char *addr;     int fd;     int i;     struct stat sb;     size_t length;      if (2 != argc) {         fprintf(stderr, "%s file offset [length]\n", argv[0]);         exit(EXIT_FAILURE);     }      fd = open(argv[1], O_RDWR);     if (fd == -1)         handle_error("open");      if (fstat(fd, &sb) == -1) {           /* To obtain file size */         handle_error("fstat");         exit(EXIT_FAILURE);     }      length = sb.st_size;      /* offset for mmap() must be page aligned */      addr = mmap(NULL, length, PROT_WRITE,                 MAP_SHARED, fd, 0);     if (addr == MAP_FAILED)         handle_error("mmap");      close(fd);      for (i = 1; i < length; ++i) {         if (0x05 == addr[i-1] && 0x01 == addr[i]) {             addr[i - 1] = 0x01;         }     }     msync(addr,length,MS_SYNC);      exit(EXIT_SUCCESS); }

用mmap，就是先把文件内容映射到内存地址空间，然后直接操作内存，应该是效率比较高，处理也相对简单的一种方式。

仅供参考#include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN  40 #define MAX2N 80 FILE *fi,*fo; char sn[_MAX_PATH],dn[_MAX_PATH],f[MAX2N],bw[MAXN],bf[MAXN+sizeof(int)-1],bx[MAXN],br[MAXN+sizeof(int)-1],bb[MAXN]; char *ag[MAXN]; int L,i,j,k,lenf,lenr,find,match; __int64 off; void FR() {     printf("\n");     printf("Src : %s\n",sn);     if (find==0) {         printf("Dest: %s\n",dn);     }     for (i=0;i<lenf;i++) {         bb[i]=fgetc(fi);     }     off=0i64;     while (1) {         match=1;         for (j=0;j<lenf;j++) {             if (bw[j]==0&&bf[j]==bb[j]) continue;             if (bw[j]==1) continue;             match=0;             break;//         }         if (match==1) {             printf("%016I64X\n",off);             if (find==0) {                 for (j=0;j<lenf;j++) {                     if (bx[j]==0) fputc(br[j],fo);                     else fputc(bb[j],fo);                 }             }             for (i=0;i<lenf;i++) {                 bb[i]=fgetc(fi);                 if (feof(fi)) break;//             }             if (feof(fi)&&find==0) {                 for (j=0;j<i;j++) fputc(bb[j],fo);                 break;//             }             if (feof(fi)) break;//             else off+=(__int64)lenf;         } else {             if (find==0) {                 fputc(bb[0],fo);             }             memmove(bb,bb+1,lenf-1);             bb[lenf-1]=fgetc(fi);             off++;             if (feof(fi)) {                 if (find==0) {                     for (j=0;j<lenf-1;j++) fputc(bb[j],fo);                 }                 break;//             }         }     } } int main() {     while (1) {         printf("Find & Replace, designed by zhao4zhong1@163.com\n");         printf("Src  file name:");         fflush(stdout);         fgets(sn,_MAX_PATH,stdin);         if ('\n'==sn[0]) break;//         L=strlen(sn);if ('\n'==sn[L-1]) sn[L-1]=0;         if ((fi=fopen(sn,"rb"))==NULL) {             printf("Can not open %s!",sn);             break;//         }         while (1) {             printf("Dest file name:");             fflush(stdout);             fgets(dn,_MAX_PATH,stdin);             if ('\n'==dn[0]) break;//             L=strlen(dn);if ('\n'==dn[L-1]) dn[L-1]=0;             if (strcmpi(sn,dn)==0) printf("Error: Src file name[%s] == Dest file name[%s]!\n",sn,dn);             else if ((fo=fopen(dn,"rb"))!=NULL) {                 fclose(fo);                 printf("Error: Dest file already exists!\n");             } else break;//         }         printf("Find   :");         fflush(stdout);         fgets(f,MAX2N,stdin);         L=strlen(f);if ('\n'==f[L-1]) f[L-1]=0;         if (f[0]=='\'') {             lenf=strlen(f)-1;             for (j=0;j<lenf;j++) {                 if (f[j+1]=='?') bw[j]=1;                 else {                     bw[j]=0;                     bf[j]=f[j+1];                 }             }         } else {             i=0;             for (j=0;j<MAXN;j++) {                 if (f[i]==0x0D||f[i]==0x0A||f[i]==0x1A||f[i]==0) {                     f[i]=0;                     break;//                 }                 while (f[i]==' '||f[i]==9) {                     f[i]=0;                     i++;                 }                 ag[j]=f+i;                 while (f[i]!=9&&f[i]!=' '&&f[i]!=0x0D&&f[i]!=0x0A&&f[i]!=0x00) i++;             }             lenf=j;             for (i=0;i<lenf;i++) {                 if (isxdigit(ag[i][0])) {                     bw[i]=0;                     sscanf(ag[i],"%2x",&bf[i]);                 } else {                     bw[i]=1;                 }             }         }         printf("Replace:");         fflush(stdout);         fgets(f,MAX2N,stdin);         L=strlen(f);if ('\n'==f[L-1]) f[L-1]=0;         if (f[0]==0 || '\n'==dn[0]) find=1;         else {             if (f[0]=='\'') {                 lenr=strlen(f)-1;                 if (lenr!=lenf) {                     printf("Error: Find len != Replace len");                     fclose(fi);                     break;//                 }                 find=0;                 fo=fopen(dn,"wb");                 for (j=0;j<lenr;j++) {                     if (f[j+1]=='?') bx[j]=1;                     else {                         bx[j]=0;                         br[j]=f[j+1];                     }                 }             } else {                 i=0;                 for (j=0;j<MAXN;j++) {                     if (f[i]==0x0D||f[i]==0x0A||f[i]==0x1A||f[i]==0) {                         f[i]=0;                         break;//                     }                     while (f[i]==' '||f[i]==9) {                         f[i]=0;                         i++;                     }                     ag[j]=f+i;                     while (f[i]!=9&&f[i]!=' '&&f[i]!=0x0D&&f[i]!=0x0A&&f[i]!=0x00) i++;                 }                 lenr=j;                 if (lenr!=lenf) {                     printf("Error: Find len != Replace len");                     fclose(fi);                     break;//                 }                 find=0;                 fo=fopen(dn,"wb");                 for (i=0;i<lenr;i++) {                     if (isxdigit(ag[i][0])) {                         bx[i]=0;                         sscanf(ag[i],"%2x",&br[i]);                     } else {                         bx[i]=1;                     }                 }             }         }         if (lenf<=0) break;//         FR();         fcloseall();     }     return 0; }

简单一点的，可以先把数据处理好放在buffer中，完了再整体写入。  引用 1 楼 tanqiyingk 的回复:我不懂的是，我要用文件指针读出来判段，然后判断后，我又要用文件指针写进入 这一步怎么处理


Question: 关于socket 抓包 求大神

引用 5 楼 caigzhi 的回复:从以太层开始解析，下一层就是PPPoE。不是解析 而是抓包，包都没抓到何来的解析

引用 1 楼 jerry_dqh 的回复:使用winpcap吧，socket不能解析到链路层的。 这个是windows下的吧 linux下能用么

继续顶！！，，

从以太层开始解析，下一层就是PPPoE。

winpcap

用开源库把  SOCKET自带的太慢了，别人有封装好的，PFRING 内核抓包！

顶上去 反反复复反复

使用winpcap吧，socket不能解析到链路层的。


Question: 高手看过来，老鼠问题，你会编程求解吗？

我的C代码是按第一种理解写的。 看来结果不一样可能另有原因。

引用 44 楼 zhao4zhong1 的回复:我猜我的代码和帖主的代码运行结果不一样的原因可能是比如：  “三岁得肿瘤无法再生育”表示下面哪种情况？ 情况一：三岁开始，得肿瘤无法再生育，三岁结束。 情况二：三岁开始，生育，得肿瘤以后无法再生育，三岁结束。  应该用第一种理解，只要到3岁，也就是34个月，可以生， 36个月，就有80%的肿瘤不再生育，剩余20%可以正常生育到10岁。

引用 42 楼 uuuououlcz 的回复:习语言，lz真的想推广的话，去建个版吧还是，老了，看见你用习语言写的东西都觉得受不了了，太刺眼了   你能帮忙建个吗？ 提前谢谢了。

此类问题求解，需要建模，最好的方法就是构建状态机。 好理解，也容易保证正确性。   引用 39 楼 zhao4zhong1 的回复:求高手纠错 //假设一对耗子每2个月都可以生一对小耗子。 //小耗子生长3个月后，从第4个月开始也就能够生小耗子，耗子寿命为10年， //使用转基因玉米大豆喂耗子，80%的耗子3岁开始得肿瘤无法再生育，得肿瘤的耗子4岁死去。 //耗子的第二代（孩子）有20%绝育，耗子的第3代(孙子)全部绝育。 //假设现在有100对1岁成年耗子，请问：3年后、5年后、10年后、20年后一共有多少只活耗子？ #include <stdio.h> #define MAXN 100000 struct RAT2 {//一对耗子     char gen;//0死耗子 1第一代 2第二代 3第三代     char agp;//上次生育年龄，单位:月     char age;//现年龄，单位:月     char prc;//1可育 0绝育     char can;//1得肿瘤 0没得肿瘤 } rat2[MAXN]; int i,n,m,j,z,z8,z2,z1,z3,zc,zp; int main() {     n=100;     for (i=0;i<n;i++) {         rat2[i].gen=1;         rat2[i].agp=12;         rat2[i].age=12;         rat2[i].prc=1;         rat2[i].can=0;     }     for (m=0;m<20*12;m+=2) {         for (i=0;i<n;i++) {             if (rat2[i].gen>0) rat2[i].age+=2;         }          //小耗子生长3个月后，从第4个月开始也就能够生小耗子         for (i=0;i<n;i++) {             if (rat2[i].gen>0 && rat2[i].age>=4) rat2[i].prc=1;         }          //80%的耗子3岁开始得肿瘤无法再生育         z=0;         for (i=0;i<n;i++) {             if (rat2[i].gen>0 && rat2[i].age==36) z++;         }         z8=z*8/10;         z=0;         for (i=0;i<n;i++) {             if (rat2[i].gen>0 && rat2[i].age==36) {                 if (z<z8) {                     rat2[i].can=1;                     rat2[i].prc=0;                 }                 z++;             }         }          //得肿瘤的耗子4岁死去         for (i=0;i<n;i++) if (rat2[i].gen>0 && rat2[i].can==1 && rat2[i].age==48) rat2[i].gen=0;          //耗子的第二代（孩子）有20%绝育         z=0;         for (i=0;i<n;i++) {             if (rat2[i].gen>0 && rat2[i].gen==2 && rat2[i].prc==1) z++;         }         z2=z*2/10;         z=0;         for (i=0;i<n;i++) {             if (rat2[i].gen>0 && rat2[i].gen==2 && rat2[i].prc==1) {                 if (z<z2) rat2[i].prc=0;                 z++;             }         }          j=0;         for (i=0;i<n;i++) {             if (rat2[i].age>=120) rat2[i].gen=0;//耗子寿命为10年，             if (0<rat2[i].gen && rat2[i].gen<3//耗子的第3代(孙子)全部绝育。              && rat2[i].prc==1              && rat2[i].age-rat2[i].agp>=2) {//一对耗子每2个月都可以生一对小耗子。                 rat2[n+j].gen=rat2[i].gen+1;                 rat2[n+j].agp=0;                 rat2[n+j].age=0;                 rat2[n+j].prc=0;                 rat2[n+j].can=0;                 j++;                 if (n+j>=MAXN) {                     printf("Too many rats!\n");                     return 1;                 }                 rat2[i].agp=rat2[i].age;             }         }         n+=j;         z=0;         z1=0;         z2=0;         z3=0;         zc=0;         zp=0;         for (i=0;i<n;i++) {             if (rat2[i].gen>0) {                 z++;                 if (rat2[i].gen==1) z1++;                 if (rat2[i].gen==2) z2++;                 if (rat2[i].gen==3) z3++;                 if (rat2[i].can==1) zc++;                 if (rat2[i].prc==1) zp++;             }         }         printf("当前月=%d，老鼠总数=%d，其中一,二,三代;得肿瘤,可生育数分别为%d,%d,%d;%d,%d\n",m+2,z*2,z1*2,z2*2,z3*2,zc*2,zp*2); //      if (m==36-2 || m==60-2 || m==120-2 || m==240-2) { //          z=0; //          for (i=0;i<n;i++) if (rat2[i].gen>0) z++; //          printf("Year %d,%d rats.\n",(m+2)/12,z*2); //      }     }     return 0; }

运行结果： 当前月=2，老鼠总数=400，其中一,二,三代;得肿瘤,可生育数分别为200,200,0;0,200 当前月=4，老鼠总数=600，其中一,二,三代;得肿瘤,可生育数分别为200,400,0;0,200 当前月=6，老鼠总数=960，其中一,二,三代;得肿瘤,可生育数分别为200,600,160;0,360 当前月=8，老鼠总数=1480，其中一,二,三代;得肿瘤,可生育数分别为200,800,480;0,520 当前月=10，老鼠总数=2160，其中一,二,三代;得肿瘤,可生育数分别为200,1000,960;0,840 当前月=12，老鼠总数=3000，其中一,二,三代;得肿瘤,可生育数分别为200,1200,1600;0,1320 当前月=14，老鼠总数=4000，其中一,二,三代;得肿瘤,可生育数分别为200,1400,2400;0,1960 当前月=16，老鼠总数=5160，其中一,二,三代;得肿瘤,可生育数分别为200,1600,3360;0,2760 当前月=18，老鼠总数=6480，其中一,二,三代;得肿瘤,可生育数分别为200,1800,4480;0,3720 当前月=20，老鼠总数=7960，其中一,二,三代;得肿瘤,可生育数分别为200,2000,5760;0,4840 当前月=22，老鼠总数=9600，其中一,二,三代;得肿瘤,可生育数分别为200,2200,7200;0,6120 当前月=24，老鼠总数=11240，其中一,二,三代;得肿瘤,可生育数分别为200,2240,8800;160,7400 当前月=26，老鼠总数=13200，其中一,二,三代;得肿瘤,可生育数分别为200,2440,10560;160,9160 当前月=28，老鼠总数=15192，其中一,二,三代;得肿瘤,可生育数分别为200,2640,12352;160,10792 当前月=30，老鼠总数=17344，其中一,二,三代;得肿瘤,可生育数分别为200,2840,14304;160,12712 当前月=32，老鼠总数=19656，其中一,二,三代;得肿瘤,可生育数分别为200,3040,16416;160,14664 当前月=34，老鼠总数=22128，其中一,二,三代;得肿瘤,可生育数分别为200,3240,18688;160,16776 当前月=36，老鼠总数=24440，其中一,二,三代;得肿瘤,可生育数分别为40,3280,21120;0,18888 当前月=38，老鼠总数=26944，其中一,二,三代;得肿瘤,可生育数分别为40,3320,23584;160,21192 当前月=40，老鼠总数=29480，其中一,二,三代;得肿瘤,可生育数分别为40,3360,26080;320,23656 当前月=42，老鼠总数=32016，其中一,二,三代;得肿瘤,可生育数分别为40,3400,28576;608,26032 当前月=44，老鼠总数=34584，其中一,二,三代;得肿瘤,可生育数分别为40,3440,31104;1024,28432 当前月=46，老鼠总数=37184，其中一,二,三代;得肿瘤,可生育数分别为40,3480,33664;1568,30832 当前月=48，老鼠总数=39816，其中一,二,三代;得肿瘤,可生育数分别为40,3520,36256;2240,33264 当前月=50，老鼠总数=42192，其中一,二,三代;得肿瘤,可生育数分别为40,3400,38752;2880,35600 当前月=52，老鼠总数=44472，其中一,二,三代;得肿瘤,可生育数分别为40,3280,41152;3648,37968 当前月=54，老鼠总数=46496，其中一,二,三代;得肿瘤,可生育数分别为40,3120,43336;4416,40120 当前月=56，老鼠总数=48264，其中一,二,三代;得肿瘤,可生育数分别为40,2960,45264;5184,42048 当前月=58，老鼠总数=49776，其中一,二,三代;得肿瘤,可生育数分别为40,2800,46936;5952,43720 当前月=60，老鼠总数=51160，其中一,二,三代;得肿瘤,可生育数分别为40,2640,48480;6592,45232 当前月=62，老鼠总数=52160，其中一,二,三代;得肿瘤,可生育数分别为40,2480,49640;7360,46296 当前月=64，老鼠总数=52904，其中一,二,三代;得肿瘤,可生育数分别为40,2320,50544;8024,47432 当前月=66，老鼠总数=53392，其中一,二,三代;得肿瘤,可生育数分别为40,2160,51192;8688,48080 当前月=68，老鼠总数=53624，其中一,二,三代;得肿瘤,可生育数分别为40,2000,51584;9352,48472 当前月=70，老鼠总数=53600，其中一,二,三代;得肿瘤,可生育数分别为40,1840,51720;10016,48608 当前月=72，老鼠总数=53704，其中一,二,三代;得肿瘤,可生育数分别为40,1840,51824;10680,48680 当前月=74，老鼠总数=53424，其中一,二,三代;得肿瘤,可生育数分别为40,1680,51704;11114,48406 当前月=76，老鼠总数=52992，其中一,二,三代;得肿瘤,可生育数分别为40,1520,51432;11550,48236 当前月=78，老鼠总数=52304，其中一,二,三代;得肿瘤,可生育数分别为40,1360,50904;11858,47836 当前月=80，老鼠总数=51360，其中一,二,三代;得肿瘤,可生育数分别为40,1200,50120;12064,47154 当前月=82，老鼠总数=50160，其中一,二,三代;得肿瘤,可生育数分别为40,1040,49080;12168,46216 当前月=84，老鼠总数=48960，其中一,二,三代;得肿瘤,可生育数分别为40,1040,47880;12296,45120 当前月=86，老鼠总数=47734，其中一,二,三代;得肿瘤,可生育数分别为40,1040,46654;12322,43970 当前月=88，老鼠总数=46482，其中一,二,三代;得肿瘤,可生育数分别为40,1040,45402;12246,42794 当前月=90，老鼠总数=45230，其中一,二,三代;得肿瘤,可生育数分别为40,1040,44150;12066,41646 当前月=92，老鼠总数=43952，其中一,二,三代;得肿瘤,可生育数分别为40,1040,42872;11758,40470 当前月=94，老鼠总数=42648，其中一,二,三代;得肿瘤,可生育数分别为40,1040,41568;11322,39268 当前月=96，老鼠总数=41320，其中一,二,三代;得肿瘤,可生育数分别为40,1040,40240;10862,37940 当前月=98，老鼠总数=40068，其中一,二,三代;得肿瘤,可生育数分别为40,1040,38988;10274,36892 当前月=100，老鼠总数=38892，其中一,二,三代;得肿瘤,可生育数分别为40,1040,37812;9658,35820 当前月=102，老鼠总数=37820，其中一,二,三代;得肿瘤,可生育数分别为40,1040,36740;9044,34850 当前月=104，老鼠总数=36850，其中一,二,三代;得肿瘤,可生育数分别为40,1040,35770;8430,33982 当前月=106，老鼠总数=35982，其中一,二,三代;得肿瘤,可生育数分别为40,1040,34902;7816,33216 当前月=108，老鼠总数=35034，其中一,二,三代;得肿瘤,可生育数分别为0,1000,34034;7304,32206 当前月=110，老鼠总数=34330，其中一,二,三代;得肿瘤,可生育数分别为0,960,33370;6894,31644 当前月=112，老鼠总数=33698，其中一,二,三代;得肿瘤,可生育数分别为0,920,32778;6486,31154 当前月=114，老鼠总数=33136，其中一,二,三代;得肿瘤,可生育数分别为0,880,32256;6076,30768 当前月=116，老鼠总数=32644，其中一,二,三代;得肿瘤,可生育数分别为0,840,31804;5666,30450 当前月=118，老鼠总数=32222，其中一,二,三代;得肿瘤,可生育数分别为0,800,31422;5256,30202 当前月=120，老鼠总数=31666，其中一,二,三代;得肿瘤,可生育数分别为0,760,30906;4744,29718 当前月=122，老鼠总数=31140，其中一,二,三代;得肿瘤,可生育数分别为0,680,30460;4334,29304 当前月=124，老鼠总数=30652，其中一,二,三代;得肿瘤,可生育数分别为0,600,30052;4026,28928 当前月=126，老鼠总数=30172，其中一,二,三代;得肿瘤,可生育数分别为0,560,29612;3822,28552 当前月=128，老鼠总数=29730，其中一,二,三代;得肿瘤,可生育数分别为0,520,29210;3720,28214 当前月=130，老鼠总数=29326，其中一,二,三代;得肿瘤,可生育数分别为0,480,28846;3720,27882 当前月=132，老鼠总数=28858，其中一,二,三代;得肿瘤,可生育数分别为0,440,28418;3720,27486 当前月=134，老鼠总数=28326，其中一,二,三代;得肿瘤,可生育数分别为0,400,27926;3720,27026 当前月=136，老鼠总数=27730，其中一,二,三代;得肿瘤,可生育数分别为0,360,27370;3720,26502 当前月=138，老鼠总数=27070，其中一,二,三代;得肿瘤,可生育数分别为0,320,26750;3720,25914 当前月=140，老鼠总数=26346，其中一,二,三代;得肿瘤,可生育数分别为0,280,26066;3720,25262 当前月=142，老鼠总数=25558，其中一,二,三代;得肿瘤,可生育数分别为0,240,25318;3720,24546 当前月=144，老鼠总数=24770，其中一,二,三代;得肿瘤,可生育数分别为0,200,24570;3688,23822 当前月=146，老鼠总数=23886，其中一,二,三代;得肿瘤,可生育数分别为0,160,23726;3656,22978 当前月=148，老鼠总数=22962，其中一,二,三代;得肿瘤,可生育数分别为0,120,22842;3598,22152 当前月=150，老鼠总数=21974，其中一,二,三代;得肿瘤,可生育数分别为0,80,21894;3514,21262 当前月=152，老鼠总数=20922，其中一,二,三代;得肿瘤,可生育数分别为0,40,20882;3406,20306 当前月=154，老鼠总数=19806，其中一,二,三代;得肿瘤,可生育数分别为0,0,19806;3272,19288 当前月=156，老鼠总数=18722，其中一,二,三代;得肿瘤,可生育数分别为0,0,18722;3144,18262 当前月=158，老鼠总数=17632，其中一,二,三代;得肿瘤,可生育数分别为0,0,17632;2990,17198 当前月=160，老鼠总数=16562，其中一,二,三代;得肿瘤,可生育数分别为0,0,16562;2812,16178 当前月=162，老鼠总数=15518，其中一,二,三代;得肿瘤,可生育数分别为0,0,15518;2608,15186 当前月=164，老鼠总数=14492，其中一,二,三代;得肿瘤,可生育数分别为0,0,14492;2402,14186 当前月=166，老鼠总数=13486，其中一,二,三代;得肿瘤,可生育数分别为0,0,13486;2196,13206 当前月=168，老鼠总数=12498，其中一,二,三代;得肿瘤,可生育数分别为0,0,12498;1992,12242 当前月=170，老鼠总数=11556，其中一,二,三代;得肿瘤,可生育数分别为0,0,11556;1788,11326 当前月=172，老鼠总数=10684，其中一,二,三代;得肿瘤,可生育数分别为0,0,10684;1608,10480 当前月=174，老鼠总数=9888，其中一,二,三代;得肿瘤,可生育数分别为0,0,9888;1454,9710 当前月=176，老鼠总数=9144，其中一,二,三代;得肿瘤,可生育数分别为0,0,9144;1300,8992 当前月=178，老鼠总数=8452，其中一,二,三代;得肿瘤,可生育数分别为0,0,8452;1148,8324 当前月=180，老鼠总数=7784，其中一,二,三代;得肿瘤,可生育数分别为0,0,7784;1020,7656 当前月=182，老鼠总数=7194，其中一,二,三代;得肿瘤,可生育数分别为0,0,7194;892,7092 当前月=184，老鼠总数=6654，其中一,二,三代;得肿瘤,可生育数分别为0,0,6654;764,6578 当前月=186，老鼠总数=6166，其中一,二,三代;得肿瘤,可生育数分别为0,0,6166;636,6116 当前月=188，老鼠总数=5730，其中一,二,三代;得肿瘤,可生育数分别为0,0,5730;508,5706 当前月=190，老鼠总数=5344，其中一,二,三代;得肿瘤,可生育数分别为0,0,5344;380,5344 当前月=192，老鼠总数=4932，其中一,二,三代;得肿瘤,可生育数分别为0,0,4932;252,4932 当前月=194，老鼠总数=4572，其中一,二,三代;得肿瘤,可生育数分别为0,0,4572;150,4572 当前月=196，老鼠总数=4264，其中一,二,三代;得肿瘤,可生育数分别为0,0,4264;74,4264 当前月=198，老鼠总数=4006，其中一,二,三代;得肿瘤,可生育数分别为0,0,4006;24,4006 当前月=200，老鼠总数=3800，其中一,二,三代;得肿瘤,可生育数分别为0,0,3800;0,3800 当前月=202，老鼠总数=3644，其中一,二,三代;得肿瘤,可生育数分别为0,0,3644;0,3644 当前月=204，老鼠总数=3488，其中一,二,三代;得肿瘤,可生育数分别为0,0,3488;0,3488 当前月=206，老鼠总数=3332，其中一,二,三代;得肿瘤,可生育数分别为0,0,3332;0,3332 当前月=208，老鼠总数=3176，其中一,二,三代;得肿瘤,可生育数分别为0,0,3176;0,3176 当前月=210，老鼠总数=3020，其中一,二,三代;得肿瘤,可生育数分别为0,0,3020;0,3020 当前月=212，老鼠总数=2864，其中一,二,三代;得肿瘤,可生育数分别为0,0,2864;0,2864 当前月=214，老鼠总数=2708，其中一,二,三代;得肿瘤,可生育数分别为0,0,2708;0,2708 当前月=216，老鼠总数=2552，其中一,二,三代;得肿瘤,可生育数分别为0,0,2552;0,2552 当前月=218，老鼠总数=2396，其中一,二,三代;得肿瘤,可生育数分别为0,0,2396;0,2396 当前月=220，老鼠总数=2240，其中一,二,三代;得肿瘤,可生育数分别为0,0,2240;0,2240 当前月=222，老鼠总数=2084，其中一,二,三代;得肿瘤,可生育数分别为0,0,2084;0,2084 当前月=224，老鼠总数=1928，其中一,二,三代;得肿瘤,可生育数分别为0,0,1928;0,1928 当前月=226，老鼠总数=1772，其中一,二,三代;得肿瘤,可生育数分别为0,0,1772;0,1772 当前月=228，老鼠总数=1624，其中一,二,三代;得肿瘤,可生育数分别为0,0,1624;0,1624 当前月=230，老鼠总数=1476，其中一,二,三代;得肿瘤,可生育数分别为0,0,1476;0,1476 当前月=232，老鼠总数=1334，其中一,二,三代;得肿瘤,可生育数分别为0,0,1334;0,1334 当前月=234，老鼠总数=1198，其中一,二,三代;得肿瘤,可生育数分别为0,0,1198;0,1198 当前月=236，老鼠总数=1070，其中一,二,三代;得肿瘤,可生育数分别为0,0,1070;0,1070 当前月=238，老鼠总数=948，其中一,二,三代;得肿瘤,可生育数分别为0,0,948;0,948 当前月=240，老鼠总数=832，其中一,二,三代;得肿瘤,可生育数分别为0,0,832;0,832

我的运行结果，好像从第38月开始出现差错了

引用 35 楼 xiyuyan 的回复:[quote=引用 33 楼 maoshuoqiong 的回复:] 80%的耗子3岁开始得肿瘤无法再生育，得肿瘤的耗子4岁死去。 5岁的耗子得了肿瘤是要自杀死还是要时空穿越回去死？  你是想给 赵老师 出难题吗？ ：）  按照 习语言 代码所展示的算法，  你可以随意增加可能的情况， 无非增加对应的状态数组 及 状态转换处理代码。[/quote]  不是出难题，是这里有点歧义，我没弄明白题目的意思

第[2]月,共有耗子[400]只,死亡[0]只 第[4]月,共有耗子[600]只,死亡[0]只 第[6]月,共有耗子[960]只,死亡[0]只 第[8]月,共有耗子[1480]只,死亡[0]只 第[10]月,共有耗子[2160]只,死亡[0]只 第[12]月,共有耗子[3000]只,死亡[0]只 第[14]月,共有耗子[4000]只,死亡[0]只 第[16]月,共有耗子[5160]只,死亡[0]只 第[18]月,共有耗子[6480]只,死亡[0]只 第[20]月,共有耗子[7960]只,死亡[0]只 第[22]月,共有耗子[9600]只,死亡[0]只 第[24]月,共有耗子[11240]只,死亡[0]只 第[26]月,共有耗子[13040]只,死亡[0]只 第[28]月,共有耗子[14872]只,死亡[0]只 第[30]月,共有耗子[16736]只,死亡[0]只 第[32]月,共有耗子[18632]只,死亡[0]只 第[34]月,共有耗子[20560]只,死亡[0]只 第[36]月,共有耗子[22360]只,死亡[160]只 第[38]月,共有耗子[24232]只,死亡[0]只 第[40]月,共有耗子[26016]只,死亡[0]只 第[42]月,共有耗子[27672]只,死亡[0]只 第[44]月,共有耗子[29200]只,死亡[0]只 第[46]月,共有耗子[30600]只,死亡[0]只 第[48]月,共有耗子[31872]只,死亡[0]只 第[50]月,共有耗子[32856]只,死亡[160]只 第[52]月,共有耗子[33712]只,死亡[160]只 第[54]月,共有耗子[34312]只,死亡[288]只 第[56]月,共有耗子[34656]只,死亡[416]只 第[58]月,共有耗子[34744]只,死亡[544]只 第[60]月,共有耗子[34704]只,死亡[672]只 第[62]月,共有耗子[34536]只,死亡[800]只 第[64]月,共有耗子[34240]只,死亡[928]只 第[66]月,共有耗子[33816]只,死亡[1056]只 第[68]月,共有耗子[33264]只,死亡[1184]只 第[70]月,共有耗子[32584]只,死亡[1312]只 第[72]月,共有耗子[31904]只,死亡[1312]只 第[74]月,共有耗子[31096]只,死亡[1440]只 第[76]月,共有耗子[30264]只,死亡[1464]只 第[78]月,共有耗子[29406]只,死亡[1490]只 第[80]月,共有耗子[28522]只,死亡[1516]只 第[82]月,共有耗子[27612]只,死亡[1542]只 第[84]月,共有耗子[26676]只,死亡[1568]只 第[86]月,共有耗子[25812]只,死亡[1496]只 第[88]月,共有耗子[25018]只,死亡[1426]只 第[90]月,共有耗子[24326]只,死亡[1324]只 第[92]月,共有耗子[23736]只,死亡[1222]只 第[94]月,共有耗子[23248]只,死亡[1120]只 第[96]月,共有耗子[22864]只,死亡[1016]只 第[98]月,共有耗子[22582]只,死亡[914]只 第[100]月,共有耗子[22402]只,死亡[812]只 第[102]月,共有耗子[22324]只,死亡[710]只 第[104]月,共有耗子[22348]只,死亡[608]只 第[106]月,共有耗子[22476]只,死亡[504]只 第[108]月,共有耗子[22524]只,死亡[544]只 第[110]月,共有耗子[22612]只,死亡[504]只 第[112]月,共有耗子[22668]只,死亡[504]只 第[114]月,共有耗子[22692]只,死亡[504]只 第[116]月,共有耗子[22684]只,死亡[504]只 第[118]月,共有耗子[22644]只,死亡[504]只 第[120]月,共有耗子[22572]只,死亡[504]只 第[122]月,共有耗子[22388]只,死亡[544]只 第[124]月,共有耗子[22132]只,死亡[544]只 第[126]月,共有耗子[21812]只,死亡[576]只 第[128]月,共有耗子[21428]只,死亡[608]只 第[130]月,共有耗子[20980]只,死亡[640]只 第[132]月,共有耗子[20468]只,死亡[672]只 第[134]月,共有耗子[19892]只,死亡[704]只 第[136]月,共有耗子[19252]只,死亡[736]只 第[138]月,共有耗子[18548]只,死亡[768]只 第[140]月,共有耗子[17780]只,死亡[800]只 第[142]月,共有耗子[16948]只,死亡[832]只 第[144]月,共有耗子[16116]只,死亡[832]只 第[146]月,共有耗子[15252]只,死亡[864]只 第[148]月,共有耗子[14380]只,死亡[872]只 第[150]月,共有耗子[13502]只,死亡[878]只 第[152]月,共有耗子[12618]只,死亡[884]只 第[154]月,共有耗子[11728]只,死亡[890]只 第[156]月,共有耗子[10864]只,死亡[864]只 第[158]月,共有耗子[10016]只,死亡[848]只 第[160]月,共有耗子[9210]只,死亡[806]只 第[162]月,共有耗子[8456]只,死亡[754]只 第[164]月,共有耗子[7754]只,死亡[702]只 第[166]月,共有耗子[7104]只,死亡[650]只 第[168]月,共有耗子[6504]只,死亡[600]只 第[170]月,共有耗子[5986]只,死亡[518]只 第[172]月,共有耗子[5552]只,死亡[434]只 第[174]月,共有耗子[5170]只,死亡[382]只 第[176]月,共有耗子[4840]只,死亡[330]只 第[178]月,共有耗子[4560]只,死亡[280]只 第[180]月,共有耗子[4304]只,死亡[256]只 第[182]月,共有耗子[4074]只,死亡[230]只 第[184]月,共有耗子[3870]只,死亡[204]只 第[186]月,共有耗子[3692]只,死亡[178]只 第[188]月,共有耗子[3540]只,死亡[152]只 第[190]月,共有耗子[3412]只,死亡[128]只 第[192]月,共有耗子[3284]只,死亡[128]只 第[194]月,共有耗子[3156]只,死亡[128]只 第[196]月,共有耗子[3028]只,死亡[128]只 第[198]月,共有耗子[2900]只,死亡[128]只 第[200]月,共有耗子[2772]只,死亡[128]只 第[202]月,共有耗子[2644]只,死亡[128]只 第[204]月,共有耗子[2516]只,死亡[128]只 第[206]月,共有耗子[2388]只,死亡[128]只 第[208]月,共有耗子[2260]只,死亡[128]只 第[210]月,共有耗子[2132]只,死亡[128]只 第[212]月,共有耗子[2004]只,死亡[128]只 第[214]月,共有耗子[1876]只,死亡[128]只 第[216]月,共有耗子[1748]只,死亡[128]只 第[218]月,共有耗子[1620]只,死亡[128]只 第[220]月,共有耗子[1492]只,死亡[128]只 第[222]月,共有耗子[1364]只,死亡[128]只 第[224]月,共有耗子[1236]只,死亡[128]只 第[226]月,共有耗子[1108]只,死亡[128]只 第[228]月,共有耗子[988]只,死亡[120]只 第[230]月,共有耗子[868]只,死亡[120]只 第[232]月,共有耗子[756]只,死亡[112]只 第[234]月,共有耗子[650]只,死亡[106]只 第[236]月,共有耗子[550]只,死亡[100]只 第[238]月,共有耗子[456]只,死亡[94]只 第[240]月,共有耗子[368]只,死亡[88]只 第[242]月,共有耗子[296]只,死亡[72]只 第[244]月,共有耗子[238]只,死亡[58]只 第[246]月,共有耗子[186]只,死亡[52]只 第[248]月,共有耗子[140]只,死亡[46]只 第[250]月,共有耗子[100]只,死亡[40]只 第[252]月,共有耗子[68]只,死亡[32]只 第[254]月,共有耗子[42]只,死亡[26]只 第[256]月,共有耗子[22]只,死亡[20]只 第[258]月,共有耗子[8]只,死亡[14]只 第[260]月,共有耗子[0]只,死亡[8]只

引用 33 楼 maoshuoqiong 的回复:80%的耗子3岁开始得肿瘤无法再生育，得肿瘤的耗子4岁死去。 5岁的耗子得了肿瘤是要自杀死还是要时空穿越回去死？  你是想给 赵老师 出难题吗？ ：）  按照 习语言 代码所展示的算法，  你可以随意增加可能的情况， 无非增加对应的状态数组 及 状态转换处理代码。

引用 33 楼 maoshuoqiong 的回复:80%的耗子3岁开始得肿瘤无法再生育，得肿瘤的耗子4岁死去。 5岁的耗子得了肿瘤是要自杀死还是要时空穿越回去死？ 肿瘤只在3岁时得。 5岁的活耗子肯定没得肿瘤。

（郁闷，我怎么不能用引用功能呢，手动引用 ） 引用赵：谁对谁错还没有定论吧。   所以，我用：好像不如。 话不说死，一切可能皆允许。

引用 30 楼 lunat 的回复:假定公母数目一直保持一样？？？ 人家一对耗子，不论公母，公公，母母都能生！而且一生肯定成对！！

假定公母数目一直保持一样？？？

引用 22 楼 zhao4zhong1 的回复:抛开使用开发语言的不同，等哪位高手根据两段代码的算法差异，进而挖掘和剖析出两段代码的运行结果不同的根源，并指出谁对谁错中……  引用 27 楼 xiyuyan 的回复:怎么除了赵老师，就没人写出计算此题的程序啦！ 看来 赵老师 是武林第一人啊！  不过赵老师的程序好像不如 习语言 程序简单、准确啊！  谁对谁错还没有定论吧。

mark 回家再看


Question: 在指定位置插入字符

引用 2 楼 user-3 的回复:void insert(char s[] , char t, int i) {     char *p = s;     while (*p++); // 结果p指向'\0'下一个字符     while (p > &s[i]) {         *p = *(p - 1);         --p;     }     *p = t; } ++

char *strcat(char *dest,char *src); 但是你传参数的时候确实一个字节！所以再改改吧

strcat(string, t)有问题


Question: linux 网络编程 求推荐开源代码

网络编程的API基本是通用的，这有很多socket例子： http://download.csdn.net/detail/geoff08zhang/4571358

引用 3 楼 qq120848369 的回复:学我的吧： https://code.csdn.net/qq120848369/ez_poll/tree/master 我看你代码用的是C++，但是C++没学过啊，我学的是linux C


Question: 系统剩余的内存超过4G，realloc大约100多M内存还会失败吗？

内存不够用的终极解决方法是： 用文件读写模拟内存读写

程序启动的时候，就把内存申请足够，然后就不要释放了，否则内存碎片化之后，很难再申请大块内存。

谢谢楼上各位，尤其是jha334201553、mLee79等人。  现将楼上答案做一个简要总结：  问题：32位Win7，4G内存。程序已经占用1.2G内存，还剩大约1G。再用realloc申请100多M的内存，失败。 换到64位Win7上，8G内存。在同一个地方出错。此时系统还剩至少4G内存。 如果没有足够多的【连续】内存供realloc用，它就会出错，即使总的内存还够用。但问题是，剩余这4G多内存，就没有100多M连续的吗？  解答：在64位系统下，程序还是32位的啊，程序指针最大值也就是0xFFFFFFFF，而系统又规定高2G保留系统使用，最大寻址就是0x7FFFFFFF，不能申请超过2G的内存。  解决方法1：按照微软规定修改启动项到最大，可以使程序用的内存达到3G 解决方法2：在64位系统下, 打开 /LARGEADDRESSAWARE 选项, 32位程序可以使用4G内存 解决方法3：把程序编译成64位的，这才是一劳永逸的方法 另外，程序启动时，最好一次申请足够的内存，避免频繁地申请  方法1：  xp系统修改boot.int ： multi(0)disk(0)rdisk(0)partition(4)\WINDOWS="Microsoft Windows XP Professional" /3GB /fastdetect 加上那个/3G 就可以  win7 系统用 bcdedit.exe ： BCDEdit /set increaseuserva 3072  （来自http://bbs.csdn.net/topics/390615068） 注：用BCDEdit命令时，可能需要管理员权限。 解决方法： 　　1、点击”开始“菜单; 　　2、然后输入”cmd“; 　　3、在出现的”cmd.exe“程序中右键单击，选择”以管理员身份运行“，就得到一个具有管理员权限的命令行窗口，然后再运行bcdedit.exe就OK。 （来自http://www.pcyyjs.com/sys/win7/3853/）  方法2：    方法3  VS 2008的64位编译环境的安装和使用：详见http://blog.csdn.net/clever101/article/details/8844314  如果程序中用到了lib、dll文件，则要重新把它们编译成64位的，否则会报错：模块计算机类型“X86”与目标计算机类型“x64”冲突 如果还报错，参见： http://blog.csdn.net/txh0001/article/details/7019052 http://blog.csdn.net/qtbmp/article/details/7273191

如果系统中没有那么大的连续内存空间, 分配失败也是正常的.  这就是常说的"内存碎片"问题. 虽然可用内存很多, 但是可能你想申请的那么大的连续内存却已经没有了.

内存不够用的终极解决方法是： 用文件读写模拟内存读写 或者 直接用操作系统提供的内存映射文件API

xp的话修改boot.int  multi(0)disk(0)rdisk(0)partition(4)\WINDOWS="Microsoft Windows XP Professional" /3GB /fastdetect 加上那个/3G 就可以  win7 的话要用 bcdedit.exe  BCDEdit /set increaseuserva 3072

直接用系统调用分配页呢

并不是系统64位，应用程序就是64位。这是两个概念

你得把程序编译为64位程序，才能使用大于2g以上内存。

引用 12 楼 jha334201553 的回复:引用 11 楼 bukeshuo8 的回复:是的。我不明白的是，放到64位系统下，在剩余内存大于4G的情况下，为什么没有100多M的连续内存，来供realloc使用？在64位系统下，你程序还是32位的啊，你程序指针最大值也就是0xFFFFFFFF，而系统又规定高2G保留系统使用，那么你最大寻址不就是0x7FFFFFFF么，你如何申请超过2G的内存？ 原来如此！ 那么，怎样按照微软规定修改启动项为3G呢？ 当然，一劳永逸的方法是把我的程序变成64位的，如何才能办到呢？

引用 9 楼 bukeshuo8 的回复:32位系统能寻址2^32B=4GB内存。但实际中，会有一些地址为其他地方所用。所以实际中，32位系统下，最大能利用3G多的内存。默认2G-4G的内存是系统用的，驱动、系统内核在使用，你使用一个指针操作2G以上内存立马挂掉。并非程序是能用4G，你按照微软规定修改启动项最大用户才3G

引用 8 楼 jha334201553 的回复:你没理解，系统内存，程序寻址空间，内存寻址，这些基本的概念。你把程序编译成x64的然后在x64上运行可以申请超过4G的内存了。而编译成x86的最大最大也就能寻址3G，一般是2G，地址从0x10000~0x7ffeffff,还要出去exe、dll、一些结构体PEB  占用的内存，能申请到1.5G就非常非常好了 是的。我不明白的是，放到64位系统下，在剩余内存大于4G的情况下，为什么没有100多M的连续内存，来供realloc使用？

引用 7 楼 u011779875 的回复:[quote=引用 3 楼 bukeshuo8 的回复:] [quote=引用 2 楼 u011779875 的回复:]  我感觉你没明白realloc函数 realloc 有一个问题 你要知道就是它在realloc的时候 会出现连续空间不够的情况 之后把以前的申请的内存释放掉 在重新申请一片空间 所以你要用的是realloc的返回值 而不是说你realloc 它就会成功。 用realloc的时候一定要小心的检查。 在有就是你需要看C标准库是如何实现realloc 它的陷阱在哪。 realloc返回结果是NULL。剩余4G内存，为什么还不够realloc 100多M的呢？[/quote] 你不贴代码 是看不出问题的 你是不是连怎么用都写错了啊  [/quote]   const  Coord_Mat_double operator*(const Coord_Mat_double& A, const Coord_Mat_double &B) { 	//A: m * l, B:	l2*n. C=A*B：m*n 	int m=A.dim(0),l=A.dim(1), l2=B.dim(0), n=B.dim(1); 	if(l!=l2) 	{ 		MessageBoxA(NULL,"Matirx multiply error! Matrix demensions don't match.",NULL,MB_OK); 		return A; 	}  	int i,j,k,q;  	int nA=A.NumNonzeros(); 	int nB=B.NumNonzeros();  	 	if(!nA) 		return A;//A为0 	if(!nB) 		return B;//B为0 	 	 	int *num= new int[l];//B的每一行非0元素的个数 	for(i=0;i<l;i++) 		num[i]=0; 	for(i=0;i<nB;i++) 	{ 		j=B.row_ind(i); 		num[j]++; 	}  	int *row_ptrB=new int[l+1];//B的每一行非0元素在B.val[]中的位置（最后一个当监视哨） 	row_ptrB[0]=0; 	for(i=1;i<=l;i++) 	{ 		row_ptrB[i]=row_ptrB[i-1]+num[i-1]; 	}  	int nC=0;//当前C 中非零元素的个数 	int pA=0;//指示A.data 中当前非零元素的位置  	int memSize=0.01*m*n+10*m+10*n+100;//当前申请的内存空间。估计用这个会比较合适  	int* row=(int*)malloc(sizeof(int)*memSize); 	int* col=(int*)malloc(sizeof(int)*memSize); 	double* val=(double*)malloc(sizeof(double)*memSize);  	if(!row || !col || !val) 	{ 		MessageBoxA(NULL,"Malloc error in matrix multiply.",NULL,MB_OK); 		return A; 	}  	double *temp=new double[n]; 		 	for ( i= 0;i<m; i++) 	{   		for (j=0;j<n;j++)  			temp[j]=0; /*cij 的累加器初始化*/  		//while (A.row_ind(pA)==i ) /*求第i 行的*/ 		while (pA<nA&&A.row_ind(pA)==i )//2013.06.20 hyb 又找出一个bug!!! 		{  			k=A.col_ind(pA); /*A 中当前非零元的列号*/  			for (q=row_ptrB[k]; q<row_ptrB[k+1]; q++) /* B 中第k 行的每一个非零元素*/ 			{  				j=B.col_ind(q); 				temp[j]+=A.val(pA)* B.val(q); 			} 			pA++; 		}   	for (j=0;j<n;j++) 		if (temp[j]!=0) 		{  			nC++; 			if(nC>memSize)//当前数组空间不够用了 			{ 				memSize *= 2;//申请空间加倍  				int* row2=(int*)realloc(row, sizeof(int)*memSize); 				int* col2=(int*)realloc(col, sizeof(int)*memSize); 				double* val2=(double*)realloc(val, sizeof(double)*memSize);//不能直接把值返回给val，以防出现特殊情况 				/*1.如果 当前连续内存块足够 realloc 的话，只是将p所指向的空间扩大，并返回p的指针地址。 这个时候 q 和 p 指向的地址是一样的。 				2.如果 当前连续内存块不够长度，再找一个足够长的地方，分配一块新的内存q，并将 p指向的内容 copy到 q，返回 q。并将p所指向的内存空间删除。 				*/ 				if(!row2 || !col2 || !val2) 				{ 					MessageBoxA(NULL,"Realloc error in matrix multiply.",NULL,MB_OK); 					ofstream outfile("D:\\coord_double_error.txt",ios::app); 					outfile<<"realloc memory: "<<memSize<<" *(int + int + double)。 m= "<<m<<"	n=: "<<n<<endl; 					outfile.close(); 					return A; 				}  				row=row2; 				col=col2; 				val=val2; 			} 			row[nC-1]=i; 			col[nC-1]=j; 			val[nC-1]=temp[j]; 		} 	}  	 	Coord_Mat_double C=Coord_Mat_double(m,n,nC,val,row,col);  	free(row); 	free(col); 	free(val); 	delete []num; 	delete []row_ptrB; 	delete []temp;  	return C; 	 }   是稀疏矩阵的乘法。由于矩阵大小、相乘结果中非0元的个数不确定，所以没办法事先确定一定要申请多少内存。只能先申请一个初始值，不够再加倍。

引用 5 楼 jha334201553 的回复:你这是神马问题，程序已经占用1.2G，系统剩余1G。。。。 程序不管系统剩余多少，只要你里面的地址空间还够就可以申请（理论），但是如果地址空间都没用用完了就没办法了，32位程序最大寻找也就2G，你那剩余系统空间根本没有意义，如果你电脑只有256M内存，那32为程序还是可以寻址2G的，只是用了虚拟内存映射到磁盘的pagefile里面，你想多用些地址空间，建议你开机3G选项，用户可以使用3G的地址空间。。。 32位系统能寻址2^32B=4GB内存。但实际中，会有一些地址为其他地方所用。所以实际中，32位系统下，最大能利用3G多的内存。

引用 3 楼 bukeshuo8 的回复:[quote=引用 2 楼 u011779875 的回复:]  我感觉你没明白realloc函数 realloc 有一个问题 你要知道就是它在realloc的时候 会出现连续空间不够的情况 之后把以前的申请的内存释放掉 在重新申请一片空间 所以你要用的是realloc的返回值 而不是说你realloc 它就会成功。 用realloc的时候一定要小心的检查。 在有就是你需要看C标准库是如何实现realloc 它的陷阱在哪。 realloc返回结果是NULL。剩余4G内存，为什么还不够realloc 100多M的呢？[/quote] 你不贴代码 是看不出问题的 你是不是连怎么用都写错了啊

大块的内存要在程序开始的时候就申请，而且别释放。随着程序的运行过程中内存的不断申请和释放，内存可能被碎片化了，无法再申请出大块连续的内存

引用 1 楼 fishion 的回复:是不是其它地方导致出错了，你直接申请大内存看看 我是先melloc一定大小的空间（比如10M），计算过程中，不够用，再把这个空间加倍（用realloc）。这样，加倍到申请100多M的时候，就realloc失败了。


Question: fread/fwrite与read/write哪个更快？

权威教程  unix 环境高级编程  里面有对比 推荐用 fopen

我平常使用不大会去使用open/read/write ,基本是使用 fopen/fread/fwrite, 另设置一合适缓冲大小,减少I O的频繁度

一般是 fopen/fread/fwrite 快

在文件大小相同的前提下：  读刚读过的文件比头次读没读过的文件快  读转速快的硬盘上的文件比读转速慢的硬盘上的文件快  读没有磁盘碎片的文件比读有磁盘碎片的文件快  读文件不处理比边读边处理快  单线程从头到尾一次读文件比多线程分别读文件各部分快（非固态硬盘上）  读固态硬盘上的文件比读普通硬盘上的文件快

open/read/write更快，前提是你要给他弄一个合适的输入/输出缓冲区。

++  引用 1 楼 user-7 的回复:http://blog.163.com/zhaohai_1988/blog/static/2095100852012623105329412/ 参考下


Question: 浮点数强制转换和直接截断的区别

data 赋值为 1.9 自己运行看输出

引用 3 楼 nice_cxf 的回复:强转是去掉了小数点后边，%.0lf是四舍五入，难道不知道自己测试下么？ 人家就是不知道才问嘛。

MOVSD传送双字  一个用了eax       cvttsd2si   eax,mmword ptr [data] //cvttsd2si r32,XMM/m64 类似cvtsd2si,截断取整.  另一个用了 xmm0    movsd      xmm0,mmword ptr [data]//用了printf的实现的函数处理 详情看C标准库printf的实现

强转是去掉了小数点后边，%.0lf是四舍五入，难道不知道自己测试下么？

区别在于 请看反汇编代码 printf("%d",int(data));             //强制类型转换后输出 002C13FB  cvttsd2si   eax,mmword ptr [data]   002C1400  mov         esi,esp   002C1402  push        eax   002C1403  push        2C5858h   002C1408  call        dword ptr ds:[2C92C0h]   002C140E  add         esp,8   002C1411  cmp         esi,esp   002C1413  call        __RTC_CheckEsp (02C1136h)    printf("%.0lf",data);  //直接舍弃小数位 002C1418  mov         esi,esp   002C141A  sub         esp,8   002C141D  movsd       xmm0,mmword ptr [data]   002C1422  movsd       mmword ptr [esp],xmm0   002C1427  push        2C585Ch   002C142C  call        dword ptr ds:[2C92C0h]   002C1432  add         esp,0Ch   002C1435  cmp         esi,esp   002C1437  call        __RTC_CheckEsp (02C1136h)

可以通过啊 只不过输入的是俩个数连一起了大哥 比如 int main() {   	 double data = 5.2;  printf("%d",int(data));             //强制类型转换后输出  printf("%.0lf",data);  //直接舍弃小数位  getchar(); }  输出55 你都没加空格 连在一起了

强转如果数据太大，不论截断取整，还是转换成最大值都是一种错误。 数据不能转换回来了误差就非常大。  输出截断，只是省略，一些位不写，可能还有舍入，误差可控-- 比如 %.0f,是有舍入的吧，截断误差 <= 0.5。--- 不会出现控制不了的局面。  即使自己截断  比如 使用floor,ciel 函数， 误差 < 1 ，误差同样可控。  强转是不可控的，如果需要使用； 必须确保你知道，它的结果，是你可以接受的。


Question: 新手c语言问题

引用 3 楼 turingo 的回复:字符串交换不能直接赋值，要用strcpy复制内容。你弄错了 这里是只能 直接赋值交换 不能strcpy复制内容

引用 3 楼 turingo 的回复:字符串交换不能直接赋值，要用strcpy复制内容。  [quote=引用 楼主 u012142460 的回复:] 一个指针数组的问题  奖若干字符串按字母顺序（由小到大）输出 #include"stdio.h" #include"string.h" void main() {  void sort(char * name[],int n);  void print(char * name[],int n);  char * name[]={"Follow","BASIC","Great","ZORTRAN","Computer"};  int n=5;  sort( name,n);  print( name,n); }  void sort(char * name[],int n)  {   int i,j,k;   char *temp;   for(i=0;i<n-1;i++)   {    k=i;    for(j=i+1;j<n;j++)         if(strcmp(name[k],name[j])>0)k=j;   /*比较字符串的大小*/        if(k=!i)         { temp=name[i];name[i]=name[k];name[k]=temp;}    }   }    void print(char * name[],int n)  {    int i;    for(i=0;i<n;i++)    {     printf("%s\n",name[i]);    /*输出比较后的字符串*/    }       为什么输出的是这样呢[/quote] 但是前两个不是交换成功了吗

引用 2 楼 buyong 的回复:你这个就是冒泡，最后一个好像处理的不对 可否细说一下

引用 8 楼 qin_moon 的回复:额  貌似是这一句      if(k=!i)          { temp=name[i];name[i]=name[k];name[k]=temp;}          判断不相等符号写错了  把=!改成!= 就ok啦 好吧好吧 这错误犯得太不着调了

仅供参考  #include <stdio.h> #include <string.h> #include <ctype.h>  void sort(char * name[],int n); void print(char * name[],int n);   int main() { 	char *name[]={"what","how old are you","Thanks","Follow","BASIC","Great","ZORTRAN","Computer"}; 	int n = 8; 	sort(name,n); 	print(name,n); }  void sort(char *p[],int n) { 	int i,j; 	char *temp; 	for (i = 0; i<n; i++) 	{ 		for (j = n-1; j>i; j--) 		{ 			if (toupper(*p[j]) < toupper(*p[j-1])) 			{ 				temp = p[j-1]; 				p[j-1] = p[j]; 				p[j] = temp; 			} 		} 	} }   void print(char *name[],int n) {  	int i; 	for(i=0;i<n;i++) 	{ 		printf("%s\n",name[i]);    /*输出比较后的字符串*/ 	} }

字符串交换不能直接赋值，要用strcpy复制内容。  引用 楼主 u012142460 的回复:一个指针数组的问题  奖若干字符串按字母顺序（由小到大）输出 #include"stdio.h" #include"string.h" void main() {  void sort(char * name[],int n);  void print(char * name[],int n);  char * name[]={"Follow","BASIC","Great","ZORTRAN","Computer"};  int n=5;  sort( name,n);  print( name,n); }  void sort(char * name[],int n)  {   int i,j,k;   char *temp;   for(i=0;i<n-1;i++)   {    k=i;    for(j=i+1;j<n;j++)         if(strcmp(name[k],name[j])>0)k=j;   /*比较字符串的大小*/        if(k=!i)         { temp=name[i];name[i]=name[k];name[k]=temp;}    }   }    void print(char * name[],int n)  {    int i;    for(i=0;i<n;i++)    {     printf("%s\n",name[i]);    /*输出比较后的字符串*/    }       为什么输出的是这样呢

你这个就是冒泡，最后一个好像处理的不对

先用简单的冒泡法把 F B G  Z C 这几个字母 按照从小到大的顺序排列好！ 然后再想想这个指针数组要怎么排！


Question: 帮忙调试程序！栈的应用：行编辑器！

引用 4 楼 u011327682 的回复:或者在你的基础上把这个改一改引用//输出栈的元素 Status print_stack(linkstack *s) { 	for(linkstack *p=s;Stack_Empty(p)==false;p=p->next) 		printf("%c",p->next->data); 	printf("\n");  	return OK; }  嗯，输出正确。。。谢谢。

指针参数传递二级指针试试，然后单步走一遍，代码粘贴过来居然没换行，真没劲一行一行的换了....

上面的两个空格 一个是你初始定义的 top->data = -1;一个是字符串结尾的'\0'

引用//判断栈是否为空 bool Stack_Empty(linkstack *top) { 	if(top==NULL) 		return true; 	else 		return false; }改为这个就可以。下一个为NULl，你就退出，所以少打印一个。


Question: 二维数组作为函数参数，报错。

引用 5 楼 z1179675084 的回复:你这么做本身就不对，按你的程序，a是什么数组指针吧，类型是int（*）p；而p是什么二季指针，类型是int **p，再次理解二维数组本质上还是一维数组。那么现在调用的时候p确实是指向了你这个二维数组的首地址，那么下面呢，看看你被调用函数里面的指针运算。 *（p + 1）看第一步 p + 1 = （unsigned int ）p + 1*sizeof（*p） *p的类型是什么int *对吧，所以上面的结果是p + 1 = （unsigned int ）p + 4这是谁的地址a[0][1]的吧，几接下来干什么？ *（p + 1） 不就是取得地址a[0][1]的值吗！不是2是谁？你的问题是没有理解了二级指针与二维数组的区别，你程序编译的时候应该是有警告吧，这是说两个类型不一样，这种情况下除非你很确信这么做可以达到目的，否则最好修改的没有警告了。 接上面所说如果不修改你的函数原型，那么在调用函数里面再给他转回来， int （*ret）[2] = (int (*)2)p; 之后就可以像二维数组那样调用ret了！这里只是帮组你理解一下，最好别这么用。下面介绍一下我认为比较可取的方法。 前面说过二维数组本质上还是一维存储的所以term(int **p)可以这么写  term（int *p,int row*col） {   int i,j;   for(i = 0;i <row*col;i++ )   printf("%d"a[i]); }  } 第二种  void term(int (*p)[col],int row) //等价于void term(int p[2][col],int row)  再来看看数组名作为参数的退化  void print(int a[],int num)   ==>	void print(int *a,int num) 调用一维数组  void print(int *a[],int num)   ==>	void print(int **a,int num) 调用指针数组  void print(int a[row][col],int row)   ==>	void print(int *a[col],int row)   记得昨天晚上回去前回复过你的，如果还有问题加我Q1179675084 不好意思，最后打错一句话 void print(int a[row][col],int row)   ==>	void print(int (*a)[col],int row)

void term(int p[][2]) { 	printf("*(p+1):%d",*(p+1)); }  你传递一个**p，程序怎么知道你的第二维是多大呢？

void term(int *p) { printf("*(p+1):%d",*(p+1)); } int main(){   int a[][10]={{.....}......};   term(a[0]); } 二维数组，通常传递，一级指针操作。 指针数组，也行，不过很讨厌 比如 void term(int (*p)[2]) //void term(int **p) { printf("*(p+1):%d\n",(p+1)); printf("*(p+1):%d\n",*(p+1)); printf("*(p+1):%d\n",**(p+1)); }  int main(){ int b[4][5]={。。。。。}; term(b)//错误，类型不匹配。  }

函数  term 并不知道 p 指向一个二维数组


Question: 求助大神！C语言网络方面

引用 2 楼 u010152577 的回复:你看看这的 http 例子 WebClnt ： http://download.csdn.net/detail/geoff08zhang/4571358  谢谢 我先去看看！

大神在哪！大神！


Question: 新手求解！！！求解！！！！

仅供参考 #include <stdio.h>  int main() { 	int i; 	char s[100]; 	printf("请输入一个需要加密的字符串:"); 	gets(s); 	for (i=0; s[i]; i++) 	{ 		if (s[i] >='w' && s[i] <= 'z') 		{ 			s[i] = s[i] + 3 - 'z' + 'a'; 		} 		else if (s[i] >='W' && s[i] <= 'Z') 		{ 			s[i] = s[i] + 3 - 'Z' + 'A'; 		} 		else 		{ 			s[i] = s[i] + 4; 		} 	}  	printf("加密后的字符串:"); 	puts(s);  	return 0; }

刷OJ题的吧……这个是入门级的啊，每个char+4就好，判断一下是不是大于‘z’/‘Z’，大于的话减掉'z'/'Z'加上'a'/'A'（如果题目要求）

#include <stdio.h> void main() { 	char a[]="China"; 	for(int i=0;i<5;i++) 		a[i] +=4; 	printf("%s",a); }

引用 1 楼 user-5 的回复:你都说了用原来字母后面的第4个字母代替原来的字母代替了，直接+4不就好了 char c1,c2,c3,c4,c5; c1='C'+4; c2='h'+4; c3='i'+4; c4='n'+4; c5='a'+4; ++


因为串的“\0”只是结束符号，所以“\0”这个串，不过是两个结束符的串而已。 字符串显示，到结束符为止。不再输出其他字符。 字符串可以链接在一起中间用'\0'分割，但是第一个'\0'后面的字符，输出串的时候都不能够输出。  字符'\0'就是ASCII为 0的字符。是个控制字符，显示为空格。 许多不显示的ASCII字符，都会显示为空格，这些多半都是控制字符。 ASCII只有128个字符，最大为127是个控制字符 del 可能会显示，也可能不会显示。 128 以上的图形字符，不是标准的ASCII码，有时称为扩充（扩展）ASCII码。

你这个问题可以简化为2行         cout << "i"  << '\0' << "i" << endl;         cout << "i"  << "" << "i" << endl; cout << 字符 cout << 字符串 这俩最终调用的是不同的函数，字符总是会输出，\0输出为NULL，不可见字符，你看到的就是空格，而字符串则是碰到\0结束输出。

引用 2 楼 lg1544650023 的回复:我的怎么没非法 不同编译器的string 的实现不一样，有的空串用“” 有的用NULL指针

我的怎么没非法

s[0]访问非法呀


Question: 求助，文件读取写入的简单问题，有高分

用了Win32 Console Project，编译通过，但是运行报错：“无法执行程序”

修改后报错  --------------------Configuration: csdn - Win32 Debug-------------------- Compiling... csdn.cpp C:\Documents and Settings\Administrator\桌面\yxd\csdn\csdn.cpp(22) : warning C4508: 'main' : function should return a value; 'void' return type assumed Linking... LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 Debug/csdn.exe : fatal error LNK1120: 1 unresolved externals 执行 link.exe 时出错.  csdn.exe - 1 error(s), 0 warning(s)

vc++6.0环境报错  --------------------Configuration: csdn - Win32 Debug-------------------- Compiling... csdn.cpp C:\Documents and Settings\Administrator\桌面\yxd\csdn\csdn.cpp(9) : error C2664: '__thiscall std::basic_ofstream<char,struct std::char_traits<char> >::std::basic_ofstream<char,struct std::char_traits<char> >(const char *,int)' : cannot convert param eter 1 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' to 'const char *'         No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called C:\Documents and Settings\Administrator\桌面\yxd\csdn\csdn.cpp(21) : warning C4508: 'main' : function should return a value; 'void' return type assumed 执行 cl.exe 时出错.  csdn.exe - 1 error(s), 0 warning(s)

引用 8 楼 mujiok2003 的回复:#include <string> #include <fstream> #include <cassert>  void foo(std::string const& line) {    //若输入"abcdxxxxx"    assert(line.size() > 4); //确保每行多于4个字符    std::ofstream ofs(line.substr(0,4) + ".dat",  std::ofstream::app); //以追加方式abcd.dat    ofs << "\"" << line.substr(4) << "\"" << std::endl;//输出"xxxxx"到abcd.dat  }  int main() {   std::ifstream ifs("input.txt");   std::string line;    while(std::getline(ifs, line))   {     foo(line);   } }  std::ofstream ofs(line.substr(0,4) + ".dat",  std::ofstream::app); //以追加方式abcd.da 改为   std::string fn = line.substr(0,4) + ".dat"; std::ofstream ofs(fn.c_str(),  std::ofstream::app); //以追加方式abcd.da

abcdxxxxx 一共九位

全是c++啊，有点看不明白，能否注解一下 用vc++6可以进行调试吗？ 输出文件后缀是.dat怎么命名

引用 4 楼 mujiok2003 的回复:#include <string> #include <fstream> #include <cassert>  void foo(std::string const& line) {    assert(line.size() > 4);    std::ofstream ofs(line.substr(0,4).c_str(),  std::ofstream::app);    ofs << "\"" << line.substr(4) << "\"" << std::endl;  }  int main() {   std::ifstream ifs("input.txt");   std::string line;    while(std::getline(ifs, line))   {     foo(line);   } } 调试一下。

对的，是这个意思。 对于所有的abcdxxxx，按照格式写入abcd.dat

对于任意行，abcdxxxxx, 把xxxxx写入abcd.dat?

ps： 有的文件名包含字符 ab120001 ab120002 ab120003 cd120001 cd120002 ef120001


Question: c和指针

正确的是：这是处理字符串第一个字符的判断条件，仅此而已

程序是调试出来的

那是处理开始就是空格，如果没有这句，dest会访问越界的。其他的就是如果不是空格就直接赋给dest，如果是空格，就判断dest前一个是否是空格了，如果不是，赋值空格，如果前一个也是空格，跳过

你自己动手画一画，如果第一个就是就为空呢？


Question: 一个整数，一个浮点数，求倒数，求指导

en ,多谢指导,

刚开始学，有点搞不懂

引用 2 楼 AnYidan 的回复:scanf("%f,%f",&a,&b);  错误  c=1.0/a; 数学上的定义不是很清楚，计算机中，int的倒数是什么类型 计算机中： 1/0 = 除法中断 ，1/1 =1 ，1/n=0 (n>1) 不过，输入整数，可以认为是整型数。  求倒数则不必。不可太拘泥于形式  。 数学上的定义，不必太谦虚。  除了小学1，2，3年级，只学到整数外。  整数也是实数，当然也有倒数，二分之一不是2的倒数？？，难道2不是整数？？ 这个你一定懂，不用谦虚。

int a; scanf("%f,%f",&a,&b);  这两句一对比，问题很明显 应该将后一句改为：scanf("%d,%f",&a,&b);   或者将第一句改为double a; （反正要求倒数，把a定义为整形也可以） 注意在输入时的格式，两个数要用逗号分隔，比如： 23,45.67 [回车] 为避免出错，还应该判断输入的数是否为0，否则当输入0时，程序会崩溃。


Question: 二维数组传参为题。为什么报错，

二维数组的名称，是数组指针，指向数组的一级指针，不是二级指针。  直接传递一级指针，最好。  其次是数组指针，因为长度固定，所以不灵活，用的不多。  #include<stdio.h>  int main() { float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}}; void average(float *,int);    void search(float*,int);  search(score[0],2,4); getchar(); return 0; } void search(float *p,int n，int m) { int i; printf("The score of NO.%d are:\n",n);  for(i=0;i<m;i++) printf("%5.2f  ",*(p + n * m + i));  printf("\n"); }

不好意思,刚发帖的时候删除了写没用到的代码,同时,把二维数组的定义部分给漏掉了: float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}}; 3楼的说的对printf("%5.2f  ",*( (*p+n)+i));这句是不行的. 不明二维数组传参到函数中传递的为什么是指针,而不是指针的指针.这里有点不明白. 二维数组的名称不是指针的指针么.?

他们俩把你的问题说出来了，但是还有个很大的问题，就是你里面打印printf("%5.2f  ",*( (*p+n)+i));用这个可以？我个人觉得是不行的，二维数组本质上还是以以一维存储的！你再看看指针运算 (*p+n) = *p + （szieof（*p）* n）= 什么呢？*p是你二维数组的第一个元素，至于后面的就不用我说了吧，你也觉得不行了！ 我个人觉得打印二维数组要不传递个一级指针，和一个int数= row*col；比如 int p[2][3]; print（int *p,int n）; 调用就是print（p,2*3）;至于内部如何用，就是一个for循环了 第二种print（int *p[3],int cow）数组名作为参数时退化为指针，这个不是很准确，他只能退化一维的 print（int *p[3],int cow）== print（int p[2][3],int cow）,因此我们还需要另外传递一个参数来表示行号。有疑问1179675084

传的参数score变量定义在那里呢？ 楼主，找本基础点c语言书好好看看吧！

main()函数里，search(score,2); 这一句，score未定义，应该是一个float类型的二维数组吧，比如：float score[大于2的数][4]={/*初始化*/};


Question: c语言指针++的问题

把printf("%d\n",ptr++); 换成printf("%d\n",++ptr); 就会不同了 一个是后自加，一个是先自加

printf("%d\n",ptr++); 相当于 printf("%d\n",ptr); ptr++;  引用 楼主 y516599087 的回复:int main() { int * ptr=(int*)malloc(10);//arr; printf("%d\n",ptr); printf("%d\n",ptr++); } 为什么输出的结果是相同的呢

自加后缀式ptr++是先执行打印操作然后再自加的，如果你把两句打印语句换一下的话，结果就可以不同了

引用 4 楼 y516599087 的回复:[quote=引用 2 楼 wangjunsheng 的回复:] ptr++ 后++ 执行完以后才 ++ 前++ 执行前先++  就是 11了 哦   printf（）相当于赋值是吧，那（ptr++）是不是相当于（ptr），ptr+1 所以打出来的结果也是ptr的值啊/？？[/quote] 不是的！ptr++是把ptr的指向的地址向前移动一位了(这里是4个字节)， 只是在你第二句printf函数执行打印的时候ptr++的值还没有生效，ptr++是先执行操作，再++的 你把两句对换下位置，再打印试试，就明白了

引用 2 楼 wangjunsheng 的回复:ptr++ 后++ 执行完以后才 ++ 前++ 执行前先++  就是 11了 哦   printf（）相当于赋值是吧，那（ptr++）是不是相当于（ptr），ptr+1 所以打出来的结果也是ptr的值啊/？？

因为都是以十进制的方式打印出来 ptr的地址值的！ ptr++ 执行完后才生效的！  建议把 两行打印信息换个位置， 然后用%p打印试试吧！

ptr++ 后++ 执行完以后才 ++ 前++ 执行前先++  就是 11了

计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）


Question: C语言简单问题

引用 19 楼 u010510926 的回复:年龄用double，年龄有小数哒？ 这孩子还不足月。

年龄用double，年龄有小数哒？

根据C标准，fflush(stdout)有定义，而fflush(stdin)则是没有明确定义的；也就是说各个编译器自己看着办。 有定义的，也有不定义的，因此这个的行为是“不定”，严重影响移植。

mark   为什么%c前面加一个空格可以解决以上问题

引用 15 楼 lin5161678 的回复:[quote=引用 14 楼 u012271055 的回复:] 对了，我上次问了老师，老师说加在%c前面加一个空格可以解决以上问题，我试过了，可以解决，不过是在C语言中试的！其实有点不理解，老师要我别用ffush(stdin)! 老师的建议的对的  fflush 刷新输出流  stdin是输入流 不一定能用  [/quote]  那么加一个空格是为什么呢？是个什么原理？可以解释一下么？谢谢！！

引用 14 楼 u012271055 的回复:对了，我上次问了老师，老师说加在%c前面加一个空格可以解决以上问题，我试过了，可以解决，不过是在C语言中试的！其实有点不理解，老师要我别用ffush(stdin)! 老师的建议的对的  fflush 刷新输出流  stdin是输入流 不一定能用

引用 9 楼 linbounconstraint 的回复:菜鸟，我写的有问题，还没找出来，求高手。 输入age后，参数没传到in_age里，怎么传啊？  #include <stdio.h>  void in_age(int age) {	 	char choose; 	if(age >= 18) 	{ 		printf("该网站你可以进入\n"); 	} 	else 	{ 		printf("如果想进入请输入Y，不想进入请输入N\n"); 		scanf("%c",&choose); 		if('Y' == choose) 		{ 			printf("SUCCESS\n"); 		} 		else 		{   			printf("FALSE\n");  		} 	} }  int main(void) {	 	int a; 	printf("请输入你的年龄:\n"); 	in_age(scanf("%d\n",&a)); 	//in_age(12); 	return 0; }  引用 11 楼 lin5161678 的回复:scanf(" %c",&choose); 加一个空格在%c前面   对了，我上次问了老师，老师说加在%c前面加一个空格可以解决以上问题，我试过了，可以解决，不过是在C语言中试的！其实有点不理解，老师要我别用ffush(stdin)!

#include <stdio.h> void in_age(int age) {	 	char choose; 	if(age >= 18) 	{ 		printf("该网站你可以进入\n"); 	} 	else 	{ 		printf("如果想进入请输入Y，不想进入请输入N\n"); 		fflush(stdin); //fllush是刷新缓冲区 		choose = getchar(); 		if('Y' == choose) 		{ 			printf("SUCCESS\n"); 		} 		else 		{   			printf("FALSE\n");  		} 	} }  int main(void) {	 	int a; 	printf("请输入你的年龄:\n"); 	scanf("%d",&a); 	in_age(a); 	//in_age(12); 	return 0; } 这样更好。

这个可以运行。 我发了一贴。你可以看看。 http://bbs.csdn.net/topics/390617771?page=1#post-395816239 #include <stdio.h> void in_age(int age) {	 	char choose; 	if(age >= 18) 	{ 		printf("该网站你可以进入\n"); 	} 	else 	{ 		printf("如果想进入请输入Y，不想进入请输入N\n"); 		fflush(stdin); //fllush是刷新缓冲区 		choose = getchar(); 		if('Y' == choose) 		{ 			printf("SUCCESS\n"); 		} 		else 		{   			printf("FALSE\n");  		} 	} }  int main(void) {	 	int a; 	printf("请输入你的年龄:\n"); 	in_age(scanf("%d",&a)); 	//in_age(12); 	return 0; }

scanf(" %c",&choose); 加一个空格在%c前面

菜鸟俩字。我是说我是菜鸟 ，lz不要误会。

引用 7 楼 u012271055 的回复:[quote=引用 4 楼 max_min_ 的回复:] [quote=引用 3 楼 u012271055 的回复:] [quote=引用 2 楼 buyong 的回复:] void main() { double age;     char choose; printf("请输入你的年龄:"); fflush(stdin); scanf("%lf",&age); if(age>=18){ printf("该网站你可以进入."); }else{ printf("如果想进入请输入Y，不想进入请输入N\n"); fflush(stdin); scanf("%c",&choose); if(choose=='Y'){ printf("SUCCESS"); }else{ printf("FALSE"); } }  }   谢谢你！我用了一下午的时间都没想通，这个fflush我不懂。呵呵，谢谢！[/quote] 那是因为你在第一次输入年级的时候，有一个回车符还在输入缓冲区中！ 当后面输入的时候直接赋值给choose了，所以没有输入！ fllush是刷新缓冲区！ 也可以用getchar()吃点那个没有用的回车符！[/quote]  那个printf（"请输入你的年龄:"）里面我没有用'\n'啊！为什么下一行还用fflush(stdin)清除缓存数据，那清除的这个缓存数据是什么呢？这个缓存数据是系统赋给变量age的初值吗？ 还有就是scanf("%c",&choose)这一行上面的清除缓存数据的指令fflush(stdin)清除的缓存数据就是printf("")里面的换行缓存数据吗？ 还有那个fflush(stdout)又是个啥！！！ 谢谢谢谢，您的回复！[/quote]  fflush(stdout)是清空输出缓冲区，一般会输出到屏幕。 和它相似的还有一个fflush(stdin)是清空输入缓冲区，一般会丢弃掉。

引用 4 楼 max_min_ 的回复:[quote=引用 3 楼 u012271055 的回复:] [quote=引用 2 楼 buyong 的回复:] void main() { double age;     char choose; printf("请输入你的年龄:"); fflush(stdin); scanf("%lf",&age); if(age>=18){ printf("该网站你可以进入."); }else{ printf("如果想进入请输入Y，不想进入请输入N\n"); fflush(stdin); scanf("%c",&choose); if(choose=='Y'){ printf("SUCCESS"); }else{ printf("FALSE"); } }  }   谢谢你！我用了一下午的时间都没想通，这个fflush我不懂。呵呵，谢谢！[/quote] 那是因为你在第一次输入年级的时候，有一个回车符还在输入缓冲区中！ 当后面输入的时候直接赋值给choose了，所以没有输入！ fllush是刷新缓冲区！ 也可以用getchar()吃点那个没有用的回车符！[/quote]  那个printf（"请输入你的年龄:"）里面我没有用'\n'啊！为什么下一行还用fflush(stdin)清除缓存数据，那清除的这个缓存数据是什么呢？这个缓存数据是系统赋给变量age的初值吗？ 还有就是scanf("%c",&choose)这一行上面的清除缓存数据的指令fflush(stdin)清除的缓存数据就是printf("")里面的换行缓存数据吗？ 还有那个fflush(stdout)又是个啥！！！ 谢谢谢谢，您的回复！

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

void main() { double age;     char choose; printf("请输入你的年龄:"); fflush(stdin); scanf("%lf",&age); if(age>=18){ printf("该网站你可以进入."); }else{ printf("如果想进入请输入Y，不想进入请输入N\n"); fflush(stdin); scanf(" %c",&choose);//加个空格 if(choose=='Y'){ printf("SUCCESS"); }else{ printf("FALSE"); } }  }

引用 3 楼 u012271055 的回复:[quote=引用 2 楼 buyong 的回复:] void main() { double age;     char choose; printf("请输入你的年龄:"); fflush(stdin); scanf("%lf",&age); if(age>=18){ printf("该网站你可以进入."); }else{ printf("如果想进入请输入Y，不想进入请输入N\n"); fflush(stdin); scanf("%c",&choose); if(choose=='Y'){ printf("SUCCESS"); }else{ printf("FALSE"); } }  }   谢谢你！我用了一下午的时间都没想通，这个fflush我不懂。呵呵，谢谢！[/quote] 那是因为你在第一次输入年级的时候，有一个回车符还在输入缓冲区中！ 当后面输入的时候直接赋值给choose了，所以没有输入！ fllush是刷新缓冲区！ 也可以用getchar()吃点那个没有用的回车符！

引用 2 楼 buyong 的回复:void main() { double age;     char choose; printf("请输入你的年龄:"); fflush(stdin); scanf("%lf",&age); if(age>=18){ printf("该网站你可以进入."); }else{ printf("如果想进入请输入Y，不想进入请输入N\n"); fflush(stdin); scanf("%c",&choose); if(choose=='Y'){ printf("SUCCESS"); }else{ printf("FALSE"); } }  }   谢谢你！我用了一下午的时间都没想通，这个fflush我不懂。呵呵，谢谢！

不知道想说啥？


Question: 这个我竟然不知道怎么输入

叫兽。。

福州大学的老师一直很牛逼Orz。。。

同学你是福州大学的吧？ 我是你们数据结构的老师，不懂可以来问我不要上网找答案，作业要独立完成。

先输入一个n值，确定个数，可定义一个数组int a[n] 在用循环输入获取 n个值 for（） {    scanf（“%d”，a + i）； }

1,cin>_User_Type_Data; 2,scanf("%d",&>User_Type_Data)


Question: C 日期转换

//如何根据周，计算具体的日期？比如20132002，其中前4位2013是年份，后面的20是第20个周的意思，最后2为是一周的第几天之意。请问如何得出是2013年的哪一天？ #include <stdio.h> #include <time.h> void YYYYWWWD2YYYY_MM_DD(char *s) {     int y,w,d,d1;     time_t t;     struct tm st;     struct tm *ts;      sscanf(s,"%4d%2d%2d",&y,&w,&d);     y-=1900;w--;d--;     st.tm_year=y;     st.tm_mon=0;     st.tm_mday=1;     st.tm_hour=0;     st.tm_min=0;     st.tm_sec=0;     t=mktime(&st);     ts=localtime(&t);     d1=ts->tm_wday;if (d1==0) d1=7;d1--;     t+=(w*7+d-d1)*24*60*60;     ts=localtime(&t);     printf("%4d-%02d-%02d\n",ts->tm_year+1900,ts->tm_mon+1,ts->tm_mday); } int main() {     YYYYWWWD2YYYY_MM_DD("20130101");     YYYYWWWD2YYYY_MM_DD("20130102");     YYYYWWWD2YYYY_MM_DD("20130201");     YYYYWWWD2YYYY_MM_DD("20132002");     YYYYWWWD2YYYY_MM_DD("20135302");     YYYYWWWD2YYYY_MM_DD("20135303");     return 0; } //2012-12-31 //2013-01-01 //2013-01-07 //2013-05-14 //2013-12-31 //2014-01-01 //

//如何根据周，计算具体的日期？比如20132002，其中前4位2013是年份，后面的20是第20个周的意思，最后2为是一周的第几天之意。请问如何得出是2013年的哪一天？ #include <stdio.h> #include <time.h> void YYYYWWWD2YYYY_MM_DD(char *s) {     int y,w,d,d1;     time_t t;     struct tm st;     struct tm *ts;      sscanf(s,"%4d%2d%2d",&y,&w,&d);     y-=1900;w--;d--;     st.tm_year=y;     st.tm_mon=0;     st.tm_mday=1;     st.tm_hour=0;     st.tm_min=0;     st.tm_sec=0;     t=mktime(&st);     ts=localtime(&t);     d1=ts->tm_wday;if (d1==0) d1=7;d1--;     t+=(w*7+d-d1)*24*60*60;     ts=localtime(&t);     printf("%4d-%02d-%02d\n",ts->tm_year+1900,ts->tm_mon+1,ts->tm_mday); } int main() {     YYYYWWWD2YYYY_MM_DD("20130102");     YYYYWWWD2YYYY_MM_DD("20130201");     YYYYWWWD2YYYY_MM_DD("20132002");     YYYYWWWD2YYYY_MM_DD("20135302");     return 0; } //2013-01-01 //2013-01-07 //2013-05-14 //2013-12-31 //

参考http://linux.chinaunix.net/techdoc/develop/2007/06/03/959192.shtml  引用 楼主 s373785346 的回复:如何根据周，计算具体的日期？比如20132002，其中前4位2013是年份，后面的20是第20个周的意思，最后2为是一周的第几天之意。请问如何得出是2013年的哪一天？


Question: C 日期转换

引用 3 楼 zhao4zhong1 的回复://如何根据周，计算具体的日期？比如20132002，其中前4位2013是年份，后面的20是第20个周的意思，最后2为是一周的第几天之意。请问如何得出是2013年的哪一天？ #include <stdio.h> #include <time.h> void YYYYWWWD2YYYY_MM_DD(char *s) {     int y,w,d,d1;     time_t t;     struct tm st;     struct tm *ts;      sscanf(s,"%4d%2d%2d",&y,&w,&d);     y-=1900;w--;d--;     st.tm_year=y;     st.tm_mon=0;     st.tm_mday=1;     st.tm_hour=0;     st.tm_min=0;     st.tm_sec=0;     t=mktime(&st);     ts=localtime(&t);     d1=ts->tm_wday;if (d1==0) d1=7;d1--;     t+=(w*7+d-d1)*24*60*60;     ts=localtime(&t);     printf("%4d-%02d-%02d\n",ts->tm_year+1900,ts->tm_mon+1,ts->tm_mday); } int main() {     YYYYWWWD2YYYY_MM_DD("20130101");     YYYYWWWD2YYYY_MM_DD("20130102");     YYYYWWWD2YYYY_MM_DD("20130201");     YYYYWWWD2YYYY_MM_DD("20132002");     YYYYWWWD2YYYY_MM_DD("20135302");     YYYYWWWD2YYYY_MM_DD("20135303");     return 0; } //2012-12-31 //2013-01-01 //2013-01-07 //2013-05-14 //2013-12-31 //2014-01-01 //  正解！

由周和一周里的某一天计算出一年的某一天，这个问题不是很复杂。需要把周数和天数获取到哦。

仅供参考 #include <stdio.h> #include <stdlib.h>  int main() { 	int day = 0; 	char *s = "20132002"; 	char q[3]; 	q[0] = s[4]; 	q[1] = s[5];  	q[2] = '\0'; 	day +=  atoi(q) * 7; 	q[0] = s[6]; 	q[1] = s[7]; 	day +=  atoi(q); 	printf("%s 是这一年的第 %d 天!\n", s,day); 	return 0; }

#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_SIZE 100  bool is_ryear(int year) {     if(((year % 4 == 0) && (year %100 != 0)) ||  (year % 400 == 0))         return true;     else         return false;  } int main() {     int year[MAX_SIZE ]= {0};     int mouth[MAX_SIZE ] = {0};     int day[MAX_SIZE ] = {0};     int answer[MAX_SIZE ] = {0};     int num;     int temp[MAX_SIZE] = {0};     int mouth_day[12] = {31,28,31,30,31,30,31,31,30,31,30,31};     int i;      scanf("%d",&num);     for(i = 0 ; i < num; i++){         scanf("%d %d %d",&year[i],&mouth[i],&day[i]);     if(is_ryear(year[i]))     {      temp[i] = 1;     } }       for(i = 0 ; i < num; i++){     switch(mouth[i]){          case 12:             answer[i] = answer[i] + mouth_day[10] ;         case 11:              answer[i] = answer[i] + mouth_day[9] ;         case 10:              answer[i] = answer[i] + mouth_day[8]  ;         case 9:              answer[i] = answer[i] + mouth_day[7];         case 8:              answer[i] = answer[i] + mouth_day[6] ;         case 7:              answer[i] = answer[i] + mouth_day[5] ;         case 6:              answer[i] = answer[i] +  mouth_day[4];         case 5:              answer[i] = answer[i] + mouth_day[3] ;         case 4:              answer[i] = answer[i] +  mouth_day[2] ;         case 3:              answer[i] = answer[i] + mouth_day[1] + temp[i];         case 2:              answer[i] = answer[i] + mouth_day[0]  ;         case 1:              answer[i] = answer[i] + day[i];              break;         default:              break;     }  }      for(i = 0 ; i < num; i++)         printf("%d\n",answer[i]);         return 0; } 这个不是和 第几年的第几个月第几天的判定逻辑一样 只不过一周7天而已

取字符串的的第五位和第六位，然后转换成int类型取，取得整周数！ 然后取最后一位转成int，得到这周的第几天，组合一起就好了！


Question: 头文件引用的讨论

引用 8 楼 sec_hus 的回复:问题解决，这种情况，不需要在B.h里重新定义或者引入A.h。 想问一下是如何解决的呢？

问题解决，这种情况，不需要在B.h里重新定义或者引入A.h。

引用 5 楼 angel_su 的回复:简单的方式就把需要的那些A类型写入B.h，然后使用跟A.h一模一样的保护头包住这部分，也就是B在建库的时候，B.c先包含A.h，那么在B.h有关A的部分，因为条判断件不成立被略过，就不会重复定义；而用户使用B时不知有A，条件成立引入那些A类型...A.h的内容很多，包括A库中的功能函数，而如果在B.h里也用相同的保护头的话，A.h里的那些功能函数也会被过滤掉了。

引用 4 楼 max_min_ 的回复:为什么不直接让 B.h 引用 A.h ，然后B的源文件直接引用B.h呢！因为B.h要跟接口一起提交给别人用，而A.h不能提交出去。

为什么不直接让 B.h 引用 A.h ，然后B的源文件直接引用B.h呢！

头文件没加#ifdef保护吗？

"在B.h中需要用到A.h中的一些类型定义"，你什么都想用，脑子不会短路吗？ 把A.h里的类型定义剥离出来共享吧！

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


Question: malloc分配内存的问题。

malloc的实现，它会给的偏大！不过一定是整页数！

引用 楼主 u012373530 的回复:我想分配20个内存页，代码如下： #include<stdio.h> #include<stdlib.h> int main() {     printf("pid=%d\n",getpid());     char* p=malloc(20*4096);     while(1); } 理论上系统应该会给我33个内存页。但是我查看发现堆区占用的内存是： 0994e000-09982000 也就是给了我52个内存页了。、 这是为什么？  还有个问题就是，假如我： char* p=malloc(20*4096); char* p1=malloc(20*4096); 系统应该是给了66个内存页吧 然后free(p1)，那么堆区还会占用多少内存？ 你还能确定人家分配多少啊？如5楼所说，有个策略问题，申请size大小，分配的可能大于size的，但是具体多少只有操作系统知道他能给多少！

引用 8 楼 my_live_123 的回复:malloc的实现，它会给的偏大！不过一定是整页数！ malloc实现的都是33的倍数页吧  而brk和sbrk才是以整页数。

不用4096，用一个计算内存页大小的函数代替试试，，（我还不懂什么是内存页，回答有误望体谅）

堆区大小和你申请多少内存，有何关系？？？？？ 这是内存管理，策略问题，和你申请的多少，关系不大。 最多是你申请了，太大内存，堆内存太少，不够用而已。 其他没有太大关系。

内存页是4096字节。你看，执行malloc(20*4096)后堆区照样分配了53页，真是奇怪。  引用 1 楼 focuslight 的回复:内存页设得太小，内存页会很多

VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

getpagesize获取内存页大小

内存页设得太小，内存页会很多


Question: 快崩溃了！！！求助啊！！明天交了。栈的后缀式求值，，运行没错误，但就是不能出结果，请各位大神帮帮！！！

引用 5 楼 u010291323 的回复:[quote=引用 4 楼 u011779875 的回复:] 第一 空格貌似没处理   第二 你这是C++的程序 别C没学好 就用C++ 这么会乱的 第三 你要把程序挺住看结果    这是C阿阿阿[/quote] 这还带引用的 这不是C 这是C++的特性 哥们 我帮你处理了 你不结贴 还做什么

引用 4 楼 u011779875 的回复:第一 空格貌似没处理   第二 你这是C++的程序 别C没学好 就用C++ 这么会乱的 第三 你要把程序挺住看结果    这是C阿阿阿

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h"   #include <stdio.h> #include <malloc.h> #include <ctype.h> #include <windows.h>  #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10  typedef struct {     char *base;     char *top;     int stacksize; }OPTR;//运算符栈  typedef struct {     int *base;     int *top;     int stacksize; }OPND;//运算数栈  OPTR optr; OPND opnd;  int InitStack(OPTR &S)//运算符 {     S.base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));     if(!S.base) return 0;     S.top = S.base;     S.stacksize = STACK_INIT_SIZE;     return 1; }  int InitStack(OPND &S)//运算数 {     S.base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));     if(!S.base) return 0;     S.top = S.base;     S.stacksize = STACK_INIT_SIZE;     return 1; }  int StackEmpty(OPTR &S) {     if(S.base == S.top) return 1;     else return 0; }  int StackEmpty(OPND &S) {     if(S.base == S.top) return 1;     else return 0; }  int Push1(OPTR &S,char e) {     if(S.top - S.base >= S.stacksize)     {         S.base = (char *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(char));         if(!S.base) return 0;         S.top = S.base + S.stacksize;         S.stacksize += STACKINCREMENT;     }     *S.top++ = e;     return 1; }  int Push2(OPND &S,int e) {     if(S.top - S.base >= S.stacksize)     {         S.base = (int *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(int));         if(!S.base) return 0;         S.top = S.base + S.stacksize;         S.stacksize += STACKINCREMENT;     }     *S.top++ = e;     return 1; }  int Pop1(OPTR &S,char &e) {     if(S.top == S.base) return 0;     e = *--S.top;     return e; }  int Pop2(OPND &S,int &e) {     if(S.top == S.base) return 0;     e = *--S.top;     return e; }  char GetTop1(OPTR &S) {     char e;     e = *(S.top - 1);     return e; }  int GetTop2(OPND &S) {     int e;     e = *(S.top - 1);     return e; }  char Precede(char ch1,char ch2) {     if(ch1 == '+' || ch1 == '-')     {         if(ch2 == '+' || ch2 == '-' || ch2 ==')' || ch2 == '#') return ('>');         else if(ch2 == '*' || ch2 == '/' || ch2 =='(') return ('<');     }     else if(ch1 == '*' || ch1 == '/')     {         if(ch2 == '+' || ch2 == '-' || ch2 == '*' || ch2 == '/' || ch2 ==')' || ch2 == '#') return ('>');         else if(ch2 =='(') return ('<');     }     else if(ch1 =='(')     {         if(ch2 == '+' || ch2 == '-' || ch2 == '*' || ch2 == '/' || ch2 =='(') return ('<');         else if(ch2 ==')') return ('=');     }     else if(ch1 ==')')     {         if(ch2 == '+' || ch2 == '-' || ch2 == '*' || ch2 == '/' || ch2 ==')' || ch2 == '#') return ('>');     }     else if(ch1 =='#')     {         if(ch2 == '+' || ch2 == '-' || ch2 == '*' || ch2 == '/' || ch2 =='(') return ('<');         else if(ch2 =='#') return ('=');     }     else if(!((ch1 == '+' || ch1 == '-' || ch1 == '*' || ch1 == '/' || ch1 == '(' || ch1 ==')' || ch1 == '#') && (ch2 == '+' || ch2 == '-' || ch2 == '*' || ch2 == '/' || ch2 == '(' || ch2 ==')' || ch2 == '#'))) return 0;     return 0; }  char In(char c) {     if(c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c ==')' || c == '#') return 1;     else return 0; }  int Operate(int a, char theta, int b) {     if(theta == '+') return (a + b);     else if(theta == '-') return (a - b);     else if(theta == '*') return (a * b);     else if(theta == '/') return (a / b);     else return 0; }  int EvaluateExpression() {      int a, b, c;     char theta, x;     InitStack(optr);     InitStack(opnd);     Push1(optr,'#');      c = getchar();      while(c != '#' || GetTop1(optr) != '#')     { 	         if(!In(c))  		{ ////////////////////////////////// 			if(isspace(c)){ 			c = getchar(); 			continue; 			} ///////////////////////////////////这是我帮你改的 得把空格32吃掉 			Push2(opnd,c); 		 			c = getchar(); 		}          else          switch(Precede(GetTop1(optr),c))         {        case '<':         Push1(optr,c); c = getchar();         break;        case '=':         Pop1(optr,x); c = getchar();         break;        case '>':         Pop1(optr,theta);         Pop2(opnd,b);         Pop2(opnd,a);         Push2(opnd,Operate(a,theta,b));         break;         }     } 	printf("end /n");     return GetTop2(opnd);     return 0; }  int main() {     printf("输入表达式:");     printf("the result: %d\n",EvaluateExpression()); 	printf("end /n"); 	//system("pause"); 	system("pause"); 让程序停下来看结果     return 0; }

着重调试下面两个函数  Precede(char ch1,char ch2) int EvaluateExpression()

你把你错误的输入格式写上啊  还有这个程序是你自己写的？ 还是怎么来的


Mapping Modes and Translations The mapping modes are described in the following table.   Mapping Mode Description  MM_ANISOTROPIC Each unit in page space is mapped to an application-specified unit in device space. The axis may or may not be equally scaled (for example, a circle drawn in world space may appear to be an ellipse when depicted on a given device). The orientation of the axis is also specified by the application.  MM_HIENGLISH Each unit in page space is mapped to 0.001 inch in device space. The value of x increases from left to right. The value of y increases from top to bottom.  MM_HIMETRIC Each unit in page space is mapped to 0.01 millimeter in device space. The value of x increases from left to right. The value of y increases from top to bottom.  MM_ISOTROPIC Each unit in page space is mapped to an application-defined unit in device space. The axes are always equally scaled. The orientation of the axes may be specified by the application.  MM_LOENGLISH Each unit in page space is mapped to 0.01 inch in device space. The value of x increases from left to right. The value of y increases from top to bottom.  MM_LOMETRIC Each unit in page space is mapped to 0.1 millimeter in device space. The value of x increases from left to right. The value of y increases from top to bottom.  MM_TEXT Each unit in page space is mapped to one pixel; that is, no scaling is performed at all. When no translation is in effect (this is the default), page space in the MM_TEXT mapping mode is equivalent to physical device space. The value of x increases from left to right. The value of y increases from top to bottom.  MM_TWIPS Each unit in page space is mapped to one twentieth of a printer's point (1/1440 inch). The value of x increases from left to right. The value of y increases from top to bottom.    To set a mapping mode, call the SetMapMode function. Retrieve the current mapping mode for a DC by calling the GetMapMode function.   The page-space to device-space transformations consist of values calculated from the points given by the window and viewport. The window and viewport each consist of a pair of points, with one point specifying an origin and the other a width and height (called the extents). The window points are in logical coordinates; the viewport in device coordinates (pixels). The system combines the origins and extents from both the window and viewport to create the transformation. This means that the window and viewport each specify half of the factors needed to define the transformation used to map points in page space to device space. The effect of a transformation calculated in this way is that The system maps the window origin to the viewport origin and the window extents to the viewport extents, as shown in the following illustration.    The window and viewport extents establish a ratio or scaling factor used in the page-space to device-space transformations. For the six predefined mapping modes (MM_HIENGLISH, MM_LOENGLISH, MM_HIMETRIC, MM_LOMETRIC, MM_TEXT, and MM_TWIPS), the extents are set by the system when SetMapMode is called. They cannot be changed. The other two mapping modes (MM_ISOTROPIC and MM_ANISOTROPIC) require that the extents are specified. This is done by calling SetMapMode to set the appropriate mode and then calling the SetWindowExtEx and SetViewportExtEx functions to specify the extents. In the MM_ISOTROPIC mapping mode, it is important to call SetWindowExtEx before calling SetViewportExtEx.  The window and viewport origins establish the translation used in the page-space to device-space transformations. Set the window and viewport origins by using the SetWindowOrgEx and SetViewportOrgEx functions. The origins are independent of the extents, and an application can set them regardless of the current mapping mode. Changing a mapping mode does not affect the currently set origins (although it can affect the extents). Origins are specified in absolute units that the current mapping mode does not affect. To alter the origins, use the OffsetWindowOrgEx and OffsetViewportOrgEx functions.  The following formula shows the math involved in converting a point from page space to device space.  Dx = ((Lx - WOx) * VEx / WEx) + VOx    The following variables are involved.  Dx     x value in device units  Lx     x value in logical units (also known as page space units)  WOx     window x origin  VOx     viewport x origin  WEx     window x-extent  VEx     viewport x-extent    The same equation with y replacing x transforms the y component of a point.  The formula first offsets the point from its coordinate origin. This value, no longer biased by the origin, is then scaled into the destination coordinate system by the ratio of the extents. Finally, the scaled value is offset by the destination origin to its final mapping.  The LPtoDP and DPtoLP functions may be used to convert from logical points to device points and from device points to logical points, respectively.

对于打印预览和打印只要更改HDC就可以。

问题解决了。源代码如下： SetMapMode(print_or_window_hdc,MM_HIMETRIC);       //设置映射模式0.01mm为单位 LOGFONT		logfont;       //定义字体对象 memset(&logfont, 0, sizeof(LOGFONT));       //初始化 logfont.lfWidth   =50*i;       //这里的长度单位是和映射模式密切相关的也就是单位是映射模式的单位，这里是0.01mm，所以一个字寛是50*0.01mm=0.5mm。i是放大倍数 logfont.lfHeight =75*i; //logfont.lfWeight =10;       //设置上面，这个磅数就没有作用了 strcpy(logfont.lfFaceName, "宋体");       //字体集 HFONT	hfont=CreateFontIndirect(&logfont);       //创建字体 SelectObject(print_or_window_hdc,hfont);       //应用字体到指定HDC TextOut(print_or_window_hdc,1035*i,-90*i,"天津城建大学计划外购置申请表",28);       //绘制字体 DeleteObject(&logfont);       //不用字体，一定记住要删除，释放资源

用creatfont创建字体没有效果啊

去VC/MFC论坛问问？

Coordinate Functions  DPtoHIMETRIC Converts device units into HIMETRIC units.  DPtoLP Converts device units into logical units.  HIMETRICtoDP Converts HIMETRIC units into device units.  HIMETRICtoLP Converts HIMETRIC units into logical units.  LPtoDP Converts logical units into device units.  LPtoHIMETRIC Converts logical units into HIMETRIC units.

Text Functions  TextOut Writes a character string at a specified location using the currently selected font.  ExtTextOut Writes a character string within a rectangular region using the currently selected font.  TabbedTextOut Writes a character string at a specified location, expanding tabs to the values specified in an array of tab-stop positions.  DrawText Draws formatted text in the specified rectangle.  GetTextExtent Computes the width and height of a line of text on the attribute device context using the current font to determine the dimensions.  GetOutputTextExtent Computes the width and height of a line of text on the output device context using the current font to determine the dimensions.  GetTabbedTextExtent Computes the width and height of a character string on the attribute device context.  GetOutputTabbedTextExtent Computes the width and height of a character string on the output device context.  GrayString Draws dimmed (grayed) text at the given location.  GetTextAlign Retrieves the text-alignment flags.  SetTextAlign Sets the text-alignment flags.  GetTextFace Copies the typeface name of the current font into a buffer as a null-terminated string.  GetTextMetrics Retrieves the metrics for the current font from the attribute device context.  GetOutputTextMetrics Retrieves the metrics for the current font from the output device context.  SetTextJustification Adds space to the break characters in a string.  GetTextCharacterExtra Retrieves the current setting for the amount of intercharacter spacing.  SetTextCharacterExtra Sets the amount of intercharacter spacing.    Font Functions  GetFontData Retrieves font metric information from a scalable font file. The information to retrieve is identified by specifying an offset into the font file and the length of the information to return.  GetKerningPairs Retrieves the character kerning pairs for the font that is currently selected in the specified device context.  GetOutlineTextMetrics Retrieves font metric information for TrueType fonts.  GetGlyphOutline Retrieves the outline curve or bitmap for an outline character in the current font.  GetCharABCWidths Retrieves the widths, in logical units, of consecutive characters in a given range from the current font.  GetCharWidth Retrieves the fractional widths of consecutive characters in a given range from the current font.  GetOutputCharWidth Retrieves the widths of individual characters in a consecutive group of characters from the current font using the output device context.  SetMapperFlags Alters the algorithm that the font mapper uses when it maps logical fonts to physical fonts.  GetAspectRatioFilter Retrieves the setting for the current aspect-ratio filter.

1）放大字体 字体的宽度和高度放大100 2）显示后缩放图像 StretchBlt 图像放大100倍。

坚决消灭领会副。

怎么没人会吗？

英文啊。。。。。。翻译先 再看


Question: 新人求教一个简单的问题

啥意思？ 是main函数吧？ man函数没用过，原型举例看看

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

引用 2 楼 user-5 的回复:应该是main函数吧..只不过多了参数而已。标准C/C++只承认两种写法：int main(int argc,char *argv[]){} int main();//或者int main(void)argc是参数的数量，argv是参数的值，比如假设a.cpp编译后的程序为a，linux下你可以在命令行中这样写：./a -a -b那么此时main接收到的参数就是-a -b两个，argv[0]="-a",argv[1]="-b",而argc则是参数的个数，所以argc=2 你经常看到一些命令行的命令就是这样编写的。  如果是man函数 我还真不知道你在说什么，建议贴代码来看看 楼上说的有问题啊，argv[0]=函数的路径名，你所传递参数的地址是从argv[1]开始的

int main(void) int main() main() int main(int argc,char *argv[]){  } 因为C语言是写linux的 Unix的操作系统的，所以当时有一个东西叫做 交换式Shell 就相当于windows中的dos命令窗口  为了使命令的参数可以在交换式shell传入程序进行分析 所以main 函数需要这些参数 进行解析命令  毕竟程序越灵活越好 这样 有引出另一个问题 交互式shell解析器 它到底是怎么出来的貌似有个叫 busy_box 它把别人写的效率高的特殊功能的函数 集合到了一个程序  之后通过shell解析器 进行创建进程的方式 进行执行那些命令 所以就遗留下这个命令行参数的问题，正如main函数就是一部手机 你打电话的号码就是参数 难不成它只能给一个人打电话。 还有一个问题 就是这个好处是可以进行父进程 创建子进程的继承问题 有很大的作用 。


Question: 请教个long 型的乘法在32位下计算结果比预期少1的问题

谢谢大家，结贴了。 谢谢所有回帖讨论的朋友。  angel_su给指明了方向。  我自己尝试了一下，确实可以。 按下面的编译选项之后结果也正确了，虽然还是不是很明白各个指令集，CPU选项的选择方式和用途。 gcc -msse2 tt_1.c  查到的资料如下，感兴趣的同学可以研究研究，有心得的朋友记得指点指点我哦。 http://www.acejoy.com/thread-4438-1-1.html http://www.cnblogs.com/zyl910/archive/2012/10/22/simdsumfloat.html http://www.cnblogs.com/zyl910/archive/2012/04/23/simd_var_name.html

64位int,long 也许是64位的

顶起来， 顶起来

浮点数计算，会有误差，但是什么情况下，误差多少和运算的数据有关，不是任何时候都是一样的。 误差，不是确定的，只能大概估计，何种情况，误差范围是多少，而不是每次计算的误差都一样。

-march=CPU[,+EXTENSION...]     generate code for CPU and EXTENSION, CPU is one of:      i8086, i186, i286, i386, i486, pentium, pentiumpro,      pentiumii, pentiumiii, pentium4, prescott, nocona,      core, core2, corei7, l1om, k6, k6_2, athlon, k8,      amdfam10, generic32, generic64     EXTENSION is combination of:      8087, 287, 387, no87, mmx, nommx, sse, sse2, sse3,      ssse3, sse4.1, sse4.2, sse4, nosse, avx, noavx,      vmx, smx, xsave, movbe, ept, aes, pclmul, fma,      clflush, syscall, rdtscp, 3dnow, 3dnowa, sse4a,      svme, abm, padlock, fma4

引用 11 楼 angel_su 的回复:64位默认使用sse指令，32位不是，要加参数-march=pentium4(或更高)，结果就一样。 高手啊！

引用 1 楼 u011980246 的回复:不知道   应该是类型转换的问题，，，，或者浮点数精度问题，，它可能只是近似值，例如3749.99999， printf("--%lf\n",  (double)b * 0.075)；  这个是正确的 谢谢回答，我觉得也是类型准换和精度的原因，因为在64位下面就能出正确结果。 继续等待高人释疑~

引用 2 楼 worldy 的回复:估计是按float类型进行转换计算  谢谢回答，开始也是这么以为的，但是下面这样也不行：     long b = 50000;     printf("--%ld\n", b);     long d = ((double)b) * ((double)0.075);     printf("--%ld\n", d);

估计是按float类型进行转换计算

可是为什么下面两种修改下能出正确结果呢  1） 吧程序放到64位的linux下 2） 把计算结果先付给一个double， 再把double值再付给一个long， 这个Long值也是正确的。

用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10) 同理，用二进制小数也不能精确表示某些10进制小数。

浮点数计算会有误差，但是如果是这样修改后也应该有误差啊？搞不清为什么，有知道gcc编译出来的怎么看汇编么？看下汇编大概就知道问题在哪里了 vs下测试没问题。。。。

别沉了了。 高手现现身给解答解答吧~~~


Question: C 语言中一个诡异的现象

VC6.0没有见你的现象，运行正常！

浮点数是无法精确的表示299.90 所以*100后是29989也没啥奇怪的。

浮点数误差而已。  引用 楼主 RJGCSS 的回复:#include <stdio.h>  int main() { 	double t; 	scanf("%lf",&t); 	printf("%d\n",(int)(t * 100)); 	return 0; }  如果输入299.90，输出竟然是29989？ 这是如此哪般？

可以去读下IEEE浮点规格，呵呵。

我算了一下，如果用16Bit去盛放一个数的小数部分，则0.9这个10进制数的2进制表示是： 0.899693896484375（用百度搜索的计算器算的），肯定是存在误差的

浮点数是有误差的。浮点数的等价判断，和整数的等价判断不是一回事

#include <stdio.h> int main() {     double t;     scanf("%lf",&t);     printf("%.0lf\n",t * 100.0);     printf("%d\n",(int)(t * 100.0+0.5));     return 0; }

引用 5 楼 akirya 的回复:浮点数是无法精确的表示299.90 所以*100后是29989也没啥奇怪的。+++

有什么诡异的？ 只是我们看到有点诡异而已！机器中小数部分也是二进制存储的，所以有误差是应该的

浮点精度以及整数运算 比如299.90可能只能表示成299.89999，乘以100得29989.999，取整得29989


Question: 新手提问：想把一个字符数组里的东西倒序的放进另一个数组，为啥错了呢

引用 4 楼 u012071720 的回复:[quote=引用 3 楼 u012071720 的回复:] printf("%s\n",rev_a);打印字符串的时候，因为其并不知道字符串的长度，所以就是找\0的位置作为结束标识，之前两个字符串的字符分别为 char a[6] = "hello";//h e l l o 0x00 char rev_a[6] = "";//0x00 0x00 0x00 0x00 0x00 0x00 而你执行完后成了 char a[6] = "hello";//h e l l o 0x00 char rev_a[6] = "/0olleh";//0x00 o l l e h 所以在打印时，第一个就遇到了0x00以为是结尾了，所以就没有打印出来，你可以改一下程序 for(int i = 0; i < 6; i++) {     rev_a[4-i] = a[i]; } 希望对你有帮助，其实你可以用debug来跟踪解决这个问题不好意思，有个地方错了 for(int i = 0; i < 5; i++) {     rev_a[4-i] = a[i]; }[/quote] 谢谢，学到很多。

引用 3 楼 u012071720 的回复:printf("%s\n",rev_a);打印字符串的时候，因为其并不知道字符串的长度，所以就是找\0的位置作为结束标识，之前两个字符串的字符分别为 char a[6] = "hello";//h e l l o 0x00 char rev_a[6] = "";//0x00 0x00 0x00 0x00 0x00 0x00 而你执行完后成了 char a[6] = "hello";//h e l l o 0x00 char rev_a[6] = "/0olleh";//0x00 o l l e h 所以在打印时，第一个就遇到了0x00以为是结尾了，所以就没有打印出来，你可以改一下程序 for(int i = 0; i < 6; i++) {     rev_a[4-i] = a[i]; } 希望对你有帮助，其实你可以用debug来跟踪解决这个问题不好意思，有个地方错了 for(int i = 0; i < 5; i++) {     rev_a[4-i] = a[i]; }

for(int i = 0; i < 5; i++)     rev_a[4-i] = a[i];

printf 错了


Question: 为什么虚拟XP系统下打不开BC呢

Borland C++ for DOS 还是 for Windows？ for DOS可能需要在DOSBOX下运行，for Windows可能版本太低不支持XP。 现在用这个很方便，XP或Win7都可以： 《C与C++程序设计学习与实验系统 2013.3》 只有几十M，集成了Turbo C/C++，VC 6.0和GCC的编译器。

DosBox也可以试试。

1、安装VirtualBox虚拟机； 2、在虚拟机下安装DOS6.22操作系统； 3、在DOS下安装BC3.0/BC3.1； 4、在BC下编译你的代码； 5、在DOS下执行你的程序。  引用 楼主 u011905800 的回复:为什么虚拟XP系统下打不开BORLANDC呢,闪退了

一下→以下

一下内容仅供参考：要想在Windows环境下稳定运行bc.exe 建一个批处理bc.bat,内容为下面两行，放在bc.exe同目录下，再将bc.bat发送到桌面快捷方式： del tc*.swp >NUL start command /c bc.exe 如果想在IDE里面使用鼠标，还应将快捷方式属性中的快速编辑模式关掉。

如果程序本身没有问题的话，可能就是虚拟机压力太多！