**已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
3天前关闭。
Improve this question
我用C写了这段代码,我需要它把数字增加到16,但它又执行了2个数字。
gcc /*
* Programa: decascii
* Fichero: decascii.c
* Histórico: Creado por X X X el 18/04/2023
* version 1.0.0
* Copyright © 2023 X X X. All rights reserved.
*/
/*
* PROGRAMA PRINCIPAL
* Entrada: fp fichero de caracteres con 0's y 1's.
* Requisitos: Ninguno
* Salida: El programa construye una secuencia de elementos del codigo ASCII mediante la interprentacion de los elementos de un fichero de caracteres.
*/
#include <stdio.h>
#include <math.h>
#define N 1000
typedef char tabla[N];
typedef struct numero_binario {
int num; //longitud del numero
tabla elementos;
} numero_binario;
typedef struct numero_ascii {
int num;
tabla elementos;
} numero_ascii;
void leer_numero (FILE *fp, numero_binario *numbin);
void decimal (numero_binario numbin, numero_ascii *numascii);
int main (void)
{
FILE *fp;
char nombre[100], res;
numero_binario numbin;
numero_ascii numascii;
printf ("Programa: deascii \n");
printf ("Autor: Rodrigo Martínez Roncero \n");
printf ("Fecha: 18/04/2023 (Version 1.0.0) \n");
printf ("Descripcion: El programa construye una secuencia de elementos del codigo ASCII mediante la interprentacion de los elementos de un fichero de caracteres. \n\n");
do
{
/*printf ("Introduce el nombre del fichero: ");
scanf ("%s", nombre);
while ((fp = fopen(nombre,"r"))==NULL)
{
printf("Introduce un nombre valido para el fichero: ");
scanf ("%s", nombre);
}*/
fp = fopen("numero_binario","r");
leer_numero(fp, &numbin);
printf("El numero encriptado es: %s \n", numbin.elementos);
decimal(numbin, &numascii);
printf("El numero desencriptado es: %s \n", numascii.elementos);
fclose(fp);
printf ("¿Desea continuar? (s/n): ");
scanf (" %c", &res);
printf("\n\n");
}
while (res == 's' || res == 'S');
return 0;
}
void leer_numero (FILE *fp, numero_binario *numbin)
{
int i;
char digito;
(*numbin).num = 0;
(*numbin).elementos[0] = '\0';
while(!feof(fp))
{
for(i = 0; i < 8; i = i + 1)
{
if (feof(fp))
{
break; //cerrar bucle si ha finalizado fichero
}
digito = fgetc(fp) - 48;
printf("%d---",digito);
(*numbin).elementos[(*numbin).num] = digito;
(*numbin).num = (*numbin).num + 1;
}
printf("x%dx",(*numbin).num);
}
(*numbin).elementos[(*numbin).num] = '\0';
return;
}
void decimal (numero_binario numbin, numero_ascii *numascii)
{
int i, ind, numdec;
char bit;
(*numascii).num = 0;
(*numascii).elementos[0] = '\0';
ind = 0;
while (ind < numbin.num)
{
numdec = 0;
for(i = 7; i > -1; i = i - 1)
{
bit = numbin.elementos[ind];
numdec = numdec + pow(2, i) * bit; //numdec ≠ 0 si bit = 1
ind = ind + 1;
}
printf("%dxxx",numdec);
(*numascii).elementos[(*numascii).num] = numdec;
(*numascii).num = (*numascii).num + 1;
}
(*numascii).elementos[(*numascii).num] = '\0';
return;
}
我试过改变
for(i = 0; i < 8; i = i + 1)
但是我找不到如何让它只带我到16我已经尝试了这么多的东西,但我不知道如何做到这一点。:/如果有人看到一些:)
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
1条答案
按热度按时间n9vozmp41#
您没有检查
fgetc
的返回值是否为EOF或非数字。因此,数字末尾的换行符和EOF指示将被视为“数字”,您将获得两个额外的虚假“数字”