标准输入输出
介绍常用的输入输出方法。
格式 化IO
printf
类似于C语言中的格式化输出,根据格式化字符串,对可变参数列表进行格式化。
broadcast
可以将消息广播到所有设备,它同样也支持格式化输出。
Shell> printf("%O", [1, 2]);
[ /* sizeof() == 2 */
1,
2,
]
Shell> printf("%M\n", [1, 2]);
[1,2]
Shell> object obj = load_static("/test.gs");
Shell> printf("%O", obj);
object[32:v26]/test.gs<Static>
Shell> broadcast("%ip", 123456789);
7.91.205.21
sprintf
将格式化输出以字符串返回。
Shell> string str1 = "hello";
Shell> int year = 2017;
Shell> string str2 = "world";
Shell> string str = sprintf("%s%d%s", str1, year, str2); // str = "hello2017world"
提示
GS的格式化输出部分细节与C语言中不同:
-
几个扩展的格式化说明符
%O
%H
%M
等。%O
:任意类型格式化,输出详细格式%M
:任意类型格式化,输出紧凑格式%H
:格式化handle类型%ip
:ip地址格式化
-
不支持转换浮点数为十进制指数计数法
%E
%e
。 -
不支持转换浮点数为十六进制记法
%A
%a
。 -
格式化浮点数输出
%g
等效于%f
, 不会转换为十进制指数计数法输出。 -
字符串格式化输出中无截断操作
printf("%2s", "Hello"); // 结果为 “Hello” 而不是 “He”
-
.
dot类拓展整型时默认补空格而不是数字0printf("%.5d", 1); // 结果为 “ 1” 而不是 “00001”
-
方便的输出颜色控制
printf(HIY "RED" NOR); // 输出为红色
-
居中输出控制符 '|'
printf(".%|11s.", "Hello"); //输出结果为 ". Hello ."
-
左对齐输出控制符 '-'
printf(".%-11s.", "Hello"); //输出结果为 ".Hello ."
-
浮点型格式化输出不支持小数精度为0, 不会进行4舍5入
printf("%.0f", 1.5); //输出结果为 "1.5" 而不是 "2"
write
write作为一种设备输出方式,不需要格式化字符串,可以输出任意类型值,且支持可变参数:
Shell> string val1 = "G-bits";
Shell> int val2 = 2017;
Shell> write(val1, "to", val2, 1234);
G-bitsto20171234
input_string
input_string
支持按行读取标准输入:
Shell> import gs.lang.io;
Shell> string name = input_string("Your name: ");
Your name: Zhang3
Shell> printf("Hello, %s\n", name);
Hello, Zhang3
sscanf
sscanf
根据格式化字符串从指定字符串中提取内容,返回含有提取到的内容的array
,其中第一个元素为格式化字符串中%
说明符的个数。GS还增加了另外一种匹配方式%*d, %*s等等,*号表示任意个。这种匹配方式不会映射到返回数组当中,而是舍弃这个匹配,但是返回数组第一个参数会+1。
Shell> array arr1 = sscanf("123abc456", "%dabc%d"); // arr1 = [2, 123,456]
Shell> // 带*号匹配
Shell> array arr2 = sscanf("g1b2i3ts", "g%db%*si%cts"); // arr2 = [3, 1, 51], 3对应的ASCII为51
Shell> array arr3 = sscanf("g1b2i3ts", "g%db%*s%d"); // arr2 = [3, 1, 2], %*s匹配到0个字符
提示
sscanf与c的实现也有一些区别:
-
返回值为接收参数的数量与参数构成的数组,不需要额外的输入用于接收参数的变量。
-
不支持如 %9s 此类最多有9个非空白符的字符串匹配的限制描述
sscanf("aaaa", "%2s"); // 报错
-
整型溢出后结果不是默认值-1,而是保留溢出值
sscanf("9223372036854775808", "%d"); // 结果为 -9223372036854775808
-
不支持如 %3[0-9] 类的匹配至多3个十进制数字的字符串的描述
sscanf("4444", "3[0-9]"); // 报错