从c中的字符输入添加十六进制值

从c中的字符输入添加十六进制值,c,hex,checksum,C,Hex,Checksum,我必须制作一个程序,从文件中获取字符输入,生成它们的十六进制值,并将它们的十六进制值相加(8位校验和) 输入: while(fscanf(ifp, "%c", buffer) != EOF) { input[i] = *buffer; printf("%02x", input[i]); i++; } 例如,如果输入为“a”,则初始输出应为:610a(0a表示新行字符) 把这些加在一起,得到6b。 加上“aa”,初始输出应为:61610a和“cc” 到目前为止,我已经制

我必须制作一个程序,从文件中获取字符输入,生成它们的十六进制值,并将它们的十六进制值相加(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 61610A 二维 MacbookPro:CheckSum$./a.out i4.txt 8 6161610A ffffff8e MacbookPro:CheckSum$./a.out i5.txt 8 6161610A ffffffef 试试这个:

#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;
}

显示一个最小的完整示例程序。使用
unsigned char addChar(char*input,int i,int size)
post complete code include
main()
function将其更改为unsigned char修复了该问题。这肯定会帮助我了解更多,但im从cmd行从txt文件读入,因此它不会总是a,aa,aaa等。那么,我是否可以删除打印语句前的行,然后继续正常操作?我正在更新原始帖子,以显示我在输入中阅读的位置。实际上,这非常有效。我唯一需要更改原始代码的就是函数。我让它返回一个字符而不是未签名的字符。同时,我将输入赋值给char,而不是unsigned char。非常感谢你!
#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