??xml version="1.0" encoding="utf-8" standalone="yes"?>国产国产成人精品久久,欧美久久精品一级c片片,久久狠狠一本精品综合网http://www.shnenglu.com/ivenher/category/485.htmlzh-cnThu, 22 May 2008 07:30:40 GMTThu, 22 May 2008 07:30:40 GMT60C语言中对旉和日期的处理http://www.shnenglu.com/ivenher/articles/33195.html爱饭?/dc:creator>爱饭?/author>Sat, 29 Sep 2007 07:35:00 GMThttp://www.shnenglu.com/ivenher/articles/33195.htmlhttp://www.shnenglu.com/ivenher/comments/33195.htmlhttp://www.shnenglu.com/ivenher/articles/33195.html#Feedback3http://www.shnenglu.com/ivenher/comments/commentRss/33195.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/33195.html

C语言中对旉和日期的处理

Chuck Allison

Chuck Allison是盐湖城?/span>Latter Day教堂总部下耶稣教堂家族历史研究处的软g体系设计?/span>。他拥有数学学士和数学硕士学位。他?/span>1975qv开始编E,?/span>1984qv他开始从?/span>c语言的教学和开发。他目前的兴是面向对象的技术及其教肌Ӏ他?/span>X3J16Q?/span>ANSI C ++标准化委员会的一员?/span>发?/span>e-mail?/span>allison@decus.orgQ或者拨打电话到(801)240-4510均可以与他取得联pR?/span>

大部分的操作pȝ有办法得到当前的日期和时间。通过定义?em>time.h的库函数Q?span>ANSI C能以许多不同的Ş式得到这个信息。函?em>timeq回一个类型ؓtime_t的|通常为longQ,该函数在q行期间对当前的日期和时间进行编码。然后你可以这个返回g递给其他能对该D行解码和格式化的函数?/span>

Listing 1中的E序使用函数timeQ?em>localtime?em>strftime以不同的形式输出当前的日期和旉。函?em>localtime把已l编码的旉解码成如下的structQ?/font>

struct tm
{
   int tm_sec;     /* (0 - 61) */
   int tm_min;     /* (0 - 59) */
   int tm_hour;    /* (0 - 23) */
   int tm_mday;    /* (1 - 31) */
   int tm_mon;     /* (0 - 11) */
   int tm_year;    /* past 1900 */
   int tm_wday;    /* (0 - 6) */
   int tm_yday;    /* (0 - 365) */
   int tm_isdst;   /* daylight savings flag */
};

每次当你调用localtime的时候,它会重写一个静态的l构q返回该l构的地址Q因此同一时刻在一个程序中只能取得一个这Ll构Q而不能做明显的拷贝)。函?/font>ctimeq回一个指向静态字W串的指针,该字W串以标准的格式包含了完整的旉和日期?/font>strftimeҎ用户的指定格式格式化字符Ԍ例如Q?/span>%A代表一周中每一天的名称Q?/span>Table 1列出了格式描q符的完整列表?/span>

/日期q算

通过改变tml构里的|可对旉/日期q行q算?a >Listing 2中的E序展示了如何计将来某天的日期和以Uؓ单位所计算出的E序执行旉。注意函?em>time的语法(参数time_t由地址传入Qƈ非作为函数的q回|。函?em>mktime改变tml构的|以便日期和时间在一个合适的范围内,之后day-of-week (tm_wday)和day-of-year (tm_yday)域进行相应的更新?em>mktime?em>tml构中日期和旉的值置于合适的范围之内Q相应的更新day of week (tm-wday)和day of year (tm-yday)的倹{这U情况发生在当一个日期超Z你的实现能够支持的范围的时候。例如,我的MS-DOS的编译器不能~码1970q?月䆾之前的日期。函?em>asctimeq回tm参数所描述旉的标准字W串Q因?em>ctime (&tval)与asctime (localtime(&tval)是相{的)。函?em>difftimeq回用秒做单位的两个time_t的差?/span>

如果需要处理超出系l范围的日期Q或者需要计两个日期的间隔又不是用U来做单位,那你需要设计自qdate~码?a >Listing 3 ?a >Listing 5中的应用E序通过使用一个简单的month-day-yearl构Q展CZ定两个日期间隔的年数、月份数和天数的技术。日期的相减像你在学里做的减法那P例如Q首先进行天数的相减Q如果需要就向月份数借位Q以此类推)。注意蟩q的q䆾都被计算q去了。ؓ了简略v见,date_interval函数假设日期都是有效的,q且W一个日期在W二个日期之前。函数返回一个指向静?em>Datel构的指针,该结构包含了我们惌的答案?/span>

文g旉/日期?/span>

大多数操作系lؓ文gl护旉/日期戟뀂至你能得知一个文件最后被修改的时间。(常用?em>make工具使用q一信息来决定一个文件是否需要被重新~译Q或者一个应用程序是否需要被重新q接Q。由于文件系l在不同q_上有所不同Q没有什么通用的函数得C个文件的旉/日期戻I因此ANSI 标准没有定义q样的函数。然而,大多数流行的操作pȝQ包括MS-DOS和VAX/VMSQ提供了UNIX函数statQ该函数q回相关的文件信息,包括?em>time_t表示的最后修Ҏ间?/span>

Listing 6中的E序使用stat?em>difftime来确定是?em>time1.c?em>time2.c更新Q例如,是否最q被修改q)?/font>

如果你需要更C个文件的旉/日期戛_当前旉Q可单的重写文g的第一个字节。虽然实际内容ƈ未改变,但你的文件系l会认ؓ文g已经被改变了Qƈ且会相应的更新时?日期戟뀂(知道你的文gpȝQ在VAX/VMS下,当你得到一个文件的新版本的时候,旧的版本仍会被保留)。这U技术叫?#8220;‘touching’一个文?#8221;?a >Listing 7?em>touch的实现在指定文g不存在的时候会创徏一个新文g。注意文件以“binary”模式打开Q在打开模式字符串中由字W?em>b军_—在来的专栏中我会详细讨论文g处理的问题)?/span>

?span>1Q?em>strftime的格式描q符

Code Sample Output
---------------------------------------------
%a    Wed
%A    Wednesday
%b    Oct
%B    October
%c    Wed Oct 07 13:24:27 1992
%d    07    (day of month [01-31])
%H    13    (hour in [00-23])
%I    01    (hour in [01-12])
%j    281   (day of year [001-366])
%m    10    (month [01-12])
%M    24    (minute [00-59])
%p    PM
%S    27    (second [00-59] )
%U    40    (Sunday week of year [00-52])
%w    3     (day of week [0-6])
%W    40    (Monday week of year [00-52])
%x    Wed Oct 7, 1992
%X    13:24:27
%y    92
%Y    1992
%Z    EDT   (daylight savings indicator)

Listing 1 time1.c ?采用不同格式输出当前的日期和旉

#include <stdio.h>
#include <time.h>
 
#define BUFSIZE 128
 
main()
{
   time_t tval;
   struct tm *now;
   char buf[BUFSIZE];
   char *fancy_format =
     "Or getting really fancy:\n"
     "%A, %B %d, day %j of %Y.\n"
     "The time is %I:%M %p.";
 
   /* Get current date and time */
   tval = time(NULL);
   now = localtime(&tval);
   printf("The current date and time:\n"
         "%d/%02d/%02d %d:%02d:%02d\n\n",
     now->tm_mon+1, now->tm_mday, now->tm_year,
     now->tm_hour, now->tm_min, now->tm_sec);
   printf("Or in default system format:\n%s\n",
         ctime(&tval));
   strftime(buf,sizeof buf,fancy_format,now);
   puts(buf);
 
   return 0;
}
 
/* Output
The current date and time:
10/06/92 12:58:00
 
Or in default system format:
Tue Oct 06 12:58:00 1992
 
Or getting really fancy:
Tuesday, October 06, day 280 of 1992.
The time is 12:58 PM.
*/
 
/* End of File */

Listing 2 time2.c ?em>展示如何计算来某一天的日期以及以秒为单位计出的执行时?/em>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
main()
{
   time_t start, stop;
   struct tm *now;
   int ndays;
 
   /* Get current date and time */
   time(&start);
   now = localtime(&start);
 
   /* Enter an interval in days */
   fputs("How many days from now? ",stderr);
   if (scanf("%d",&ndays) !=1)
      return EXIT_FAILURE;
   now->tm_mday += ndays;
   if (mktime(now) != -1)
      printf("New date: %s",asctime(now));
   else
      puts("Sorry. Can't encode your date.");
 
   /* Calculate elapsed time */
   time(&stop);
   printf("Elapsed program time in seconds: %f\n",
     difftime(stop,start));
 
   return EXIT_SUCCESS;
}
 
/* Output
How many days from now? 45
New date: Fri Nov 20 12:40:32 1992
Elapsed program time in seconds: 1.000000
*/
 
/* End of File */

Listing 3 date.h ?一个简单的日期l构

struct Date
{
   int day;
   int month;
   int year;
};
typedef struct Date Date;
 
Date* date_interval(const Date *, const Date *);
/* End of File */

Listing 4 date_int.c ?计算两个日期的间?/em>

/* date_int.c: Compute duration between two dates */
 
#include "date.h"
 
#define isleap(y) \
 ((y)%4 == 0 && (y)%100 != 0 || (y)%400 == 0)
 
static int Dtab [2][13] =
{
 {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
 {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
 
Date *date_interval(const Date *d1, const Date *d2)
{
   static Date result;
   int months, days, years, prev_month;
 
   /* Compute the interval - assume d1 precedes d2 */
   years = d2->year - d1->year;
   months = d2->month - d1->month;
   days = d2->day - d1->day;
 
   /* Do obvious corrections (days before months!)
    *
    * This is a loop in case the previous month is
    * February, and days < -28.
    */
   prev_month = d2->month - 1;
   while (days < 0)
   {
      /* Borrow from the previous month */
      if (prev_month == 0)
         prev_month = 12;
      --months;
      days += Dtab[isleap(d2->year)][prev_month--];
   }
 
   if (months < 0)
   {
      /* Borrow from the previous year */
      --years;
      months += 12;
   }
 
   /* Prepare output */
   result.month = months;
   result.day = days;
   result.year = years;
   return &result;
}
/* End of File */

Listing 5 tdate.c ?举例说明日期间隔函数的?/em>

/* tdate.c: Test date_interval() */
 
#include <stdio.h>
#include <stdlib.h>
#include "date.h"
 
main()
{
   Date d1, d2, *result;
   int nargs;
 
   /* Read in two dates - assume 1st precedes 2nd */
   fputs("Enter a date, MM/DD/YY> ",stderr);
   nargs = scanf("%d/%d/%d%*c", &d1.month,
     &d1.day, &d1.year);
   if (nargs != 3)
      return EXIT_FAILURE;
 
   fputs("Enter a later date, MM/DD/YY> ",stderr);
   nargs = scanf("%d/%d/%d%*c", &d2.month,
     &d2.day, &d2.year);
   if (nargs != 3)
      return EXIT_FAILURE;
 
   /* Compute interval in years, months, and days */
   result = date_interval(&d1, &d2);
   printf("years: %d, months: %d, days: %d\n",
      result->year, result->month, result->day);
   return EXIT_SUCCESS;
 
}
/* Sample Execution:
Enter a date, MM/DD/YY> 10/1/51
Enter a later date, MM/DD/YY> 10/6/92
years: 41, months: 0, days: 5 */
/* End of File */

Listing 6 ftime.c ?定是否time1.c?/em>time2.c更新

/* ftime.c: Compare file time stamps */
 
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <time.h>
 
main()
{
   struct stat fs1, fs2;
 
   if (stat("time1.c",&fs1) == 0 &&
      stat("time2.c",&fs2) == 0)
   {
      double interval =
        difftime(fs2.st_mtime,fs1.st_mtime);
 
      printf("time1.c %s newer than time2.c\n",
        (interval < 0.0) ? "is" : "is not");
      return EXIT_SUCCESS;
   }
   else
      return EXIT_FAILURE;
}
/* Output
time1.c is not newer than time2.c */
/* End of File */

Listing 7 touch.c ?em>通过覆盖旧文件或者创Z个新的文件来更新旉?/em>

/* touch.c: Update a file's time stamp */
 
#include <stdio.h>
 
void touch(char *fname)
{
   FILE *f = fopen(fname,"r+b");
   if (f != NULL)
   {
      char c = getc(f);
      rewind(f);
      putc(c,f);
   }
   else
      fopen(fname,"wb");
 
   fclose(f);
}
 
/* End of File */

 



]]>
string操作http://www.shnenglu.com/ivenher/articles/1601.html爱饭?/dc:creator>爱饭?/author>Wed, 07 Dec 2005 07:48:00 GMThttp://www.shnenglu.com/ivenher/articles/1601.htmlhttp://www.shnenglu.com/ivenher/comments/1601.htmlhttp://www.shnenglu.com/ivenher/articles/1601.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/1601.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/1601.htmlusing namespace std;
int main()
{
  string str="hello world";
  char * p;
  int len=0;
   len = str.size() ;  //q回字符串长度;
  char ch='a';
   str +=  ch  ;//(char),相当于strcat
   str.empty(); //判空
   int i=0;
   ch = str[i] ;       //下标讉K
   p = (char *)str.c_str();//q回char* cd的字W串?BR>   printf("%s",p);
   str.substr() ; //q个好像有的
return 0;
}

]]>
C语言高效~程的四大绝?/title><link>http://www.shnenglu.com/ivenher/articles/1599.html</link><dc:creator>爱饭?/dc:creator><author>爱饭?/author><pubDate>Wed, 07 Dec 2005 06:54:00 GMT</pubDate><guid>http://www.shnenglu.com/ivenher/articles/1599.html</guid><wfw:comment>http://www.shnenglu.com/ivenher/comments/1599.html</wfw:comment><comments>http://www.shnenglu.com/ivenher/articles/1599.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/ivenher/comments/commentRss/1599.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ivenher/services/trackbacks/1599.html</trackback:ping><description><![CDATA[~写高效z的C语言代码Q是许多软g工程师追求的目标。本文就是针对编E工作中的一些体会和l验做相关的阐述?<BR><BR>  <B>W一招:以空间换旉</B><BR><BR>  计算机程序中最大的矛盾是空间和旉的矛盾,那么Q从q个角度出发逆向思维来考虑E序的效率问题,我们有了解决问题的W??-以空间换旉。比如说字符串的赋|<BR><BR>  ҎAQ通常的办?BR><BR> <TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <TBODY> <TR> <TD>#define LEN 32<BR>char string1 [LEN];<BR>memset (string1,0,LEN);<BR>strcpy (string1,"This is a example!!"Q?</TD></TR></TBODY></TABLE><BR>  ҎBQ?<BR><BR> <TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <TBODY> <TR> <TD>const char string2[LEN] ="This is a example!";<BR>char * cp;<BR>cp = string2 ;</TD></TR></TBODY></TABLE><BR>  使用的时候可以直接用指针来操作?<BR><BR>  从上面的例子可以看出QA和B的效率是不能比的。在同样的存储空间下QB直接使用指针可以操作了Q而A需要调用两个字W函数才能完成。B的缺点在于灵zL没有A好。在需要频J更改一个字W串内容的时候,Ah更好的灵zL;如果采用ҎBQ则需要预存许多字W串Q虽然占用了大量的内存,但是获得了程序执行的高效率?<BR><BR>  如果pȝ的实时性要求很高,内存q有一些,那我推荐你用该招数。该招数的变?-使用宏函数而不是函数。D例如下: <BR><BR>  ҎCQ?<BR><BR> <TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <TBODY> <TR> <TD>#define bwMCDR2_ADDRESS 4<BR>#define bsMCDR2_ADDRESS 17<BR>int BIT_MASK(int __bf) <BR>{<BR> return ((1U << (bw ## __bf)) - 1)<< (bs ## __bf);<BR>}<BR>void SET_BITS(int __dst, <BR>int __bf, int __val)<BR>{<BR> __dst = ((__dst) & ~(BIT_MASK(__bf))) |<BR>\<BR> (((__val) << (bs ## __bf)) <BR>& (BIT_MASK(__bf))))<BR>}<BR><BR>SET_BITS(MCDR2, MCDR2_ADDRESS,RegisterNumber);</TD></TR></TBODY></TABLE><BR>  ҎDQ?<BR><BR> <TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <TBODY> <TR> <TD>#define bwMCDR2_ADDRESS 4<BR>#define bsMCDR2_ADDRESS 17<BR>#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)<BR>#define BIT_MASK(__bf) <BR>(((1U << (bw ## __bf)) - 1)<BR><< (bs ## __bf))<BR>#define SET_BITS(__dst, __bf, __val)<BR>\<BR>((__dst) = ((__dst) & ~(BIT_MASK(__bf)))<BR>| \<BR>(((__val) << (bs ## __bf))<BR>& (BIT_MASK(__bf))))<BR><BR>SET_BITS(MCDR2, MCDR2_ADDRESS,<BR>RegisterNumber);</TD></TR></TBODY></TABLE><BR>  函数和宏函数的区别就在于Q宏函数占用了大量的I间Q而函数占用了旉。大家要知道的是Q函数调用是要用系l的栈来保存数据的,如果~译器里有栈查选项Q一般在函数的头会嵌入一些汇~语句对当前栈进行检查;同时QCPU也要在函数调用时保存和恢复当前的现场Q进行压栈和Ҏ操作Q所以,函数调用需要一些CPU旉?<BR><BR>  而宏函数不存在这个问题。宏函数仅仅作ؓ预先写好的代码嵌入到当前E序Q不会生函数调用,所以仅仅是占用了空_在频J调用同一个宏函数的时候,该现象尤其突出?<BR><BR>  DҎ是我看到的最好的|位操作函数Q是ARM公司源码的一部分Q在短短的三行内实现了很多功能,几乎늛了所有的位操作功能。CҎ是其变体Q其中滋呌需大家仔细体会?<BR><BR><STRONG>W二招:数学Ҏ解决问题</STRONG> <BR><BR>  现在我们演绎高效C语言~写的第二招--采用数学Ҏ来解决问题。数学是计算Z母,没有数学的依据和基础Q就没有计算机的发展Q所以在~写E序的时候,采用一些数学方法会对程序的执行效率有数量的提高。D例如下,?1~100的和?BR><BR>  ҎEQ?BR><BR> <TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <TBODY> <TR> <TD>int I , j;<BR>for (I = 1 ;I<=100; I ++Q?BR>{<BR> j += I;<BR>}</TD></TR></TBODY></TABLE><BR>  ҎF <BR><BR> <TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <TBODY> <TR> <TD>int I;<BR>I = (100 * (1+100)) / 2</TD></TR></TBODY></TABLE><BR>  q个例子是我印象最q一个数学用例,是我的计机启蒙老师考我的。当时我只有学三年U,可惜我当时不知道用公?N×QN+1Q? 2 来解册个问题。方法E循环?00ơ才解决问题Q也是说最用?00个赋|100个判断,200个加法(I和jQ;而方法F仅仅用了1个加法,1ơ乘法,1ơ除法。效果自然不a而喻。所以,现在我在~程序的时候,更多的是动脑{找规律Q最大限度地发挥数学的威力来提高E序q行的效率?<BR><BR>  <B>W三招:使用位操?</B><BR><BR>  实现高效的C语言~写的第三招——用位操作。减除法和取模的运。在计算机程序中数据的位是可以操作的最数据单位,理论上可以用"位运?来完成所有的q算和操作。一般的位操作是用来控制g的,或者做数据变换使用Q但是,灉|的位操作可以有效地提高程序运行的效率。D例如下: <BR><BR>  ҎG <BR><BR> <TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <TBODY> <TR> <TD>int I,J;<BR>I = 257 /8;<BR>J = 456 % 32;</TD></TR></TBODY></TABLE><BR>  ҎH <BR><BR> <TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <TBODY> <TR> <TD>int I,J;<BR>I = 257 >>3;<BR>J = 456 - (456 >> 4 << 4);</TD></TR></TBODY></TABLE><BR>  在字面上好像H比Gȝ了好多,但是Q仔l查看生的汇编代码׃明白Q方法G调用了基本的取模函数和除法函敎ͼ既有函数调用Q还有很多汇~代码和寄存器参与运;而方法H则仅仅是几句相关的汇~,代码更简z,效率更高。当Ӟ׃~译器的不同Q可能效率的差距不大Q但是,以我目前遇到的MS C ,ARM C 来看Q效率的差距q是不小。相x~代码就不在q里列D了?<BR><BR>  q用q招需要注意的是,因ؓCPU的不同而生的问题。比如说Q在PC上用q招~写的程序,q在PC上调试通过Q在ULC?6位机q_上的时候,可能会生代码隐患。所以只有在一定技术进阶的基础下才可以使用q招?<BR><BR>  <B>W四招:汇编嵌入 </B><BR><BR>  高效C语言~程的必杀技Q第四招——嵌入汇~?在熟悉汇~语a的h眼里QC语言~写的程序都是垃?。这U说法虽然偏Ȁ了一些,但是却有它的道理。汇~语a是效率最高的计算aQ但是,不可能靠着它来写一个操作系l吧?所以,Z获得E序的高效率Q我们只好采用变通的Ҏ--嵌入汇编Q؜合编E。D例如下,数l一赋值给数组?要求每一字节都相W?<BR><BR> <TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <TBODY> <TR> <TD>char string1[1024],string2[1024];</TD></TR></TBODY></TABLE><BR>  ҎI <BR><BR> <TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <TBODY> <TR> <TD>int I;<BR>for (I =0 ;I<1024;I++)<BR> *(string2 + I) = *(string1 + I)</TD></TR></TBODY></TABLE><BR>  ҎJ <BR><BR> <TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <TBODY> <TR> <TD>#ifdef _PC_<BR>int I;<BR>for (I =0 ;I<1024;I++)<BR>*(string2 + I) = *(string1 + I);<BR>#else<BR>#ifdef _ARM_<BR>__asm<BR>{ <BR> MOV R0,string1<BR> MOV R1,string2<BR> MOV R2,#0<BR>loop:<BR> LDMIA R0!, [R3-R11]<BR> STMIA R1!, [R3-R11]<BR> ADD R2,R2,#8<BR> CMP R2, #400<BR> BNE loop<BR>}<BR>#endif</TD></TR></TBODY></TABLE><BR>  ҎI是最常见的方法,使用?024ơ@环;ҎJ则根据^C同做了区分,在ARMq_下,用嵌入汇~仅?28ơ@环就完成了同L操作。这里有朋友会说Qؓ什么不用标准的内存拯函数?q是因ؓ在源数据里可能含有数据ؓ0的字节,q样的话Q标准库函数会提前结束而不会完成我们要求的操作。这个例E典型应用于LCD数据的拷贝过E。根据不同的CPUQ熟l用相应的嵌入汇编Q可以大大提高程序执行的效率?<BR><BR>  虽然是必杀技Q但是如果轻易用会付出惨重的代仗这是因为,使用了嵌入汇~,侉K制了E序的可UL性,使程序在不同q_UL的过E中Q卧虎藏龙,险象环生Q同时该招数也与C软g工程的思想相违背,只有在迫不得已的情况下才可以采用?<BR><img src ="http://www.shnenglu.com/ivenher/aggbug/1599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ivenher/" target="_blank">爱饭?/a> 2005-12-07 14:54 <a href="http://www.shnenglu.com/ivenher/articles/1599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言~程技巧汇?/title><link>http://www.shnenglu.com/ivenher/articles/1499.html</link><dc:creator>爱饭?/dc:creator><author>爱饭?/author><pubDate>Fri, 02 Dec 2005 08:08:00 GMT</pubDate><guid>http://www.shnenglu.com/ivenher/articles/1499.html</guid><wfw:comment>http://www.shnenglu.com/ivenher/comments/1499.html</wfw:comment><comments>http://www.shnenglu.com/ivenher/articles/1499.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ivenher/comments/commentRss/1499.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ivenher/services/trackbacks/1499.html</trackback:ping><description><![CDATA[读键盘扫描码<BR>获取机器日期<BR>QҎ转化为字W串<BR>清除屏幕<BR>昄旉<BR>打印一个矩?BR>砍掉字符串中所有空?BR>取子字符?BR>从文件中d字符<BR>字符串左靠齐<BR>取左字符?BR>向文件写数据<BR>取右字符?BR>打开或关闭光?BR>喇叭发声<BR>旉延迟<BR>正点报时<BR>写整C文g?BR>从文件中d整数<BR>报警<BR>字符串右靠齐<BR>字符串居?BR>删除子字W串<BR>查找指定字符?BR>产生I格<BR>产生字符?BR>砍掉字符串左边空?BR>砍掉字符串右边空?BR>昄一个字W串<BR>定义屏幕颜色<BR>昄提示H口昄警告H口<BR>得到文g长度<BR>H口滚屏<BR>扫描键盘<BR>插入字符?<BR>磁盘是否准备就l?BR>磁盘是否写保护<BR>修改文g的某一?BR>成批拯文g<BR>拯一个文?BR>建立目录<BR>得到目录<BR>得到文g?BR>L两个正整数相?<80?<BR>L两个正整数相?BR><BR><BR>注意Q该函数集省略了不少TC标准头文Ӟ读者用时要自行添加。而且׃该函数集内部函数间有的有调用关系Q读者拆卸时要}慎?BR><BR><BR>/*~程技巧荟?/<BR><BR>/*从键盘中d字符 功能Q按下普通键Ӟq回其ASCII?扫描码CODE=0*/<BR>int INKEY(int *code)<BR>{<BR>int m;<BR>while(!bioskey(1))/*可加入无按键时代?/;<BR>*code=bioskey(0);<BR>m=*code*255;<BR>if(!m) m=*code>>8;<BR>*code=*code&255;<BR>return m;<BR>}<BR><BR>/*获取机器日期*/<BR>int DATE(char *s,char type)<BR>{<BR>char dat[30];<BR>int num;<BR>struct tm *tblock;<BR>time_t t;<BR>t=time(NULL);<BR>tblock=localtime(&t);<BR>strcpy(dt,asctime(tblock));<BR>strcpy(s,"");<BR>switch(type)<BR>{<BR>case 'N':<BR>num=(*tblock).tm_year+1900;<BR>itoa(num,s,10);<BR>break;<BR>case 'Y':<BR>num=(*tblock).tm_mon+1;<BR>itoa(num,s,10);<BR>break;<BR>case 'R':<BR>num=(*tblock).tm_mday;<BR>itoa(num,s,10);<BR>break;<BR>case 'S':<BR>strcpy(dt,asctime(tblock));<BR>MID(s,dt,12,8);<BR>break;<BR>}<BR>}<BR>return num;<BR>}<BR><BR>/*QҎ转化为字W串*/<BR>/* 参数说明 data:需转换的QҎQs:输出字符Ԍlen:转换后的长度*/<BR>void f_to_s(double data,char *s,int len)<BR>{<BR>int dec,sign,i;<BR>char *s1,s2[100],s3[100];<BR>s1=0;<BR>s2[0]=0;<BR>s3[0]=0;<BR>s1=fcvt(data,len,&dec,&sign);<BR>if (!sign&&data>=1)<BR>{<BR>MID(s2,s1,dec+1,-1);<BR>MID(s3,s1,1,dec);<BR>strcpy(s,"+");<BR>strcat(s,s3);<BR>strcat(s,".");<BR>strcat(s,s2);<BR>}<BR>if (sign&&fabs(data)>=1)<BR>{<BR>MID(s2,s1,dec+1,-1);<BR>strcpy(s,"-");<BR>MID(s3,s1,1,dec);<BR>strcat(s,s3);<BR>strcat(s,".");<BR>strcat(s,s2);<BR>}<BR>if (!sign&&dec==0)<BR>{<BR>strcpy(s,"+0.");<BR>strcat(s,s1);<BR>}<BR>if (sign&&dec==0)<BR>{<BR>strcpy(s,"-0.");<BR>strcat(s,s1);<BR>}<BR>if (!sign&&dec<0)<BR>{<BR>strcpy(s,"+0.");<BR>for(i=1;i<=fabs(dec);i++)<BR>strcat(s,"0");<BR>strcat(s,s1);<BR>}<BR>if (sign&&dec<0)<BR>{<BR>strcpy(s,"-0.");<BR>for(i=1;i<=fabs(dec);i++)<BR>strcat(s,"0");<BR>strcat(s,s1);<BR>}<BR>if (strlen(s)>len) s[len]=0;<BR>}<BR><BR>/*清除屏幕*/<BR>void CLSXY(int color,int x,int y,int xl,int yl)<BR>{<BR>int x1,y1;<BR>union REGS r;<BR>if(x<1||y<1) return;<BR>y--;<BR>x--;<BR>y1=y+yl-1;<BR>x1=x+xl-1;<BR>if (y1>25||x1>80)<BR>return;<BR>r.h.ah=6; /*子功能号*/<BR>r.h.al=0; /*滚动行数*/<BR>r.h.ch=y;<BR>r.h.cl=x;<BR>r.h.dh=y1;<BR>r.h.dl=x1;<BR>r.h.bh=color*16;<BR>int86(16,&r,&r);<BR>}<BR><BR><BR>/*昄旉*/<BR>void display_time(int color,int back_color,int y,int x)<BR>{<BR>static char oldtime[9]="";<BR>char newtime[9];<BR>if(y<1||x<1) return;<BR>settextstyle(1,0,1);<BR>DATA(newtime,'S');<BR>back_color=7;<BR>if(strcmp(newtime,oldtime))<BR>{<BR>setfillstyle(1,back_color);<BR>setcolor(color);<BR>bar(535,458,635,475);<BR>outtextxy(x,y,newtime);<BR>strcpy(oldtime,newtime);<BR>}<BR>}<BR><BR><BR>/*打印一个矩?/<BR>void PRINT_KJ(int x,int y,int wide,int high)<BR>{<BR>int i;<BR>for(i=x;i<x+wide;i+=2)<BR>{<BR>gotoxy(i,y);<BR>cprintf("?);<BR>}<BR>gotoxy(x,y+high);<BR>cprintf("?);<BR>gotoxy(x+wide,y+high);<BR>cprintf("?);<BR>gotoxy(x,y);<BR>cprintf("?);<BR>gotoxy(x+wide,y);<BR>cprintf("?);<BR>for(i=x+2;i<x+wide;i+=2)<BR>{<BR>gotoxy(i,y+high);<BR>cprintf("?);<BR>}<BR>for(i=y+1;i<y+high;i++)<BR>{<BR>gotoxy(x,i);<BR>cprintf("?);<BR>}<BR>for(i=y+1;i<y+high;i++)<BR>{<BR>gotoxy(x+wide,i);<BR>cprintf("?);<BR>}<BR>}<BR><BR>/*砍掉字符串中所有空?/<BR>void CUT_ALL_SPC(char *s)<BR>{<BR>int i,n;<BR>char d[10000];<BR>n=0;<BR>for(i=0;i<strlen(s);i++)<BR>if(s!=32)<BR>{<BR>d[n]=s;<BR>n++;<BR>}<BR>d[n]=0;<BR>strcpy(s,d);<BR>}<BR><BR><BR>/*取子字符?/<BR>void MID(char *s,char *t,int n,int m)<BR>{<BR>int i,j,p;<BR>if(n<1) n=1;<BR>i=strlen(s);<BR>if(i<n) m=0;<BR>if(m<0) m=i;<BR>else m=n+m-1;<BR>if(m>i) m=i;<BR>p=m-n+1;<BR>if(p<0) p=0;<BR>for(i=n-1,j=0;i<m;i++,j++)<BR>t[j]=s;<BR>t[p]=0;<BR>}<BR><BR><BR>/*从文件中d字符*/<BR>int READ_STR(char *s,FILE *fp)<BR>{<BR>int i=0;<BR>if(!fp) return 0;<BR>if(fgets(s,10000,fp)) i=1;<BR>s[strlen(s)-1]=0;<BR>return i;<BR>}<BR><BR>/*字符串左靠齐*/<BR>void MOVE_LEFT(char *d,char *s,int n)<BR>{<BR>int i,l;<BR>l=strlen(s);<BR>if(n>l) n=l;<BR>for(i=0;i<l;i++)<BR>*d++=*s++;<BR>*d=0;<BR>}<BR><BR>/*取左字符?/<BR>void LEFT(char *d,char *s,int n)<BR>{<BR>int i,l;<BR>i=0;<BR>l=strlen(s);<BR>if(n>l) n=l;<BR>for(i=0;i<n;i++)<BR>d=s;<BR>d[n]=0;<BR>}<BR><BR><BR>/*向文件写数据*/<BR>void WRITE_STR(char *s,FILE *fp)<BR>{<BR>char c=10;<BR>if(!fp) return;<BR>fputs(s,fp);<BR>fputc(c,fp);<BR>}<BR><BR>/*取右字符?/<BR>void RIGHT(char *dest,char *source,int num)<BR>{<BR>int i,j;<BR>if (num<1) num=0;<BR>num=strlen(source)-num;<BR>if (num<0) num=0;<BR>for(i=0,j=num;j<=strlen(source);i++,j++) dest=source[j];<BR>}<BR><BR><BR>/*打开或关闭光?/<BR>void CURSOR(int on2off)<BR>{<BR>union REGS r;<BR>if (on2off!=OFF) on2off=10;<BR>r.h.ah=1;<BR>r.h.ch=3;<BR>r.h.cl=on2off;<BR>int86(16,&r,&r);<BR>}<BR><BR>/*喇叭发声*/<BR>void SOUND(int frequency,int time)<BR>{<BR>int i;<BR>i=time*50;<BR>if (i>30000) i=30000;<BR>if (i<50) i=50;<BR>sound(frequency);<BR>MYDELAY(i);<BR>nosound();<BR>}<BR><BR>/*旉延迟*/<BR>void MYDELAY(long t)<BR>{<BR>time_t OldTime;<BR>long t0;<BR>t0=t/55;<BR>if (t0<1) t0=1;<BR>OldTime=clock();<BR>while(clock()-OldTime<t0);<BR>}<BR><BR><BR>/*正点报时*/<BR>void REPORT_CLOCK(void)<BR>{<BR>int i;<BR>for(i=0;i<5;i++);<BR>{<BR>SOUND(500,10);<BR>MYDELAY(1000);<BR>}<BR>SOUND(800,10);<BR>}<BR><BR><BR>/*写整C文g?/<BR>void WRITE_INT(int num,FILE *p)<BR>{<BR>char s[20],a=10;<BR>if (!p) return;<BR>itoa(num,s,10);<BR>fputs(s,p);<BR>fputc(a,p);<BR>}<BR><BR><BR>/*从文件中d整数*/<BR>int READ_INT(int *num,FILE *p)<BR>{<BR>int i;<BR>char s[30]="";<BR>if (!p) return 0;<BR>if (fgets(s,10000,p))<BR>{<BR>i=-1;<BR>s[strlen(s)-1]=0;<BR>*num=atoi(s);<BR>}<BR>else i=0;<BR>return i;<BR>}<BR><BR><BR>/*报警 */<BR>void WARN(void)<BR>{<BR>SOUND(300,1);<BR>SOUND(100,1);<BR>}<BR><BR><BR>/*字符串右靠齐*/<BR>void MOVE_RIGHT(char *s,int wide)<BR>{<BR>int i,l,n;<BR>l=strlen(s);<BR>n=wide-l;<BR>if (n>0)<BR>{<BR>for(i=l;i>-1;i--) s[i+n]=s;<BR>for(i=0;i<n;i++) s=32;<BR>}<BR>}<BR><BR><BR>/*字符串居?/<BR>void MOVE_MIDDLE(char *s,int wide)<BR>{<BR>int i,l,n;<BR>l=strlen(s);<BR>if (wide>l)<BR>{<BR>wide=wide-1;<BR>n=wide/2;<BR>wide=wide-n;<BR>for(i=l;i>-1;i--) s[i+n]=s;<BR>for(i=0;i<n;i++) s=32;<BR>for(i=0;i<wide;i++) s[l+n+i]=32;<BR>s[l+n+i]=0;<BR>}<BR>}<BR><BR>/*删除子字W串*/<BR>void Delete_SubString(char *source,int start,int num)<BR>{<BR>int i,l;<BR>l=strlen(source);<BR>if (num>l-start+1||num==-1) num=l-start+1;<BR>if (start<1||start>1) return;<BR>for(i=start;i<l-num+2;i++)<BR>source[i-1]=source[i+num-1];<BR>}<BR><BR>/*查找指定字符?/<BR>int INSTR(int n,char *source,char *dest)<BR>{<BR>int i,j,k1,k2,p;<BR>int start=0;<BR>if (n==0) n=1;<BR>k1=strlen(source);<BR>k2=strlen(dest);<BR>if (n<0)<BR>{<BR>char s[100];<BR>n=-n;<BR>MID(s,source,n,k2);<BR>if (strcmp(s,dest)) return 0;<BR>return n;<BR>}<BR>if (k1-n+1<k2) return start;<BR>for(i=n-1;i<k1;i++)<BR>{<BR>p=0;<BR>for(j=0;j<k2;j++)<BR>if (source[i+j]!=dest[j]) break;<BR>else p++;<BR>if (p==k2)<BR>{<BR>start=i+1;<BR>break;<BR>}<BR>}<BR>return start;<BR>}<BR><BR><BR>/*产生I格*/<BR>void SPACE(char *s,int n)<BR>{<BR>int i;<BR>if (n<0) n=0;<BR>for(i=0;i<n;i++) *s++=32;<BR>*s=0;<BR>}<BR><BR><BR>/*产生字符?/<BR>void STRING(int n,char *s1,char *s2)<BR>{<BR>int i;<BR>if (n<0) n=0;<BR>s1[0]=0;<BR>for(i=1;i<=n;i++) strcat(s1,s2);<BR>}<BR><BR><BR>/*砍掉字符串左边空?/<BR>void CUT_LEFT_SPACE(char *s)<BR>{<BR>int i,j,k=0;<BR>i=strlen(s)+1;<BR>for(j=0;j<i;j++) if (s[j]!=' ') break;<BR>for(k=0;j<i;k++,j++) s[k]=s[j];<BR>}<BR> <TABLE cellSpacing=0 cellPadding=0 width="90%" border=0> <TBODY> <TR> <TD style="WIDTH: 520px; WORD-BREAK: break-all" width="100%">/*砍掉字符串右边空?/<BR>void CUT_RIGHT_SPACE(char *s)<BR>{<BR>int i,j;<BR>i=strlen(s)-1;<BR>for(j=i;j>-1;j--) if (s[j]!=' ') break;<BR>s[j+1]=0;<BR>}<BR><BR>/*昄一个字W串*/<BR>void DISPLAY(char *s)<BR>{<BR>union REGS regs;<BR>int color,x,y;<BR>x=wherex();<BR>y=wherey();<BR>color=16*bjys+qjys;<BR>while(*s)<BR>{<BR>if(x>80) break;<BR>regs.h.ah=9;<BR>regs.h.al=*s;<BR>regs.h.bh=0;<BR>regs.h.bl=color;<BR>regs.x.cx=1; /*昄的次?不改变光标位|?/<BR>int86(16,&reg;s,&reg;s);<BR>x++;<BR>if(x>80)<BR>{<BR>x=1;<BR>y++;<BR>if(y>25) y=25;<BR>}<BR>gotoxy(x,y);<BR>s++;<BR>}<BR>}<BR><BR>/*定义屏幕颜色*/<BR>void COLOR(int ForeColor,int BackColor)<BR>{<BR>if(ForeColor<0||ForeColor>15) return;<BR>if(BackColor<0||BackColor>15) return;<BR>qjys=ForeColor;<BR>bjys=BackColor;<BR>}<BR><BR>/*昄提示H口*/<BR>void quit_YesNo(char *s1,char *s2)<BR>{<BR>char buffer[2000],jx;<BR>gettext(30,8,76,16,buffer);<BR>textbackground(3);<BR>CLSXY(8,32,9,30,6);<BR>CLSXY(4,30,8,30,6);<BR>COLOR(15,4);<BR>gotoxy(35,10);<BR>DISPLAY(s1);<BR>gotoxy(35,12);<BR>DISPLAY(s2);<BR>gotoxy(35+strlen(s2)+1,12);<BR>jx=getch();<BR>puttext(30,8,76,16,buffer);<BR>if (jx=='n'||jx=='N') return;<BR>textbackground(0);<BR>textcolor(15);<BR>clrscr();<BR>CURSOR(ON);<BR>exit(0);<BR>}<BR><BR>/*昄警告H口*/<BR>void warn_message(char *s1,char *s2)<BR>{<BR>char buffer[2000];<BR>gettext(30,8,76,16,buffer);<BR>CLSXY(8,32,9,30,6);<BR>CLSXY(4,30,8,30,6);<BR>COLOR(15,4);<BR>gotoxy(35,10);<BR>DISPLAY(s1);<BR>gotoxy(35,12);<BR>DISPLAY(s2);<BR>gotoxy(40,13);<BR>DISPLAY("按Q意键l箋...");<BR>getch();<BR>puttext(30,8,76,16,buffer);<BR>}<BR><BR>/*得到文g长度*/<BR>long GetFileLength(char *file)<BR>{<BR>FILE *fp;<BR>int i;<BR>if ((fp=fopen(file,"rb"))==NULL)<BR>{<BR>clrscr();<BR>printf("Can't open the file %s .",file);<BR>return 0;<BR>}<BR>i=0;<BR>while(!feof(fp))<BR>{<BR>i++;<BR>fgetc(fp);<BR>}<BR>fclose(fp);<BR>return (i-1);<BR>}<BR><BR>/*H口滚屏*/<BR>void WINDOW_ROLL(int y1,int x1,int yl,int xl,int direct)<BR>{<BR>union REGS regs;<BR>int x2,y2;<BR>x1--;<BR>y1--;<BR>x2=x1+xl-1;<BR>y2=y1+yl-1;<BR>regs.h.ah=5+direct; /*ah=06h 向上滚动当前?/<BR>/*ah=07h 向下。。?*/<BR>regs.h.al=1;<BR>regs.h.bh=16*pmbj+pmqj;<BR>regs.h.ch=y1; /*左上角行*/<BR>regs.h.cl=x1; /*?/<BR>regs.h.dh=y2; /*右下角行*/<BR>regs.h.dl=x2; /*?/<BR>int86(16,&reg;s,&reg;s);<BR>}<BR><BR>/*扫描键盘*/<BR>int scan_keyboard(int *m)<BR>{<BR>union inkey<BR>{<BR>unsigned char ch[2];<BR>int ii;<BR>}cc;<BR>while(!bioskey(1))<BR>{;}<BR>cc.ii=bioskey(0);<BR>*m=cc.ch[1];<BR>return cc.ch[0];<BR>}<BR><BR>/*插入字符?/<BR>void INSERT_STRING(char *ds,char *ss,int n)<BR>{<BR>char s[100];<BR>MID(ds,s,n,-1);<BR>ds[n-1]=0;<BR>strcat(ds,ss);<BR>strcat(ds,s);<BR>}<BR>void STR_ADD_CHAR(char *s,char ch)<BR>{<BR>char s1[2];<BR>s1[0]=ch;<BR>s1[1]=0;<BR>strcat(s,s1);<BR>}<BR><BR>/*磁盘是否准备就l?/<BR>int CheckDiskReading(int n)<BR>{<BR>int result;<BR>char buffer[512];<BR>result=biosdisk(4,n,0,0,0,1,buffer);<BR>result=result&0x02;<BR>if (result!=0x02) return 0;<BR>return 1;<BR>}<BR><BR>/*磁盘是否写保护*/<BR>int CheckDiskWriteProf(void)<BR>{<BR>int result;<BR>char buffer[512];<BR>result=biosdisk(5,0,0,0,0,1,buffer);<BR>if (result==0x03) return 0;<BR>return 1;<BR>}<BR><BR>/*修改文g的某一?/<BR>int ModifyFileLine(char *filename,char *s,int n)<BR>{<BR>char data[20][80];<BR>int i;<BR>FILE *fp;<BR>if ((fp=fopen(filename,"r"))==NULL) return 0;<BR>i=0;<BR>while(READ_STR(data,fp))<BR>i++;<BR>fclose(fp);<BR>fp=fopen(filename,"w");<BR>strcpy(data[n-1],s);<BR>n=i-1;<BR>for(i=0;i<=n;i++)<BR>WRITE_STR(data,fp);<BR>fclose(fp);<BR>return 1;<BR>}<BR><BR>/*成批拯文g*/<BR>int CopyFile(char *sfile,char *dfile,int f2d,int barlong,int height,int x,int y)<BR>{<BR>int Copyfile(char *sf,char *df);<BR>int MakeNdir(char *Dir);<BR>char filename[200][13],d[40],s[40],s1[40];<BR>struct ffblk ffblk;<BR>int done,i,j,l,len;<BR>i=0;<BR>done=findfirst(sfile,&ffblk,0);<BR>if (!done) strcpy(filename,ffblk.ff_name);<BR>while(!done)<BR>{<BR>done=findnext(&ffblk);<BR>if (!done)<BR>{<BR>i++;<BR>strcpy(filename,ffblk.ff_name);<BR>}<BR>}<BR>if (f2d)<BR>{<BR>Copyfile(sfile,dfile);<BR>return 1;<BR>}<BR>strcpy(s,sfile);<BR>l=strlen(sfile);<BR>for(j=l-1;j>=0;j--)<BR>if (s[j]=='\\')<BR>{<BR>s[j+1]=0;<BR>break;<BR>} <BR><BR>/*拯一个文?/<BR>int Copyfile(char *sf,char *df)<BR>{<BR>FILE *in,*out;<BR>char ch;<BR>in=0;<BR>out=0;<BR>if ((in=fopen(sf,"rb"))==NULL)<BR>exit(0);<BR>if ((out=fopen(df,"wb"))==NULL)<BR>exit(0);<BR>while(!feof(in))<BR>{<BR>ch=fgetc(in);<BR>if (ferror(in)) return 0;<BR>fputc(ch,out);<BR>if (ferror(out)) return 0;<BR>}<BR>fclose(in);<BR>fclose(out);<BR>return 1;<BR>}<BR><BR>/*建立目录*/<BR>int MakeNdir(char *Dir)<BR>{<BR>int i,l,j;<BR>char s[10][40];<BR>j=0;<BR>l=strlen(Dir);<BR>for(i=0;i<l;i++)<BR>if (Dir=='\\')<BR>{<BR>LEFT(s[j],Dir,i);<BR>j++;<BR>}<BR>strcpy(s[j],Dir);<BR>for(i=0;i<=j;i++)<BR>if (access(s,0)) mkdir(s);<BR>return 1;<BR>}<BR><BR>/*得到目录*/<BR>int GetDir(char *dirF,char dataK[][14])<BR>{<BR>struct ffblk ffblk;<BR>int done;<BR>int i;<BR>i=0;<BR>done=findfirst(dirF,&ffblk,FA_DIREC);<BR>while(!done)<BR>{<BR>if (ffblk.ff_attrib==16||ffblk.ff_attrib==17)<BR>{<BR>strcpy(dataK,ffblk.ff_name);<BR>strcat(dataK,"\\");<BR>i++;<BR>}<BR>done=findnext(&ffblk);<BR>}<BR>return i;<BR>}<BR><BR>/*得到文g?/<BR>int GetFile(char *dirF,char dataK[][14])<BR>{<BR>struct ffblk ffblk;<BR>int done;<BR>int i;<BR>i=0;<BR>done=findfirst(dirF,&ffblk,0);<BR>while(!done)<BR>{<BR>strcpy(dataK,ffblk.ff_name);<BR>done=findnext(&ffblk);<BR>i++;<BR>}<BR>return i;<BR>}<BR><BR>/*L两个正整数相?<80?*/<BR>/*参数说明:numA,numB分别为加数和被加?result存放相加后的l果*/<BR>void add(char *numA,char *numB,char *result)<BR>{<BR>int i,j,a,b,c,jw,Alen,Blen; /*定义变量*/<BR>char num[81];<BR>char numC[81]; /*定义新的字串,长度与numA相同*/<BR>char ch;<BR>char s[1];<BR>num[0]=0;<BR>numC[0]=0;<BR>if (strlen(numA)>=80) return;<BR>if (strlen(numB)>=80) return;<BR>for(i=0;i<strlen(numA);i++) /*判断输入数是否非?/<BR>if (!isdigit(numA)) return; /*如果非法q回l果为空*/<BR>for(i=0;i<strlen(numB);i++)<BR>if (!isdigit(numB)) return;<BR>if (strlen(numA)<strlen(numB)) /*较大的数放入numA?/<BR>{<BR>strcpy(num,numA);<BR>strcpy(numA,numB);<BR>strcpy(numB,num);<BR>num[0]=0;<BR>}<BR>Alen=strlen(numA);<BR>Blen=strlen(numB);<BR>strcpy(numC,numB);<BR>for(i=0;i<Alen;i++)<BR>numC[Alen-i-1]=numC[Blen-i-1];<BR>for(i=0;i<Alen-Blen;i++) /*在numC中插入n?,使其长度{于numA*/<BR>numC='0';<BR>jw=0; /*q位*/<BR>for(i=0;i<Alen;i++)<BR>{<BR>s[0]=numA[Alen-i-1];<BR>s[1]=0;<BR>a=atoi(s);<BR>s[0]=numC[Alen-i-1];<BR>s[1]=0;<BR>b=atoi(s);<BR>c=a+b+jw;<BR>if (c>=10)<BR>{<BR>jw=1;<BR>c=c-10;<BR>}<BR>else jw=0;<BR>itoa(c,s,10);<BR>num=s[0];<BR>}<BR>if (jw==1) {num='1';num[i+1]=0;}<BR>else num=0;<BR>j=strlen(num);<BR>for(i=0;i<j/2;i++)<BR>{<BR>ch=num;<BR>num=num[j-i-1]; /*num反{*/<BR>num[j-i-1]=ch;<BR>}<BR>strcpy(result,num);<BR>return; /*q回相加l果*/<BR>}<BR><BR>/*L两个正整数相?/<BR>/*参数说明:numA,numB 分别Z数和被乘?resultm存放U?/<BR>void mult(char *numA,char *numB,char *resultm)<BR>{<BR>int i,j,k,l,m,a,b,c,jw,Alen,Blen,f; /*定义变量*/<BR>char resulta[82];<BR>char num[161];<BR>char ch;<BR>char s[1];<BR>num[0]=0;<BR>f=0;<BR>if (strlen(numA)>=80) return;<BR>if (strlen(numB)>=80) return;<BR>for(i=0;i<strlen(numA);i++) /*判断输入数是否非?/<BR>if (!isdigit(numA)) return; /*如果非法q回l果为空*/<BR>for(i=0;i<strlen(numB);i++)<BR>if (!isdigit(numB)) return;<BR>if (strlen(numA)<strlen(numB)) /*较大的数放入numA?/<BR>{<BR>strcpy(num,numA);<BR>strcpy(numA,numB);<BR>strcpy(numB,num);<BR>num[0]=0;<BR>}<BR>Alen=strlen(numA);<BR>Blen=strlen(numB);<BR>strcpy(resultm,"0");<BR>for(i=0;i<Blen;i++)<BR>{<BR>s[0]=numB[Blen-i-1];<BR>s[1]=0;<BR>c=atoi(s);<BR>strcpy(resulta,numA);<BR>if (c==0) strcpy(resulta,"0");<BR>for(j=0;j<c-1;j++) {add(resulta,numA,resulta);}<BR>l=strlen(resulta);<BR>for(k=0;k<i;k++)<BR>{<BR>resulta[l+k]='0';<BR>resulta[l+k+1]=0;<BR>}<BR>add(resultm,resulta,resultm);<BR>}<BR>}</TD></TR></TBODY></TABLE><img src ="http://www.shnenglu.com/ivenher/aggbug/1499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ivenher/" target="_blank">爱饭?/a> 2005-12-02 16:08 <a href="http://www.shnenglu.com/ivenher/articles/1499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言常用文g处理函数 http://www.shnenglu.com/ivenher/articles/1493.html爱饭?/dc:creator>爱饭?/author>Fri, 02 Dec 2005 06:27:00 GMThttp://www.shnenglu.com/ivenher/articles/1493.htmlhttp://www.shnenglu.com/ivenher/comments/1493.htmlhttp://www.shnenglu.com/ivenher/articles/1493.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/1493.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/1493.html在实际的~程中,l常需要进行文件读写的操作。下面是W者在学习中记录的一些常有文件处理函数。一、文件的打开与关?BR>1、fopen
    调用方式Q?BR>    FILE *fp;
    fp=fopen(文g?使用文g方式);

    说明Q?BR>    Q?Q、用文件方式主要有:只读(r)、只?w)、追?a)Q还有配?+"使用的方式,如r+、w+、a+;
    Q?Q、默认打开的文件ؓ文本文gQ用't'表示Q可以省略。如果打开二进制的文gQ则使用'b'。例如:r、rt、rb{?BR>    Q?Q、如果不能实现打开的Q务,则函数返回NULL倹{?BR>2、fclose
    调用方式Q?BR>    FILE *fp;
    fclose(fp);

    说明Q?BR>    Q?Q、打开文g后,必须要养成关闭文件的好习惯?BR>    Q?Q、如果关闭文件出错,函数q回非零|否则q回0.可以用ferror函数查是否出错?BR>
二、文件的d
1、fputc
    调用方式Q?BR>    FILE *fp;
    char c;
    fputc(c,fp);

    说明Q?BR>    Q?Q、fputc向文件写入一个字W?nbsp;  
    Q?Q、输出成功则q回值就是输出的字符Q如果失败则q回一个EOF?BR>2、fgetc
    调用方式Q?BR>    FILE *fp;
    char c;
    c=fgetc(fp);
    
    说明Q?BR>    Q?Q、fgetc向文件读取一个字W?BR>    Q?Q、函数返回读取的字符Q如果遇到文件结,则返回EOF?BR>    Q?Q、徏议用feof函数来判断是否文件结束。如果文件结束,函数feofq回gؓ1Q否则ؓ0?BR>3、fread
    调用方式Q?BR>    fread(buffer,size,count,fp);
    
    说明Q?BR>    Q?Q、bufferQ是一个指针。对于fread来说明,它是d数据的存攑֜址。对fwrite来说Q是要输出数据的地址?BR>    Q?Q、sizeQ要d的字节数。可以用sizeof来获得字节长度?BR>    Q?Q、countQ要q行d多少个size字的数据V?BR>    Q?Q、fpQ文件指针?BR>    Q?Q、如果fread或fwrite调用成功Q则函数q回gؓcount的倹{?BR>4、fwrite
    见fread说明?BR>5、fprintf和fscanf
    调用方式Q?BR>    fprintf(文g指针Q格式字W串Q输出列表);
    fscanf(文g指针Q格式字W串Q输入列表);

    说明Q?BR>    Q?Q、在内存与磁盘频J交换数据的情况下,采用fread和fwrite实现?BR>三、文件的定位
1、rewind
    调用方式Q?BR>    FILE *fp;
    rewind(fp);   
    说明Q?BR>    Q?Q、rewind使文件的位置指针重新定位于文件开头?BR>
2、fseek   
    调用方式Q?BR>    fseek(文gcd指针Q位U量Qv始点Q?
    说明Q?BR>    Q?Q、v始点???代替Q分别表C文件开始、文件当前位|、文件末?BR>    Q?Q、位U量指v始点为基点,向前Ud的字节数。一般ؓlong型?BR>    Q?Q、fseek常用二进制文Ӟ可以实现随机d?BR>3、ftell
     调用方式Q?BR>    FILE *fp;
    long i;
    i=ftell(fp);
    说明Q?BR>    Q?Q、函数返回文件当前位|,如果调用出错则返回gؓ-1L?BR>四、出错的?BR>1、ferror
    调用方式Q?BR>    FILE *fp;
    ferror(fp);
    说明Q?BR>    Q?Q、返回gؓ0Q表C未出错Q返回gؓ1Q表C出错?BR>    Q?Q、同一个文件每一ơ调用输入输出函敎ͼ均生一个新 的ferror函数倹{?BR>    Q?Q、在执行fopen函数Ӟferror函数的初始D动置??BR>2、clearerr
    调用方式Q?BR>    FILE *fp;
    clearerr(fp);
    说明Q?BR>    Q?Q:使文仉误标志和文gl束标志?.


]]>
99þþƷѿ| þñþۺ| ˾þav| þþƷһ| ѾƷþ| vavavaþ| ۺϾþҹAV | 18պҹþó| 51þҹɫƷ| þþþþùƷ| þŮվ| þ99Ʒһ| þۺձ츾| ɫվþav| պ޹ۺϾþþ| þ޴ɫĻþþ| ޾þһ| þù| þþþùƷ| ݺݾƷþþĻ| þþƷ77777| þþŷղ| þþþۺϹŷһ| þ99׾Ʒ| 91ƷѾþþþþþþ| Ů޾Ʒþþۺ| þһ| ޹˾þһWWW| þùƷһ| һɫۺþ| þùֱ| ޹Ƶþ| ޾Ʒһþ | ˺ݺۺ88ۺϾþ| AVӰƬþþþþ| þþþþüƷþþ | þˬˬƬAV| ޾ƷŮþþþ99С˵| Ůþþþþ| Ʒ˾þþ| Ʒþ|