【问题标题】:Convert integer input to digit using array in C使用C中的数组将整数输入转换为数字
【发布时间】:2020-12-10 03:03:39
【问题描述】:
#include <stdio.h>

void seperate(int intNum);

int main()
{
   int x;
   
   printf("Please enter an integer: \n");
   scanf("%d",&x);
   seperate(x);
}

void seperate(int intNum)
{
    int i,count=0;
    while (intNum!=0)
    {
        intNum/=10;
        ++count;  //to calculate the number of digits for user input = size of array
    }
    int array[count];   
    
    printf("The number on seperate line as follows:\n");

    for(i=count-1; i>=0; i--)
    {
        array[i]= intNum%10;
        intNum /= 10;
    }           
    for(i=0; i<=count-1; i++)
    {
        printf("%d\n", array[i]);
    }
}

预期输出(当数组大小固定时有效):

Please enter an integer:
42568
The number on separate line as follows:
4
2
5
6
8

输出:

Please enter an integer:
42568
The number on separate line as follows:
0
0
0
0
0

代码只有在数组大小固定的情况下才有效,如何解决这个问题?如果我创建一个数组而不声明大小,它不起作用吗?

编辑:变量intNum的值在while循环中改变,与数组的声明无关

【问题讨论】:

  • 进行基本调试。使用调试器甚至只调试打印语句来跟踪程序的执行。它与数组的声明无关。考虑intNum 的值在for 循环的开头是什么。如果您进行任何基本调试,您应该能够轻松发现这一点。
  • 这里有几个非常好的调试链接How to debug small programs,考虑与鸭子聊天,然后查看What is a debugger and how can it help me diagnose problems?
  • while (intNum!=0){ ... } 猜猜那个循环后intNum 的值。

标签: arrays c function


【解决方案1】:

您的 while 循环(用于计算位数)正在更改给定的 intNum 变量,该变量在循环结束时为零。

您应该复制intNum 并在第一个 (while) 循环中使用/修改它,如下所示:

void seperate(int intNum)
{
    int i, count = 0, temp = intNum; // Make a copy to use in the "count" loop
    while (temp != 0) {
        temp /= 10;
        ++count;  //to calculate the number of digits for user input = size of array
    }
    if (count == 0) count = 1; // To take care of the case when intNum == 0
    int array[count];

    printf("The number on seperate line as follows:\n");

    for (i = count - 1; i >= 0; i--) {
        array[i] = intNum % 10;
        intNum /= 10;
    }
    for (i = 0; i <= count - 1; i++) {
        printf("%d\n", array[i]);
    }
}

或者,您可以保存intNum 的值并在while 循环完成后恢复:

void seperate(int intNum)
{
    int i, count = 0, save = intNum; // Save the original value of intNum ...
    while (intNum != 0) {
        intNum /= 10;
        ++count;  //to calculate the number of digits for user input = size of array
    }
    intNum = save;                   // ... and restore it after counting the digits
    if (!count) count = 1;
    int array[count];
//...

编辑:有一个更简单和更短的解决方案,只有一个循环,使用sprintf 函数为您获取数字(按正确的顺序):

void seperate(int intNum)
{
    char output[100];// Should be long enough for the largest integer.
    sprintf(output, "%d", intNum);
    printf("The number on seperate line as follows:\n");
    for (char* cp = output; *cp; ++cp) {
        printf("%c\n", *cp);
    }
}

【讨论】:

  • seperate(0) 导致 int array[0]; 是 UB。
  • @chux 已编辑。负数也存在问题,但我将把它作为“读者练习”。现在。
  • 很好的修复。替代方案:如果代码使用do { } while 循环而不是while,则seperate(0) 案例将不需要if (count == 0) count = 1;
【解决方案2】:

你可以用一点数学来简化这个问题。首先,

#include <math.h>

那么,count的位数可以通过计算log10intNum来确定。你只需要一个循环。类似的,

void seperate(int intNum)
{
        printf("The number on seperate line as follows:\n");
        double log10 = log(10);
        while (intNum > 0) {
                int count = (int) (log(intNum) / log10);
                int pow10 = pow(10, count);
                int digit = (int) (intNum / pow10);
                printf("%d\n", digit);
                intNum -= digit * pow10;
        }
}

【讨论】:

  • intNum &lt;= 0intNum 接近 10 的幂且 (log(intNum) / log10) 为 xxx.99999 时,此方法会失败...由于通常的 FP 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 2018-10-07
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多