c++中实现*字符前移

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中实现*字符前移相关的知识,希望对你有一定的参考价值。

假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导的*号之外,将串中其它*号全部删除。在编写函数时,不得使用C语言提供的字符串函数。函数fun中给出的语句仅供参考。
例如,字符串中的内容为:****A*BC*DEF*G*******,删除后, 字符串中的内容应当是:****ABCDEFG。
注意: 部分源程序在文件PROG01.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include <stdio.h>
void fun( char *a )

/* 以下代码仅供参考 */
int i=0,k;
while(a[i]=='*') i++;
k=i;
while(a[i]!='\0') /* 以下程序段实现非*字符前移 */



a[k]='\0';


main()
char s[81];void NONO ();
printf("Enter a string:\n");gets(s);
fun( s );
printf("The string after deleted:\n");puts(s);

参考技术A void fun( char *a )

/* 以下代码仅供参考 */
int i=0,k;
while(a[i]=='*') i++;
k=i;
while(a[i]!='\0') /* 以下程序段实现非*字符前移 */

if(a[i]=='*') i++;
else a[k++]=a[i++];


a[k]='\0';
本回答被提问者采纳

在 C++ 中实现 C++ 线程库

【中文标题】在 C++ 中实现 C++ 线程库【英文标题】:Implementing a C++ threading Library in c++ 【发布时间】:2009-02-11 06:29:26 【问题描述】:

我是一名 java 程序员,但目前正在使用 c++ 语言。与 java 不同,c++ 没有定义任何线程实用程序。在 C++ 中实现多线程应用程序对我来说有点困难。有没有人可以使用 C++ 实现他自己的线程库?你必须能够掌握一些汇编语言的概念吗?我在很多场合都试图从操作系统的特定功能创建一个线程,但我总是失败。 有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

鉴于您的专业水平,也许 Boost Threads 会有所帮助?

http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html

在回答您的其他问题时,您当然可以实现自己的线程库。不,您不需要了解任何汇编语言,但是没有 C 标准库函数可以帮助您,您需要使用操作系统特定的库。例如,在 Windows 上,您使用 beginthreadex CRT 函数,该函数最终调用 CreateThread Win32 系统调用,但在许多 unix 上,您将使用 pthread_create。

除了启动线程之外,您可能还需要一些同步原语,以及前面的 Boost 库 delivers。如果你想自己动手,在 Windows 上查看 CreateMutex、WaitForSingleObject 和 ReleaseMutex 或 CriticalSection 函数,在 unix 上查看 pthread_mutex_init。

【讨论】:

【参考方案2】:

我建议您使用现有的多平台库作为 Boost、ACE、POCO、QT...

ACE 有相当多的线程类,最简单的可能是 ACE_Task_Base。您从它继承并提供 int svc() 方法的实现。这是当您激活线程时调用的方法。

class WorkerThread : public ACE_Task_Base

public:
   int svc()  ... 
;
int main()

   WorkerThread worker;
   worker.activate();
   worker.wait();

使用 POCO,您必须使用 Runnable 接口,其用法与使用 Java 线程所获得的接近(如果您实现 Runnable,而不是扩展 Thread):

class Worker : public Poco::Runnable  ... ;
int main() 
 
   Worker worker;
   Poco::Thread thr;
   thr.start( worker );
   thr.join();

Boost 线程(推荐)略有不同。它依赖于定义的 operator() 而不是实现/扩展接口。您创建一个线程,向它传递一个实现 operator()() 的对象。线程通过调用该方法开始。好的部分是与 boost::bind 结合创建一个假函子(对象实现 operator())非常简单:

class X  public: void method( int argument ); 
int main()

   X x;
   boost::thread thr( boost::bind( &X::method, &x, 100 ) );
   thr.join();

sn-p 将创建一个 X 类型的对象。通过 bind,您可以创建一个函子,该函子包装对应用于对象 x 的方法 X::method 的调用,并将其作为方法参数传递 100。

虽然这与 Java 的角度最不同,但它也是最灵活的方法,因为您可以将线程模型与实际工作代码分离。无需适合特定的界面。这也是即将推出的标准线程接口。

【讨论】:

【参考方案3】:

除了其他人提到的库之外,还有英特尔的Threading Building Blocks。它是来自英特尔的开源(GPL2 链接异常)跨平台库。

【讨论】:

很高兴至少有一个简短的文档,因为许多想法都是有用的。【参考方案4】:

如果您使用 POSIX 系统,例如 Linux 或 Unix or even windows,您可以使用 pthread

如果您被困在没有 .NET 的 Windows 机器上,我认为您别无选择,只能学习 win32 线程。当然管子上有很多“win32线程库”。

Boost

CodeProject

SourceForge

我怀疑大多数大型代码存储库都有某种自定义实现...

win windows 最简单的选择可能是使用更容易处理的 .NET 线程。 You can have Visual C++ .NET for free

【讨论】:

【参考方案5】:

Pthreads 可以在 C++ 中使用。我通常只是在它们周围写一些简单的包装器。

另外,如果您只是想创建一堆低级循环,请查看 OpenMP。它非常容易使用。

我有一个小 C++ 项目,这里有一个线程库。目的非常具体,但它也许可以作为一个例子。

http://github.com/mikelikespie/reccage

【讨论】:

【参考方案6】:

另一个易于使用、独立于平台的并发 HEADER ONLY 库:

https://github.com/zlateski/zi_lib/tree/master/zi/concurrency/

示例在测试目录下

【讨论】:

【参考方案7】:

以下 URL 声明“用于 C++ 的独立于平台的多线程和同步库”

http://zthread.sourceforge.net/

祝你好运。

【讨论】:

以上是关于c++中实现*字符前移的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有正则表达式的情况下在 C++ 中实现有效的全字字符串替换?

在 C++ 中实现地图矢量

C语言题:将s串中所有字符前移一个位置,第一个字符移到最后。谢谢帮

如何在SQL中的字符串中实现字符串

如何在反应材料-ui自动完成中实现最小字符长度功能

c++ 为啥 ifstream get() 函数返回无法识别的特殊字符?