Добавление шестнадцатеричных значений из ввода символов в c - PullRequest
0 голосов
/ 04 ноября 2018

Я должен создать программу, которая берет входные данные из файла, генерирует их шестнадцатеричное значение и складывает их шестнадцатеричные значения вместе (8-битная контрольная сумма).

Ввод:

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

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

Например, если вход «a», начальный выход должен быть: 610a (0a для символа новой строки) После их сложения вы получите 6б. И с «aa» начальный вывод должен быть: 61610a и «cc» как результат сложения.

Пока что я создал программу, которая читает char-by-char и сохраняет ее. Затем я сделал рекурсивную функцию для добавления символов вместе

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 перед некоторыми результатами. Я знаю, что это переполнение от сложения их вместе, но как мне избавиться от этого.

Ввод: а, аа, ааа, аааа, ааааа

[Клеммный выход] [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

2d

MacbookPro:CheckSum $ ./a.out i4.txt 8

616161610a

ffffff8e

MacbookPro:CheckSum $ ./a.out i5.txt 8

61616161610a

ffffffef

1 Ответ

0 голосов
/ 04 ноября 2018

Попробуйте это:

#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
...