/*filename:funclist.c
list some useful functions in stander lib,
which we can use directly.
*/
/*1:getopt()*/
while ((c = getopt(argc, argv, "l:i:s:p:h")) != -1) {
switch (c) {
case 'l':
logfile = optarg;
break;
case 'p':
service = optarg;
break;
case 'h':
default:
printf("/nusage: %s [-l logfile] [-p TCP service_name]/n",
argv[0]);
exit(0);
}
}
/*2:getenv()*/
char *datadir;
if ((datadir = getenv("WS_DATA_PATH")) == NULL) {
fprintf(stderr,"Can not get the WS_DATA_PATH enviroment variable/n");
exit(0);
}
/*3:memmove and memcopy*/
#include <string.h>
#include <stdio.h>
int main()
{
int a[10];
for(int i=0; i < 10; i++)
a[i] = i;
MemCopy(&a[4],a,sizeof(int)*6); //result:0 1 2 3 0 1 2 3 0 1
//memcpy(&a[4], a, sizeof(int)*6); //result:0 1 2 3 0 1 2 3 0 1
//memmove(&a[4],a,sizeof(int)*6); //result:0 1 2 3 0 1 2 3 4 5
//memmove(a, &a[4], sizeof(int)*6);//result:4 5 6 7 8 9 6 7 8 9
//memcpy(a, &a[4], sizeof(int)*6); //result:4 5 6 7 8 9 6 7 8 9
for(i = 0; i < 10; i++)
printf("%d ",a[i]);
printf("/n");
return 0;
}
/*summary
1. 当 src 和 dest 所指内存区有重叠时,memmove 相对 memcpy 能提供保证:
保证能将 src 所指内存区的前 n 个字节正确的拷贝到 dest 所指内存中;
2. 当 src 地址比 dest 地址低时,两者结果一样。
memmove 与 memcpy 的区别仅仅体现在dest 的头部和 src 的尾部有重叠的情况下;
总体来说:即从高向低复制都可以,从低向高复制用memmove()。
*/
/*4:sscanf()*/
int sscanf (const char *str,const char * format,........);
/*函数说明 sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。
(1)-: 表示范围,如:%[1-9]表示只读取1-9这几个数字 %[a-z]表示只读取a-z小写字母,类似地 %[A-Z]只读取大写字母
(2)^: 表示不取,如:%[^1]表示读取除'1'以外的所有字符 %[^/]表示除/以外的所有字符
(3),: 范围可以用","相连接 如%[1-9,a-z]表示同时取1-9数字和a-z小写字母
(4)原则:从第一个在指定范围内的数字开始读取,到第一个不在范围内的数字结束%s
*/
char buf[512] ;
sscanf("123456 ", "%s", buf);//此处buf是数组名,它的意思是将123456以%s的形式存入buf中!
printf("%s/n", buf);
结果为:123456
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s/n", buf);
结果为:1234
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s/n", buf);
结果为:123456
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s/n", buf);
结果为:123456abcdedf
sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
printf("%s/n",buf);
结果为:123456
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s/n", buf);
结果为:123456abcdedf
6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s/n", buf);
结果为:12DDWDFF