串类型(string, buffer)
string为字符串,buffer解释为缓冲区,他们都是连续存储并且存储内存都是动态分配的。
string
string可以理解为一个连续存放字符的容器,它和buffer的区别是string字符串可能会放在字符串池中,且无法对string[idx]
单个字符进行修改
string初始化,以及一些简单的符号运算:
string str = "Hello World"; // 使用双引号,只能包括一行字符串
string str0 = """P // 使用"""P ... """P; 的方式可以定义多行任意格式字符串
Hello World! // 其中P可以为[a-z]和[A-Z],任意字母无差别,但要保证前后一致。
This is my first program,
thank you!
"""P;
string str1 = "Hello", str2 = " World";
string add_str = str1 + str2; // add_str为"Hello World"
printf("%c",add_str[0]); // 输出 H
从设备输入数据
mixed input_string(string prompt = EMPTY_STRING, bool echo = true, int max_size= 4096); // 原型
// 返回值如果是nil表示EOF,数字表示出错,否则就是string
import gs.lang.io
string str = "";
array lines = []; // 行数
int total_size = 0; // 总长度
while (str = input_string("", false, 1024*1024))
{
lines << [str];
total_size += str.length();
}
- string可以通过切片语法获取子串。
string str = "hello";
write(str[0..4]); // hello
write(str[0..2]); // hel
write(str[0..0]); // h
// <n 代表从右边向左边数,第n个
write(str[0..<1]); // hello
write(str[1..<3]); // el
string常用的外部函数
下面列出string类型一些常用的外部函数以及用法。
1.
string int_instance.to_string()
int转成string
2.
string float_instance.to_string()
float转成string
3.
string bigin_instancet.to_string()
bigint转成string
4.
int string_instance.length()
得到string长度
5.
string string_instance.to_lower()
字母转小写
6.
string string_instance.to_upper()
字母转大写
7.
bool is_string(srting str)
是否为string
8.
int strcmp(string s1, string s2) // s1<s2 => -1;
比较
9.
int stricmp(string s1, string s2)
转小写比较
10.
int strdiff(string s1, string s2)
相同位置不同字符个数
11.
int strsrch(string s1, int/string s2, bool reverse = false)
查找
12.
string string_instance.trim(int option = 3, string filter = " ")
递归过滤前后filter
13.
array string_instance.explode(string delim = "")
分割字符串
14.
string string_instance.get_range(int pos. int count = -1)
提取子串
15.
mixed string_instance.replace(string s1, string s2)
替代子串
16.
string save_string(mixed val)
使用string保存数据
17.
string sprintf(string str, ...)
获取输出字符流
18.
array sscanf(string val, string fmt)
获取输入字符流
19.
bool string_instance.ends_with(string s1)
是否以s为结尾
20.
bool string_instance.starts_with(string s1)
是否以s为开始
21.
bool string_instance.isupper()
字母是否都是大写
22.
bool string_instance.islower()
字母是否都是小写
23.
int string_instance.index_of(string str)
获取子串的索引(顺序)
24.
int string_instance.rindex_of(string str)
获取子串的索引(逆序)
注
表格第12项参数:option:1,2,3分别表示left,right,both size;filter表示过滤因子
buffer
buffer解释为缓存,其内部维持一个连续的线性储存空间。可以用类似数组索引的方式访问buffer中储存的字节。
向buffer的每个字节写入的数值范围是 0~255(即无符号的一字节整数)。尝试写入超出范围的数值将抛出异常
string add_string()
{
string result = "";
for(int i = 0;i < n;i ++)
result += str[i];
return result;
}
当执行这个程序的时候,for循环会不断地构造一个新的string对象然后赋给result,然而我们只需要最后一个result的结果, 中间过程中的9个string对象都是浪费内存。 如果我们使用buffer的话,每次修改操作只会在原来的对象中操作,不会生成新的对象,这样也就起到了节省内存空间的效果了。
buffer初始化,以及一些简单的符号运算:
buffer buf = (buffer)"Hello World"; // 初始化buf
buffer buf1 = (buffer)"Hello", buf2 = (buffer)" World";
buffer add_buf = buf1 + buf2; // add_buf为"Hello World"
write(add_buf[0]); // 输出 72 ('H'的ASCII)
buffer常用的外部函数
下面列出buffer类型一些常用的外部函数以及用法。
1.
buffer buffer.allocate(int size)
分配空间
2.
void buffer_instance.clear()
清除
3.
void buffer_instance.delete_at(int pos, int num = 1)
删除
4.
int buffer_instance.find(mixed val)
查找
5.
mixed buffer_instance.get(int pos)
取值
6.
buffer buffer_instance.get_range(int pos, int count = -1)
取子buffer
7.
void buffer_instance.insert(int pos, mixed val)
插入
8.
void buffer_instance.push_back(mixed val)
往后插入
9.
void buffer_instance.set(int pos, mixed val)
赋值
10.
string buffer_instance.to_hex()
转成十六进制串
11.
buffer save_buffer(mixed val, int option_flag = 0)
保存
12.
bool is_buffer(mixed val)
是否为buffer
13.
void buffer.copy(buffer dst, int pos, buffer src, int start = 0, int copy_len = 2^63 - 1)
复制