繁体   English   中英

为什么在输入 4*x 或更多符号时出现此代码错误? 将 16 位数字转换为 10 位数字

[英]Why this code error when entering a 4*x symbol number or more? Converting a 16 digit number into 10 digit number

-程序将数字(16)的值作为一串字符(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)

-根据字符表转码为正确的值

- 将值转换为十进制


但是...如果:

在: A | 出局:10 (+)

在: AA | 输出:170(+)

在:AAA| out: ...忘记答案但是 (+)

!!! 在:AAAA| 输出:错误(-)

为什么?

#include <STDIO.H>
#include <CONIO.H>
void main()
{
    char m[100];                                // init massive chars [m] 
    gets(m);                                    // input massive [m] (16 digit number)
    int i = -1;                                 // init counter for [m] (-1 for start [i++] in 0 pos)

    while (m[i++]);                             // go to last postion in [m] and count length
    i--;                                        // step back for skip '\0'
    i--;                                        // step back for start position last char
    int s = 0;                                  // init sum  number (10 digit number)
    int v = 1;                                  // init multiplier

    while (i >= 0)                              // it is first char?
    {
        if ((m[i] >= 'A') && (m[i] <= 'F')) s += ((int)(m[i]-55) * v); // if char 'A'(65) char = (10)  * multiplier
        else s += ((int)(m[i]) * v);                                // else char 1,2,3,4,5... (1,2,)* multiplier
        v *= 16;                                // up multiplier power
        i--;                                    // char step back
    }
    printf("%i", s);                            //out sum
}

评论后编辑后:

char m[100];
gets(m);
int i = 0;       // * "=-1" -> "0"
while (m[++i]);  // * "i++" -> "++i"
i--;

double s = 0; int v = 1;
while (i >= 0)
{
  if ((m[i] >= 'A') && (m[i] <= 'F'))  s += ((int)(m[i]-55) * v);
  if ((m[i] >= '0') && (m[i] <= '9'))  s += ((int)(m[i]-48) * v); //add this rules

  v *= 16;
  i--;
}

printf("%lf", s);

+带有输出结果12 的图像

评论后编辑后:

char m[100];
gets(m);
for (int i = 0; m[i] != '\0'; i += 1); // * 

unsigned long int s = 0; unsigned long int v = 1;    // *
for (int u = 0; u < i; u += 1)
{
  if ((m[u] >= 'A') && (m[u] <= 'F'))  s += ((int)(m[u]-55) * v); 
  if ((m[u] >= '0') && (m[u] <= '9'))  s += ((int)(m[u]-48) * v);

  v *= 16;
}

printf("%lu", s);                      // *

我应该从 0 开始,而不是 -1。

您还没有注意到它,但是您的数学计算对于数字 0 到 9 是错误的。

如果您希望所有输出对于 16 个十六进制字符都是正数,您需要一个无符号 64 位整数(但是这在您的平台/编译器上实现)并且您需要打印 unsigned long(即不是 %i/%d)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM