Почему мой массив символов не распечатывается на C?

У меня есть эта программа, которая пытается преобразовать строку символов в другую базу без использования atoi. Почему вывод не печатается в конце? Текст «Вывод:» печатается, но после него ничего нет.

Код, кажется, работает до этого момента. Я пошел дальше и добавил нулевой байт.

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

void Int(char* numstring, int base) {

    char *digitPtr = numstring;
    char ans[100];

    int decVal = 0;
    int totalVal = 0;

    int numDigits = 0;

    // Go through the entire string to get the decimal value of the number.

    while (*digitPtr != '\0') {
        numDigits++;
        digitPtr++;
    }

    // Now calculate decimal value of the string.

    printf("before decimal value calc \n");
    //  *digitPtr = numstring;

    int length = numDigits;

    numDigits--;

    printf("numDigits: %d \n", numDigits);

    
    for (int i = 0; i < length; i++)
    {
        printf("calcuating the dec \n");
        decVal = (*numstring - 48);
        printf("dec Value: %d \n", decVal);
        printf("power: %f \n", pow(10, numDigits));     

        totalVal = totalVal + decVal *  pow(10, numDigits);

        printf("totalVal %d \n", totalVal);
        numDigits--;
        numstring++; 
    }

    //*digitPtr = numstring;
    numDigits = length;

    printf("totalVal %d \n", totalVal);

    while (totalVal > 0) {
        int remainder = totalVal % base;
        printf("remainder: %d \n", remainder);
        totalVal = totalVal / base;
        ans[numDigits] = remainder;
        numDigits--;
    }

    ans[99] = '\0'; 

    printf("Output: %s \n", ans); 
}

int main() {
ans[numDigits] = remainder + '0'
vgru 14.12.2020 22:34

Кроме того, использование numDigits в качестве индекса выглядит неправильно. Например, если есть одна цифра, она будет сохранена в ans[1] вместо ans[0]. ans[99] = '\0'; также неверен, так как он помещает NUL в конец массива, а не в конец последовательности цифр - в результате после цифр появляется мусор, который printf попытается проанализировать как часть строки.

kaylum 14.12.2020 22:41

В любом случае, если вы не делаете функцию в качестве домашнего задания, вы можете использовать strtol

anotherOne 14.12.2020 22:50

Я получил уведомление о том, что вы сказали, что это не домашнее задание. (Но потом вы удалили комментарий) В этом случае вам действительно не нужно изобретать велосипед.

anotherOne 14.12.2020 23:11

Да, это не домашняя работа, а «вызов», в котором вы не должны использовать эти функции.

Bob Bobson The Third Esq. 14.12.2020 23:16

В качестве общего примечания:(*numstring - 48); Не используйте магические числа. Если вы имеете в виду '0', напишите '0' не какое-то числовое значение, которое зависит от кодировки символов, и большинство людей должны сначала искать в диаграмме ASCII.

Gerhardh 15.12.2020 11:45

@Groo Хорошо, это что-то печатает .... но почему?

Bob Bobson The Third Esq. 15.12.2020 14:31

@BobBobsonTheThirdEsq.: Я не слишком много анализировал код, но так же, как вы вычли 48 (код ascii для «0») из символа ascii при преобразовании в числовое значение, вам придется добавить 48 при обратном преобразовании . Но есть несколько других ошибок с кодом, и я бы рекомендовал разделить этот код на две отдельные функции, а затем протестировать их по отдельности.

vgru 15.12.2020 15:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
439
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Он ничего не печатает, потому что вы присваиваете числовое значение остатка char, но вы не учитываете, что числа начинаются с 48 (то есть '0') в таблице ASCII, поэтому вы должны добавить «начало point" к вашему остатку:

ans[numDigits] = remainder + '0';

Тем не менее, есть еще одна проблема: вы присваиваете длину входного значения numDigits перед циклом while, но длина числа, вероятно, не будет такой же, как длина числа в новой базе (например, Число 32 по основанию 10 состоит из двух цифр, а по основанию 2 — еще на четыре цифры). Решение может состоять в том, чтобы заставить numDigits начинаться с 0, увеличивать его после каждой итерации и печатать строку символ за символом в обратном порядке. В качестве альтернативы математический подход для получения количества цифр числа в пользовательской базе прибавляет единицу к округленному логарифму числа в пользовательской базе. Для этого вы можете использовать свойства логарифма, поскольку стандартные библиотеки C предоставляют журналы только в базе 2, e и 10.

numDigits = (int)(floor(log(totalVal) / log(base) + 1);

Следуя этому подходу, вам не нужно менять свой цикл, и вы можете распечатать результат в виде строки.

Обратите внимание, что вы не должны устанавливать ans[99] на '\0';, так как между преобразованным числом и концом строки может быть мусор; вместо этого вы должны установить его на numDigits. Вы также можете инициализировать ans значением 0 (что является числовым представлением \0), чтобы забыть о ручной установке терминатора.

Другие вопросы по теме