www.91084.com

GVKun编程网logo

详述C++casting操作(c++ casting)

9

本文将分享详述C++casting操作的详细内容,并且还将对c++casting进行详尽解释,此外,我们还将为大家带来关于AS3中对String操作的replaceAll方法、Bash编程(6)Str

本文将分享详述C++casting操作的详细内容,并且还将对c++ casting进行详尽解释,此外,我们还将为大家带来关于AS3中对String操作的replaceAll方法、Bash编程(6) String操作、Bash脚本里面的string操作、C 简陋版string操作strcpy strcmp strcat strchr strstr的相关知识,希望对你有所帮助。

本文目录一览:

详述C++casting操作(c++ casting)

详述C++casting操作(c++ casting)

Casting----类型转换,也就是将数据从一种类型转换到另一种类型的操作。本文首先给出两种类型转换的方式:隐式转换显式转换,然后简单介绍一下C语言常用的类型转换方式,最后详细叙述C++中常用的三种类型转换模版:static_cast,const_cast,reinterpret_cast

1.隐式转换和现实转换

隐式转换(Implict conversion):这种类型转换操作是由编译器自动完成的,程序员不需要亲自操作。

例如:

int iVariable = 10;
float fVariable = iVariable; // 这里将一个整数赋值给一个浮点数,隐式触发类型转换

显式转换(Explicit conversion:这种类型转换需要程序员自己显式给出类型修饰。

例如:

int iVariable = 20;
float fVariable = (float) iVariable / 10;

2.C++中常用三种类型转换方式

static_cast

用法:static_cast<type>(expression); 注:type是目标类型,expression(表达式)----可以是一个变量,或者具有计算结果的表达式

例如:

int iVariable = 30;
float fVariable = static_cast<float>(iVariable); // 这一语句将类型为int的变量iVariable转换为float类型的fVariable

从上面的示例代码可知,static_cast告诉编译器尝试转换两个不同类型的变量。这个转换方式常用来转换C++语言自有类型(build-in type,例如:char,int,float,double),即使类型之间会有精度的损失。此外,static_cast操作只能用在相关的指针类型之间。

例如:

int* pToInt = &iVariable;
float* pToFloat = &fVariable;
float* pResult = static_cast<float*>(pToInt); // error:不同类型的指针之间无法转换

const_cast

用法:const_cast<type>(expression); 注:type是目标类型,expression(表达式)----可以是一个变量,或者具有计算结果的表达式

例如:

void aFunction(int* a)
{
		cout << *a << endl;
}

int main()
{
		int a = 10;
		const int* iVariable = &a;
		aFunction(const_cast<int*>(iVariable));
		// 因为函数aFunction中参数没有指定为const int*类型,那么就需要将const int*类型的变量显式的转换为非const类型
		return 0;
}

const_cast可能是使用做少的类型转换操作,因为它不可以在不同类型之间进行转换。它仅仅是将一个const修饰的类型变量转化为非const修饰的类型变量。一般而言,我们很少使用到这个操作。

reinterpret_cast

用法:reinterpret_cast<type>(expression); 注:type是目标类型,expression(表达式)----可以是一个变量,或者具有计算结果的表达式

目前来说,这是最强大的类型转换操作。reinterpret_cast实现在任意类型之间进行显式转换,也包括指针类型转换成任意其他指针类型。但是,它不能完成const_cast操作的功能。

AS3中对String操作的replaceAll方法

AS3中对String操作的replaceAll方法

在AS3中没有提供对字符串的replaceAll方法,最近做的一个项目,使用了大量的对XML操作,所以有时候有让我很头疼 最后研究发现一种方法可使实现replaceAll var str:String="AAABBBCCCAAA"; str=str.split("AAA").join("DDD"); 结果str为:DDDBBBCCCDDD

Bash编程(6) String操作

Bash编程(6) String操作

1. 拼接

  1) 简单的字符串拼接如:PATH=$PATH:$HOME/bin。如果拼接的字符串包含空格或特殊字符,需要使用双引号括起,如:

var=$HOME/bin  # 注释并不是赋值的一部分
var="$HOME/bin # but this is"

# bash 3.1后,可以使用+=拼接(+=也可用于数组相加)
var=abc

$ var=abc
$ var+=xyz
$ echo "$var"
abcxyz

注意:+=的性能较直接拼接的效率高,测试如下:

$ var=; time for i in {1..10000}; do var=${var}foo; done;

real    0m1.251s
user    0m1.144s
sys    0m0.104s
$ var=; time for i in {1..10000}; do var+=foo; done;

real    0m0.156s
user    0m0.156s
sys    0m0.000s 

2) 重复字符到指定长度

_repeat(){
    #@ 功能:重复字符串到指定长度
    _REPEAT=
    while (( ${#_REPEAT} < $2))
    do
        _REPEAT+=$1
    done
}

$ _repeat % 40
$ printf "%s\n" "$_REPEAT"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  通过拼接在每个循环中拼接多个实例来提高函数速度:

_repeat(){
    #@ 功能:重复字符串到指定长度
    _REPEAT=$1
    while (( ${#_REPEAT} < $2))
    do
        _REPEAT=$_REPEAT$_REPEAT$_REPEAT
    done
    _REPEAT=${_REPEAT:-:$2}  ##  裁剪指定长度字符串
}

repeat(){
    _repeat "$@"
    printf "%s\n" "$_REPEAT"
}

alert(){ #@ 功能: 打印包含边界及鸣响的警告信息
_repeat "${2:-#}" $(( ${#1} + 8 ))
printf ''\a%s\n'' "$_REPEAT" ## \a = BEL
printf ''%2.2s %s %2.2s\n'' "$_REPEAT" "$1" "$_REPEAT"
printf ''%s\n'' "$_REPEAT"

}

$ alert "Do you really want to detele all your files?"

#################################################################################
## Do you really want to detele all your files? ##
#################################################################################

 2. 字符处理

 没有直接的参数扩展来提供字符串的首字符或尾字符,可借助通配符问号?,以及字符串截取来抽取首字符或尾字符。

$ var=strip
$ allbutfirst=${var#?}  # 去除首字符
$ allbutlast=${var%?}   # 去除尾字符
$ printf "%8s %8s\n" "$allbutfirst" "$allbutlast"
    trip     stri
$ first=${var%"$allbutfirst"} 
$ last=${var#"$allbutlast"}
$ printf "%8s %8s\n" "$first" "$last"
s p

## 小测试
$ while [ -n "$var" ]; do temp=${var#?}; char=${var%"$temp"}; printf "%s\n" "$char"; var=$temp; done ## 将字符串的每个字母按行打印
s
t
r
i
p 
$ while [ -n "$var" ]; do temp=${var%?}; char=${var#"$temp"}; printf "%s\n" "$char"; var=$temp; done  ## 将字符串的每个字母反向打印
p
i
r
t
s 
 也可以通过"%c"获取字符串首字符
$ printf -v first "%c" "$var"  # 将原本输出到标注输出的信息赋值给first
$ echo $first
s

3. 大小写转换

Bourne shell中,字符转换可以通过tr命令完成,tr作用:将第一个参数中的字符转换成对应的第二个参数中的字符

$ echo abcdefgh | tr ceh CEH  ## c=>C,e=>E,h=>H
abCdEfgH
$ echo abcdefgh | tr ceh HEC ## c=>H,e=>E,h->C
abHdEfgC
$ echo touchdown | tr ''a-z'' ''A-Z'' ## 将小写转换为大写
TOUCHDOWN 

POSIX shell中,可以通过参数扩展来完成。

to_upper(){
    case $1 in
        a*) _UPR=A;; b*) _UPR=B;; c*) _UPR=C;; d*) _UPR=D;;
        e*) _UPR=E;; f*) _UPR=F;; g*) _UPR=G;; h*) _UPR=H;;
        i*) _UPR=I;; j*) _UPR=J;; k*) _UPR=K;; l*) _UPR=L;;
        m*) _UPR=M;; n*) _UPR=N;; o*) _UPR=O;; p*) _UPR=P;;
        q*) _UPR=Q;; r*) _UPR=R;; s*) _UPR=S;; t*) _UPR=T;;
        u*) _UPR=U;; v*) _UPR=V;; w*) _UPR=W;; x*) _UPR=X;;
        y*) _UPR=Y;; z*) _UPR=X;; *) _UPR=${1%${1#?}};;
   esac
}

$word=function
$to_upper "$word"
$printf "%c%s\n" "$_UPR" "${word#?}"
Function

## 将所有字符转换为大写
_upword(){
    local word=$1
    while [ -n "$word" ]  ## 循环直到$word为空
    do
        to_upper "$word"
        _UPWORD=$_UPWORD$_UPR
        word=${word#?}  ## 移除$word中的首字母
    done
}

upword(){
    _upword "$@"
    printf "%s\n" "$_UPWORD"
}

 4. 比较内容且不需考虑大小写

当输入为单个字母,例如请求Y或N,可以使用逻辑运算符或(|)或者方括号([])对大小写进行选择。

read ok
case $ok in
    y|Y) echo "Great!" ;;
    n|N) echo Good-bye; exit 1 ;;
    *)  echo Invalid entry ;;
esac


read ok
case $ok in
    [yY]) echo "Great!" ;;
    [nN]) echo Good-bye; exit 1 ;;
    *)  echo Invalid entry ;;
esac 

 当输入较长时,以上方法需要将所有的可能组合进行展示,这样的方法较为繁琐。

## 针对于"|",需要列出所有组合
jan | jaN | jAn | jAN | Jan | JAn | JAN) echo "Great!" ;;

## 对于"[]",脚本不宜阅读
read monthname
case $monthname in
    [Jj][Aa][Nn]*) month=1 ;;
    [Ff][Ee][Bb]*) month=2 ;;
    ## 输入剩余的月份
    [Dd][Ee][Cc]*) month=12 ;;
    [1-9]1[0-2] month=$monthname ;; 考虑输入数字的情况
    *) echo "Invalid month: $monthname" >&2 ;;
esac 
较好的方法是将输入统一转换为大写或小写再进行比较:
_upword "$monthname"
case _UPWORD in
    JAN*) month=1 ;;
    FEB*) month=2 ;;
   ## 输入剩余的月份
   DEC*) month=12 ;;
   [0-9]|1[0-2]) month=$monthname
   *) echo "Invalid month: $monthname" >&2 ;;
esac
bash 4.*中字符转换为大写,也可采用${monthname^^}执行

 5. 检查变量名的有效性

检查变量名是否满足仅包含字母、数字和下划线,且只能以字母和下划线开头。

validname(){
    case $1 in
        [!a-zA-Z_]* | *[!a-zA-Z0-9_]*) return 1;;
    esac
}

for name in name1 2var first.name first_name last-name
do
    validname "$name" && echo " valid: $name" || echo "invalid: $name"
done

valid: name1
invalid: 2var
invalid: first.name
 valid: first_name
invalid: last-name 

 6. 字符串插入

_insert_string(){ #@功能: 在字符串的指定位置插入字符串
    local insert_string_dflt=2  ## 默认的插入位置
    local string=$1    ## 被插入的字符串
    local i_string=$2  ## 待插入字符串
    local i_pos=${3:-${insert_string_dflt:-2}}  ## 插入位置
    local left right
    left=${string:0:$(( $i_pos -1 ))}
    right=${string:$(( $i_pos -1 ))}
    _insert_string=$left$i_string$right
}

insert_string(){
    _insert_string "$@" && printf "%s\n" "$_insert_string"
}

$ insert_string poplar u 4
popular
$ insert_string show ad 3
shadow
$ insert_string tail ops ## 使用默认位置
topsail

     7. 覆盖

在一个字符串上覆盖另一个字符串。

_overlay(){
    local string=$1
    local sub=$2
    local start=$3
    local left right
    left=${string:0:start-1}
    right=${string:start+${#sub}-1}
    _OVERLAY=$left$sub$right
}

overlay(){
    _overlay "$@" && printf "%s\n" "$_OVERLAY"
}

$ {
> overlay pony b 1
> overlay pony u 2
> overlay pony s 3
> overlay pony d 4
> }
bony
puny
posy
pond 

8. 裁剪不想要的字符

字符串首尾的空格可以通过循环和条件判断完成。

var="    John    "
while : ## 无限循环
do
    case $var in
        '' ''*) var=${var#?} ;; ## 如果字符串以空格开始,则移除
        *'' '') var=${var%?} ;; ## 如果字符串以空格结尾,则移除
        *) break; ## 当字符串的头部或尾部均无空格,则退出循环
     esac
done 

更有效的方法是找到首尾最长待删除的空格,然后从原始字符串中删除。

var="    John    "
printf "%s|%s\n" "$var" "${#var}"
rightspaces=${var##*[! ]} ## 删除一切直到最后一个非空值
printf "%s|%s\n" "$rightspaces" ${#rightspaces}  ## rightspaces为4个空格
var=${var%"$rightspaces"} ## var目前为"John    "
printf "%s|%s\n" "$var" "${#var}"
leftspaces=${var%%[! ]*} ## 从第一个非空值删除直到结尾
printf "%s|%s\n" ${leftspaces} ${#leftspaces}
var=${var#"$leftspaces"}
printf "%s|%s\n" "$var" "${#var}" 

 进一步封装的方法如下:如果存在第二个参数,则从字符串中删除该参数对应的字符,如果为空,则默认删除空格。

_trim(){ #@ 从$1中删除空格(或$2中的字符)
   local trim_string
    _TRIM=$1
    printf "%s|%s\n" "$_TRIM" ${#_TRIM}
    trim_string=${_TRIM##*[!${2:- }]}
    printf "%s|%s\n" "$trim_string" ${#trim_string}
    _TRIM=${_TRIM%"$trim_string"}
    printf "%s|%s\n" "$_TRIM" ${#_TRIM}
    trim_string=${_TRIM%%[!${2:- }]*}
    printf "%s|%s\n" "$trim_string" ${#trim_string}
    _TRIM=${_TRIM#"$trim_string"}
    printf "%s|%s\n" "$_TRIM" ${#_TRIM}
}

trim(){
    _trim "$@" && printf "%s\n" "$_TRIM"
}

$ trim " S p a c e d o u t "
S p a c e d o u t
$ trim "0002367.45000" 0
2367.45 

9. 索引

定位一个字符串在另一个字符串中的索引位置。

_index(){ #@ $2在$1中的位置保存在$_INDEX
   local idx
   case $1 in
        "") _INDEX=0; return 1 ;;
        *"$2"*) idx=${1%%"$2"*}  ## 提取匹配位置的起始
                _INDEX=$(( ${#idx} + 1 )) ;;
        *) _INDEX=0;  return 1 ;;
   esac
}

index(){
    _index "$@" && printf "%d\n" "$_INDEX"
}

 

例:基于月份的前3个字母,打印出对应的数值

_month2num(){
    local month=JAN.FEB.MAR.APR.MAY.JUN.JUL.AUG.SEP.OCT.NOV.DEC
    _upword "${1:0:3}" ## 提取$1中的前3个字母,并转换为大写
    _index "$month" "$_UPWORD" || return 1
    _MONTH2NUM=$(( $_INDEX / 4 + 1 ))
}

month2num(){
    _month2num "$@" && printf "%s\n" "$_MONTH2NUM"
}

Bash脚本里面的string操作

Bash脚本里面的string操作

1. string长度

# test.sh
hello=world
echo "hello''s length:" ${#hello}

$ ./test.sh
hello''s length: 5

2. substr

#!/bin/bash

hello=world
echo "hello的子串一:" ${hello:1}
echo "hello的子串一:" ${hello:1:3}


$ ./test.sh
hello的子串一: orld
hello的子串一: orl

3. 删除最小匹配子串

#! /bin/bash

filename="front.middle.back"

# 从前面开始匹配,删除最短匹配
echo ${filename#*.}
# 从后面开始匹配,删除最短匹配
echo ${filename%.*}


$ ./shortest-match.sh
middle.back
front.middle

4. 删除最长匹配


#! /bin/bash

filename="front.middle.back"

# 从前面开始匹配,删除最长匹配
echo ${filename##*.}
# 从后面开始匹配,删除最长匹配
echo ${filename%%.*}


$ ./longest-match.sh
back
front


5. 替换string中的一段


#!/bin/bash

filename="front.middle.back.middle.back"
echo "只替换第一个middle:" ${filename/middle/abcd}
echo "替换所有middle:" ${filename//middle/abcd}
echo "只替换在开头出现的front:" ${filename/#front/abcd}
echo "只替换在结尾出现的back:" ${filename/%back/abcd}


$ ./replacement.sh
只替换第一个middle: front.abcd.back.middle.back
替换所有middle: front.abcd.back.abcd.back
只替换在开头出现的front: abcd.middle.back.middle.back
只替换在结尾出现的back: front.middle.back.middle.abcd

C 简陋版string操作strcpy strcmp strcat strchr strstr

C 简陋版string操作strcpy strcmp strcat strchr strstr

文件下载地址:http://pan.baidu.com/s/1bn2BcTL

代码如下:


#include <stdio.h>

#include <stdlib.h>



char *strcpy_(char *dest,const char *src);

char *strcat_(char *dest,const char *src);

int strcmp_(const char *dest,const char *src);

int strlen_(const char *src);

char *strchr_(char *s, int c);

char *strstr_(const char *s,const char *c);

int main()

{

char p[]="xxdexxx";

char q[]="de";

printf("p=%s\n",p);

printf("q=%s\n",q);

printf("strlen_(p)=%d\n",strlen_(p));

printf("strcpy_(p,q)=%s\n", strcpy_(p,q));

char p1[]="xxdexxx";

char q1[]="de";

printf("strchr_(p,''d'')=%s\n",strchr_(p1,''d''));

char p2[]="xxdexxx";

char q2[]="de";

printf("strstr_(p,q)=%s\n",strstr(p2,q2));

char p3[]="xxdexxx";

char q3[]="de";

printf("strcmp_(p,q)=%d\n",strcmp_(p3,q3));

char p4[]="xxdexxx";

char q4[]="de";

printf("strcat_(p,q)=%s\n",strcat_(p4,q4));

return 0;

}


char *strstr_(const char *s,const char *c)

{

const char *p=NULL;

const char *q=NULL;

while(*s!=''\0'')

{

p=s;

p=c;

while(*s==*c&&*c!=''\0'')

{

s++;

c++;

}

if(*c==''\0'')

{

return (char*) p;

}

p++;

c=p;

s=p;

}

return NULL;

}

char *strcpy_(char *dest,const char *src)

{

char *p=dest;

while(*src!=''\0'')

{

*p=*src;

p++;

src++;

}

return dest;

}


int strcmp_(const char *dest,const char *src)

{

int result=0;

const char *p=dest;

AA: if(*p==*src)

{

p++;

src++;

goto AA;

}else

{

result=*p-*src;

return result;

}

return result;


}


char *strcat_(char *dest,const char *src)

{

int len=strlen_(dest)+strlen_(src)+1;

char *p=(char *)malloc(len);

if(p!=NULL)

{

strcpy_(p,dest);

strcpy_(p+strlen_(dest),src);

return p;

}

return NULL;


}


char *strchr_(char *s, int c)

{

char *p=s;

while(*p!=''\0'')

{

if(*p==c)

{

return p;

}

p++;

}

return NULL;


}


int strlen_(const char *src)

{

int count=0;

const char *p=src;

while(*p++)

{

count++;

}

return count;

}


今天关于详述C++casting操作c++ casting的介绍到此结束,谢谢您的阅读,有关AS3中对String操作的replaceAll方法、Bash编程(6) String操作、Bash脚本里面的string操作、C 简陋版string操作strcpy strcmp strcat strchr strstr等更多相关知识的信息可以在本站进行查询。

本文标签: