Bill the eternal Ответов: 3

Я создал версию itob на языке C, но она не работает


Я попытался создать itob, функцию, которая превращает целое число в A в представление базового числа b, но всякий раз, когда я пытаюсь запустить ее, она выходит из строя. Есть идеи?
#include <stdio.h>


void itob(int j, int k[], int z);

int main(void)
{
	int a, b, i;
	int c[5];
	a = 5;
	b = 10;
	itob(a, c, b);
	printf("%s", c);
	return 0;
}

void itob(int n, int s[], int b)
{
	int i=0;
	do
	{
		if (n%b>=10)
		    s[i++]=(n%b-10)+'a';
		else
		    s[i++]=n%b-'0';
	}
	while (n/=b>0);
}


Что я уже пробовал:

Я пробовал использовать getchar и scanf, чтобы дать a и b, но после того, как я дал первое число, оно перестало работать.

3 Ответов

Рейтинг:
2

OriginalGriff

Ну ... поскольку нет никакой проверки, чтобы увидеть, вышли ли вы за пределы вашего выходного массива, а он всего 5 в ширину, это может вызвать его. Но он не будет работать должным образом, даже если вы остановите его сбой, учитывая это:

printf("%s", c);

Пытается напечатать весь Ваш массив целых чисел в виде строки, а это не так;t - вам понадобится цикл для печати каждого элемента по очереди.

Но это простая проблема: просто используйте отладчик и узнайте, что происходит.
Я понятия не имею, какую систему вы пытаетесь использовать, поэтому не могу дать вам явных инструкций, но поставьте точку останова в первой строке main и пройдите через свой код, глядя на содержимое переменной, чтобы точно узнать, что происходит.


Рейтинг:
2

BacchusBeale

Логика в itob неверна. Чтобы найти базовое число, вы можете либо продолжать находить остаток и делить, либо найти все степени этого базового числа и делить.
Главное, прежде чем программировать, нужно записать и обдумать процесс и разные случаи возникновения проблемы. В этом случае между 2-10 легко, но после 10 вам понадобится больше символов, например HEX.

#include <stdio.h>
#include <string.h>
#define N 100
int itob(int decimal, char *basenumber_out, int base, int size);

int main(void)
{
	int input, base, result;
	char c[N];
	memset(c,0,N);//make all null character
	input = 5;
	base = 2;
	result=itob(a, c, b, N);
	if(x<0) return -1;
	printf("%s", c);
	return 0;
}

int itob(int decimal, char *basenumber_out, int base, int size)
{
    if(base<=0) return -1;//impossible
    char backwards[N];
    int count=0;
    memset(backwards,0,N);//make all null character
    if(base<=10)
    {
        // find remainder
        // divide by base
        // store in backwards array
        // increment count
    }
    else
    {
        // if base>10
        // need alphabet characters instead of 0-9
    }

    //copy string in reverse to array
	return 0;
}


Рейтинг:
0

Patrice T

Из кода это выглядит более логичным, чтобы иметь s как массив символов.
Это было бы более согласовано с предыдущей строкой

s[i++]=n%b+'0';


Считается хорошей практикой использовать те 2 линии, которые совпадают
void itob(int j, int k[], int z);
void itob(int n, int s[], int b)


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

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.

Совет: возьмите лист бумаги и попробуйте сделать это вручную, ваша программа должна использовать ту же процедуру.