无法在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 数量 - signb
和 coeff
是大小为 15 的数组,但您正在尝试复制16 个字节。如果不调用未定义的行为,则无法读取或写入超出数组范围的内容。
一旦你调用了未定义的行为,就没有必要试图解释你得到的结果。您需要相应地调整数组的大小,以便它们足够大以满足您的要求 - 这包括允许将它们用作字符串所需的终止空字符。
数组对于所需的内容来说太小了一个字符(您必须指定元素的数量,而不是最后一个有效索引的数量)。此外,您忘记了 C 字符串所需的 NUL 终止符。因此,首先将数组扩大两个条目:
char fdata[33],coeff[17],signb[17];
然后你必须将 '[=11=]'
附加到 memcpy
之后的两个较小的数组,因为它们不知道。
这是因为 printf
需要有效的字符串。
请注意,使用 scanf
读取字符串是不安全的,因为用户输入不受限制。这导致未定义的行为(变体"buffer overflow",经典错误)。要么用 fgets
读取字符串(出于同样的原因不要使用 gets
),或者限制 scanf
中的长度(我会把正确的格式字符串语法留给你) .
我试图将我的 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 数量 - signb
和 coeff
是大小为 15 的数组,但您正在尝试复制16 个字节。如果不调用未定义的行为,则无法读取或写入超出数组范围的内容。
一旦你调用了未定义的行为,就没有必要试图解释你得到的结果。您需要相应地调整数组的大小,以便它们足够大以满足您的要求 - 这包括允许将它们用作字符串所需的终止空字符。
数组对于所需的内容来说太小了一个字符(您必须指定元素的数量,而不是最后一个有效索引的数量)。此外,您忘记了 C 字符串所需的 NUL 终止符。因此,首先将数组扩大两个条目:
char fdata[33],coeff[17],signb[17];
然后你必须将 '[=11=]'
附加到 memcpy
之后的两个较小的数组,因为它们不知道。
这是因为 printf
需要有效的字符串。
请注意,使用 scanf
读取字符串是不安全的,因为用户输入不受限制。这导致未定义的行为(变体"buffer overflow",经典错误)。要么用 fgets
读取字符串(出于同样的原因不要使用 gets
),或者限制 scanf
中的长度(我会把正确的格式字符串语法留给你) .