C语言 我怎么能让它只带我到16?[关闭]

eufgjt7s  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(164)

**已关闭。**此问题需要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

n9vozmp4

n9vozmp41#

您没有检查fgetc的返回值是否为EOF或非数字。因此,数字末尾的换行符和EOF指示将被视为“数字”,您将获得两个额外的虚假“数字”

相关问题