字符串

1.strlen字符串长度计算

int main(){
    int len = "abcdef";
    printf("%d\n", strlen(len)); // 6; strlen求字符串长度,返回 unsigned int(注:如果比较不会小于0); 字符串里必须要有 \0 
    return 0;
}

 

2.strcat\strncat字符串追加

int main(){
    char arr1[20] = "hello";
    char arr2[] = "world";
    strcat(arr1, arr2);
    printf("%s\n", arr1); // helloword 注意:被追加元素的大小要放的下追加之后的总大小;追加时只认被追加元素的\0
    return 0;
}
-------------------- 限制个数strncat --------------------
int main(){
  char arr1[20] = "hello";
  char arr2[] = "world";
  strncat(arr1, arr2, 2);
  printf("%s\n", arr1); // hellowo 注意:被追加元素的大小要放的下追加之后的总大小;追加时只认被追加元素的\0
  return 0;
}

 

3.strcpy\strncpy字符串拷贝

int main(){ 
    char arr1[] = "abcdef";
    char arr2[] = "gg";
    printf("%s", strcpy(arr1, arr2)); // gg; strcpy拷贝字符串,返回目的地,将arr2拷贝到arr1; arr1所占空间要大于arr2
    //printf("%s", strcpy(arr1, "hehe")); // hehe
    return 0;
}
-------------------- 限制个数strncpy --------------------
int main(){
  char arr1[8] = "abc";
  char arr2[] = "hello word";
  strncpy(arr1, arr2, 7); // 记得会把 \0 也拷贝过去,所以其实拷贝了8个;如果你拷贝了3个但是其实只有1个会补2个0
  printf("%s", arr1);
  return 0;
}

 

4.strcmp\strncmp字符串比较

int main(){
    // strcmp字符串比较,从第一个字符开始比较; 第一个大于第二个返回大于0的数,相同返回0,第一个小于第二个返回小于0的数,ascii码值比较
    char* p1 = "abc";
    char* p2 = "sbx";
    int tem  = strcmp(p1,p2);
    printf("%d\n",tem); // -1
    return 0;
}
-------------------- 限制个数strncmp --------------------
int main(){
  char* p1 = "avdf";
  char* p2 = "avda";
  int tem = strncmp(p1, p2, 3);
  printf("%d", tem); // 0 ; 只比较前三个
  return 0;
}

 

5.strstr查找字符串

int main(){
    // 查找字符串strstr
    char* p1 = "abcdefaadef";
    char* p2 = "def";
    char* tem = strstr(p1,p2);
    if (tem == NULL){ printf("没有匹配到\n"); }
    else{ printf("%s\n", tem); }; // defaadef ; 如果没有匹配到返回空指针,否则返回p1的开始的def到 \0
    return 0;
}

 

6.分割字符串strtok

int main(){
    // 分割字符串strtok,会修改源数据所以先备份一下比较好
    char arr[] = "apqo@klks.tech";
    char* p = "@."; 
    char buf[30];
    strcpy(buf,arr);

    //1:
    //char* tem = strtok(buf, p);
    //printf("%s\n", tem); // apqo
    //tem = strtok(NULL, p);
    //printf("%s\n", tem); // klks
    //tem = strtok(NULL, p);
    //printf("%s\n", tem); // tech
    //printf("%s\n", arr); // apqo@klks.tech

    //2:
    char* ret = NULL;
    for (ret = strtok(buf, p); ret != NULL; ret = strtok(NULL, p)){
        printf("%s\n", ret); // apqo \n klks \n  tech
    }
    
    return 0;
}

 

7.错误信息strerror

int main(){
    // 错误信息strerror,错误码有很多可选择
    //char* str = strerror(0);
    //printf("%s\n", str); //No error

    //char* str = strerror(1);
    //printf("%s\n", str); //Operation not permitted

    //char* str = strerror(2);
    //printf("%s\n", str); //No such file or directory

    //errno是一个全局错误码的变量,C语言程序在运行时发生了错误会自动把相应的错误码返给你,需要头文件 #include <errno.h>
    FILE* pf = fopen("text.txt", "r");  // fopen基于stdio.h
    if (pf == NULL){
        printf("%s\n", strerror(errno)); 
    }
    else{    
        printf("打开文件成功");
    }

    return 0;
}

 

8.判断字符大小写及其它

// 需要头文件 ctype.h; 返回非0的数字表示就成立

 

 tolower: 大写转小写:char ch = tolower('Q'); putchar(ch);// q

 toupper: 小写转大写

C库函数随笔_字符串

 

9.内存函数

1.内存拷贝 mencpy

int main(){
    // 内存拷贝 mencpy
    int i = 0;
    int arr1[] = {1,2,3,4,5};
    int arr2[5] = { 0 };
    memcpy(arr2, arr1, sizeof(arr1)); // 第三个参数是要拷贝多少字节
    for (i = 0; i < 5; i++){
        printf("%d ", arr2[i]); // 1 2 3 4 5
    }
    return 0;
}

-----------------  拷贝结构体  -----------------

struct ss{
    char name[20];
    int age;
};

int main(){
    struct ss arr3[] = { { "张三", 20 }, {"李四", 18} };
    struct ss arr4[3] = { 0 };
    memcpy(arr4, arr3, sizeof(arr3));
    printf("%s", arr4[0].name); // 张三
    return 0;
}

 2.内存拷贝重叠处理(也可以处理不重叠的)menmove

int main(){
    // 处理内存拷贝重叠 menmove
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int i = 0;
    memmove(arr + 2, arr, 20); // 第三个参数是要拷贝多少字节
    for (i = 0; i < 10; i++){
        printf("%d ", arr[i]); // 1 2 1 2 3 4 5 8 9 10
    }
    return 0;
}

 3.内存比较 mencmp

int main(){
    // 内存比较 mencmp

    int arr1[] = {1,2,3,4,5};
    int arr2[] = {1,2,5,4,3};
    int ret = memcmp(arr1, arr2, 8); // 8 表示字节
    printf("%d\n", ret); // 0; 表示前8个字节一样;不一样是-1
    return 0;
}

4.内存设置 menset

int main(){
    // 内存设置 menset

    //char arr[10] = "";
    //memset(arr, '#', 9);  // 9表示字节;会加一个隐藏的 \0 实际是10个 
    //printf("%s", arr); // #########

    int arr[10] = {0};
    int i = 0;
    memset(arr, 1, 40);
    for (i = 0; i < 10; i++){
        printf("%d ", arr[i]);
    }
    return 0;
}