无法在C程序中拆分数组

Can't split array in C program

我试图将我的 32 位字符数组拆分为 2 个 16 位数组,但它给出了超过 16 位的奇怪输出。对此有任何帮助。

#include <stdio.h>
#include <string.h>
#include "hexb.h"
#include "flr.h"


int main()
{   int i,j,k;  
    char inbit[20];
    char fdata[31],coeff[15],signb[15];
    printf("Enter X(n) data file with extension: ");
    scanf("%s",inbit);
    //strcpy(inbit,flr);
    printf(" Data in file :%s\n", flr(inbit));
    //printf(" Hex conversion : %s\n", hexc(flr(inbit)));
    strcpy(fdata,"11001101001011011001000101001000");
    printf(" Hex conversion : %s\n", fdata);
    memcpy(signb, fdata, 16);
    memcpy(coeff, fdata +16, 16);
    //signb[15] = fdata[15];
    //coeff[15] = fdata[31];
    printf(" part1  signbit : %s\n", signb);
    printf(" part2 valuebit : %s\n", coeff); return (0);}

竟然输出超过16位

Enter X(n) data file with extension: coeff.in
Data in file :CD2D9148
 Hex conversion : 11001101001011011001000101001000
 part1  signbit : 1100110100101101coeff.in
 part2 valuebit : 10010001010010001100110100101101coeff.in

这是解决方案

char fdata[33],coeff[17],signb[17];
printf("Enter X(n) data file with extension: ");
scanf("%s",inbit);
//strcpy(inbit,flr);
printf(" Data in file :%s\n", flr(inbit));
//printf(" Hex conversion : %s\n", hexc(flr(inbit)));
strcpy(fdata,"11001101001011011001000101001000");
printf(" Hex conversion : %s\n", fdata);
memcpy(signb, fdata, 16);
memcpy(coeff, fdata +16, 16);
signb[16] = '[=10=]';
coeff[16] = '[=10=]';

首先,这一行

strcpy(fdata,"11001101001011011001000101001000");

导致缓冲区溢出,因为 fdata(数组大小 31)小于您的源字符串。

同样

memcpy(signb, fdata, 16);
memcpy(coeff, fdata +16, 16);

正在使用太小的目标缓冲区,无法接收您尝试复制到它们的 daya 数量 - signbcoeff 是大小为 15 的数组,但您正在尝试复制16 个字节。如果不调用未定义的行为,则无法读取或写入超出数组范围的内容。

一旦你调用了未定义的行为,就没有必要试图解释你得到的结果。您需要相应地调整数组的大小,以便它们足够大以满足您的要求 - 这包括允许将它们用作字符串所需的终止空字符。

数组对于所需的内容来说太小了一个字符(您必须指定元素的数量,而不是最后一个有效索引的数量)。此外,您忘记了 C 字符串所需的 NUL 终止符。因此,首先将数组扩大两个条目:

char fdata[33],coeff[17],signb[17];

然后你必须将 '[=11=]' 附加到 memcpy 之后的两个较小的数组,因为它们不知道。

这是因为 printf 需要有效的字符串。

请注意,使用 scanf 读取字符串是不安全的,因为用户输入不受限制。这导致未定义的行为(变体"buffer overflow",经典错误)。要么用 fgets 读取字符串(出于同样的原因不要使用 gets),或者限制 scanf 中的长度(我会把正确的格式字符串语法留给你) .