1‘ strnstr
//
从 s 串 中 找到 子串 find 并且 返回 find 在s 中的 位置
slen表示find 的长度!。。
1 #include
2 #include
3 char *strnstr( char *s, char *find, size_t slen)
4 {
5 char c, sc;
6 size_t len;
7
8 if ((c = *find++) != '\0') {
9 len = strlen(s);
10 do {
11 do {
12 if (len-- < 1 || (sc = *s++) == '\0')
13 return (NULL);
14 printf("sc:%c,len=%d\n",sc,len);
15 } while (sc != c);
16 if (slen > len)
17 return (NULL);
18 } while (strncmp(s, find, slen-1) != 0);
19 s--;
20 }
21 return ((char *)s);
22 }
23
24 int main()
25 {
26 char *sp="woaichenpeiqing";
27 char *ds="chen";
28 printf("%s\n",strnstr(sp,ds,strlen(ds)));
29 return 0;
30 }
~
2、memchr
3、strchr
strchr函数原型:extern char *strchr(const char *s,char c);查找字符串s中首次出现字符c的位置。
1
2
3
4
5
6
7
8
char* strchr(char* s,char c)
{
while(*s != '\0' && *s != c)
{
++s;
}
return *s == c ?s:NULL;
}
ps: 与之 相对应的 函数 strrchr 逆向 寻找字符 并且返回 从指定字符开始的字符串
4·snprintf()
将可变个参数(...)按照format格式化成字符串,然后将其复制到str中
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为格式化后的字符串的长度。
char a[20];
i = snprintf(a, 9, "%012d", 12345);
printf("i = %d, a = %s", i, a);
输出为:i = 12, a = 00000001
函数名: strdup
功 能: 将串拷贝到新建的位置处
用 法: char *strdup(char *str);
这个函数在linux的man手册里解释为:
The strdup() function returns a pointer toa new string which is a
duplicate of the string s. Memory for thenew string is obtained with
malloc(3), and can be freed with free(3).
The strndup() function is similar, but onlycopies at most n charac-
ters. If s is longer than n, only ncharacters are copied, and a termi-
nating NUL is added.
strdup函数原型:
strdup()主要是拷贝字符串s的一个副本,由函数返回值返回,这个副本有自己的内存空间,和s不相干。strdup函数复制一个字符串,使用完后要记得删除在函数中动态申请的内存,strdup函数的参数不能为NULL,一旦为NULL,就会报段错误,因为该函数包括了strlen函数,而该函数参数不能是NULL。
strdup的工作原理:
char * __strdup (const char *s)
{
size_t len =strlen (s) + 1;
void *new =malloc (len);
if (new == NULL)
return NULL;
return (char *)memcpy (new, s, len);
}
实例1:
C/C++ code
#include
#include
#include
int main(void)
{
char *dup_str,*string = "abcde";
dup_str =strdup(string);
printf("%s\n", dup_str);free(dup_str); return 0;
}
实例2:
#include
#include
#include
unsigned int Test()
{
charbuf[]="Hello,World!";
char* pb =strndup(buf,strlen(buf));
return (unsignedint)(pb);
}
int main()
{
unsigned int pch= Test();
printf("Testing:%s\n",(char*)pch);
free((void*)pch);
return 0;
}
在Test函数里使用strndup而出了Test函数仍可以操作这段内存,并且可以释放。
由这个问题而延伸出来的问题就是,如何让函数得到的内存数据传出函数但仍可用。
解决方法目前本人只想到两个: 一个外部变量,如传递一个内存块指针给函数,但这种做法就是你得传递足够的内存,也就是你不能事先知道这个函数到底要多大的BUFFER。
另一种方法就是在函数内部申请static变量,当然这也是全局区的变量,但这种做法的缺点就是,当函数多次运行时,static变量里面的数据会被覆盖。这种类型的另一个方法就是使用全局变量,但这和使用static变量很相同,不同的是全局变量可以操作控制,而static变量如果不把它传出函数,就不可对它操作控制了。另一类方法就是上面所述的,利用堆里的内存来实现,但存在危险。strdup是从堆中分配空间的!strdup调用了malloc,所以它需要释放!对于堆栈:堆是由程序员来管理的,比如说new,malloc等等都是在堆上分配的!
栈是由编译器来管理的。
7、rename
8、mmap
mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。
条件:
#include
#include
main()
{
char *s1="Hello, Programmers!";
char *s2="Hello, programmers!";
int r;
r=memcmp(s1,s2,strlen(s1));
if(!r)
printf("s1 and s2 are identical\n"); /*s1等于s2*/
else if(r<0)
printf("s1 is less than s2\n"); /*s1小于s2*/
else
printf("s1 is greater than s2\n"); /*s1大于s2*/
return 0;
}
#include
#include
#include
#include
#define TMP_LOG_FILE_DIR "/tmp/lcf/log"
int main()
{
/* char *ac_dir = "/tmp/log";
if(access(ac_dir, F_OK)==-1)
{
printf("file not sucess\n");
}
printf("tmp/lcf have exits\n");
char *dir = "/tmp/log/";
if(mkdir(dir, 655) != 0)
{
if(errno != EEXIST)
{
perror("mkdir");
exit(-1);
}
}*/
if(access(TMP_LOG_FILE_DIR, F_OK)==-1)
{
printf("failed\n");
char dir_log[126]={'\0'};
snprintf(dir_log, 126, "mkdir -p %s", TMP_LOG_FILE_DIR);
system(dir_log);
}
}