【问题标题】:itoa function does not work for single digit integers [closed]itoa 函数不适用于个位数整数 [关闭]
【发布时间】:2013-04-28 00:47:51
【问题描述】:

我有一个自定义 itoa 函数,它适用于 10 和更大的整数,但由于某种原因,如果传递的整数是单个数字,它不会返回任何内容。我似乎无法弄清楚为什么会这样。

当我通过简单地访问array[0]array[1] 来反转数组后打印数组时,我看到一个空值和那个单个数字打印得很好,但是在单个数字之后有一些奇怪的尾随字符。这只发生在单个数字上。 例如(blank)7e(blank)4r

功能:

 char* customitoa(int number, char * array, int base){

array[0] = '\0';

    int quotient = number, i = 1;   

/* stores integers as chars into array backwards */ 

    while(quotient != 0){
            int temp, length = 1;
            temp = quotient % base;

            length++;
            array = realloc(array, (length)*sizeof(char));

            if (temp <= 9){
                array[i++] = (char)(((int)'0')+temp);
                } else {
                array[i++] =  (char)(temp + ('A' - 10));
                }
            quotient = quotient / base;

        }

/* reverse array*/ 
int j; int k;
    k = 0;
    j = i - 1;
    char temp;
/* - different swap functions based on odd or even sized integers */
    if( (j%2) == 1){

        while((k <= ((j/2)+1))){ 
            temp = array[k];
            array[k] = array[j];
            array[j] = temp;
            k = k+1;
            j = j - 1;
            }
        } else {
            while(k <= (((j)/2))){ 
                temp = array[k];
                array[k] = array[j];
                array[j] = temp;
                k = k+1;
                j = j - 1;
            }
        }

    return array;
    }

函数在这个上下文中被调用:

char *array;
array = malloc(length*sizeof(char));

array = myitoa(number, array, base);

printf("%s", array);

free(array);

【问题讨论】:

  • sizeof(char)1
  • 奇偶字符串的反转码应该相同。如果char *beg 指向第一个数字,char *end 指向最后一个数字,那么while (beg &lt; end) { char tmp = *beg; *beg++ = *end; *end-- = tmp; } 应该可以解决问题。或者,如果int i = 0; 是第一个数字的索引并且int k 包含最后一个数字的索引,那么while (i &lt; k) { char tmp = array[i]; array[i++] = array[k]; array[k--] = tmp; } 应该这样做。

标签: c arrays char itoa


【解决方案1】:
while(quotient != 0){
    int temp, length = 1;

在此循环中长度始终为 1。

改成

int length = 1;
while(quotient != 0){
    int temp;

realloc 在最后执行一次

array = realloc(array, (length)*sizeof(char));

移出while循环

}//while end
array = realloc(array, (length)*sizeof(char));

下列条件不正确

while((k <= ((j/2)+1))){ 
....
while(k <= (((j)/2))){

改成

int L = j/2;
...
while(k <= L){ 
...
while(k <= L-1){ 

总结起来

if( j%2 == 1)
    L=j/2;
else
    L=j/2-1;
while(k <= L){ 
    temp = array[k];
    array[k] = array[j];
    array[j] = temp;
    k = k+1;
    j = j - 1;
}

【讨论】:

    猜你喜欢
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2017-01-22
    • 1970-01-01
    • 2012-10-19
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多