c与c++常用函数 字符串函数 tolower函数 fill函数 对二维数组 fill_n函数 memset函数

  • max, min, fill, memset, sort, swap

字符串函数

  • 字符串比较函数strcmp因为原理是两个字符串一个个比较,所以可以比较字符是否相同!!!!!
  • 一般形式:strcmp(字符串1,字符串2)
    • 返回值:
      • 当s1<s2时,返回值<0
      • 当s1=s2时,返回值=0
      • 当s1>s2时,返回值>0
  • 如果把序号按字符串存储,则会可以通过strcmp比较序号是否相同。

    (有用)

  • Strlen函数如果没有遇到’ ’,会一直计算下去,字符串二维数组不可以用strlen,因为二维数组每一行相当于一个字符串一维数组,每一行都有’ ’!
  • c++标准库里字符串相关函数的声明,凡是不修改内容的地方一律声明为const char *, strlen(const char *),strcmp(const char *, const char *),strcpy(char *, const char *)第一个参数会被修改

strcpy函数

  • 原型声明:char *strcpy(char* dest, const char *src);
  • 功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
  • 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
  • 返回指向dest的指针。对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL。

tolower函数

  • 定义函数:int tolower(int c);

函数说明:若参数 c 为大写字母则将该对应的小写字母返回。

返回值:返回转换后的小写字母,若不须转换则将参数c 值返回。
tolower(s[i]);

  • #include <cctype>

fill函数

  • 在头文件<algorithm>里面
  • 按照单元赋值,将一个区间的元素都赋同一个值
    fill(arr, arr + n, 要填入的内容);
    vector也可以:fill(v.begin(), v.end(), 要填入的内容);
  • fill 和fill_n函数是C++ Primer第十二章泛型算法部分内容,并把它们称为生成和变异算法,也就是说这两个函数只能对输入范围内已存在的元素进行操作。如果试图对空容器进行fill_n操作,会导致严重的运行错误,所以在对元素进行写入操作时要检查目标的大小是否足以存储要写入的元素。
  • fill的内部实现就是一个for循环
1
2
3
4
5
6
7
template< class , class T >
void fill( first, last, const T& value)
{
for (; first != last; ++first) {
*first = value;
}
}

对二维数组

fill函数

  • 二维数组初始化(推荐)
    1
    2
    3
    4
    5
    6
    7
    8
    int mp[20][20];
    fill(mp[0], mp[0]+20*20, 5);
    //给二维数初始化
    for(int i = 0; i < 20; i++){
    for(int j = 0; j < 20; j++)
    cout << mp[i][j] << " ";
    cout << endl;
    }

与memset()函数的区别:

  • memset的初始化速度比循环要快很多
  • fill和for循环事件是一样的
    • fill的源码就是for循环实现的
  • 两者都可以用来对数组填充,memset是对按照字节来填充的,所以一般用来填充char型数组,也经常用于填充int型的全0或全-1操作。
  • fill是按照单元来填充的,所以可以填充一个区间的任意值。

fill_n函数

  • 在头文件<algorithm>里。
  • fill_n(vec.begin, cnt, val);从当前起始点开始,将之后的cnt个元素赋值为val。
      注意:不能在没有元素的空容器上调用fill_n()函数

memset函数

  • 在头文件<cstring>里面
  • memset的作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
  • Memset函数:可以本身就是为字符数组设计的源代码:unsigned int 有一个特性就是如果将其赋值或者当作字节来使用的话,编译器将会截取低八位作为一个字节使用。

    1
    2
    3
    4
    5
    6
    7
     void *(memset)(void *s, int c, size_t n){
    const unsigned char uc = c;
    unsigned char *su;
    for (su = s; 0 < n; ++su, --n)
    *su = uc;
    return (s);
    }
  • 源码说明对于数组参数是按照字符数组的形式进行赋值的。
    也就是c的值每次赋值给一个字节,而不是4个字节,c的类型是int类型,4个字节,但只会赋值最低位的一个字节的内容。

  • 对于非单字节数据类型只能初始化为0,而不能初始化成别的初值,因为对所有字节按任意顺序赋值0的结果都是0,而如果初始化为其他的值,就会一个字节一个字节的进行赋值,从而出现奇怪的结果。

  • 对于变量:当结构体类型中包含指针时,在使用memset初始化时需要小心。
    struct sample_strcut stTest;用memset就非常方便:memset(&stTest,0,sizeof(struct sample_struct));
    原因是memset初始化的时候是按字节一个一个填充的,int有四个字节,于是填充成0000 0001 0000 0001 0000 00001 0000 0001,这样得出数组中的每个元素的值就是16843009了。赋值时0与 效果一样。

  • 可以用于清空数组内元素与赋,memset函数一般用来填充char型数组,也经常用于填充int型的全0或全-1.不可用其它值,除非高低字节相同.
    -

    1
    2
    3

    int num[N];
    memset(num, INF, sizeof(num));
  • 这样得到的数组里面的每一个元素数值都是INF
    看一下INF的二进制表示:
    00111111001111110011111100111111
    可以看出低8位是00111111,也就是实际赋值时是用
    00111111来填充一个int类型
    ,结果正好也是
    00111111001111110011111100111111
    于是就成功用memset进行了赋值。

初始化与赋值

  • memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化
    • 例如:memset(a,'