??xml version="1.0" encoding="utf-8" standalone="yes"?> [1] 1 复制 (tng) char* strcpy (char *s1, const char *s2); (tng) char* strncpy (char *s1, const char *s2, size_t len); (tng) void* memmove (void *s1, const void *s2, size_t len); (tng) size_t strxfrm (char *s1, const char *s1, size_t len); (tng) (tng) char* strcat (char *s1, const char *s2); (tng) char* strncat (char *s1, const char *s2, size_t len); (tng) (tng) int strcmp (const char *s1, const char *s2); (tng) int strncmp (const char *s1, const char *s2, size_t len); (tng) int strcoll (const char *s1, const char *s2); (tng) (tng) ?/span>s中查扄定字W?/span>(字节?/span>)chW一ơ出现的位置 (tng) char* strrchr (const char *s, int ch); (tng) char* strstr (const char *s1, const char *s2); (tng) size_t strspn (const char *s1, const char *s2); (tng) size_t strcspn (const char *s1, const char *s2); (tng) char* strpbrk (const char *s1, const char *s2); (tng) char* strtok (char *s1, const char *s2); (tng) (tng) size_t strlen (const char *s); (tng) void* memset (void *s, int val, size_t len); (tng) char* strerror (int errno); (tng)
(tng) (tng)
(tng) (tng) 在本文中我们不想涉及(qing)到很_深的技术,ME微懂一点电(sh)脑和Internet知识的h都可以理解本的内容。Micorosoftq(sh)ؓ(f)那些希望掌握
.NET
的公司执行官、IT领导和程序员?sh)?
(tng) (tng)提供?jin)更多的资源?
(tng) (tng)
(tng) (tng) 什么是Microsoft
.NET
?
(tng) (tng)
(tng) (tng) Microsoft
.NET
是Microsoft?/font>
XML
Web服务q_?/font>
.NET
包含?jin)徏立和q行Z
XML
?/font>
软g
所需要的全部部g?
(tng) (tng)
(tng) (tng) Microsoft
.NET
解决?jin)下面这些当?/font>
软g
开发中的一些核?j)问题?x)
(tng) (tng)
(tng) (tng) ●互操作?Interoperability)、集成?Integration)和应用程序的可扩展?extensibility)太难实现而且代h(hun)很高。Microsoft
.NET
依靠
XML
(一个由World Wide Web Consortium(W3C)理的开放标?消除?jin)数据共享?/font>
软g
集成的障?
(tng) (tng)
(tng) (tng) ●无数具有相当竞争力的私?/font>
软g
技术?/font>
软g
的集成变得非常复杂。而Microsoft
.NET
建立在一个开攄标准上,它包含了(jin)所?/font>
~程
语言?
(tng) (tng)
(tng) (tng) ●当l端用户使用
软g
Ӟ他们总觉得不够简ѝ有时甚x(chng)到很沮Q因Z们无法在E序之间方便地共享数据或是无法对能访问的数据q行操作?/font>
XML
使数据交换变得容易了(jin)Qƈ?/font>
.NET
软g
可以使得用户只要一得到数据p对它们进行操作?
(tng) (tng)
(tng) (tng) ●终端用户们在用Web的时候,无法对自q个h信息和数据进行控Ӟq导致了(jin)个h隐私和安全泄漏问题。而Microsoft
.NET
提供?jin)一套服务,使用户可以管理他们的个h信息Qƈ且控制对q些信息的访问?
(tng) (tng)
(tng) (tng) ?COM公司和W(xu)eb站点开发者们很难为用户们提供_的有价值的数据Q至有一部分原因是由于他们的应用E序和服务无法很好地和其他程序和服务合作Q只是一个不和外界连接的信息孤岛。而Microsoft
.NET
的设计宗旨就是ؓ(f)?jin)来自于多个站点和公司的数据或服务能够整合h?
(tng) (tng)
(tng) (tng) 如同MS-DOS和W(xu)indows一P
.NET
大大改变我们的计算领域。MS-DOS使得个h?sh)脑在商业和家庭中广为接受;Windows增强?jin)用L(fng)囑Ş界面Q其成为首选的?/font>
软g
交互方式Q最l得图形界面成Z人电(sh)脑的L。?/font>
.NET
则要?/font>
XML
Web服务变成日后的主计模式?
(tng) (tng)
(tng) (tng)
XML
Web服务是徏立在
XML
数据交换基础上的
软g
模型Q它帮助应用E序、服务和讑֤一起工作。用
XML
q行׃n的数据,彼此之间独立Q但同时又能够松耦合地连接到一个执行某特定d的合作组?
(tng) (tng)
(tng) (tng) 想了(jin)?/font>
XML
Web服务如何工作Q最方便的方法就是把它和D
游戏
作比较?/font>
XML
Web服务和拼?/font>
游戏
的拼块一h一些独立的单元。后者用一个标准的Ҏ(gu)怺咬合在一P
XML
Web服务与这cMQ但它是通过
XML
message实现怺交互的。当你把拼块拼在一hQ你得C(jin)一个对象:(x)一q房子、一艘船或一枉机。同P当你?/font>
XML
Web服务l合在一hQ你得C(jin)一个完成某特定d?/font>
软g
解决Ҏ(gu)。同一拼块可以用在很多不同对象中,而一?/font>
XML
Web服务同样也可以用在不同的Ҏ(gu)l中Q作Z同Q务解x(chng)案的一个组成部分?
(tng) (tng)
(tng) (tng)
XML
Web服务使开发者能够对他们所要的E序的来源进行选择Q可以自己创建或购买E序的功能块Q同样也可以选择是让自己的方案用其他的
XML
Web服务Q还是让其他的程序用自q服务。这意味着一个公怸必ؓ(f)?jin)给客户一个完整的解决Ҏ(gu)而不得不提供Ҏ(gu)的每一个组成部分?
(tng) (tng)
(tng) (tng)
XML
Web服务除了(jin)个服务相互之间独立以外,对访问它们的讑֤而言也是独立的。与独立应用E序不同的是Q?/font>
XML
Web服务q没有束~于某一特定?/font>
~程
语言或商业应用程序或者是某一在线服务。这l了(jin)l端用户_的自由,使其可以使用M讉K讑֤Q从台式?sh)脑到移动?sh)话都可以?
(tng) (tng)
(tng) (tng)
.NET
战略
(tng) (tng)
(tng) (tng) Microsoft
.NET
E序员(sh)设计~写的是
XML
Web服务Q而不是服务器或客L(fng)的独立应用程序。他们把q些服务l合成松耦合Q相互协作的
软g
,
XML
Web服务之间使用
XML
messagingq行通讯。ؓ(f)?jin)做到这一点,E序员需要:(x)
(tng) (tng)
(tng) (tng) 1.一?/font>
软g
q_Q用于徏立一U新的完整的个h用户l验?
(tng) (tng)
(tng) (tng) 2.一?/font>
~程
模型和工P用以建立和整?/font>
XML
Web服务?
(tng) (tng)
(tng) (tng) 3.一套能为应用程序和服务提供基础的可
~程
的服?
(tng) (tng)
(tng) (tng) Microsoft?/font>
.NET
战略q准了(jin)q三炏V?
(tng) (tng)
(tng) (tng)
.NET
包括Q?
(tng) (tng)
(tng) (tng) ?/font>
.NET
q_Q这是一?/font>
~程
工具和基本构Ӟ用来创徏、发布、管理和整合
XML
Web服务
(tng) (tng)
(tng) (tng) ?/font>
.NET
体验Q这是终端用L(fng)以和
.NET
交互的手D?br />
.NET
q_
(tng) (tng)
(tng) (tng) Microsoft的^台是q于创建和q行
XML
Web服务l成的。它包含?jin)下面四个组Ӟ?x)
(tng) (tng)
(tng) (tng)
.NET
框架和Visual Studio
.NET
:q些是开发h员用来生?/font>
XML
Web服务的工兗?/font>
.NET
框架是Microsoft
.NET
q_核心(j)中的一?/font>
~程
接口QVisual Studio
.NET
是一套多语言pd?
(tng) (tng)
~程
工具?
(tng) (tng)
(tng) (tng) 服务器基本结?Server Infrastructure):
.NET
的服务器基本l构是一pd用于生成、发布和操作
XML
Web服务的基E序Q包括Windows和各U?/font>
.NET
企业服务器。主要的技术包括对
XML
、scale-out?qing)跨E序和服务的商务程(business process orchestration)的支持。这些服务器包括有:(x)
(tng) (tng)
(tng) (tng) ●Application Center 2000Q用于scale-out solutions
(tng) (tng)
(tng) (tng) ●BizTalk Server 2000Q用于创建和理Z
XML
的跨E序和服务的商务程(business process orchestration across applications and services)
(tng) (tng)
(tng) (tng) ●Host Integration Server 2000Q用来访问主Z的数据和应用E序
(tng) (tng)
(tng) (tng) ●Mobile Information 2001 ServerQɿUd讑֤Q比如移动电(sh)话,也能使用q些应用E序
(tng) (tng)
(tng) (tng) ?/font>
SQL
Server
2000储存和检索结构化?a class="Channel_KeyLink" >XML数据
(tng) (tng)
(tng) (tng) Building Block Services: Building Block Services是一套以用户Z?j)?/font>XML Web服务Q它把用h据的控制权从应用E序Ud?jin)用h上,使Web有了(jin)一个翻天覆地的变化Q做C(jin)E序、服务和讑֤之间的简单性及(qing)一致性,q保证了(jin)所有的交易都必d到用L(fng)同意。这些服务包含了(jin)Passport(用于用户w䆾验证)、服务之间的消息传递、文件存储、用户个性设|的理、日历管理和其他一些功能。Microsoft在那些?/font>.NET基本l构赯关重要作用的领域内提供一些块构徏服务(building block services)。大量的合作伙伴和开发商对q些块构建服务作重要的扩展?
(tng) (tng)
(tng) (tng) 讑֤(smart device): .NET利用软g使智能设备,诸如手提?sh)脑、轻便电(sh)话?/font>游戏操纵台等都能够在.NET世界中得以用?
(tng) (tng)
(tng) (tng) 一个智能设备应该:(x)
(tng) (tng)
(tng) (tng) ●对用户要智能:(x)能根据用L(fng).NETw䆾、档?profile)和有x(chng)据简化用L(fng)工作Q另外要对用L(fng)存在_的智能,能根据你的在与不在对通知(notification)作出调整?
(tng) (tng)
(tng) (tng) ●对|络要智能:(x)负责带宽的限Ӟ支持应用E序的在U和U下两种使用模式Q知道有哪些有效的服务?
(tng) (tng)
(tng) (tng) ●对信息要智能:(x)能在M地方、Q何时间访问、分析和操作数据?
(tng) (tng)
(tng) (tng) ●对其他的设备要Q能发现和报告其他智能设备、服务和Internet的存在;知道如何为其他设备提供服务;能够灉|方便CPC上访问信息?
(tng) (tng)
(tng) (tng) ●对软g和服务要Q能Ҏ(gu)表单的情况,最恰当地表现应用和数据Qؓ(f)l端用户提供合适的输入Ҏ(gu)和连接;?/font>XML、SOAP和UDDI来用Web服务Q对开发者来_(d)要具有可~程性和扩展?
(tng) (tng)
(tng) (tng) Microsoft的一?/font>软g使能够在讑֤上运行的Q它们包括Windows XP、Windows Me、Windows CE、嵌入式Windows?/font>.NET框架以及(qing).NET Compact框架?
(tng) (tng)
(tng) (tng) .NET体验(.NET experiences)
(tng) (tng)
(tng) (tng) l端用户是通过.NET体验讉KXML Web服务的,q和现有的独立应用程序有点类|但在下列q些重要的方面是不同的:(x)
(tng) (tng)
(tng) (tng) ?/font>.NET体验可用于多种讑֤我们无需为可能用的每一个设备编写一个不?/font>XML Web服务和不同的.NET体验Q?/font>.NET体验能够d用户选取讑֤的特征,l出一个恰当界面?
(tng) (tng)
(tng) (tng) ?/font>.NET体验使用XML Web服务?/font>.NET体验q入|络后就能有效地利用XML Web服务为用户带来额外的价|以更好地解决问题?
(tng) (tng)
(tng) (tng) ?/font>.NET体验是以用户Z?j)?/font>.NET体验的焦点在l端用户Q用基于n份验证的块构建服务来为用户验证、参数设定、通知机制和用h据提供服务。因为用h据是由块构徏服务理的,而不是应用程序本w,所以用户就能控制他们自q数据Q能保障它的正确性,q且可以在不同的E序和服务之间协调数据?
(tng) (tng)
(tng) (tng) Microsoft正在使最受欢q的四个产品q渡?/font>.NET体验。Microsoft Office XP为用h?/font>.NET体验斚w跨出?jin)第一步。另外,MSNQ包括MSN Explorer本地客户端的使用Q正在创Z个基于消费者的.NET体验。Microsoft bCentral的小型商务入?business portal)正努力ؓ(f)型事务(比如商品目录理)提供必要?/font>XML Web服务Q同时也使用一些重要的XML Web服务(比如eBay)。Visual Studio开发系l将为开发者们提供.NET体验Q可以在q些开发工具中直接得到MSDN信息?
(tng) (tng)
(tng) (tng) .NET的好?
(tng) (tng)
(tng) (tng) Microsoft .NET为程序员、商业领对{IT部门以及(qing)消费者带来了(jin)很多好处?
(tng) (tng)
(tng) (tng) ●相Ҏ(gu)_(d)E序员是比较~Z的,雇用的费用也很高。然而Microsoft .NET?/font>~程工作变得更加Ҏ(gu)Q开发投资的回报率也最大化。开发者们可以创徏能重用的XML Web服务Q而不再是一个单一的程序;q些Web服务易于~程和调试,彼此之间怺独立Q通过XML message通讯?qing)合作。所以对某一个服务的修改不会(x)影响到其他的服务?
(tng) (tng)
(tng) (tng) ׃XML Web服务可以被很?/font>.NET体验共同使用Q所以对一个服务模块的有效更新Q也x(chng)C(jin)所有用这个模块的.NET体验。Q?/font>~程语言都可以用来编?/font>XML Web服务(如:(x)C?/font>C++、Visual Basic、COBOL、Perl、Python和Java{?Q所以你的程序员可以选择他们最熟?zhn)的语a?/font>~程Q这大大提高?sh)(jin)开发效率。更值得一体的是,他们q没有因使用?jin)不同的语言而失去跨服务或跨lg的调试能力?
(tng) (tng)
(tng) (tng) ●Microsoft .NET减少?jin)程序员要写的代码量。一?/font>XML Web服务能适用于所以的讑֤Q不必再Mؓ(f)每一个设备编写一个不同的版本。另外,显C特性与.NET体验分开以便以后加入新的接口技术,比如语音或手写识别,而不必去重写E序?
(tng) (tng)
(tng) (tng) ●Microsoft .NET开创了(jin)全新的商业模型,它得一个公司可以用多种Ҏ(gu)来把自己的技术商品化。据个例子来_(d)一个通讯公司可以使用XML Web服务的方式提供语音信件和呼叫者ID的访问,让用户从一个即时消息程序、电(sh)子邮件或用户所选的其他信息~译器中讉KCqC息。技术提供商可以把他们现有的软g包{变(sh)ؓ(f)XML Web服务Qƈ把这些服务出售给需要这些功能第三方Q或是给.NET体验提供商,用以构徏新的软g包?br />
●Microsoft .NET允许IT部门使用其他提供商的XML Web服务Q减内部研发的开销Qƈ能提高工作效率?
(tng) (tng)
(tng) (tng) ●Microsoft .NET?用户界面友好"作了(jin)重新定义。终端用戯够徜徉于一个智能化的、个性化的InternetQ它能记住用L(fng)个h讄Qƈ在适当的时候,向用户用的讑֤上发送适当的数据?br />.NET如何改变计算
(tng) (tng)
(tng) (tng) Microsoft .NET从Ҏ(gu)上改变我们的思考和使用?sh)脑的方式。目?服务??桌面?sh)?q两U概念占据了(jin)计算领域的统d位。然而Microsoft .NET是一U分布式计算范例Q它没有?jin)传l上的服务器和桌面电(sh)脑的区别Q取而代之的是,计算的处理被攑֜最合适的地方q行Q可能是服务
(tng) (tng)器,或是PCQ也有可能是手提?sh)脑以?qing)其他讑֤。这是计算?
(tng) (tng)
(tng) (tng) .NET的计模型对商务和终端用户都产生?jin)重要?jing)响,但方法不同。对l端用户来说Q这个新计算模式更具个性化、综合程度更高,?x)给他们带来一U史无前例的C验。对商务来说Q这个模式改变(sh)(jin)刉和销?/font>软g的方法,使IT成ؓ(f)一个公司成功的重要贡献者,q徏立v新的商务模型?
(tng) (tng)
(tng) (tng) 对终端用L(fng)改变
(tng) (tng)
(tng) (tng) q里有一个例子,说明?/font>.NET体验是如何对一个终端用户生媄(jing)响的?
(tng) (tng)
(tng) (tng) BobQ一个不安的商务旅行者,在芝加哥下了(jin)飞机Q突然想起他竟忘?sh)(jin)带上他的那部智能?sh)话。这下完?jin),没?jin)q电(sh)话他无法知道晚宴在哪里进行,无法知道原本打算在晚宴上见面的h的电(sh)话号码,更惨的是Q他无法在这个关键的?x)议之前再看一下重要的文g。但不用急,他从机场的租?jin)一部智能电(sh)话,插入?jin)自q卡。很快通过内置的Internetq接Q各U相关的重要数据全部被下载了(jin)下来Q现在他能访问他的所有信息,不光是日E安排和?sh)话,q有所有通常用他的PC讉K到的所以文件?
(tng) (tng)
(tng) (tng) 不幸的是Q他在离开机场时不心(j)在自动扶梯上l了(jin)一跤,脚踝严重扭伤Q这个月q已l是W二ơ了(jin)。无奈,他强忍疼痛要求电(sh)话接Rogerȝ的办公室Q听?sh)话的是接待员Mildred姐。Bob通过?sh)话认了(jin)自qw䆾Q他授权于Mildred姐Q让她访问自q所在位|和其他一些信息,以便使她可以在附q找一家整形外U诊所。Mildred能够知道哪家诊所正在营业Q有多远Q是否接受Bob的保险。Bob所要做的就是轻按电(sh)话上的按钮授权给她,Mildred在找到诊所后便?x)和ȝU时间?
(tng) (tng)
(tng) (tng) 与Mildred通话l束后,Bob用他的智能电(sh)话访问出UR服务Q查扄他最q的出租车,q确认目的地。接下来Bob只需爬进车内Q轻按电(sh)话的昄屏确认支付的费用卛_?
(tng) (tng)
(tng) (tng) 从用戯度来Ԍ.NET提供的好处即过?jin)现在的独立的程序,也胜q了(jin)Ua(b)的Web站点?/font>XML Web服务拥有传统?/font>软g功能Q如创徏文档、计数字、存储数据等。而且在下U后也能提供服务Q比如呼叫出URQ这q不需要CPU的参与?
(tng) (tng)
(tng) (tng) 从上面的例子我们可以看到Q?/font>XML Web服务使终端用户得C(jin)更ؓ(f)个性化的、综合性的体验Q同时便捷也?/font>.NETl我们带来的一大好处?
(tng) (tng)
(tng) (tng) 对企业的改变
(tng) (tng)
(tng) (tng) Bob那不走运的商务旅行结束了(jin)Q他y跚地回C(jin)?虽然那个晚宴非常成功Q但现在他不得不面对六个星期的n体治?。接下来QBob要提交费用报告。他拿出?jin)他的PDAQ验明n份后QPDA列出?jin)其信用卡上的支付纪录。他标出?jin)与q次芝加哥之行有关的费用Q至于那些止痛药和寄Uh信g的费用,他标Z人开销。信用卡公司ؓ(f)其生成必要的账单?
(tng) (tng)
(tng) (tng) 因ؓ(f)Bob标记?jin)一些个用,所以信用卡公司根据他指定的方法ؓ(f)Bob生成一张个人帐单。在q个例子中,Bob使用的是直接从他银行账号中提qҎ(gu)Q但同时他也要一份药费开支报告的拷贝。根据他的选择Q信用卡公司?x)Email发给他一个PDF文档QBob只需它打印出来卛_?
(tng) (tng)
(tng) (tng) 对于那些业务上的开支,信用卡公怼(x)lBob的公司发Z张电(sh)子帐单,它被送到公司的会(x)计部门,由公怼(x)计Chris来处理。电(sh)子帐单到达时QChris?x)收C自动生成的EmailQ随后他d?x)计pȝ打开q䆾帐单。他仔细(g)查每一W费用,没问题后Q他q行支付Q这也就是授权将一W金从公司的账户转移C用卡公司的̎户上?
(tng) (tng)
(tng) (tng) 从企业角度讲Q?/font>.NET能够自动地处理很多Q务,节约?jin)员工的大量旉。当?/font>XML系l和XML Web服务q接h后,数据交换变得非常方便Q数据处理也变得轻而易举。在q个例子中,员工Bob和Chris分别只要单击一?同意"和启动一个事务处理,无需花大量的旉d写报销单或是往?x)计pȝ中手工录入数据,一切都变得非常之简单?
(tng) (tng)
(tng) (tng) 对企业和企业l端用户来说Q?/font>.NET预示q些?/font>XML Web服务衍生出来的应用程序有着很强的个性化和高度的整合性的特点Q同时它们适用于各U智能设备,h相当的灵zL?
(tng) (tng)
(tng) (tng) 什么东西没有变
(tng) (tng)
(tng) (tng) 管Microsoft .NETl计带来了(jin)一些翻天覆地的变化Q但q有很多东西依然没有改变.
(tng) (tng)
(tng) (tng) ●终端用户将依然使用熟?zhn)的界面,?/font>.NET体验中的Microsoft Office一栗这可以减少再培训的开支,也意味着用户可以马上开始?/font>.NET软g?
(tng) (tng)
(tng) (tng) ?/font>g上运行的q是象Windows、Unix、Windows CE和Palm OS一L(fng)操作pȝ。实际上Q?/font>.NET增加?/font>软g的运行场所Q但同时减少?jin)开发的负担。由?/font>XML Web服务只?/font>XML与设备通信Q所以Q何智能设备都可以享用XML Web服务?
(tng) (tng)
(tng) (tng) ●对E序员来_(d)他们依然可以使用他们原先熟?zhn)?/font>~程语言?/font>.NETq_借助?/font>.NET框架的公paq行旉?CLR)使得用不同语a开发的XML Web服务之间也可以相互操作。有没有.NET体验问题?sh)大Q你依旧可以用Visual Basic、Java、甚x(chng)COBOL创徏XML Web服务。这U对~程语言的中立性意味着不用Z(jin)q入.NET世界而抛弃已有的投资?
(tng) (tng)
(tng) (tng) ●原先系l无需被替换。一部分的Microsoft .NET产品是Z(jin)能方便地现有的pȝ整合到新Q的XML Web服务?/font>.NET体验中去而设计的。Host Integration Server是个例子,它简化了(jin)对主机的讉K。再比如是BizTalk Server,它管理的商务程(business process orchestration)包括?jin)对现有pȝ和数据格式的支持Qƈ?x)执行一些必要的转换Q将数据转成XML?
(tng) (tng)
(tng) (tng) 所以这U下一代的分布式计是建立在目前这一代基上的。Microsoft .NET不是我们所惌的那P对现在的应用软g作大规模的替换,而是一个自然的q化q程Q在原先的技术孤岛之间徏立了(jin)协作关系Q协同工作能力逐渐加强Q我们也从中受益无I?
(tng) (tng)
(tng) (tng) ȝ
(tng) (tng)
(tng) (tng) Microsoft .NET是Microsoft?/font>XML Web服务的^台。这是下一代的Internet计算模型Q各?/font>XML Web服务之间彼此是松耦合的,通过XMLq行通讯Q协同完成某一特定的Q务。Microsoft .NET战略提供?jin)一个用以徏立新.NET体验?/font>软gq_、一?/font>~程模型、用以徏立和整合XML Web服务的工具以?qing)一套可~程的Web接口?
(tng) (tng)
(tng) (tng) 现在我们正处于向.NET转变的过E中。Microsoft已经宣布?/font>.NET框架的第一个部?-.NETq_、Visual Studio.NET和一些块构徏服务以及(qing)最初的.NET体验。Microsoft在今q和明年中将?x)提供更多的工具和服务?/font>
]]>
用法Q?include <string.h>
功能Q由src所指内存区域复制count个字节到dest所指内存区域?br />
说明Qsrc和dest所指内存区域不能重叠,函数q回指向dest的指针?br />
举例Q?br />
// memcpy.c
#include <syslib.h>
#include <string.h>
main()
{
char *s="Golden Global View";
char d[20];
clrscr();
memcpy(d,s,strlen(s));
d[strlen(s)]=0;
printf("%s",d);
getchar();
return 0;
}
原型Qextern char *strchr(char *s,char c);
用法Q?include <string.h>
功能Q查扑֭W串s中首ơ出现字Wc的位|?br />
说明Q返回首ơ出现c的位|的指针Q如果s中不存在c则返回NULL?br />
举例Q?br />
// strchr.c
#include <syslib.h>
#include <string.h>
main()
{
char *s="Golden Global View";
char *p;
clrscr();
strchr(s,'V');
if(p)
printf("%s",p);
else
printf("Not Found!");
getchar();
return 0;
}
字W串s2复制?/span>s1指定的地址
void* (tng)memcpy (void *s1, const void *s2, size_t len);
?/span>s2的前len个字W?/span>(字节)复制?/span>s1中指定的地址, 不加'\0'
当源单元和目的单元缓冲区交P时?/span>
Ҏ(gu)E序当前的区域选项, ?/span>s2的前len个字W?/span>(字节)复制?/span>s1中指定的地址, 不加'\0'
2 q接
字W串s2q接?/span>s1N
字W串s2的前len个字W连接到s1N, 不加'\0'
3 比较
比较字符?/span>s1?/span>s2
int (tng)memcmp (const void *s1, const void *s2, size_t len);
?/span>s1?/span>s2的前len个字W?/span>(字节)作比?/span>
Ҏ(gu)E序当前的区域选项中的LC_COLLATE, 比较字符?/span>s1?/span>s2
4 查找
void* memchr (const void *s, int ch, size_t len);
在串s中查扄定字W?/span>ch最后一ơ出现的位置, r表示从串ּ?/span>
在串s1中查找指定字W串s2W一ơ出现的位置
q回s1中第一个在s2中不存在的字W的索引(find_first_not_of)
q回s1中第一个也?/span>s2中存在的字符的烦(ch)?/span>(find_first_of)
?/span>strcspncM, 区别是返回指针而不是烦(ch)?/span>
从串s1中分d׃s2中指定的分界W分隔开的记?/span>(token)
W一ơ调用时s1为需分割的字?/span>, 此后每次调用都将s1|ؓ(f)NULL,
每次调用strtokq回一个记?/span>, 直到q回NULL为止
5 其他
求字W串s的长?/span>
从s开始的len个字节置?/span>val
q回指向错误信息字符串的指针
]]>
Qi nclude <stdlib.h>
Qi nclude <string.h>
Qi nclude <time.h>
//获得prefix数组
int* GetPrefixValue(char* strPattern, int iPatternLen)
{
(tng) (tng) (tng) int i, j; /* i runs through the string, j counts the hits*/
(tng) (tng) (tng) int* prefix = (int*)malloc(iPatternLen*sizeof(int));
(tng) (tng) (tng)
(tng) (tng) (tng) i = 1; j = 0;
(tng) (tng) (tng) prefix[0] = 0;
(tng) (tng) (tng)
(tng) (tng) (tng) while(i<iPatternLen)
(tng) (tng) (tng) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) if(strPattern[i] == strPattern[j])
(tng) (tng) (tng) (tng) (tng) (tng) (tng) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) prefix[i] = ++j;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) else
(tng) (tng) (tng) (tng) (tng) (tng) (tng) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) j = 0;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) prefix[i] = j;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) i++;
(tng) (tng) (tng) }
(tng) (tng) (tng)
(tng) (tng) (tng) return prefix; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
} (tng) (tng) (tng)
//q回target串在pattern串中W一ơ匹配的index
int KMPStringMatch(char* strPattern, int iPatternLen, char* strTarget, int iTargetLen, int* prefix)
{
(tng) (tng) (tng) int i = 0;
(tng) (tng) (tng) int j = 0;
(tng) (tng) (tng)
(tng) (tng) (tng) while(i<iPatternLen && j<iTargetLen)
(tng) (tng) (tng) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) if(j==0 || strPattern[i]==strTarget[j])
(tng) (tng) (tng) (tng) (tng) (tng) (tng) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) i++; (tng) j++;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) else
(tng) (tng) (tng) (tng) (tng) (tng) (tng) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) j = prefix[j];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) } (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng)
(tng) (tng) (tng) free(prefix);
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) if(j==iTargetLen)
(tng) (tng) (tng) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return i-j;
(tng) (tng) (tng) }
(tng) (tng) (tng) else
(tng) (tng) (tng) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return -1;
(tng) (tng) (tng) } (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
} (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
int KMP(char* strPattern, char* strTarget)
{
(tng) (tng) (tng) int* prefix = GetPrefixValue(strPattern, strlen(strPattern));
(tng) (tng) (tng) int index = KMPStringMatch(strPattern, strlen(strPattern), strTarget, strlen(strTarget), prefix);
(tng) (tng) (tng) return index;
}
//在文本文件中查找target串出现的行数
int SearchInTxtFile(char* fileName, char* strTarget)
{
(tng) (tng) (tng) FILE* hFile = fopen(fileName, "r");
(tng) (tng) (tng)
(tng) (tng) (tng) char str[1024];
(tng) (tng) (tng) int count = 0;
(tng) (tng) (tng)
(tng) (tng) (tng)
(tng) (tng) (tng) while(fgets(str, 1024, hFile)) (tng)
(tng) (tng) (tng) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) if(KMP(str, strTarget)!=-1)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) count++;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) } (tng) (tng) (tng)
(tng) (tng) (tng) } (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng)
(tng) (tng) (tng) fclose(hFile);
(tng) (tng) (tng) hFile=NULL;
(tng) (tng) (tng)
(tng) (tng) (tng) return count;
} (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
int main()
{
(tng) (tng) (tng) char ch;
(tng) (tng) (tng) char str1[] = "abcabcabctasksb,abTo";
(tng) (tng) (tng) char str2[] = "abc";
(tng) (tng) (tng)
(tng) (tng) (tng) double t=clock();
(tng) (tng) (tng) printf("%d\n", KMP(str1,str2));
(tng) (tng) (tng) printf("耗时Q?f毫秒Q\n", (clock()-t));
(tng) (tng) (tng)
(tng) (tng) (tng) t=clock();
(tng) (tng) (tng) printf("find %d \n", SearchInTxtFile("c:\\txt.txt", "NULL"));
(tng) (tng) (tng) printf("耗时Q?f毫秒Q\n", (clock()-t));
(tng) (tng) (tng) scanf("%c", &ch);
(tng) (tng) (tng) return 0;
} (tng)
#include <iostream>
using namespace std;
template<class T>
class Chain;
template<class T>
class ChainNode
{
(tng)friend class Chain<T>;
(tng)friend ostream& operator<<(ostream& out, const Chain<T>& x);
private:
(tng)T data;
(tng)ChainNode<T> *link;
};
template<class T>
class Chain{
public:
(tng)Chain(int p) {first = 0;};
(tng)~Chain();
(tng)bool IsEmpty() const {return first == 0;}
(tng)int Length() const;
(tng)bool Find(int k, T& x) const;
(tng)int Search(const T& x) const;
(tng)//Chain<T>& Delete(int k, T& x);
(tng)Chain<T>& Insert(int k, const T& x);
(tng)void Output(ostream& out = cout) const;
private:
(tng)ChainNode<T> *first; // 指向W一个节点的指针
};
template<class T>
ostream& operator<<(ostream& out, const Chain<T>& x);
#endif (tng) // _CHAIN
(tng) (tng)在Chain.cpp中对Chain.h中声明的函数q行?jin)定义,具体内容如下Q?br />
#include "Chain.h"
#include <iostream>
using namespace std;
template<class T>
Chain<T>::~Chain()
{
(tng)//链表的析构函?用于删除链表中的所有节?br /> (tng)ChainNode<T> *ptr = first;
(tng)while (ptr)
(tng){
(tng) (tng)first = ptr->link;
(tng) (tng)delete ptr;
(tng) (tng)ptr = first;
(tng)}
}
template<class T>
int Chain<T>::Length() const
{
(tng)//q回链表中的元素L
(tng)int count = 0;
(tng)ChainNode<T> *ptr = first;
(tng)while (ptr)
(tng){
(tng) (tng)++count;
(tng) (tng)ptr = ptr->link;
(tng)}
(tng)return count;
}
template<class T>
bool Chain<T>::Find(int k, T& x) const
{
(tng)//L链表中的Wk个元素,q将其传送至x
(tng)//如果不存在第k个元素,则返回falseQ否则返回true
(tng)if (k < 1)
(tng){
(tng) (tng)return false;
(tng)}
(tng)int count = k;
(tng)ChainNode<T> *ptr = first;
(tng)while (count && ptr)
(tng){
(tng) (tng)--count;
(tng) (tng)ptr = ptr->link
(tng)}
(tng)if (!ptr)
(tng){
(tng) (tng)return false;
(tng)}
(tng)x = ptr->data;
(tng)return true;
}
template<class T>
int Chain<T>::Search(const T& x) const
{
(tng)//LxQ如果发现xQ则q回x的地址
(tng)//如果x不在链表中,则返?
(tng)int count = 1;
(tng)ChainNode<T> *ptr = first;
(tng)while(ptr && (ptr->data!=x))
(tng){
(tng) (tng)++count;
(tng) (tng)ptr = ptr->link;
(tng)}
(tng)if (ptr)
(tng){
(tng) (tng)return count;
(tng)}
(tng)else
(tng){
(tng) (tng)return 0;
(tng)}
}
template<class T>
void Chain<T>::Output(ostream& out = cout) const
{
(tng)ChainNode<T> *ptr = first;
(tng)while (ptr)
(tng){
(tng) (tng)out<<ptr->data<<" (tng) ";
(tng) (tng)ptr = ptr->link;
(tng)}
}
//重蝲<<q算W?br />template<class T>
ostream& operator<<(ostream& out, const Chain<T>& x)
{
(tng)x.Output(out);
(tng)return out;
}
template<class T>
Chain<T>& Chain<T>::Insert(int k, const T& x)
{
(tng)ChainNode<T> *ptr = first;
(tng)int count = 0;
(tng)while (ptr && count < k)
(tng){
(tng) (tng)++count;
(tng) (tng)ptr = ptr->link;
(tng)}
(tng)if (!ptr) (tng) //如果没到Wk个节?br /> (tng){
(tng)
(tng)}
(tng)else
(tng){
(tng) (tng)//要插入的新节?br /> (tng) (tng)ChainNode<T>* cn = new ChainNode<T>;
(tng) (tng)cn->data = x;
(tng) (tng)cn->link = 0;
(tng) (tng)if (ptr->link==0) (tng) //到达?jin)链表的l尾
(tng) (tng){
(tng) (tng) (tng)ptr->link = cn;
(tng) (tng)}
(tng) (tng)else (tng) //没到辄?br /> (tng) (tng){ (tng)
(tng) (tng) (tng)cn->link = ptr->link;
(tng) (tng) (tng)ptr->link = cn;
(tng) (tng)}
(tng)}
(tng)return *this
}
(tng)在main.cpp中进行测试,试的内容很,但是刚开始就q行不了(jin)?jin)。main.cpp内容如下Q?br />
#include "Chain.h"
using namespace std;
int main()
{
(tng)Chain<int> c;
(tng)cout<<c.Length();
(tng)return 0;
}
~译的时候没有问题,但是在连接的时候就出现?jin)问题,报错如下Q?br />--------------------Configuration: Chain - Win32 Debug--------------------
Linking...
main.obj : error LNK2001: unresolved external symbol "public: __thiscall Chain<int>::~Chain<int>(void)" (??1?$Chain@H@@QAE@XZ)
main.obj : error LNK2001: unresolved external symbol "public: int __thiscall Chain<int>::Length(void)const " (?Length@?$Chain@H@@QBEHXZ)
Debug/Chain.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
Chain.exe - 3 error(s), 0 warning(s)
但是从报错信息来看,应该是在main.cpp中没有找到所用到的函?~Chain<int>(void)和Length()的定义,在main.cpp中一qC(jin)三个函数Q构造函数Chain()Q但是构造函数是在Chain.h中定义的Q所以编译器扑ֈ?jin)其定义Q但是另外两个函数是在Chain.cpp中定义的Q而且目前报错没有扑ֈQ但是如果在main.cpp中引?include "Chain.cpp"Ӟ~译和连接就没有问题Q这p实了(jin)原来的估计是没有错的。我实在是不知道问题出现在哪里,所以希望哪位高手看出问题来的话Q请告诉我,多谢?jin)?/font>
#ifndef _CHAIN
#define _CHAIN
template<class T>
class (tng)ChainNode
{
(tng)friend class Chain<T>;
private:
(tng)T data;
(tng)ChainNode<T> *link;
};
template<class T>
class Chain{
public:
(tng)Chain()
(tng){
(tng) (tng)first = 0;
(tng)};
(tng)~Chain();
(tng)bool IsEmpty() const {return first == 0;}
(tng)int Length() const;
(tng)bool Find(int k, T& x) const;
(tng)int Search(const T& x) const;
(tng)//Chain<T>& Delete(int k, T& x);
(tng)Chain<T>& Insert(int k, const T& x);
(tng)void Output(ostream& out = cout) const;
private:
(tng)ChainNode<T> *first; // 指向W一个节点的指针
};
#endif (tng) // _CHAIN
l果报错Q?br />--------------------Configuration: Chain - Win32 Debug--------------------
Compiling...
Chain.cpp
g:\work plan\c++ code practice\chain\chain.h(17) : error C2059: syntax error : '<'
(tng) (tng) (tng) (tng) (tng) (tng) (tng) g:\work plan\c++ code practice\chain\chain.h(21) : see reference to class template instantiation 'ChainNode<T>' being compiled
g:\work plan\c++ code practice\chain\chain.h(17) : error C2238: unexpected token(s) preceding ';'
(tng) (tng) (tng) (tng) (tng) (tng) (tng) g:\work plan\c++ code practice\chain\chain.h(21) : see reference to class template instantiation 'ChainNode<T>' being compiled
g:\work plan\c++ code practice\chain\chain.h(40) : error C2989: 'Chain' : template class has already been defined as a non-template class
(tng) (tng) (tng) (tng) (tng) (tng) (tng) g:\work plan\c++ code practice\chain\chain.h(17) : see declaration of 'Chain'
g:\work plan\c++ code practice\chain\chain.cpp(6) : error C2059: syntax error : '<'
g:\work plan\c++ code practice\chain\chain.cpp(6) : error C2588: '::~Chain' : illegal global destructor
g:\work plan\c++ code practice\chain\chain.cpp(6) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Error executing cl.exe.
Chain.obj - 6 error(s), 0 warning(s)
感觉从代码来看应该是没有问题的,如果哪个高手看出问题来了(jin)请一定告诉我啊,如果知道~译不通过的原因也请一定要告诉我啊。没办法Q最后采用解决的办法是修改ChainNode的定义了(jin)Q定义ؓ(f)l构?)
template<class T>
struct ChainNode
{
(tng) T data;
(tng) ChainNode<T> *link;
};
反正l构体中的数据成员都是public的,至于讉K限制的实现就依靠q代器来实现?jin),g++的STL中的?wi)结点不也是l构体吗Q?)