Вы говорите:
читать до конца, кроме последнего байта (который является контрольной суммой)
, но если я применяю :10C00000814202D8BFF32F8F10BD441C42E8004366
, ваш код
int a=0;
if((chunk[7] == '0') && (chunk[8] == '0')) {
size_t length = strlen(chunk);
while (a < (length-13)) {
sub[a]=chunk[9+a];
a++;
}
}
sub values 814202D8BFF32F8F10BD441C42E8004
, поэтому вы удаляете 366
в конце строки, а не только 66
Из вашего примечания
при определении массива символов с помощью функции mallo c (), какой размер мне следует указать, поскольку я не знаю точного размера?
Если вы хотите свернуть все подстроки в одной строке, один из способов - начать с массива размером 1 для нулевого завершающего символа, а затем увеличить его на строку в строке, используя malloc
. Например:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char ** argv)
{
if (argc != 2) {
fprintf(stderr, "Usage: %s <file>\n", *argv);
exit(1);
}
FILE *fp = fopen(argv[1], "rb");
if (fp == NULL) {
perror("Unable to open file!");
exit(1);
}
size_t sz = 0; /* without counting the char for \n */
char * finaldata = malloc(1);
char chunk[128];
while (fscanf(fp, " %127s", chunk) == 1) {
if((chunk[7] == '0') && (chunk[8] == '0')) {
if (strlen(chunk) != 43) {
fprintf(stderr, "unexpected line '%s'\n", chunk);
exit(1);
}
chunk[41] = 0; /* remove two last chars */
char * s = realloc(finaldata, sz + 32 +1); /* + block + \n */
if (s == NULL) {
fputs("not enough memory", stderr);
free(finaldata); /* for valgrind etc */
exit(1);
}
finaldata = s;
strcpy(finaldata + sz, chunk + 9);
sz += 32;
}
}
fclose(fp);
finaldata[sz] = '\0';
/* debug */
puts(finaldata);
free(finaldata); /* for valgrind etc */
return 0;
}
Я использую fscanf
, чтобы обойти возможные пробелы, включая новую строку, до и после части, которой нужно управлять. В формате " %127s"
обратите внимание на пробел перед '%' и 127, который равен 128 минус 1, чтобы оставить место для завершающего нуля символа.
Компиляция и выполнение:
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ cat f
:020000040200F1
:10C00000814202D8BFF32F8F10BD441C42E8004366
:020000040200F1
:10C00000123456789abcdef0123456789abcdef012
pi@raspberrypi:/tmp $ ./a.out f
814202D8BFF32F8F10BD441C42E80043123456789abcdef0123456789abcdef0
pi@raspberrypi:/tmp $