Linux c --- 数组与字符串

来源:互联网 发布:淘宝经典文案 编辑:程序博客网 时间:2024/06/06 00:38

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.头文件<>和”“的区别

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