温故知新系列1——go中字符串的处理
D:\go20190906\src\go>StringUtil
[0x7FEF9B33C50] ANOMALY: meaningless REX prefix used
fn.jpg
Original:This is a test !
Upper Case:THIS IS A TEST !
Lower Case:this is a test !
字符串反转后:! tset a si sihT
Original:我们C/C++ Tips
Upper Case:我们C/C++ TIPS
Lower Case:我们c/c++ tips
字符串反转后:spiT ++C/C们我
1812048064 -> 192.168.1.108
16777343 -> 127.0.0.1
Comparing Abc with Abc true
Comparing abc with Abc true
Comparing Abc with Abc 0
Comparing abc with Abc -1
Comparing abcd with abc 1
Comparing Abc with Abcd -1
请输入密码:
han
s=han
ok!,success
-1
-1
13
package main
import (
"fmt"
"strings"
"strconv"
"unsafe"
"runtime"
)
// 字符串反转
func Reverse(s string)string{
// 能够处理字符串里面包含中文的情况
r:=[]rune(s)
for i,j:=0,len(r)-1;i<j;i,j=i+1,j-1{
r[i],r[j]=r[j],r[i]
}
return string(r)
}
func ConvertAddressToString(a int)string{
var s string
// go实现memcpy
var d [4]byte
p:=unsafe.Pointer(&a)
q:=(*[4]byte)(p)
copy(d[0:],(*q)[0:])
for i:=0;i<4;i++{
s = s + strconv.Itoa(int(d[i]))
if(i<3){
s=s+"."
}
}
return s
}
// 从绝对路径中提取文件名
func RemovePathFromFileName(fullPath string)string{
n0:=strings.LastIndex(fullPath,"\\")
// go的string支持直接根据index截取字符串
fileName:=fullPath[n0+1:]
//或者fileName:=fullPath[n0+1:len(fullPath)]
return fileName
}
/*
大小写敏感,期望结果:
Comparing Abc with Abc 0
Comparing abc with Abc -1
Comparing abcd with abc 1
Comparing Abc with Abcd -1
*/
func strcmp(name1, name2 string)int{
n1:=len(name1)
n2:=len(name2)
n:=n1
if n>n2{
n=n2
}
for i:=0;i<n;i++{
iret:=chcmp(name1[i],name2[i])
if (iret!=0){
return iret
}
}
if n1<n2{
return -1
}
if n1>n2{
return 1
}
/*
var r bool= name1 == name2
if r{
return 1
}
*/
return 0
}
func chcmp(ch1,ch2 byte)int{
if(ch1>='A' && ch1<='Z'){
ch1=ch1+32
}else if(ch1>='a' && ch1<='z'){
ch1=ch1-32
}
if(ch2>='A' && ch2<='Z'){
ch2=ch2+32
}else if(ch2>='a' && ch2<='z'){
ch2=ch2-32
}
if(ch1<ch2){
return -1
}
if(ch1>ch2){
return 1
}
return 0
}
func equal(name1, name2 string) (r bool) {
switch runtime.GOOS {
case "windows":
r = strings.ToLower(name1) == strings.ToLower(name2)
default:
r = name1 == name2
}
return
}
func main() {
// 获取文件名
filename:=RemovePathFromFileName("c:\\dir1\\dir2\\fn.jpg")
fmt.Println(filename)//fn.jpg
// CharUpper将字符或字符串变为大写,CharLower将字符或字符串变为小写
dostrFun:=[]func(s string) string{strings.ToUpper,strings.ToLower,Reverse}
strSave :=[]string{"This is a test !","我们C/C++ Tips"}
for i:=0;i<len(strSave);i++{
fmt.Println("Original:" + strSave[i])
fmt.Println("Upper Case:" + dostrFun[0](strSave[i]))
fmt.Println("Lower Case:" + dostrFun[1](strSave[i]))
fmt.Println("字符串反转后:" + dostrFun[2](strSave[i]))
}
iAddr:=[]int{1812048064,16777343}
for i:=0;i<len(iAddr);i++{
ip:=ConvertAddressToString(iAddr[i])
fmt.Println(iAddr[i],"->",ip)
}
// strcmpi/lstrcmpi比较两个字符串(大小写不敏感)
fmt.Printf("Comparing Abc with Abc %v\n",equal("Abc", "Abc"));
fmt.Printf("Comparing abc with Abc %v\n",equal("abc", "Abc"));
// strcmp/lstrcmp比较两个字符串(大小写敏感)
fmt.Printf("Comparing Abc with Abc %d\n", strcmp("Abc", "Abc"));
fmt.Printf("Comparing abc with Abc %d\n", strcmp("abc", "Abc"));
fmt.Printf("Comparing abcd with abc %d\n", strcmp("abcd", "abc"));
fmt.Printf("Comparing Abc with Abcd %d\n", strcmp("Abc", "Abcd"));
// go中使用closure实现静态局部变量
I:=0
checkPWD:=func(str string)int{
if(str=="han"){
fmt.Printf("ok!,success\n")
return 0
}else{
I = I + 1
if(I==3){
fmt.Printf("exit\n")
return 1
}else{
fmt.Printf("no!,fail\n")
return 2
}
}
}
for i:=0;i<10;i++{
var s string
fmt.Printf("请输入密码:\n")
fmt.Scanf("%s\n",&s)
fmt.Printf("s=%s\n",s)
iret:=checkPWD(s)
if(iret<2){
break
}
fmt.Printf("您还有%d次机会。\n",3-I)
}
// strspn在串中查找指定字符集的子集的第一次出现
// strstr/wcswcs在一字符串中查找另一字符串第一次出现的位置
// strrchr/wcsrchr从尾部开始查找子串出现的第一个位置
strspn:=strings.Index
var spn func(s, substr string) int
fun1:=[]func(s, substr string) int{strings.Index,strings.LastIndex}
spn=fun1[1]
fmt.Printf("%d\n",strspn("AbcDef", "Abcs"))
fmt.Printf("%d\n",spn("AbcDef", "AbcDE"))
fmt.Printf("%d\n",spn("Borland International", "nation"))
}