C 从整数到字符的数字数组和打印

C 从整数到字符的数字数组和打印,c,arrays,C,Arrays,我在C语言中有一个整数,我想创建一个字符数组,每次使用模10插入最后一个数字。在那之后,我需要从末端到开始打印数组,以便以正确的顺序打印数字。我知道这听起来很奇怪,但我必须像这样做 但有些东西不起作用。数组创建得很好,但字符打印不起作用。这就是我所做的: int baseChange (int base, int newBase, int num) { int baseTen = toBaseTen(base, num); //give me a number on base 10

我在C语言中有一个整数,我想创建一个字符数组,每次使用模10插入最后一个数字。在那之后,我需要从末端到开始打印数组,以便以正确的顺序打印数字。我知道这听起来很奇怪,但我必须像这样做

但有些东西不起作用。数组创建得很好,但字符打印不起作用。这就是我所做的:

int baseChange (int base, int newBase, int num)
{
    int baseTen = toBaseTen(base, num); //give me a number on base 10
    char finalBase[24];
    int i;
    for (i = 0; baseTen != 0; i++)
    {
        int remain = baseTen % newBase;
        finalBase[i] = (char)(remain); //insert the last digit to the array
        baseTen /= newBase;
    }
    // Print finalBase from end to beginning in order to get the final number in the correct order:
    for (i--; i >= 0; i--)
    {
        printf("i is: %d... %c", i, finalBase[i]);
    }
    return SUCCESS_EXIT;
}

如果我在第一个for循环中打印
finalBase[I]
,我会得到正确的数字,但在那之后,第二个
for
循环不会打印任何内容。为什么?

你是整数到字符的类型转换,所以它会把你的<代码> int >代码作为一个字符的ASCII值。它会将该字符而不是数字添加到数组中。因此,尝试以下方法:

int baseChange (int base, int newBase, int num)
{
    int baseTen = toBaseTen(base, num); //give me a number on base 10
    char finalBase[24];
    int i;
    for (i = 0; baseTen != 0; i++)
    {
        int remain = baseTen % newBase;
        finalBase[i] = (char)(remain+48); //insert the last digit to the array
        baseTen /= newBase;
    }
    // Print finalBase from end to beginning in order to get the final number in the correct order:
    for (i--; i >= 0; i--)
    {
        printf("i is: %d... %c", i, finalBase[i]);
    }
    return SUCCESS_EXIT;
}
我改变了
finalBase[I]=(char)(保留)
最终数据库[i]=(字符)(保留+48)

因为ASCII中的数字以48开头,所以将48添加到循环中得到的每个数字中,这样就可以将其转换为
0-9
。就这样

第二个循环没有打印任何东西为什么

因为0-9中的ASCII不可打印,或者是空格和制表符


希望这对你有帮助

> p>您是整数类型的字符转换,因此它将把您的<代码> int >代码作为某个字符的ASCII值。它会将该字符而不是数字添加到数组中。因此,尝试以下方法:

int baseChange (int base, int newBase, int num)
{
    int baseTen = toBaseTen(base, num); //give me a number on base 10
    char finalBase[24];
    int i;
    for (i = 0; baseTen != 0; i++)
    {
        int remain = baseTen % newBase;
        finalBase[i] = (char)(remain+48); //insert the last digit to the array
        baseTen /= newBase;
    }
    // Print finalBase from end to beginning in order to get the final number in the correct order:
    for (i--; i >= 0; i--)
    {
        printf("i is: %d... %c", i, finalBase[i]);
    }
    return SUCCESS_EXIT;
}
我改变了
finalBase[I]=(char)(保留)
最终数据库[i]=(字符)(保留+48)

因为ASCII中的数字以48开头,所以将48添加到循环中得到的每个数字中,这样就可以将其转换为
0-9
。就这样

第二个循环没有打印任何东西为什么

因为0-9中的ASCII不可打印,或者是空格和制表符


希望这对你有帮助

int
char
的强制转换将保留第一个
char\u位
位,这是整数
中的第一个8位保持
,因为后者将包含数字(当然,对于基数小于10的模),所以强制转换后,它们将保留其值

您的问题是在ASCII表中打印等效数字

printf
函数中的
%c
说明符是指与ASCII表中的值等效的字符以及保存变量的内容

ASCII表中的前10个字符表示值
0
9
,相当于:

但数字字符的值从48到57(以10为基数/十进制):

因此,不是:

finalBase[i] = (char)remain;
您需要将其更改为:

finalBase[i] = remain + 48;

int
char
的转换将保留第一个
char\u位
位,该位是整数
中的第一个8位,保留为
,并且后者将包含数字(当然,对于基数小于10的模),因此转换后将保留其值

您的问题是在ASCII表中打印等效数字

printf
函数中的
%c
说明符是指与ASCII表中的值等效的字符以及保存变量的内容

ASCII表中的前10个字符表示值
0
9
,相当于:

但数字字符的值从48到57(以10为基数/十进制):

因此,不是:

finalBase[i] = (char)remain;
您需要将其更改为:

finalBase[i] = remain + 48;

当您执行
finalBase[i]=(char)(remaine)时,您没有将
remaine
转换为其
ASCII代码


如果您的
newBase
,则在执行
finalBase[i]=(char)(remaine)时,您没有将
remain
转换为它的
ASCII代码

如果您的
newBase
对于启动器是
,则此循环将启动

for (i = 0; baseTen != 0; i++)
{
    int remain = baseTen % newBase;
    finalBase[i] = (char)(remain); //insert the last digit to the array
    baseTen /= newBase;
}
不正确,因为通常变量
baseTen
的值最初可以等于0。在这种情况下,数组中不会写入任何内容

正确的循环可以如下所示

int i = 0;
do
{
    finalBase[i++] = baseTen % newBase;
} while ( baseTen /= newBase );
对于应该显示数字的第二个循环,则需要将数字的相应表示输出为字符

比如说

while ( i-- )
{
    printf( "i is: %d... %c\n", i,  finalBase[i] + '0' );
                                    ^^^^^^^^^^^^^^^^^^^^^               
}
while ( i-- )
{
    printf( "i is: %d... %d\n", i,  finalBase[i] );
                         ^^               
}
考虑到
int
类型的值可能为负值。您应该注意在数组中写下负值

'0'
'9'
的字符具有顺序代码。因此,例如,如果要将
1
添加到字符
'0'
,您将得到字符
'1'

也可以将数字输出为整数。比如说

while ( i-- )
{
    printf( "i is: %d... %c\n", i,  finalBase[i] + '0' );
                                    ^^^^^^^^^^^^^^^^^^^^^               
}
while ( i-- )
{
    printf( "i is: %d... %d\n", i,  finalBase[i] );
                         ^^               
}
或者最初可以将数组中的数字存储为字符

int i = 0;
do
{
    finalBase[i++] = '0' + baseTen % newBase;
} while ( baseTen /= newBase );
首先,这是一个循环

for (i = 0; baseTen != 0; i++)
{
    int remain = baseTen % newBase;
    finalBase[i] = (char)(remain); //insert the last digit to the array
    baseTen /= newBase;
}
不正确,因为通常变量
baseTen
的值最初可以等于0。在这种情况下,数组中不会写入任何内容

正确的循环可以如下所示

int i = 0;
do
{
    finalBase[i++] = baseTen % newBase;
} while ( baseTen /= newBase );
对于应该显示数字的第二个循环,则需要将数字的相应表示输出为字符

比如说

while ( i-- )
{
    printf( "i is: %d... %c\n", i,  finalBase[i] + '0' );
                                    ^^^^^^^^^^^^^^^^^^^^^               
}
while ( i-- )
{
    printf( "i is: %d... %d\n", i,  finalBase[i] );
                         ^^               
}
考虑到
int
类型的值可能为负值。您应该注意在数组中写下负值

'0'
'9'
的字符具有顺序代码。因此,例如,如果要将
1
添加到字符
'0'
,您将得到字符
'1'

也可以将数字输出为整数。比如说

while ( i-- )
{
    printf( "i is: %d... %c\n", i,  finalBase[i] + '0' );
                                    ^^^^^^^^^^^^^^^^^^^^^               
}
while ( i-- )
{
    printf( "i is: %d... %d\n", i,  finalBase[i] );
                         ^^               
}
或者最初可以将数组中的数字存储为字符

int i = 0;
do
{
    finalBase[i++] = '0' + baseTen % newBase;
} while ( baseTen /= newBase );

需要对编码进行假设总是一个麻烦的来源。为什么不使用简单的地图呢?无需对编码进行任何假设,您甚至可以对数字使用完整的Unicode范围(Whic