Linux c — 数组与字符串

1.数组与字符串的常用函数

1.1 memset

首先可以用man命令查看一下memset函数的使用手册

关于man命令在linux下开发的使用
man 1 +命令 如:ls,man
man 2 +系统借口 如:open,close
man 2 +C语言库函数 如:fopen,memset

这里写图片描述

  • NAME :函数名和该函数的释义
  • SYNOPSIS :函数的头文件和函数的使用方法
  • DESCRIPTION :函数参数的解释
  • RETURN VALUE:函数返回值
  • CONFORMING TO:遵循的标准
  • SEE ALSO:列出与该函数相似的函数

memset函数就是我们通常的初始化函数,虽然C语言的库为我们提供了该函数,当我们使用时可以直接调用,但是作为一名开发者,我们必须懂得该函数的原理,并且会写该函数。
这里贴出Linux内核源码,可以通过对比学习学习。

void *memset(void *s, int c, size_t count)
{
    char *xs = s;
    while (count--)
            *xs++ = c;
    return s;
}

这里补充如何配置ctags(Generate tag files for source code)来阅读源码
1.首先在网上下载并解压Linux内核源码包
2.cd 进入解压的文件,执行命.令ctags -R ./ 生成tags文件
3.vim /etc/vimrc 编辑vim配置文件 set tags=/linux内核源码目录路径/tags
4.vim -t 要查看的变量名或者函数
5.或者vim进入冒行模式,输入 : ta 要查看的变量名或函数
6.Ctrl+ ]跳到光标所在函数或者结构体的定义处

1.2 strlen

strlen是一个求字符串长度的函数,不包含’\0’
源码在此

size_t strlen(const char *s)
{
    const char *sc = s;

    while (*sc != '\0')
            sc++;
    return sc - s;
}

1.3 strcpy

strcpy是一个拷贝字符串的函数,strncpy是一个拷贝字符串制定长度的函数
源码在此

char *strcpy(char *dest, const char *src)
{
    char *tmp = dest;

    while ((*dest++ = *src++) != '\0')
            /* nothing */;
    return tmp;
}

1.4 strcmp

strcmp函数是比较两个字符串的大小,返回一个整形变量
若str1 = str2,则返回零;
若str1 < str2,则返回负数;
若str1 > str2,则返回正数。

源码如下:

int strcmp(const char *str1, const char *str2)
{
        const unsigned char *s1 = (const unsigned char *)str1;
        const unsigned char *s2 = (const unsigned char *)str2;
        int delta = 0;

    while (*s1 || *s2) {
            delta = *s1 - *s2;
            if (delta)
                    return delta;
            s1++;
            s2++;
    }
    return 0;
}

//s1和s2作自增运算时,不应该放在 while()里,避免结束循环时,额外多做一次自增运算。

1.4 strstr

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
源码在此:

char *strstr(const char *s1, const char *s2)
{
        size_t l1, l2;

        l2 = strlen(s2);
        if (!l2)
                return (char *)s1;
        l1 = strlen(s1);
        while (l1 >= l2) {
                l1--;
                if (!memcmp(s1, s2, l2))
                        return (char *)s1;
                s1++;
        }
        return NULL;
}

//memcmp是将地址为s1和s2的两块内存作比较。
//strncmp是将两个字符串s1,s2按字节进行比较,遇到’\0’截止。

1.5 atoi

atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数

这里我自己实现的最简单的版本,只能转换正整数

int myatoi(char *p)
{
    int i;
    int res = 0;

    for(i = 0; i < strlen(p); i++){
            res = (*(i+p) - '0') + 10 *res;
    }

    return res;
}

2.char a[] 与 char *p的区别

char a[] = "hello";
char *p = "hello";

a是一个数组,存放一串字符,每个字符在内存的栈区都对应一个地址,是可读可写的一段空间。
p是一个指针,存放字符串”hello”的地址,指针p在栈区对应一个地址,但p指向”hello”,”hello”却是常量,不能对p指向的地址作写操作。
内存分区:

名称代码区只读数据区全局变量区堆区栈区
权限只读只读读写读写读写
内容指令代码数据静态变量static动态申请的空间数组等

3.主函数带参

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("%d\n", argc);
    printf("%s\n", argv[0]);
    printf("%s\n", argv[1]);
    printf("%s\n", argv[2]);
    printf("%s\n", argv[3]);
    printf("%s\n", argv[4]);

    return 0;
}

这里写图片描述
int argc存放参数个数,包括./main的执行命令
char *argv[] 是一个指针数组,每一个数组元素都是一个指针,指向对应位置上参数的地址

4.头文件<>和”“的区别

  • <>一般包含标准库的头文件,让编译器去制定目录文件区查找
  • “”一般包含自己创建的头文件,让编辑器去在当前目录文件中查找
Logo

更多推荐