zoukankan      html  css  js  c++  java
  • C语言处理字符串及内存操作

    字符串处理函数

    1.字符串长度 strlen表示包含的字符的个数,size_t strlen(char cosnt *string), 返回的是size_t类型,它是无符号整数类型,在表达式中进行运算时必须强制转换成整型int,因为无符号数不可能是负的,如strlen(x) - strlen(y) >=0;

    2.不受限制的字符串函数,只是通过寻找字符串参数结尾的NUL字节来判断他的长度,必须保证不会溢出,strcpy和strcat返回第一个参数的拷贝,是一个指向目标字符数组的指针

    (1)复制字符串

    char *strcpy(char *dst, char const *src),其中参数dst可以修改,因此它必须是字符数组或一个指向动态分配内存的数组指针,足够大,提前开辟,不能自动计算数组长度,不能是字符串常量。新字符串以NUL结尾,如果新字符串比较短,老字符串后面的几个字符也会被有效删除。

    (2)连接字符串

    char *strcat(char *dst, char const *src),其中dst和src的内存位置不能出现交叠,即dst和src为同一个定义的字符串,另外需要保证不会溢出。

    (3)字符串比较

    char *strcmp(char const *s1, char const *s2),如果s1小于s2,strcmp返回一个小于零的值,如果大于0,返回大于0的值,如果相等返回0

    3.长度受限制的字符串函数

    (1)char *strncpy(char *dst, char const *src, size_t len);显示接受一个长度参数,当src的字符串长度小于len,则dst用额外的NUL字节填充到len长度,如果src大于或等于len,dst的末尾不会以NUL结尾,因此考虑在函数后加一条语句:dst(sizeof(dst) - 1) = '';

    (2)char *strncat(char *dst, char const *src, size_t len);总是在结果字符串后面添加一个NUL字节,不管dst的长度,最多往dst中复制len个字符,再加一个NUL字节。

    1 char a[3] = "ab";
    2 char b[4] = "mnp";
    3 strncat(a, b, 3);
    4 for (size_t i = 0; i < 10; i++)
    5     printf("%c
    ", a[i]);

    总是在dst的末尾添加,不管dst的长度。

    (3)char *strncmp(char const *s1, char const *s2, size_t len);函数的返回值只根据len个字节的比较来确定

    4.字符串查找(重点)

     (1)查找一个字符

    char *strchr(char const *str, int ch); 

    char *strrchr(char const *str, int ch); 

    虽然第二个参数是整型值,但其实是一个字符值。分别返回ch在str中第一次出现和最后一次出现的位置,如果不存在则返回NULL指针。

     1 #include <string.h>
     2 #include <stdio.h>
     3 int buld(char* str, char c) {
     4   int p = strchr(str,c) - str; //??? 
     5   return p;
     6 }
     7 int main() {
     8     char str1[20],c;
     9     printf("输入字符串:
    ");
    10     gets(str1);
    11     char *p = str1;
    12     printf("输入一个字符:");
    13     scanf("%c",&c);
    14     printf("%s
    ",strchr(str1,c));//打印字符串str1中从字符c开始的后续字符串,
    15                              //如果有字符串中有多个与c相同的字符,应该以第一个为准
    16   int n = strchr(str1,c) - p; //??? 
    17   printf("%d", n); //输出c在str1中的字符串中的位置 
    18 }

    (2)查找任何几个字符(标准库中不存在)

    char *strpbrk(char const *str,char const *group); 

    并不是查找某个特定的字符,而是查找任何一组字符第一次在字符串中出现的位置。

    (3)查找一个子串(标准库中不存在)

    char *strstr(char const* s1, char const* s2)

    若s2不为空,在s1中查找整个s2第一次出现的位置,否则返回NULL指针;若s2为空,则返回s1

    (4)查找字符串前缀

    size_t strspn(char const *str, char const *group);

    size_t strcspn(char const *str, char const *group);

    group字符串指定一个或多个字符。strspn从str起始位置开始,遍历所有字符,直到第一个不符合group字符串的字符为止,返回所有符合group的字符的数目. strcspn则相反,直到第一个符合的字符为止,返回不符合的字符数目。

    (5)查找标记

    char *strtok(cahr *str, char const *sep);

    sep是个字符串,定义了多个分隔符的字符集合,strtok找到str的下一个标记,并将其用NUL结尾,然后返回一个指向这个标记的指针。

    典型用法:第一次调用时,向它传递一个指向字符串的指针,然后这个函数被重复调用(第一个参数为NULL),直到返回NULL,将原字符串分段输出。

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 void print_tokens(char line[]){
     5 
     6     //static char whitespace[] = " 	f
    v
    ";
     7     char *whitespace = " 	f
    v
    ";
     8     char *token;
     9 
    10     for (token = strtok(line, whitespace);
    11         token != NULL;
    12         token = strtok(NULL, whitespace))
    13         printf("Next token is %s
    ", token);
    14 }
    15 
    16 int  main(){
    17 
    18     char line[] = "int main	wosshi  ff 
    v";
    19     
    20     print_tokens(line);
    21     return 0;
    22 }

    5.内存操作(重点)

    字符串都是以NUL字节结尾,所以字符串内部不能包含NUL字符,处理类似字符串时就不能够用常规字符串处理函数,另外内存操作还可以处理数组和结构体,但该函数的返回值和参数类型均为void*

    (1)void *memcpy(void *dst, void const *src, size_t length);

    显式包含需要处理的字节数,但和strn的函数不同,遇到NUL并不会停止操作,可以复制任何类型的值,第三个参数指定复制长度(以字节计算)。

    若是字符数组:char a[n], b[n],则memcpy(a, b, n);表示从b数组复制n个字节到a,但如果是a和b是整型数组,则memcpy(a, b, sizeof(b));

    另外如果只有部分内容需要复制,则需要复制的数量需要在第三个参数中指明,对于长度大于一个字节的数据,需要数量和数据类型的长度相乘;memcpy(a, b, count*sizeof(b));

    (2)void *memmove(void *dst, void const *src, size_t length);主要用于源和目标参数存在重叠的情况

    (3)void *memcmp(void const*a, void const *b, size_t length);只能比较单字节的数据,一共比较length个字节,函数的返回值只根据length来确定

    (4)void *memchr(void const*a, int ch, size_t length);从a开始的位置开始查找ch出现的第一次的位置,并返回一个指向该位置的指针,一共length个字节

    (5)void *memset(void const*a, int ch, size_t length);从a开始的length个字节都设置为字符值ch。

    注意:memset最大的作用是将a的前length个字节置为0,a可以是指针,也可以是数组。另外,由于计算机中的字节为16进制,因此不能将memset中重置为1,否则会出错。

  • 相关阅读:
    数组,一维,二维,多维
    类函数:string、math
    while和for的内嵌
    循环语言(for)
    选择语言之switch case
    程序语言
    语言、数据和运算符
    原理之一,进制转换
    HTML第一部分
    结构体共用变量 递归
  • 原文地址:https://www.cnblogs.com/qinguoyi/p/10130429.html
Copyright © 2011-2022 走看看