【问题标题】:Adding hex values from char input in c从c中的char输入添加十六进制值
【发布时间】:2018-11-04 20:15:33
【问题描述】:

我必须编写一个程序,从文件中获取字符输入,生成它们的十六进制值并将它们的十六进制值相加(8 位校验和)。

输入:

while(fscanf(ifp, "%c", buffer) != EOF)
{
    input[i] = *buffer;

    printf("%02x", input[i]);
    i++;
}

例如,如果输入是“a”,那么初始输出应该是:610a(0a 表示换行符) 将它们加在一起后,您得到 6b。 加上“aa”,初始输出应该是:61610a 和“cc”作为加法的结果。

到目前为止,我已经编写了一个程序,可以逐个字符地读取并存储它。然后我做了一个递归函数把字符加在一起

char addChar(char *input, int i, int size ) {
   if( i == size ) {
      return 0;
   }
   return input[i] + addChar(input, i+1, size);
}

然后我打印。

printf("%02x\n", addChar(input, i, size)));

但是当我运行程序时,我总是在一些输出前得到一堆 f。我知道这是将它们加在一起的溢出,但我该如何摆脱它。

输入:a、aa、aaa、aaaa、aaaa

[终端输出][1]

MacbookPro:CheckSum $ ./a.out i1.txt 8 610a 6b MacbookPro:CheckSum $ ./a.out i2.txt 8 61610a ffffffcc MacbookPro:CheckSum $ ./a.out i3.txt 8 6161610a 二维 MacbookPro:CheckSum $ ./a.out i4.txt 8 616161610a ffffff8e MacbookPro:CheckSum $ ./a.out i5.txt 8 61616161610a 呸呸呸

【问题讨论】:

  • 显示一个最小的完整示例程序。
  • 使用unsigned char addChar(char *input, int i, int size )
  • 发布完整代码包括main()函数
  • 将其更改为 unsigned char 解决了该问题。

标签: c hex checksum


【解决方案1】:

试试这个:

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

unsigned char addChar( const unsigned char * input, size_t i, size_t size ) {
   if( i == size ) {
      return 0;
   }
   return input[i] + addChar( input, i+1, size );
}

int main( int argc, char * argv[] ) {
   {
      unsigned char input[] = { 'a', '\n' };
      printf( "a    : %02x\n", addChar( input, 0, sizeof( input )));
   }
   {
      unsigned char input[] = { 'a', 'a', '\n' };
      printf( "aa   : %02x\n", addChar( input, 0, sizeof( input )));
   }
   {
      unsigned char input[] = { 'a', 'a', 'a', '\n' };
      printf( "aaa  : %02x\n", addChar( input, 0, sizeof( input )));
   }
   {
      unsigned char input[] = { 'a', 'a', 'a', 'a', '\n' };
      printf( "aaaa : %02x\n", addChar( input, 0, sizeof( input )));
   }
   {
      unsigned char input[] = { 'a', 'a', 'a', 'a', 'a', '\n' };
      printf( "aaaaa: %02x\n", addChar( input, 0, sizeof( input )));
   }
   (void)argc;
   (void)argv;
   return 0;
}

输出:

a    : 6b
aa   : cc
aaa  : 2d
aaaa : 8e
aaaaa: ef

【讨论】:

  • 这绝对可以帮助我理解更多,但是我从 cmd 行的 txt 文件中读取,所以它并不总是 a 、 aa 、 aaa 等。所以我只是删除该行在打印语句之前并正常继续?我正在更新原始帖子以显示我在输入中阅读的位置。
  • 实际上这非常有效。我唯一需要更改为原始代码的就是函数。我让它返回一个字符而不是无符号字符。我也将输入分配给 char 而不是 unsigned char。非常感谢!
猜你喜欢
  • 2022-12-20
  • 2011-10-28
  • 2020-03-17
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 2011-10-13
相关资源
最近更新 更多