Некоторые проблемы:
- вам нужна опция
-lm
для компоновщика, чтобы сообщить ему, где найти pow
функция last_index_of
написана неправильно,вы используете имя функции как внутреннюю переменную, вы можете исправить это следующим образом:
//Code to find the index of where the string ends
int last_index_of(char in_str[], char ch) {
int ret = 0;
for (int i = 0; i < MAX_LENGTH; i++) {
if(in_str[i] == ch) {
ret = i;
}
}
return ret;
}
Обратите внимание, что вы можете заменить вашу last_index_of()
функцию на strlen()
как указано в комментарии, sub_string()
не является функциональным.Исправленная версия может быть:
//Code to find the start of the fractional aspect
void sub_string(char in_str[], char out_str[], int start, int end){
int i = 0;
while (start != end) {
/* warning, bounds are still not tested...*/
out_str[i++] = in_str[start++];
}
out_str[i] = '\0'
}
Вместо вызова last_index_of()
в вашем существующем for
условии цикла, вы должны принять его значение, чтобы использовать его снова:
for (int j = 0; j < last_index_of(input, TERMINATOR); j++) {
/* Error here: will never be TRUE */
if (j == last_index_of) {
/* ... */
}
else {
/* ... */
}
}
станет:
int last_index = last_index_of(input, TERMINATOR);
for (int j = 0; j < last_index; j++) {
if (j == last_index) {
/* ... */
}
else {
/* ... */
}
}
Другая проблема, вы используете переменную number
без ее инициализации, вы должны написать int number = 0
вместо int number;
После этого также возникает проблема с вашей логикой.
У вас есть представление о том, что вы хотите сделать, но это неясно в вашем коде.
Похоже, вы хотите
- , чтобы пользователь ввел некоторую строку в виде
10010.100111
- , чтобы разбить эту строку на две части
10010
и100111
- для преобразования первой части в целочисленную часть
10010
-> 18
- для преобразования второй части в дробную часть
100111
-> 0.609...
Эта декомпозиция может привести к написанию кода такого типа:
#include "stdio.h"
#include "string.h"
#define MAX_BITS 32
#define MAX_LENGTH 49
//Code to find the index of where the string ends
int last_index_of(char in_str[], char ch)
{
int ret = 0;
for (int i = 0; i < MAX_LENGTH; i++) {
if (in_str[i] == ch) {
ret = i;
}
}
return ret;
}
void sub_string(char in_str[], char out_str[], int start, int end)
{
int i = 0;
while (start != end) {
/* warning, bounds are still not tested... */
out_str[i++] = in_str[start++];
}
out_str[i] = '\0';
}
void split(char *input, char *first, char *second)
{
int idx = last_index_of(input, '.');
sub_string(input, first, 0, idx);
sub_string(input, second, idx + 1, strlen(input));
}
int main()
{
//Declaration of variable
char input[MAX_LENGTH + 1]; // +1 for '\0'
char first[MAX_BITS];
char second[MAX_BITS];
/* Input from the user */
printf("Enter a floating point value in binary: ");
scanf("%s", input);
/* split integer and fractionnal parts */
split(input, first, second);
/* decode integer part */
printf("integer part:\n");
for (int i = strlen(first) - 1, j = 1; i > -1; --i, j <<= 1) {
if (first[i] == '1') {
printf("%d ", j);
}
}
/* decode frac part */
printf("\nfractionnal part:\n");
for (int i = 0; i < strlen(second); ++i) {
if (second[i] == '1') {
printf("1/%d ", 2 << i);
}
}
return 0;
}