【C语言】解决不同场景字符串问题:巧妙运用字符串函数

简介: 【C语言】解决不同场景字符串问题:巧妙运用字符串函数

blog.csdn.net

【C语言】解决不同场景字符串问题:巧妙运用字符串函数-CSDN博客

成就一亿技术人!

17-21 分钟


🌈个人主页是店小二呀

🌈C语言笔记专栏:C语言笔记

🌈C++笔记专栏: C++笔记

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅

文章目录


一、字符函数

字符函数一般分为字符分类函数字符转换函数,它们使用的时候可以相互打配合,这些字符函数统一声明在库函数头文件ctype.h


1.1 字符分类函数

以上这些函数使用方式非常类似,这里简单使用两个常用字符分类函数

1.1.1 islower

#include <stdio.h>
#include <ctype.h>
int main()
{
   int ret=islower('a')
       return 0;
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7

【说明】

  • 字符类型是整型类型的子集,这里可以使用ASCII表达字符
  • 判断参数部分是否为小写字母
  • 如果是小写字母,就返回非零的整数(为真)
  • 如果不是小写字母,就返回零(为假)

1.1.2 isupper

#include <stdio.h>
#include <ctype.h>
int main()
{
    int ret=isupper('A')
        return 0;
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7

【说明】

  • 字符类型是整型类型的子集,这里可以使用ASCII表达字符
  • 判断参数部分是否为大写字母
  • 如果是小写字母,就返回非零的整数(为真)
  • 如果不是小写字母,就返回零(为假)

如果对于其他字符分类函数使用感兴趣,可以点击这次链接,经行查找搜索->[字符分类函数](scanf - C++ Reference (cplusplus.com))

1.2字符转换函数

C语言提供了以下两个字符转换函数:

int tolower(int c)
功能:将参数部分为小写转化为大写
int toupper (int C)
功能:将参数部分为大写转化为小写
• 1
• 2
• 3
• 4
int main()
{
    int ret=iolower('A');
    printf("%d",ret);//这里打印出的就是小写a
    return 0;
}
• 1
• 2
• 3
• 4
• 5
• 6

1.3 字符分类函数与字符转换函数配合

int main()
{
  int i = 0;
  char str[] = "Test String.\n";
  char c;
  while (str[i++])
  {
    c = str[i];
    if (islower(c))
      c = toupper(c);
    putchar(c);
  }
  return 0;
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
'

二、 字符串函数

2.1 Strlen

int main()
{
    char * p = "abcd";
    int ret = strlen(p);
    return 0;
}
• 1
• 2
• 3
• 4
• 5
• 6

【说明】:

  • 计算字符串在\0前面出现的字符个数
  • 具体细节,参考这篇文【指针篇5/5】

2.2 Strcpy

  • 将原字符串(source)拷贝到目标字符串(destination)。
  • 返回值是返回目标字符串中首地址。
int main()
{
    cosnt char pc[] = "abcdf";
    1. char p[] = "xxx";  //目标空间缺乏
    2. char p[] = "XXXXXXxxxx"; //目标空间充足
    strcpy(p, pc);
    printf("%s", p);
    return 0;
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10

【说明】

  • 源字符必须以'\0'作为结束标志
  • 源字符串中的'\0'拷贝到目标空间
  • 目标字符串是可修改的
  • 目标空间需要足够大,不然可能会溢出
  • 如果目标空间过小,虽然能打印结果,但会冲出缓冲区

2.3 Strcat

  • 在目标字符串末尾’\0’的位置上追加源字符串。
  • 目标字符串的首地址。
int main()
{
   char p[20] = "abcdefl";
   const char pc[] = "xxxx";
   strcat(p, pc,);
   printf("%s", p);
   return 0;
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9

【说明】:

  • 源字符必须以'\0'作为结束标志
  • 目标字符串需要'\0'作为结束标志,作为追加位置
  • 目标字符串是可修改的
  • 目标空间需要足够大,空间容纳下两个字符串连接后的大小

2.4 Strcmp

  • strcmp不是比较字符串的长度,而是比较两个字符串中对应位置字符的ASCII码值
int main()
{
    char p[20] = "abcdef";
    char pc[20] = "abcf";
    int ret=strcmp(p, pc);
    if (ret > 0)
    {
        printf("大于");
    }
    else if (ret == 0)
    {
        printf("等于");
    }
    else
    {
        printf("小于");
    }
    return 0;
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19

说明】:

  • 如果第一个字符串大于第二个字符串的大小,就返回大于0的数
  • 如果第一个字符串等于第二个字符串的大小,就返回0
  • 如果第一个字符串小于第二个字符串的大小,就返回小于0的数

对于strcpy和strcat越界的调整

问题】:

  • 在使用字符串函数中,strcpy和strcat都存在冲出缓冲区的风险,对此有什么办法可以尽量避免?

库为了对应这种情况的发生,提供了在strcpy和strcat基础上改良了可以控制个数的函数。


2.5 Strncpy

【说明】

  • 将源字符串的num个字符拷贝到目标空间中
  • 如果num大于源字符串的数量,拷贝完源字符串后,以后追加'\0'直到num个才停下

2.6 Strncat

【说明】:

  • 将源字符串的num个字符追加到目标空间中
  • 如果num大于源字符串的数量,则拷贝到'\0'直接停下

2.7 Strncmp

【说明】:

  • 比较dest和str的前num个字符,如果在num前发现了不同,则返回数值,不再继续
  • 如果dest和str相等,一直到了num个字符都相等,则返回0

2.8 Strstr

  • 在字符串中寻找匹配子字符串并且返回子字符串的地址
int main()
{  
    char str1[] = "abccdefg";
    char str2[] = "cd";
    char *ret=strstr(str1,str2);
    printf("%s",ret);
    return 0;
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
'

【说明】:

  • str1和str2不能为NULL.
  • 如果str2不属于str1的字符串,则返回NULL.

2.9 Strtok

  • 第一个参数指向一个字符串,包括了一个及多个的分隔符和字符组合
  • 第二个参数是指向分割符的集合
  • 将一个字符串拆分标记,标记是由分隔符分割由任何字符分隔的连续字符串序列
int main()
{
  char str[] = "192.152.142@dads";
  char sep[] = ".@";
  char* p = NULL;
  for (p = strtok(str, sep); p != NULL; p=strtok(NULL, sep))//循环中利用上面返回值三点的相关知识
  {
  printf("%s\n", str);
  }
     return 0;
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11

【说明】:

  1. 第一个参数不为NULL,则函数找到str1的第一个标记并且记录当下标记的位置
  2. 第一个参数为NULL,则从标记的位置,出发寻找下一个标记位置
  3. 如果字符串中找不到更多的标记,则返回NULL.

循环体逻辑说明

  • 因为使用一次strtok函数,只能找个一个标记点,所以我们需要用到循环
  • 字符串中找不到更多的标记,则返回NULL,这个作为结束条件
  • strtok函数会找下一个标记,以\0来结尾,返回指向这个标记的指针(strtok会改变被操作的字符串,所以strtok函数分割得到的字符串,一般是拷贝内容是可以被修改的)

2.10 Strerror

  • 获得参数部分的错误码对应的错误信息
  • 将错误信息的字符串地址返回
#include <stdio.h>
#include <errno.h>
int main()
{
    for (int i = 0; i < 10; i++)
    {
        printf("%d:%s\n",i, strerror(i));
    }
    return 0;
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10

【说明】

  • 在不同的系统和C语言标准库的实现中将这一些错误码的信息,一般都放在<errno.h>头文件中
  • 当C语言程序启动的时候,会有一个全面变量errno去记录程序中错误码,在程序启动的是时候,errno为0表示没有错误
  • 如果在使用标准库中的函数,出现错误,那么就有会由errno去记录错误码,如果错误码是=的数字,不知道什么含义**?所以每一个错误码都对应着错误信息**

讲到这里我们也是可以了解下perror函数,它的功能是直接将错误信息打印出来,比较暴力

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
    FILE*p=fopen("add.txt","r");//r的意思打开文件进行输入操作。该文件必须存在。
    //FILE * fopen ( const char * filename, const char * mode );
    if(p==NULL)
    {
        perror("Error opening file add.txt:")//Error opening file add.txt: No such file or directory
    }
    return 0;
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二C语言笔记,希望对你在学习C语言中有所帮助!

相关文章
|
27天前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
27天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
1天前
|
C语言
【C语言】模拟实现深入了解:字符串函数
【C语言】模拟实现深入了解:字符串函数
|
1月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
1月前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。
|
1月前
|
存储 安全 C语言
C语言 二级指针应用场景
本文介绍了二级指针在 C 语言中的应用,
|
2月前
|
C语言
【C语言】字符串及其函数速览
【C语言】字符串及其函数速览
26 4
|
2月前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
50 0
|
2月前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
42 0
|
5月前
|
存储 编译器 C语言
在C语言中的数组和字符串
在C语言中的数组和字符串