如何求和十六进制字符串

时间:2019-02-11 11:18:02

标签: c

我从用户那里读取了一个十六进制字符串,然后我需要计算数字的总和(将它们分组在一起)并显示结果。我不明白为什么结果不准确。

printf("Enter a string:\n");
char str[38];
scanf("%s", str);

char hex [] = {"00"};
int sum = 0; 
int i = 0;
int j = 0;
for (i = 0, j = 1 ; i < 37, j<38; i ++, j++){
    hex[0]= str[i];
    hex[1] = str[j];
    sum += (int) strtol(hex, NULL, 16);
}
printf("%x", sum);

我输入了以下字符串:

137AF00A0D

...应该这样计算: 13 + 7A + F0 + 0A + 0A + 0D,但结​​果是3D8而不是19E。

你能帮我吗?

2 个答案:

答案 0 :(得分:2)

您想要这个:

  char hex[] = { "00" };

  int sum = 0;
  for (int i = 0; str[i] != 0; i += 2) {
    hex[0] = str[i];
    hex[1] = str[i + 1];
    sum += (int)strtol(hex, NULL, 16);
  }
  printf("%x", sum);

保持简单,不要使它变得不必要的复杂。

  1. 您不需要两个索引
  2. 您的结束条件是错误的,您要在输入字符串的末尾而不是在输入缓冲区的末尾停止。

答案 1 :(得分:1)

您的迭代是不必要的,也很不正确。您只需要一个迭代器,但是您应该在循环中每圈增加2个迭代器,因为您检查了2个字符。将代码简化为:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main (void)
{
  char str[] = "AABBCCDD";
  char hex[3] = {'\0'};

  unsigned int sum = 0; 
  unsigned int length = strlen(str);
  for (int i = 0; i<length; i+=2)
  {
    hex[0] = str[i];
    hex[1] = str[i+1];
    sum += strtol(hex, NULL, 16);
  }
  printf("%x", sum);
}

值得注意的是,对于错误的半字节数量,不正确的字符等,这没有错误处理。