首页 > 其他分享 >关于atoi和strtol函数

关于atoi和strtol函数

时间:2024-04-10 20:32:36浏览次数:21  
标签:strtol 函数 int char atoi str printf 字符串

提示:文章

文章目录

前言

前期疑问:
本文目标:


一、背景

最近在牛课题HJ33 整数与IP地址间的转换题目时,涉及到大量的字符串和整型数值的转换,重新看一下字符和整型转换的函数

二、

2.1 ​

避免使用atoi、atol、atoll、atof函数

字符串中可能不含数字、含有其他字符或含有超出表示范围的数字,因
此,将字符串转换为数值时,必须检测并解决这些错误情况。
如果使用C标准库函数做字符串到数值的转换,应当使用 strtol()、strtoll()、
strtod()等函数,代替atoi()、atol()、atoll()、atof()等函数,主要原因如下:
atoi()、atol()、atoll()、atof()系列函数。当字符串转换的结果无法表示成相
应的数值时,会导致程序产生未定义行为,并且未提供足够的出错信息;
strtol()、strtoll()、strtod()系列函数。这些函数能够完成与上一组函数相同
的功能,函数行为是确定的,并且提供了更多的错误检测能力。

int main()
{
    /*case1*/
    char str[1] = {'\0'};
    char *ptr = NULL;
    int num = 102;
    ptr = itoa(num, str, 10);
    printf("%s\n", str);      //打印102   //但是这边已经数据越界了,申请的字符串数组长度不够          
                                         //str[0]:1  str[1]:0 ...  之所以可以打印是因为        
                                         //没有其他数据在申请这段内存,
                                         //或者这里数组越界更改这段内存会导致系统崩溃
    printf("%s\n", ptr);     //打印102

    
    /*case2*/
    char str2[] = "50Y";
    int numStr2 = atoi(str2);
    printf("%d\n", numStr2);        //打印50

    char str3[] = "Y50Y";
    int numStr3 = atoi(str3);    
    printf("%d\n", numStr3);        //打印0

    char str4[] = "Y50Y";
    char *ptr4 = NULL;
    int numStr4 = strtol(str4, &ptr4, 10);    

    if(ptr4 == str4 )
    {
        if(*ptr4 != '\0')
        {
            int a = 0;
        }
        int h = 0;
        //
    }
    printf("%d\n", numStr4);        //打印Y50Y
    printf("%s\n", ptr4);

    char str5[] = "1234This stopped it";
    char *ptr5 = NULL;
    int numStr5 = strtol(str5, &ptr5, 10);

    if(ptr5 == str5 )
    {
        if(*ptr5 != '\0')
        {
            int a = 0;
        }
        int h = 0;
        //
    }
    printf("%d\n", numStr5);
    printf("%s\n", ptr5);


    return 0;
}

2023年6月1日20:23:46

在数值翻转的题目中

int main()
{
    int x = 123;
    int x2 = 123;
    char charx[] = {'\0'};
    char charx2[] = {'\0'};
    //char* p = itoa(x, charx, 10);
    sprintf(charx2, "%d", x2);
//    printf("%s\n",charx);
//    printf("%s\n",p);
    printf("%s\n",charx2);
    getchar();

    return 0;
}

这边需要补充的是,itoa是windows独有的函数,如果要跨平台,可以使用sprintf。

即:itoa并不是一个标准的C函数,它是Windows特有的,如果要写跨平台的程序,需要用sprintf。C标准库中有sprintf,功能比这个更强,用法跟printf类似

2023年9月28日16:59:09更新

itoa 是一些编译器支持的非标准函数。根据错误,您的编译器不支持它。最好的选择是使用 snprintf() 来代替。
char str[255];
sprintf(str, “%x”, 100); //将100转为16进制表示的字符串。

2.2

三、# C 库函数 - strtol()

C 标准库

描述

C 库函数 *long int strtol(const char *str, char *endptr, int base) 把参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间,或者是特殊值 0。

声明

下面是 strtol() 函数的声明。

long int strtol(const char *str, char **endptr, int base)

参数

  • str – 要转换为长整数的字符串。
  • endptr – 对类型为 char* 的对象的引用,其值由函数设置为 str 中数值后的下一个字符。
  • base – 基数,必须介于 2 和 36(包含)之间,或者是特殊值 0。如果 base 为 0,则会根据字符串的前缀来判断进制:如果字符串以 ‘0x’ 或 ‘0X’ 开头,则将其视为十六进制;如果字符串以 ‘0’ 开头,则将其视为八进制;否则将其视为十进制。

返回值

函数返回被转换的长整型整数值。如果输入字符串不符合数字格式,strtol() 将返回 0。如果转换结果超出了 long 整数的表示范围,那么将产生溢出,并设置 errno 为 ERANGE。你可以使用 <errno.h> 头文件中的 errno 变量来检查是否有溢出发生。

实例

下面的实例演示了 strtol() 函数的用法。

以下实例我们将字符串 “12345” 转换为长整型整数。strtol() 函数会将这个字符串转换为对应的整数值 12345。因为我们指定了 base 为 10,所以它会按照十进制进行转换。

实例

\#include <stdio.h>
\#include <stdlib.h>

int main() {
  char str[] = "12345";
  char *endptr;
  long int num;

  num = strtol(str, &endptr, 10);

  if (*endptr != '**\0**') {
    printf("转换失败:输入字符串不是一个有效的整数。**\n**");
  } else {
    printf("转换结果:%ld**\n**", num);
  }

  return 0;
}

让我们编译并运行上面的程序,这将产生以下结果:

转换结果:12345

如果输入字符串不能被完全转换为整数,strtol() 函数将返回转换成功的部分,而 endptr 将指向未转换部分的第一个字符。在这个例子中,endptr 是指向字符串末尾的空字符 ‘\0’,表示整个输入字符串都被成功转换为整数。

如果输入字符串包含非数字字符,例如 “12ab”,那么 endptr 将指向 “ab” 的起始位置,指示转换失败。

实例

\#include <stdio.h>
\#include <stdlib.h>

int main() {
  char str[] = "12ab";
  char *endptr;
  long int num;

  num = strtol(str, &endptr, 10);

  if (*endptr != '**\0**') {
    printf("转换失败:输入字符串不是一个有效的整数。未转换部分:%s**\n**", endptr);
  } else {
    printf("转换结果:%ld**\n**", num);
  }

  return 0;
}

以上实例我们将字符串 “12ab” 转换为长整型整数。strtol() 函数会尝试将这个字符串转换为对应的整数值 12,但因为字符串中包含非数字字符 “ab”,转换无法完成。

输出将是:

转换失败:输入字符串不是一个有效的整数。未转换部分:ab

3.1


总结

未完待续

标签:strtol,函数,int,char,atoi,str,printf,字符串
From: https://blog.csdn.net/2301_77560238/article/details/137591479

相关文章

  • python初学者笔记(7)——求和函数总结
    python经常要用到各种求和,例如列表求和,元素求和,利用函数求和,将这些方法总结发给大家!1.python两个数的求和函数defsum_2_num(num1,num2):result=num1+num2returnresult#必须在执行行输入,函数命名后必须调用,调用sum_2_num(),或者print()#sum_2_num(10,20......
  • python函数 学习第二部分
    函数大纲:六、函数说明文档#定义函数,进行文档说明defadd(x,y):"""函数说明:paramx:参数x表示其中一个加数:paramy:参数y表示另一个加数:return:返回两数相加的结果"""result=x+yreturnresultr=add(5,6)print(r)......
  • 自定义Python实用函数-返回指定目录及其子目录和指定文件扩展名的文件清单列表
    importosdefget_files(file_path,image_types_set=()):"""返回指定目录及其子目录下、指定文件扩展名的文件清单列表。若image_types_set参数为空,则返回图片文件清单列表。若image_types_set参数为['.*'],则返回所有文件清单列表。"""filenames......
  • mysql函数练习题
    ......
  • php中date() 函数
    实例格式化本地日期和时间,并返回格式化的日期字符串:<?php//Printsthedayechodate("l")."<br>";//Printstheday,date,month,year,time,AMorPMechodate("ljSofFYh:i:sA");?>定义和用法date()函数格式化本地日期和时间,并返回格式化的日期字符串。......
  • MySQL多表联合查询&聚合函数应用实例
     DDL——学生表——成绩表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`......
  • Rust的函数__Function
    FunctionsareprevalentinRustcode.You’vealreadyseenoneofthemostimportantfunctionsinthelanguage:the main function,whichistheentrypointofmanyprograms.You’vealsoseenthe fnkeyword,whichallowsyoutodeclarenewfunctions.函数在......
  • 作业 函数-sqrt应用
    #include<iostream>#include<cmath>usingnamespacestd;intmain(){ intn; cin>>n; if(sqrt(n)==(int)sqrt(n)){ cout<<"yes"; return0; } cout<<"no"; return0;}#include<iostream>#includ......
  • Oracle分析函数- count()/sum() over(partition by 分组 order by 排序) 详解
    优点:代码简单明了,并且执行效率高,(不影响总的记录数)如果不用这种函数去写,按照平时我们的思路首先想到的可能是子查询,那么将至少会走4次以上的全表扫描:(1)每个订单中产品数量大于3的产品至少1个(003,004)(2)每个订单中折扣标志为'1'的产品至少有2个(002,004)(3)每个订单......
  • 【猜数字游戏】-C语言循环的应用及扩展函数的使用
    一、扩展函数的应用1.rand()生成随机数rand()函数需要引用一个头文件:#include<stdlib.h>intrand(void)//int代表返回一个整数,void代表无参数rand()无参数,会返回一个伪随机数,范围是0-RAND_MAX,这个RAND_MAX的大小依赖于编译器,大部分编译器上是32767rand()函数用法展......