zoukankan      html  css  js  c++  java
  • 字符串面试题:将整型转换为字符串

    要求:将一个整型变量转换为给定基数(base)的以空字符结尾的字符串,并将结果保存在指定的数组中。

    分析:如果允许使用库函数的话,这个很好解决,因为在<stdlib.h>中存在一个可以将整型转换为字符串的函数,原型如下:

    char* itoa(int value, char* str, int base)

    value为待转换为字符串的整数,str为内存中存放转换结果的数组首地址,base是用字符串表示value的基数,取值范围为[2,36],返回值为最终转换结果的数组指针。

    注意:如果base=10并且转换的整数为负数,那么结果字符串中应该以负号('-')打头。其他情况下的value值总是视为非负数。str数组应该足够长,以能够容纳所有可能的结果。转换为字符串的结果中,表示2进制的字符串肯定是最长的,因为1个字节的整数需要用8位二进制来表示,所以数组的长度应该满足公式:

    sizeof(int) * 8 + 1

    最后一个字节用来存储字符串的结束符。例如,在16位平台下,需要17个字节来存储;在32位平台下,需要33个字节来存储。

    以下代码是我的一种实现:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 char* my_itoa(int value, char* str, int base);
     5 
     6 int main(void)
     7 {
     8     char str[33];
     9     int  num;
    10     scanf("%d", &num);
    11     my_itoa(num, str, 10);
    12     printf("%s
    ", str);
    13 
    14     return 0;
    15 }
    16 
    17 /**
    18 Converts an integer value to a null-terminated string using the specified base and stores the result in the array given by str parameter.
    19 
    20 If base is 10 and value is negative, the resulting string is preceded with a minus sign (-). With any other base, value is always considered unsigned.
    21 
    22 str should be an array long enough to contain any possible value: (sizeof(int)*8+1) for base=2, i.e. 17 bytes in 16-bits platforms and 33 in 32-bits platforms.
    23 */
    24 char* my_itoa(int value, char* str, int base)
    25 {
    26     char  tmp[33];     // 用于缓存转换结果的数组
    27     char* p_tmp = tmp; // 在缓存数组中移动的指针
    28     char* p_str;       // 在转换结果数组str中移动的指针
    29     int   i, sign;     // 判断是否需要添加负号
    30     unsigned v;        // 转换时始终视为正数处理 
    31     
    32 
    33     // 基数合法性判断, [2, 36]
    34     if (base > 36 || base <= 1)
    35     {// 参数错误,返回空指针
    36         return 0;// NULL
    37     }
    38 
    39     // 符号判断
    40     sign = (base == 10 && value < 0);
    41     if (sign)
    42         v = -value;//如果是负数,则将其转换为其绝对值
    43     else
    44         v = (unsigned)value;// 将有符号类型强制转换为无符号类型
    45 
    46     // 进行数制转换,存储顺序与实际顺序相反
    47     while (v || p_tmp == tmp)//p_tmp == tmp表示还未进行任何转换
    48     {
    49         i = v % base;//获取最低位
    50         v = v / base;//取整
    51         if (i < 10)//将数字转换为字符
    52             *p_tmp++ = i + '0';
    53         else//将大于9的数字转换为字母
    54             *p_tmp++ = i + 'a' - 10;
    55     }
    56 
    57     if (str == 0)// 如果存储结果的数组为空,则为其分配一个空间
    58         str = (char*)malloc((p_tmp-tmp) + sign + 1);
    59 
    60     p_str = str;// p_str指向结果数组
    61     if (sign)//如果为负数,需要添加负号
    62         *p_str++ = '-';
    63     // 将缓存的转换结果中的字符逆序写入到p_str中
    64     while (p_tmp > tmp)
    65         *p_str++ = *--p_tmp;
    66     *p_str = ''; // 添加字符串结束符
    67 
    68     return str;
    69 }
  • 相关阅读:
    ADO.NET 核心对象简介
    ASP.net 内置对象
    行内元素,块级元素与空元素
    ASP.net 常用服务器控件
    javaScript 基础知识
    点击超链接 唤醒企鹅添加好友代码
    使用CSS画出三角形
    NGUI实现的一套不同大小 Item 的循环滚动代码
    xlua怎么样hotfix C#中的重写方法???
    C# ---- GC中代的递增规律
  • 原文地址:https://www.cnblogs.com/xiaomanon/p/4655172.html
Copyright © 2011-2022 走看看