【问题标题】:strcat giving unexpected resultstrcat 给出意想不到的结果
【发布时间】:2011-10-11 13:01:58
【问题描述】:

这是一个大型项目的一小部分......

这些是项目标准头文件中定义的类型定义。

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 ???如果还有其他可能的方法,请告诉我!!!!提前谢谢...

【问题讨论】:

  • 如果您使用二进制文件,您应该避免使用strxxx 函数,更喜欢uint8_t* 而不是char*,同时避免使用.txt 扩展名。

标签: c file pointers binaryfiles hexdump


【解决方案1】:

为什么data2.txt的内容没有复制到data3.txt?

strcat 专门用于连接 C 字符串,并且只复制到空终止符为止。因此,一旦遇到它认为是字符串结尾的 00 ,它就会停止从源复制。注意 data2 是如何以 00 开头的,所以它立即停止。

您需要改为memcpy,目标是data3 中最后一个字节后的1,源是data2。如果data3(实际上是data1)没有足够的空间容纳data2,您还需要优雅地失败。

【讨论】:

  • 那么还有其他可用的功能可以执行该任务吗??
【解决方案2】:

我认为您可以更轻松地做到这一点,无需确保相应的内存块足够大。

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

【讨论】:

    【解决方案3】:

    您尝试将 data2 附加到 data1 的末尾。 您打算将结果放入第三个字符串 (data3),但实际上 data3 只是 data1;它们指向同一个位置。 你的代码相当于

     strcat (data1, data2);
    

    这当然会超出 data1 的结尾。 (还有另一个问题:如果函数的调用者使用“string_literal”作为参数#1, data1 将不可写。 )

    您可能必须为生成的字符串分配一些内存并将点 data3 指向它。

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 1970-01-01
      • 2019-05-19
      • 2017-01-05
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2021-04-22
      相关资源
      最近更新 更多