相关函数: bcopy(), memccpy(), memcpy(), strcpy(), strncpy()
表头文件: #include <string.h>
定义函数: void *memmove(void *dest, const void *src, size_t n);
函数说明: memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些。
返回值: 返回指向dest的指针。
附加说明: 指针src和dest所指的内存区域可以重叠。



memcpy()、 memmove()和memccpy()
-------------------------------------------------------
    这三个函数的功能均是将某个内存块复制到另一个内存块。前两个函数的区别在于它们处理内存区域重叠(overlapping)的方式不同。第三三个函数的功能也是复制内存,但是如果遇到某个特定值时立即停止复制。
    对于库函数来说,由于没有办法知道传递给他的内存区域的情况,所以应该使用memmove()函数。通过这个函数,可以保证不会出现任何内存块重叠问题。而对于应用程序来说,因为代码“知道”两个内存块不会重叠,所以可以安全地使用memcpy()函数。



-------------------------------------------------------
#include <string.h>
#include <stdio.h>

int main()
{
    char s[] = "zengxiaolong";

    memmove(s, s+4, strlen(s)-4);
    s[strlen(s)-4] = '\0';
    printf("*s = %s\n", s);

    return 0;
}


运行显示:*s = xiaolong
如果注释掉: s[strlen(s)-4] = '\0';
运行显示:*s = xiaolonglong
其实就是:zengxiaolong的指针被这个函数从往后4个后的xiaolong给拷贝到移动到zengxiao,xiaolong==》xiaolonglong,而
这个s[strlen(s)-4] = '\0';就是截断...


memcpy用法:

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
    char a[] = "xiang dong yang";
    char *b;
    char c[]="xiang dong yang hello the world";
    b=c;
    printf("%s\n",c);
    memcpy(b,a+6,strlen(a)-6);
    //a[strlen(b)-6]='\0';
    *(b+9)='\0';
    printf("%s",c);
    printf("------------\n");
    printf("%d",strlen(c));
    printf("%c",c[10]);
    printf("%c",c[11]);
    printf("%c",c[12]);
    printf("============\n");
    printf("%s",c);
    printf("============\n");
    printf("%c",*(c+10));//越过\0的截断区域打印一个字符
    printf("%c",*(c+11));
    printf("%c",*(c+12));
    printf("|||||||||||||\n");

    printf("%s",c+12);//打印\0截断后的后面字符
    
    printf("|||||||||||||\n");

    printf("------------\n");


}


特别注意:printf %c,%s 区别,如下:
printf("%s",pointer p);//指针地址
printf("%c",pointer *p);//指针指向的值
http://item.taobao.com/item.htm?id=7949942367
http://sale.bangpai.taobao.com/site.php?m=tao_item&a=group&spid=1767&siid=9975
回忆未来(372647693)  19:04:21
^([0-9]{1,3})  不行啊。

回忆未来(372647693)  19:04:33
匹配1到3次啊,有什么错咧?
Benny(76354595)  19:10:02
^[0-9]+
回忆未来(372647693)  19:12:49
为何是+,而不是匹配1-3次咧、
Benny(76354595)  19:14:14
貌似editplus不支持{1,3}这种
    在PHP出现至今,一直在不断的更新版本,增加新的功能,供我们大家使用,满足我们的需求。PHP 5.2以及更高的版本,PHP filter被绑定于系统,它可以对数据进行自动的过滤和判断。
第一种、PHP filter判断一个变量的内容是否符合要求
使用函数filter_var,第一个参数是要判断的变量。第二个参数是判断的要求,FILTER_VALIDATE_EMAIL表示判断是否符合email格式。如果变量是类似’boy@163.com’的数据,系统就会完整的输出‘boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出空字符串。
$email = ‘boy@163.com’;  
echo filter_var($email,
FILTER_VALIDATE_EMAIL);  

第二种、PHP filter根据要求过滤一个变量的内容
和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。如果变量是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果变量没有设置内容,系统输出空字符串。如果是’boy阿三’,系统会把email格式中不允许的东西去除,输出’boy’。
$email = ‘boy@163.com’;  
echo filter_var($email,
FILTER_SANITIZE_EMAIL);  

第三种、PHP filter判断输入的变量的内容是否符合要求
使用函数filter_input。第一个参数表示从那里获得的数据,INPUT_POST表示通过POST方法传递过来,还可以使用INPUT_GET, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV,代表相应的途径。第二个参数就是数据的名称。第三个参数代表过滤的要求,FILTER_VALIDATE_EMAIL表示判断数据是否符合email格式。
假设通过表单的POST过来的一个字段email。如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出null,也就是空。
echo filter_input(INPUT_POST,
‘email’, FILTER_VALIDATE_EMAIL);

第四种、PHP filter根据要求过滤输入的变量的内容
和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。假设通过表单的POST过来的一个字段email。
如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果没有填写表单中的email字段,系统输出null,也就是空。如果是’boy阿三’源码天空,系统会把email格式中不允许的东西去除,输出’boy’。
echo filter_input
(INPUT_POST, ‘email’,
FILTER_SANITIZE_EMAIL);  
以上就是PHP filter的具体功能介绍,希望对又需要的朋友有所帮助。

来自:http://www.codesky.net/article/200912/140526.html
阅读全文
方法零,直接截取:

方法一,替换:


方法二,正则匹配:


php reg.php
Array
(
    [0] => Array
        (
            [0] => 372647693
        )

    [1] => Array
        (
            [0] => 3726476
        )

)
取array的下标1即是$out3[1][0]后,加上**,即可!

方法2:
<?php
$st['FQQ']='372647693';
$parttern="/^(\d)(\d+)(\d{2})$/";
$replace="\$1$2**";
$qq=preg_replace($parttern,$replace,$st['FQQ']);
echo $qq;
?>


php reg.php
3726476**

方法3:

<?php
$qq="372647693";
$result = preg_replace('/^(.+).{2}$/', '\1**', $qq);
echo $result;
?>


php reg.php  
3726476**

shell的awk方法实现:

cat  xyz_zizuan.txt  |awk '{print substr($1,1,length($1)-2) "**"}' > xyz_zizuan2.txt
懒人必备
用tab来做补全, 这个插件会记住你最后一次的补全类型,并按此来做补全
这个插件比上次介绍的"简单而实用的vim script"好很多.

有效编辑的七个习惯里有一条就是:
Don't type it twice
所以能偷懒的时候,就尽量偷懒吧.

插件链接地址:
http://www.vim.org/scripts/script.php?script_id=182
http://www.vim.org/scripts/script.php?script_id=1643


1.下载:http://www.vim.org/scripts/script.php?script_id=1643
2 解压:把supertab.vim 文件丢到 /usr/share/vim/vim70/plugin  文件夹就好了
3 帮助:supertab.vim 文件头部, 和命令 ":SuperTabHelp"
4 使用:
        在上面一节中你应该学会了自动补全代码的功能, 按下"Ctrl+X Ctrl+O"就搞定了, 如果你够懒的话肯定会说"这么麻烦啊,
居然要按四个键", 不必为此自责, 因为Gergely Kontra 和 Eric Van Dewoestine也跟你差不多, 只不过人家开发了supertab.vim这个插件, 可以永远懒下去了, 下面我来教你偷懒吧.

在你的~/.vimrc文件中加上这两句:
let g:SuperTabRetainCompletionType=2
let g:SuperTabDefaultCompletionType="<C-X><C-O>"
  
以后当你准备按"Ctrl+X Ctrl+O"的时候直接按<Tab>就好了, 够爽吧 ....

我稍微再介绍一下上面那两句配置信息:
let g:SuperTabDefaultCompletionType="<C-X><C-O>"
" 设置按下<Tab>后默认的补全方式, 默认是<C-P>,
" 现在改为<C-X><C-O>. 关于<C-P>的补全方式,
" 还有其他的补全方式, 你可以看看下面的一些帮助:
" :help ins-completion
" :help compl-omni
  

let g:SuperTabRetainCompletionType=2
" 0 - 不记录上次的补全方式
" 1 - 记住上次的补全方式,直到用其他的补全命令改变它
" 2 - 记住上次的补全方式,直到按ESC退出插入模式为止

ctrl+s是一个古老的shell控制键,在输入ctrl+q就可以恢复了

CTRL-S and CTRL-Q are called flow-control characters. They represent an antiquated way of stopping and restarting the flow of output from one device to another (e.g., from the computer to your terminal) that was useful when the speed of such output was low. They are rather obsolete in these days of high-speed networks. In fact, under the latter conditions, CTRL-S and CTRL-Q are basically a nuisance. The only thing you really need to know about them is that if your screen output becomes “stuck,” then you may have hit CTRL-S by accident. Type CTRL-Q to restart the output; any keys you may have hit in between will then take effect.
ctrl+s是一个古老的shell控制键,在输入ctrl+q就可以恢复了

来自:http://cn.voidcc.com/question/p-rjdaikmm-ra.html

ASCII编码是计算机所能显示字符的编码,它的取值范围是0-255,其中包括标点、字母、数字、汉字等。在编程过程中,经常把指定的字符转化为ASCII码进行比较。
cat a.php

输出:9 就是ASCII码的:09   水平定位符号

ASCII码表:http://ascii.911cha.com/?year=09
php a.php


最后,发现用终端复制就行,用vscode就不行,经下面这段代码测试,发现是终端可以输出\n这种不可见字符,而vscode在复制时这个没了,于是word就会出现错乱。


直接终端复制就可以。
也可php aaaa.php|pbcopy
即使不加换行\n,也能正常粘贴到表格里。
php aaaa.php|pbcopy          #证明pbcopy 会在行尾加换行。



下面是PHP提供的转换ASCII码和字符的函数。
1.chr()函数
该函数用于将ASCII码值转化为字符串。其函数声明如下:
string chr (int ascii);
2.ord()函数
该函数用于将字符串转化为ASCII码值。其函数声明如下:
int ord(string str);
示例:
使用chr()函数和ord()函数进行字符串与ASCII码之间的转换,程序代码如下:

<?php
$str1=chr(88);
echo $str1;                //返回值为X
echo "t";
$str2=ord('S');
echo $str2;                //返回值为83
?>
中文字符截取
ord() chr() int() intval() 的区别
ord()->本函数返回字符的 ASCII (美国国家标准交换码) 序数值。本函数和 chr() 函数相反
php chr() ord()中文截取乱码问题解决方法


<?php
$lenth = 19;
$str = "怎么将新闻的很长的标题只显示前面一些字,后面用.....来代替?";
echo strlen($str)<=$lenth ? $str : (substr($str,0,$lenth).chr(0)."....");
?>
<?
/*
@ 另一种方法,使用ord()函数:
@ 适用于 gb2312 编码:
*/
$str = "怎么将新闻的很长的标题只显示前面一些字,后面用.....来代替?";
function gb2312_substr($str, $limit) {
$restr ='';
for($i=0;$i< $limit-3;$i++) {
$restr .= ord($str[$i])>127 ? $str[$i].$str[++$i] : $str[$i];
}
return $restr;
}
/*
@ 以下仅适用于 utf-8 编码;
*/
function utf8_substr($str, $limit) {
$restr = '';
for($i=0;$i< $limit-3;$i++) {
$restr .= ord($str[$i])>127 ? $str[$i].$str[++$i].$str[++$i] : $str[$i];
}
return $restr;
}


另外一种方法:

/**
* 截取UTF-8编码下字符串的函数
*
* @access public
* @param    string       $str         被截取的字符串
* @param    int          $start       截取的起始位置
* @param    int          $length      截取的长度
* @param    bool         $append      是否附加省略号
* @return null
*/
function sub_str($str, $start=0, $length=0, $append=true)
{
     $str = trim($str);
     $reval = '';
     if (0 == $length)
     {
     $length = strlen($str);
     }
     elseif (0 > $length)
     {
     $length = strlen($str) + $length;
     }
     if (strlen($str) <= $length) return $str;
     for($i = 0; $i < $length; $i++)
     {
         if (!isset($str[$i])) break;
         if (196 <= ord($str[$i]))
         {
             $i += 2 ;
             $start += 2;
         }
     }
     if ($i >= $start) $reval = substr($str, 0, $i);
     if ($i < strlen($str) && $append) $reval .= "...";
return $reval;
}
//解释下上面第一个:chr(0)不是null,null是什么都没有,而chr(0)的值是0。表示成16进制是0x00,表示成二进制是00000000虽然chr(0)不会显示出什么,但是他是一个字符。虽然chr(0)不会显示出什么,但是他是一个字符。当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。
?>
ord.php:
[/code]
<?php
$a = chr(0);
printf("0x%x",$a);
?>

# php ord.php
0x0
来源:http://www.freesear.com/read.php?tid=4461
腾讯,深圳总部。这是失眠的夜晚。
阅读全文
这段:
auth/cookie.auth.lib.php  


    if ($GLOBALS['cfg']['LoginCookieRecall']) {
        $default_user   = $GLOBALS['PHP_AUTH_USER'];
        $default_server = $GLOBALS['pma_auth_server'];
        $autocomplete   = '';
    } else {
        $default_user   = 'kary';
        $default_server = '127.0.0.1:3306';
        // skip the IE autocomplete feature.
        $autocomplete   = ' autocomplete="off"';
    }

就是登陆框里面显示的默认配置!

后面就是打开 libraries 目录下的 config.default.php 文件,依次找到下面各项,按照说明配置即可。
展示登录框的方法:
今天研究了一下phpmyadmin,想让它有个登录!在网上找了一下,自己写出来为了以后方便!

登录phpmyadmin时验证用户权限
首先进入phpmyadmin的根目录,找到libraries目录,打开config.default.php文件,
  vi /usr/local/apache2/htdocs/phpMyAdmin/config.inc.php
  将$cfg['Servers'][$i]['auth_type'] = 'config';
  改成
   $cfg['Servers'][$i]['auth_type'] = 'http';
  
   ok!就这么简单!登录试一下!
g++ -Wall  启用所有警告信息
g++ -w 禁用所有警告信息
g++ -Werror 在发生警告时取消编译操作

其他注意大小写:
-E 预处理后即停止,不进行编译,汇编及链接
-S 编译后即停止,不进行汇编及连接
-c 编译或汇编源文件,但不进行连接
-o 指定输出文件为file

默认是连接基本库: /usr/lib/libc.so
math.h需要的库:   /usr/lib/libm.so
除非显示的制定,对于math.h没法找到那个libm.so
gcc example /usr/lib/libm.so 就可以编译通过咧。
gcc -x c++   //指定语言
static 选项强制使用静态库。
-g:获得有关调试信息,不能和常见优化如:-O1 -O2,-O3等共同使用。
背景:有时PHP在操作memcache时会出现set后删除不了疑问题(匪夷所思),需要用shell下对memcache进行调试,这样操作相对方便些。
flush_all 全清:
flush_all
注:flush并不会将items删除,只是将所有的items标记为expired,因此这时memcache依旧占用所有内存。
用status查看其确实还占用内存。
stats
STAT total_items 18375

shell下的使用方法:
先set 几个
[root@host5-7 ~]# telnet 192.168.5.21 19867
Trying 192.168.5.21...
Connected to 192.168.5.21 (192.168.5.21).
Escape character is '^]'.
set test1 0 0 3
123
STORED
set test2 0 0 3
345
STORED
set test3 0 0 3
567
STORED
set test4 0 0 3
789
STORED
quit
Connection closed by foreign host.
实践如下:



添加,删除,修改示例:
telnet 192.168.1.100 11211
add name 0 60 5     [说明 add 是指令名  name 是key的名字 (是以key/value存放), 0 标志, 60 表示数据存放 60s   5表示 放入多大数据 ], 如果一个key已经存在,再放入是失败的.
get name [获取 name的值]
//更新
set name 0 60 5   [如果 name 这个key存在,就是更新, 如果key不存在,就是添加]
//删除
delete key值


本质shell的telnet 的Memcache通讯返回,如下:
(echo "stats";sleep 2)|telnet 172.*.*.* 12000

Escape character is '^]'.
STAT pid 13574
STAT uptime 8897547
根据这个原理写了监控Memcache的shell如下:
#!/bin/sh

#通过传入ip 以及端口,发送指令获得返回数据
#copyright chengmo qq:8292669

#函数往往放到最上面
function sendmsg()
{
    msg=$1;
    echo  "$1">&8;
    getout;
}
#向socket通道发送指令,并且调用获得返回参数

function getout()
{  
    #read 命令 -u 从打开文件描述符 8 读取数据,-d读取数据忽略掉:\r换行符
    while read -u 8 -d $'\r' name;
    do
        if [ "${name}" == "END"  -o "${name}" == "ERROR" ];then
            break;
        fi;
        echo $name;
    done
}
#由于:memcached每次通讯完毕,会返回:END或者ERROR(出错),通过判断是否是"END"觉得读取是不是结束,否则循环不会停止

if [ $# -lt 2 ];then
    echo "usage:$0 host port [command]";
    exit 1;
fi;

[[ $# -gt 2 ]]&&command=$3;

#设置默认值 如果command为定义则为:stats
command="${command=stats}";
host="$1";
port="$2";



exec 8<>/dev/tcp/${host}/${port};
#打开通向通道是8

if [ "$?" != "0" ];then
    echo "open $host  $port fail!";
    exit 1;
fi

sendmsg "$command";
#发送指定命令


sendmsg "quit";
#发送退出通向命令


exec 8<&-;
exec 8>&-;
#关闭socket通道

exit 0;



这是通过重定向,实现socket通讯中,发送然后获取返回的例子。其实,上面代码看似一次只能发送一段。时间上。我们可以反复调用:sendmsg ,捕捉输出数据。实现连续的,读与写操作。

阅读全文
零、使用系统的 $RANDOM 变量
echo $RANDOM  
17617  
$RANDOM 的范围是 [0, 32767]
如需要生成超过32767的随机数,可以用以下方法实现。

一、通过时间获得随机数(date)
这个也是我们经常用到的,可以说时间是唯一的,也不会重复的,从这个里面获得同一时间的唯一值。适应所有程序里面了。

例子:
[chengmo@centos5  shell]$ date +%s
1287764773
#获得时间戳,当前到:1970-01-01 00:00:00 相隔的秒数
#如果用它做随机数,相同一秒的数据是一样的。在做循环处理,多线程里面基本不能满足要求了。

[chengmo@centos5  shell]$ date +%N
738710457
#获得当前时间的纳秒数据,精确到亿分之一秒。
#这个相当精确了,就算在多cpu,大量循环里面,同一秒里面,也很难出现相同结果,不过不同时间里面还会有大量重复碰撞

[chengmo@centos5  shell]$ date +%s%N
1287764807051101270
#这个可以说比较完美了,加入了时间戳,又加上了纳秒
通过上面说明,用它来做随机数的基数了,接下来我们看怎么样获得一段数据内怎么样获得随机数。

#!/bin/sh
#写个随机函数,调用方法random min max
#在min 与 max直接获得随机整数
#copyright chengmo QQ:8292669


#获得随机数返回值,shell函数里算出随机数后,更新该值

function random()
{
    min=$1;
    max=$2-$1;
    num=$(date +%s+%N);
    ((retnum=num%max+min));
    #进行求余数运算即可
    echo $retnum;
    #这里通过echo 打印出来值,然后获得函数的,stdout就可以获得值
    #还有一种返回,定义全价变量,然后函数改下内容,外面读取
}

#得到1-10的seq数据项
for i in {1..10};
do
    out=$(random 2 10000);
    echo $i,"2-10000",$out;
done;

看看运行结果:

[chengmo@centos5  shell]$ sh testrandom.sh
1,2-10000,5600
2,2-10000,5295
3,2-10000,3432
4,2-10000,3148
5,2-10000,9041
6,2-10000,4290
7,2-10000,2380
8,2-10000,9009
9,2-10000,5474
10,2-10000,3664

一个循环里面,得到值各不相同。

这个是我们常用方法,适应各种语言,是一个通用算法,就算服务器不提供,某时刻相同唯一数据标记,我们也可以通过这种方法,做自己的伪随机数。

来源:http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html
More: http://blog.csdn.net/fdipzone/article/details/24329523
先上示例Demo:



du -lh|awk '{if(match($1,"G") != 0) print$0}'

awk中Match的用法test:
Hello
Welcom
What
Why
jackxiang
取得每行的大写字母:
LANG=C awk ' { if(match($0,/[A-Z]+/)) print substr($0,RSTART,RLENGTH)}'  test



H
W
W
W

RSTART   被匹配函数匹配的字符串首
RLENGTH   被匹配函数匹配的字符串长度

确实加LANG=C 就OK了...

awk --version

GNU Awk 3.1.5
Copyright (C) 1989, 1991-2005 Free Software Foundation.

务必参考:http://www.cnblogs.com/chengmo/archive/2010/10/06/1844818.html
cat text.txt | xargs echo -n


awk '{{printf"%s",$0}}' awkF.txt

sed去掉换行:
sed ':a;N;s/\n//;ta' awkF.txt


sed ':a;$!N;s/\n//;ta' awkF.txt


awk '{a[NR]=$0}END{for(i=1;i<=NR;i++)if(i==NR) print a[i];else printf a[i]}' awkF.txt
各级政府将大量的人力物力财力用于维稳,但社会矛盾和社会冲突的数量非但没减,反而不断增加,这种现象忽然就联想起量子物理的“测不准”原理:人不可能同时准确测量一个粒子的动能和势能,对动能的测量会影响到势能,反之亦然。社会冲突背后是利益表达机制的缺失,如果谁表达了就想普朗克定义了普朗克常量,像麦克斯韦写出了波动方程,表达了波的波粒二象性来表达电磁波一样.
分页: 155/339 第一页 上页 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 下页 最后页 [ 显示模式: 摘要 | 列表 ]