最后更新于 .

如何将一个字符串转换成大写或者小写?这是字符串匹配中经常需要做的事情,然而C++的Standard Library并没有提供将std::string转成大写和小写的功能,只有在提供将char转成大写(toupper)和小写(tolower)的功能而已。 但我们可以利用STL的transform配合toupper/tolower,完成std::string转换大(小)写的功能,也看到 模版编程 的威力了,一个transform函数,可以适用于任何类型,且只要自己提供 函数 ,就可完成任何Transform的动作。

C++

#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
using namespace std;
int main() {
    string s = "Clare";
    // toUpper
    transform(s.begin(), s.end(), s.begin(), ::toupper);
    // toLower
    //transform(s.begin ...

最后更新于 .

C++的string提供了replace方法来实现字符串的替换,但是对于将字符串中某个字符串全部替换这个功能,string并没有实现,我们今天来做的就是这件事。
首先明白一个概念,即string替换所有字符串,将”12212″这个字符串的所有”12″都替换成”21″,结果是什么?
可以是22211,也可以是21221,有时候应用的场景不同,就会希望得到不同的结果,所以这两种答案都做了实现,代码如下:

#include   <string>   
#include   <iostream>   
using   namespace   std;   
string&   replace_all(string&   str,const   string&   old_value,const   string&   new_value)   
{   
    while(true)   {   
        string::size_type   pos(0);   
        if(   (pos=str.find(old_value))!=string::npos   )   
            str.replace(pos,old_value.length(),new_value);   
        else   break;   
    }   
    return   str ...

最后更新于 .

互斥锁

尽管在Posix Thread中同样可以使用IPC的信号量机制来实现互斥锁mutex功能,但显然semphore的功能过于强大了,在Posix Thread中定义了另外一套专门用于线程同步的mutex函数。

1. 创建和销毁

有两种方法创建互斥锁,静态方式和动态方式。POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZER来静态初始化互斥锁,方法如下:

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

在LinuxThreads实现中,pthread_mutex_t是一个结构,而PTHREAD_MUTEX_INITIALIZER则是一个结构常量。 动态方式是采用pthread_mutex_init()函数来初始化互斥锁,API定义如下:

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)

其中mutexattr用于指定互斥锁属性,如果为NULL则使用缺省属性。 pthread_mutex_destroy()用于注销一个互斥锁,API定义如下:

int pthread_mutex_destroy(pthread_mutex_t *mutex)

销毁一个互斥锁即意味着释放它所占用的资源,且要求锁当前处于开放状态。由于在Linux中,互斥锁并不占用任何资源,因此LinuxThreads中的pthread_mutex_destroy()除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作。

2. 互斥锁属性

互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。当前(glibc2.2.3,linuxthreads0 ...

最后更新于 .

在excel中,提供了一个功能可以根据第一个数字下拉生成一串连续的数字,那么在vim中能不能生成呢?答案是肯定的,而且方法不只一种,而且灵活性更高。 第一种.用Vim的查找替换,说白了,比如说要生成1到100,那么就讲100个1顺序替换,每次替换自加就可以了。方法如下:

1)在Vim中键入1.

2)在1所在行,yy,100p。

3)进入命令行模式,输入如下命令:

let i=1|g/1/s//\=i/|let i=i+1

OK啦,效果如下。

生成连续数字,方法1

其实命令比较简单,简单解释一下:

1/  代表查找1 s/  代表替换后的新字符就在这个位置 /   就代表后面跟的是新的字符内容 \=i \=是把后面的字符串当成表达式来对待,在这里就是i的值 |   (逻辑或的符号)用以连接三个语句 其实到这里大家就可以自由发散啦,比如如果我想让字母横排怎么办呢?

:%s/\n/ /gc

再比如我只要偶数/奇数怎么办呢 ...

最后更新于 .

想必大家在学C/C++编程的一开始就会学习如何在文件中循环获取没一行的数据,但是我得以切身经历来告诉大家,有时候,课本真的不一定是对的……

#include <fstream>
ifstream fin;
fin.open("uin_err_list");
int count=0;
string stUin;
while(getline(fin,strUin))
{
    count++;
    printf("data=%s\n",strUin.c_str());
}

这段代码有没有问题呢?没有~,基本上。《c++ primer plus》里都有的例子,怎么会有问题呢?
很遗憾,就是有问题。
当我在64位机器上启动这个程序的时候,总是在读取了第一行之后就自动结束,在检查了无数次未果之后,我不得不的出一个很无奈的结论---STL库对64位的支持有点差劲……

好啦,既然如此,那么我们就只能通过别的办法在64位机上循环获取数据,代码如下:

FILE * fp = fopen(file_qq, "r");
char data[100 ...

最后更新于 .

在代码编写中,我们经常需要用到int或者long等类型转化成特殊进制的字符串的问题,当然C里面提供了一些转义符来提供特殊进制输出,如%02x是输出16进制(只是针对一个char,08x是一个int),但是还是需要一个通用的函数来实现一个完整的功能比较好。

例如:转化成2进制

实际上就是每次右移一位,如果8进制就右移3位,16进制就右移4位,当然,mask也要对应更改。


//最左边是第一位
string ChangeTo2Left(unsigned long long flag)
{
string str="";
char temp[2];
unsigned long long mask = 1;
int tempFlag=0;
for(int i=0;i<64;++i)
{
tempFlag=(flag>>i) & mask;
snprintf(temp,sizeof(temp),"%d",tempFlag);
str.append(temp);
}
return str ...

最后更新于 .

转载自内部论坛,原文出处不明。

熟练使用gdb是一个linux下开发人员必备的一项技能,我们由浅入深的学习一下gdb的强大功能。
一.gdb简单介绍
名称

gdb - GNU 调试器

提要

gdb [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps]
        [-tty=dev] [-s symfile] [-e prog] [-se prog] [-c
        core] [-x cmds] [-d dir] [prog[core|procID]]

描述
    调试器(如GDB)的目的是允许你在程序运行时进入到某个程序内部去看看该程序在做什么,或者在该程序崩溃时它在做什么。

GDB主要可以做4大类事(加上一些其他的辅助工作),以帮助用户在程序运行过程中发现bug。
    o  启动您的程序,并列出可能会影响它运行的一些信息
    o  使您的程序在特定条件下停止下来
    ...

最后更新于 .

写了一个简单的多进程的框架,其实很简单但是意义却不仅在于此。
一.网上弄够编译通过的这种代码几乎=0,都是象征性的贴几段代码,直接拿下来,编都编译不过。
二.近期打算写一个基于epoll网络模型的服务器框架,前端网络接入全部由框架完成,而收到包之后的业务逻辑交给业务自己完成,这里的业务逻辑的进程数是可以动态调整的,所以用到了fork进程的概念(因为线程对代码编写要求太高)

好了代码如下(在文章末尾会直接放出代码下载,在suse linux 10下编译通过):

 /*==============================================
#
#   Author:            dantezhu – zny2008@gmail.com
#
#   QQ :                327775604
#
#   Last modified:  2009-11-05 19:30
#
#   Filename:        forkwork_use.cpp
#
#   Description:    多进程的一个框架,大家可以直接使用,已经经过功能测试和压力测试。
#                        编译:g++ forkwork_use.cpp -o forkwork_use 
#                        (实际上看过我写的 VIM-一键编译单个源文件 的话,直接按下F5就行了)
#
================================================*/
#include <iostream>
#include <pthread.h>
#include ...

最后更新于 .

一、Linux服务器上11种网络连接状态:
4036295646_eb2b2b957d
                                          图:TCP的状态机

通常情况下:一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手

注:以下说明最好能结合”图:TCP的状态机”来理解。

SYN: (同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。

ACK: (确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。

FIN: (结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。

1)、LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN. /* The socket is listening for incoming connections. 侦听来自远方TCP端口的连接请求 */
2)、SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接.之后状态置为SYN_SENT.  ...

最后更新于 .

send函数

int send( SOCKET s,    const char FAR *buf,    int len,    int flags ); 

不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。

客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。

该函数的第一个参数指定发送端套接字描述符;

第二个参数指明一个存放应用程序要发送数据的缓冲区;

第三个参数指明实际要发送的数据的字节数;

第四个参数一般置0。

这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的 长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议 是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么 send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余 空间大小send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。

要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如 果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执 行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回 SOCKET_ERROR ...