2015-02-28 3 views
0

Я пытаюсь создать код, который преобразует десятичную дробь в любую базу между 2 и 16. Но я не знаю, как написать новое значение в моей строке.Перезаписать строку в C

void base_conversion(char s[], int x, int b) { 
int j, y; 
j = 0; 
// your code here 
while(b > 1 && b < 17) { 

    if (x < 0) { 
     x = (-x); 
    }else if(x == 0) { 
     s[j] = '\0'; 
    } 
     x = (x/b); 

    while(x > 0) { 

     y = (x%b); 


     if (y == 10) { 
      s[j] = 'A'; 
     }else if(y == 11) { 
      s[j] = 'B'; 
     }else if(y == 12) { 
      s[j] = 'C'; 
     }else if(y == 13) { 
      s[j] = 'D'; 
     }else if(y == 14) { 
      s[j] = 'E'; 
     }else if(y == 15) { 
      s[j] = 'F'; 
     }else{ 
      s[j] = y; 
     } 
    } 
}j = j + 1; 
} 
+0

Какие исследования вы сделали на свой вопрос? – nikaltipar

+0

Прежде всего вы увеличиваете 'j' вне любого цикла, поэтому вы всегда будете перезаписывать' s [0] '. Во-вторых, вы не изменяете ни 'x', ни' b' внутри внутреннего цикла, поэтому, если 'x' отличен от нуля, то вы имеете бесконечный цикл. В-третьих, можете ли вы рассказать о своей проблеме (помимо тех, которые я упоминаю)? Для какого-либо ввода, каков ожидаемый и фактический результат? –

+0

Вам не нужен цикл while() для проверки базы 'b': либо база действительна, либо нет - в записи функции. –

ответ

1

Вы были почти там, хотя несколько ошибок, поэтому я «улучшил» ваш код. Бесконечный цикл, проверяющий базу, которую нужно было сделать только один раз. Петли while() были не совсем организованы правильно - x/b выполняется вне цикла выделения цифр. Другое изменение, которое я сделал, это использовать массив поиска для преобразования каждой цифры в символ, что экономит много трудоемких тестов. Я также вернул строку, переданную как значение функции, - также может добавить немного больше функциональности. В случае передачи плохого базового значения я мог бы вернуть NULL вместо пустой строки. Заметьте также, что я обновляю j в тех же утверждениях, где я использую его как индекс, что делает код немного более свободным.

#include <stdio.h> 

char *base_conversion (char *s, int x, int b) { 
    char charr[] = "ABCDEF"; 
    int i, j = 0, len, digit, neg = 0; 
    *s = 0;      // terminate the string passed 
    if (b < 2 || b > 16)  // check the base 
     return s;    // return an empty string 
    if (x < 0) { 
     x = -x;     // adjust for negative input 
     neg = 1; 
    } 
    do { 
     digit = x % b;   // extract each l.s. digit 
     s[j++] = charr [digit]; // convert to character 
    } while (x /= b);   // implicitly test for 0 

    if (neg)     // negative input 
     s[j++] = '-';   // append a minus sign 
    s[j] = 0;     // terminate the string 

    // reverse the string 
    len = j; 
    for (i=0; i<len/2; i++) { 
     digit = s[i]; 
     s[i] = s[--j];   // pre-decrement j to next char index 
     s[j] = digit; 
    } 
    return s; 
}  

int main() { 
    int n; 
    char strig[65]; 
    for (n=1000; n>=-1000; n-=2000) { 
     printf ("Binary  %d: %s\n", n, base_conversion (strig, n, 2)); 
     printf ("Ternary  %d: %s\n", n, base_conversion (strig, n, 3)); 
     printf ("Octal  %d: %s\n", n, base_conversion (strig, n, 8)); 
     printf ("Decimal  %d: %s\n", n, base_conversion (strig, n, 10)); 
     printf ("Hexadecimal %d: %s\n", n, base_conversion (strig, n, 16)); 
    } 
    return 0; 
} 

выход программы:

Binary  1000: 1111101000 
Ternary  1000: 1101001 
Octal  1000: 1750 
Decimal  1000: 1000 
Hexadecimal 1000: 3E8 
Binary  -1000: -1111101000 
Ternary  -1000: -1101001 
Octal  -1000: -1750 
Decimal  -1000: -1000 
Hexadecimal -1000: -3E8 
Смежные вопросы