【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现2

简介: 【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现

【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1:https://developer.aliyun.com/article/1474747


总结:我们可以把可变参数(...)设置为整数num,(const char * format)格式是==“%d”,存储进大小为size_t n的目标字符数组str==中就可以解决了。

上代码:

#include <stdio.h>

int main()
{
    int num = 123456;//定义一个整数num
    char str[10] ;//字符数组str作为目标缓冲区

    int len = snprintf(str, sizeof(str), "%d", num);
        //调用snprintf进行格式化转换,并用len接收返回值
  printf("%d\n", len);//查看他返回的写入字符串的个数

    if (len < 0) 
    {
        printf("编码错误\n");
        return -1;
    }

    if (len >= sizeof(str)) 
    {
        printf("截断,数字长度大于缓冲区大小\n");
    }
    else
    {
        printf("字符串转换成功: %s\n", str);
        printf("字符串写入成功且第二个元素是: %c\n", str[1]);

    }

    return 0;
}

代码运行:



在代码中,我没有给字符数组str赋值 char str[10] ;//字符数组str作为目标缓冲区,在整数123456调试中我们可以看到str[6]=='\0'

'\0'哪里来的呢?

我们通过前面知道snprintf函数的返回值表示实际写入目标字符串的字符数,但不包括结尾的null字符’\0’。

至于null字符'\0'是怎么来的,snprintf在写入字符串时,会自动在结尾添加一个null字符'\0’,用来标识字符串的结束。

整数"123456"转换为字符串,需要6个字符加1个null字符,总长度是7。

因此我们需要在目标字符串内存中预留了null字符所占的空间

int num = 1234567890;//将num重新定义10个整数
    char str[10] ;//字符数组str作为目标缓冲区
• 1
• 2

因此我们需要在目标字符串内存中预留了null字符所占的空间,不然会发生截断

💯 💯 💯strlen的使⽤

size_t strlen ( const char * str );
• 1

• 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包含 '\0' )。

• 参数指向的字符串必须要以 '\0' 结束。

注意函数的返回值为size_t,是⽆符号的( 易错 )

strlen的使⽤需要包含头⽂件

代码实现:

#include <stdio.h>
#include <string.h>
int main()
{
  char arr1[] = "abcdef";//[a b c d e f \0]
  char arr2[] = { 'a', 'b', 'c' ,'\0'};//[a b c]
  size_t len = strlen(arr2);
  printf("%zd\n", len);

  return 0;
}

有个易错题:

#include <stdio.h>
#include <string.h>
int main()
{
  const char* str1 = "abcdef";//6
  const char* str2 = "bbb";//3
  if (strlen(str2) - strlen(str1) > 0)
  {
    printf("str2>str1\n");
  }
  else
  {
    printf("srt1>str2\n");
  }
  return 0;
}

答案是什么呢?

运行启动:

为什么呢?

strlen返回的字符串长度类型是size_t,它是一个无符号整数类型。

  • str1长度为
  • str2长度为3
  • strlen(str2) - strlen(str1) 计算为3 - 6,结果是-3
  • 但是-3作为size_t类型,它是一个无符号整数,所以它的值实际上是大于0的,所以打印的是"str2>str1"

注意:

size_t是一个无符号整数类型

例如在32位系统中:

size_t最大值为2^32 - 1

-3作为size_t,它的值就是2^32 - 1 - 3他的值远远大于0.

💯 💯 💯 💯 strlen的3种模拟实现方式

  1. 创建临时变量count
#include <stdio.h>
#include <string.h>
#include <assert.h>

size_t my_strlen1(const char* str)
{
  size_t count = 0;
  assert(str != NULL);
  while (*str)
  {
    count++;
    str++;
  }
  return count;
}

2.指针减指针

start指针记录起始位置,str指针遍历字符串,返回二者差值即为长度。

size_t my_strlen2(const char* str)
{
  assert(str);
  const char* start = str;
  while (*str)
  {
    str++;
  }
  return str - start;//两指针相减得到的是中间的元素个数
}

3.函数递归遍历(不使用临时变量,求字符串长度)

  size_t my_strlen(const char* str)
{
  if (*str == '\0')
    return 0;
  else
    return 1 + my_strlen(str + 1);
}

int main()
{
  char arr[] = "abcdef";
  size_t len = my_strlen(arr);
  printf("%zd\n", len);

  return 0;
}


例如,递归abcdef

my_strlen("abcdef");
1+my_strlen("bcdef");
1+1+my_strlen("cdef");
1+1+1+my_strlen("def");
1+1+1+1+my_strlen("ef");
1+1+1+1+1+my_strlen("f");
1+1+1+1+1+1+my_strlen("");
1+1+1+1+1+1+0;

📝总结

通过学习字符分类函数、字符串转换函数和字符串长度计算的原理和用法,我们可以更好地理解字符和字符串的处理方式,并能够灵活运用这些函数进行字符和字符串的处理。这些函数在实际的开发中经常会用到,掌握它们的使用方法对于提高开发效率和代码质量都很重要。

相关文章
|
2月前
|
存储 算法 C语言
【C语言】字符常量详解
字符常量是C语言中处理字符数据的重要工具。通过单引号括起一个字符,我们可以方便地使用字符常量进行字符判断、字符运算和字符串处理等操作。理解字符常量的表示方法、使用场景和ASCII码对应关系,对于编写高效的C语言程序至关重要。
194 11
|
2月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
88 10
|
2月前
|
存储 C语言 开发者
【C语言】格式化输出占位符及其标志字符详解(基于ISO/IEC 9899:2024)
在C语言中,格式化输出通过 `printf` 函数等格式化输出函数来实现。格式说明符(占位符)定义了数据的输出方式,标准ISO/IEC 9899:2024(C23)对这些格式说明符进行了详细规定。本文将详细讲解格式说明符的组成部分,包括标志字符、宽度、精度、长度修饰符和类型字符,并适当增加表格说明。
56 6
|
3月前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
168 4
|
4月前
|
C语言
C语言字符(串)函数
C语言字符(串)函数
|
4月前
|
C语言 C++
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
|
4月前
|
存储 安全 编译器
深入C语言库:字符与字符串函数模拟实现
深入C语言库:字符与字符串函数模拟实现
|
4月前
|
C语言
C语言常见字符函数和字符串函数精讲
C语言常见字符函数和字符串函数精讲
|
4月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
9月前
|
存储 C语言
C 语言函数完全指南:创建、调用、参数传递、返回值解析
函数是一段代码块,只有在被调用时才会运行。 您可以将数据(称为参数)传递给函数。 函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用。
239 3

热门文章

最新文章