strcat дает неожиданный результат - PullRequest
2 голосов
/ 11 октября 2011

Это очень маленькая часть большого проекта ...

Это typedefs, определенные в стандартном заголовочном файле для проекта.

typedef uint16_t u_int16_t;
typedef uint32_t u_int32_t;
typedef uint8_t  u_int8_t;

Теперь это фактическая функция, вызывающаяпроблема ...

void function(u_int8_t *data1, u_int32_t data1len,
    u_int8_t *data2, u_int32_t data2len)
{

FILE *fq,*fr,*fs;
    char *data3;
    int data3len;

    data3len=data1len+data2len;

    printf("\n%d",data1len);
    printf("\n%d",data2len);
    printf("\n%d",data3len);

fq=fopen("data1.txt","wb");
fwrite((char *)data1,data1len,1,fq);

fr=fopen("data2.txt","wb");
fwrite((char *)data2,data2len,1,fr);

data3=(char *)data1;
strcat(data3,(char *)data2);

fs=fopen("data3.txt","wb");
fwrite((char *)data3,data3len,1,fs);

}

Некоторые выходные снимки ...

40
14
54


 udit@udit-Dabba ~$ hexdump -C data1.txt
 00000000  60 00 00 00 00 8c 06 00  00 00 00 00 00 00 00 00  |`...............|
 00000010  00 00 00 00 00 00 00 01  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 02                           |........|
 00000028

 udit@udit-Dabba ~$ hexdump -C data2.txt
 00000000  00 26 00 26 00 00 00 01  00 00 00 02 34 12 00 65  |.&.&........4..e|
 00000010  00 34 00 00 61 62 63 64                           |.4..abcd|
 00000018

 udit@udit-Dabba ~$ hexdump -C data3.txt
 00000000  60 00 00 00 00 8c 06 00  00 00 00 00 00 00 00 00  |`...............|
 00000010  00 00 00 00 00 00 00 01  00 00 00 00 00 00 00 00  |................|
 00000020  00 00 00 00 00 00 00 02  00 78 f8 65 00 00 00 02  |.........x.e....|
 00000030  f4 1f 96 00 18 34 a6 bf  1c 03 96 00 88 f1 90 08  |.....4..........|
 00000040

Почему содержимое data2.txt не копируется в data3.txt ???Если есть какой-то другой способ, пожалуйста, скажите мне !!!!Спасибо заранее ...

Ответы [ 3 ]

3 голосов
/ 11 октября 2011

Почему содержимое data2.txt не копируется в data3.txt?

strcat специально для объединения строк C и копируется только до нулевого символа-терминатора.Таким образом, он прекращает копирование из источника, когда встречает 00, который считает концом строки.Обратите внимание, что data2 начинается с 00, поэтому он немедленно останавливается.

Вместо этого вам нужно будет memcpy , где пункт назначения находится на 1 после последнего байта в data3, а источник data2.Вам также нужно будет изящно потерпеть неудачу, если data3 (что на самом деле data1) не имеет достаточно места для хранения data2.

2 голосов
/ 11 октября 2011

Я думаю, что вы могли бы сделать это намного проще, избавив вас от того, что соответствующий блок памяти достаточно большой.

void function(u_int8_t *data1, u_int32_t data1len,
    u_int8_t *data2, u_int32_t data2len)
{
    FILE *fq,*fr,*fs;
    char *data3;

    fq=fopen("data1.txt","wb");
    fwrite((char *)data1, data1len, 1, fq);
    fclose(fq);

    fr=fopen("data2.txt","wb");
    fwrite((char *)data2, data2len, 1, fr);
    fclose(fr);

    fs=fopen("data3.txt","wb");
    fwrite((char *)data1, data1len, 1, fs);
    fwrite((char *)data2, data2len, 1, fs);
    fclose(fs);
}
0 голосов
/ 11 октября 2011

Вы пытаетесь добавить данные2 в конец данных1.Вы намереваетесь поместить результат в третью строку (data3), но фактически data3 - это просто data1;они указывают на то же место.Ваш код эквивалентен

 strcat (data1, data2);

, который, конечно, записывает после конца data1.(есть другая проблема: если вызывающая функция использует «string_literal» в качестве аргумента # 1, data1 не будет доступен для записи.)

Возможно, вам придется выделить некоторую память для полученной строки и указать точку data3к этому.

...