关于atoi和strtol函数

避免使用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类似

你可能感兴趣的:(c语言)