如何以C程序的相反顺序打印字符数组

How to print character array in reverse order of C program

#include <stdlib.h>
#include <stdio.h>
#define SIZE 25

int main (void)
{

        int d, b, c;

        printf(" Enter an integer and press 'enter':\n");
        scanf("%d" , &d);
        printf(" Enter the desired base and press 'enter':\n");
        scanf("%d" , &b);

        if (b < 2) {

                printf(" Your base is to low! \n")
        } else {

                while (d != 0) {

                        int radix;
                        radix = d % b;
                        d = d / b;
                        char basechars[] = "0123456789ABCDEF";

                        printf("%c" , basechards[radix]);
                }
        }
        return 0;
}

此程序提示用户输入小数点和基数,以将该小数点转换为已选择的基数。然而,转换以相反的顺序打印,我需要它定期打印。示例:输入:112,然后输入16,结果是07而不是70。

您可以将每个数字存储在一个数组中:

} else {
    char arr[32];
    int counter = 0;
    while (d != 0) {
        int radix;
        radix = d % b;
        d = d / b;
        char basechars[] = "0123456789ABCDEF";
        arr[counter++] = basechars[radix];
    }
    if (counter == 0)
        arr[counter++] = '0';
    arr[counter++] = '[=10=]';
    print_rev(arr);
    printf("\n");
}

然后使用递归函数打印字符串(它将反转输出):

void print_rev(const char *s)
{
    if (*s) {
        print_rev(s + 1);
        printf("%c", *s);
    }
}

或直接:

} else {
    char arr[32];
    int counter = 0;
    while (d != 0) {
        int radix;
        radix = d % b;
        d = d / b;
        char basechars[] = "0123456789ABCDEF";
        arr[counter++] = basechars[radix];
    }
    if (counter == 0) {
        printf("0");
    else {
        while (counter--)
            printf("%c", arr[counter]);
    }
    printf("\n");
}

此版本进行动态内存分配,因此您不必事先指定转换字符串的长度。

数字可以任意大,这在二进制转换中尤其重要。我还检查了基数 16,这是上限。

int main (void)
{

        int d, b, c, i = 1;
        char *converted = malloc(i);
        printf(" Enter an integer and press 'enter':\n");
        scanf("%d" , &d);
        printf(" Enter the desired base and press 'enter':\n");
        scanf("%d" , &b);

        if (b < 2) {

                printf(" Your base is to low! \n");
                return 1;

        } else if (b > 16) {

                printf(" Your base is to high! \n");
                return 1;

        } else {

                while (d != 0) {

                        int radix;
                        radix = d % b;
                        d = d / b;
                        char basechars[] = "0123456789ABCDEF";
                        converted = realloc(converted, i++);
                        *(converted +i - 1) = basechars[radix];

                }
        }
    i--;
    while(i != 0) {
        printf("%c", converted[i]);
        --i;
    }
    free(converted);
    printf("\n");

    return 0;
}    
  1. 反转数组是最直接的方法。
  2. 使用 limit.h 宏 LONG_BIT 了解需要存储的最大字符数。这会调整您的数组大小。
  3. 我也在检查 16 上限的基数。
  4. 构建数组,然后打印它。请注意,它可以很好地处理 0。
  5. 你还忘记了负数。

    } else if (b > 16) {
        printf(" Your base is too high! \n");
    } else {
        const char basechars[] = "0123456789ABCDEF";
    
        char arr[LONG_BIT];  // d is an integer, so LONG_BIT holds
                     // enough characters for a binary representation.
        int counter = 0;
        int negative_flag = 0;
    
        if (d < 0) {
            d = -d;
            negative_flag = 1;
        }
    
        do {
            int digit = d % b;
            d = d / b;
    
            arr[counter++] = basechars[digit];
         } while (d != 0);
    
         if (negative_flag) {
            printf ("-");
         }
    
         while (counter--) {
             printf ("%c", arr[counter]);
         }
         printf ("\n");
     }
    

提供递归方法。

确定是否需要从较高有效数字打印额外的chars,递归调用辅助函数,然后然后打印数字最低有效数字。

代码应注意将“0”作为有效输入处理。下面使用负值来很好地处理 INT_MIN.

static void PrintDigits(int x, int base) {
  static const char basechars[] = "0123456789ABCDEF";
  if (x <= -base) {
    PrintDigits(x/base, base);
  }
  putchar(basechars[-(x%base)]);
}

void PrintInt(int x, int base) {
  if (base < 2 || base > 16) {
    printf(" Your base is out of range! \n");
  } else {
    if (x < 0) putchar('-');
    else x = -x;
    PrintDigits(x, base);
  }
  putchar('\n');
}

int main(void) {
  PrintInt(65535, 16);
  PrintInt(65535, 10);
  PrintInt(65535, 2);
  PrintInt(INT_MAX, 10);
  PrintInt(0, 10);
  PrintInt(-1, 16);
  PrintInt(INT_MIN, 10);

  int d, b;
  printf(" Enter an integer and press 'enter':\n");
  scanf("%d" , &d);
  printf(" Enter the desired base and press 'enter':\n");
  scanf("%d" , &b);
  PrintInt(d, b);
  return 0;
}

FFFF
65535
1111111111111111
2147483647
0
-1
-2147483648

即使以2为底,递归深度也不会超过int的位宽。