本文将分享详述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)
- AS3中对String操作的replaceAll方法
- Bash编程(6) String操作
- Bash脚本里面的string操作
- C 简陋版string操作strcpy strcmp strcat strchr strstr
详述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中没有提供对字符串的replaceAll方法,最近做的一个项目,使用了大量的对XML操作,所以有时候有让我很头疼 最后研究发现一种方法可使实现replaceAll var str:String="AAABBBCCCAAA"; str=str.split("AAA").join("DDD"); 结果str为:DDDBBBCCCDDDBash编程(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操作
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
#! /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
文件下载地址: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等更多相关知识的信息可以在本站进行查询。
本文标签: