c语言字符串操作,及常用函数

时间:2021-02-17 03:53:00

一,字符串操作

1 . strcpy : 拷贝

char *stpcpy(char *destin, char *source);

2 . strcat :  拼接

char *strcat(char *destin, char *source);

3 . strchr : 查找第一个字符匹配

char *strchr(char *str, char c);

strrchr : 查找最后一个匹配

char *strrchr(char *str, char c);

strstr : 查找第一个匹配字符串

char *strstr(const char *haystack, const char * needle);

4 . strcmp : 比较

int strcmp(char *str1, char *str2);

看Asic码,str1>str2,返回值 > 0;两串相等,返回0

strncasecmp : 忽略大小写比较前n个

int strncasecmp(const char *s1, const char *s2, size_t n);

5 . strdup : 将串拷贝到新建的位置处

char *strdup(char *str);

#include <stdio.h>
#include <string.h>
#include <alloc.h> int main(void)
{ char *dup_str, *string = "abcde"; dup_str = strdup(string);
printf("%s\n", dup_str);
free(dup_str); return ; }

6 . strtok : 分隔

char * strtok(char *s, const char *delim);

char *strtok_r(char *str, const char *delim, char **saveptr);
strtok_r函数是strtok函数的可重入版本。str为要分解的字符串,delim为分隔符字符串。char **saveptr参数是一个指向char *的指针变量,用来在strtok_r内部保存切分时的上下文,以应对连续调用分解相同源字符串。
 
int in=0;
char buffer[INFO_MAX_SZ]="Fred male 25,John male 62,Anna female 16";
char *p[20];
char *buf=buffer;
char *outer_ptr=NULL;
char *inner_ptr=NULL;
while((p[in] = strtok_r(buf, ",", &outer_ptr))!=NULL) {
  buf=p[in];
  while((p[in]=strtok_r(buf, " ", &inner_ptr))!=NULL){
    in++;
    buf=NULL;
   }
  buf=NULL;
}
printf("Here we have %d strings/n",in);
for (int j=0; j<in; j++) {
  printf(">%s</n",p[j]);
}

 

7 . swab : 交换字符串n位

void swab (char *from, char *to, int nbytes);

二,转换数值类型

1 . strtod : 从字符串 中转换 double 类型数值,并将后续的字符串指针存储到 end 指向的 char* 类型存储。

double strtod(const char *nptr, char **endptr);
float strtof(const char *nptr, char **endptr);

2 .  atoi(p) 字符串转换到 int 整型 
  atof(p) 字符串转换到 double 符点数 
  atol(p) 字符串转换到 long 整型

#include <stdlib.h>

int atoi(const char *nptr);
long atol(const char *nptr);

double atof(const char *nptr);

三,字符检查 


int isalpha(int c) 检查是否为字母字符 
isupper() 检查是否为大写字母字符 
islower() 检查是否为小写字母字符 
isdigit() 检查是否为数字 
isxdigit() 检查是否为十六进制数字表示的有效字符 
isspace() 检查是否为空格类型字符 
iscntrl() 检查是否为控制字符 
ispunct() 检查是否为标点符号 
isalnum() 检查是否为字母和数字 
isprint() 检查是否是可打印字符 
isgraph() 检查是否是图形字符,等效于 isalnum() | ispunct()

四,scanf 

1 . sscanf : 从一个字符串中读进与指定格式相符的数据

int sscanf(const char *str, const char *format, ...);

sscanf("1 2 3","%d %d %d",buf1, buf2, buf3);

2 . sprintf : 把格式化的数据写入某个字符串缓冲区。

int sprintf( char *buffer, const char *format, [ argument] … );

五,mem

1 . memcpy : memcpy中dest和source中的区域不能重叠

void *memcpy(void *dest, const void *source, size_t count);

2 . memmove : 如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。

void *memmove(void *dest, const void *source, size_t count)

**memcpy和memmove的区别

http://blog.chinaunix.net/uid-22780578-id-3346391.html

3 . memcmp :  比较内存区域buf1和buf2的前count个字节。

int memcmp(const void *s1, const void *s2, size_t n);

4 . mmap :

void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);

int munmap(void* start,size_t length);

port :

PROT_EXEC //页内容可以被执行
PROT_READ //页内容可以被读取
PROT_WRITE //页可以被写入
PROT_NONE //页不可访问

flags :

MAP_FIXED //使用指定的映射起始地址,如果由start和len参数指定的内存区重叠于现存的映射空间,重叠部分将会被丢弃。如果指定的起始地址不可用,操作将会失败。并且起始地址必须落在页的边界上。
MAP_SHARED //与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或者munmap()被调用,文件实际上不会被更新。
MAP_PRIVATE //建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。这个标志和以上标志是互斥的,只能使用其中一个。
MAP_DENYWRITE //这个标志被忽略。
MAP_EXECUTABLE //同上
MAP_NORESERVE //不要为这个映射保留交换空间。当交换空间被保留,对映射区修改的可能会得到保证。当交换空间不被保留,同时内存不足,对映射区的修改会引起段违例信号。
MAP_LOCKED //锁定映射区的页面,从而防止页面被交换出内存。
MAP_GROWSDOWN //用于堆栈,告诉内核VM系统,映射区可以向下扩展。
MAP_ANONYMOUS //匿名映射,映射区不与任何文件关联。
MAP_ANON //MAP_ANONYMOUS的别称,不再被使用。
MAP_FILE //兼容标志,被忽略。
MAP_32BIT //将映射区放在进程地址空间的低2GB,MAP_FIXED指定时会被忽略。当前这个标志只在x86-64平台上得到支持。
MAP_POPULATE //为文件映射通过预读的方式准备好页表。随后对映射区的访问不会被页违例阻塞。
MAP_NONBLOCK //仅和MAP_POPULATE一起使用时才有意义。不执行预读,只为已存在于内存中的页面建立页表入口。