2014-10-14 1 views
0

Я продолжаю получать символы мусора, когда выводя «123» и «0».Почему я получаю мусорных персонажей?

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

Если вы можете помочь, пожалуйста. Программа находится в C.

Заранее благодарю вас.

#include <stdio.h> 

#define COUNT 8  /* number of hex digits to display */ 
#define DECIMAL 10 /* to indicate base 10 */ 
#define HEX 16  /* to indicate base 16 */ 

/* array used for ASCII conversion */ 
const char digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

void baseout (int number, int base, FILE * stream) { 
int f1; 
int f2; 
int index = 0; 
int result = number; 
char store1[f2]; 

/*This condition outputs the digit "0" on Line 4*/ 
if (number == 0) {   
    fputc(digits[0], stream); 
} 

/*This condition outputs the digit "0" after "0x"*/ 
if (base != DECIMAL){ 
    store1[f1] = '0'; 
    fputc(store1[f1], stream); 

} 

/*This condition outputs codes from bases 2-36*/ 
if (number != 0) { 
    for(f2 = 1; f2 < COUNT && result != 0; f2++){ 
     index = result % base; 
     store1[f2] = digits[index]; 
     result = result/base; 
    } 
} 

for (f2 = COUNT; f2 > 0; f2--){ 
    fputc(store1[f2], stream); 
} 
} 

void decout (unsigned int number, FILE * stream) { 
    /*Passes DECIMAL to baseout algorithm*/ 
    baseout(number, DECIMAL, stream);  
} 

void hexout (unsigned int number, FILE * stream) { 

    /* Output "0x" for hexidecimal. */ 
    writeline ("0x", stream); 
    baseout (number, HEX, stream); 
} 
void newline (FILE * stream) { 
    /* Output a newline character */ 
    fputc('\n', stream); 
} 
int writeline (const char * message, FILE * stream) { 
    int index = 0; 
    /*While "index<messagelength" output the each character of message*/ 
    while(message[index] != '\0'){ 
      fputc(message[index], stream); 
     index++; 
    } 
    /*Return the message length*/ 
    return sizeof(message); 
} 


int main (int argc, char *const* argv) { 
    writeline ("Hello World", stdout); 
    fprintf (stderr, "Hola Mundo\n"); 
    newline(stdout); 
    decout (123, stdout); 
    newline(stdout); 
    decout (0, stdout); 
    newline(stdout); 
    hexout (0xFEEDDAD, stdout); 
    newline(stdout); 
    return 0; 
} 

желаемая Выход:

Hola Mundo

Hello World

0x0FEEDDAD

токовый выход:

Hola Mundo

Hello World

0x0FEEDDAD

+1

Попытайтесь сосредоточиться на одном вопросе за раз. Уменьшите код до небольшого тестового примера только одной проблемы и отлаживайте его, а затем, когда это работает, переходите к следующей проблеме. –

+0

'for (f1 = COUNT - 1; f1 iwolf

+0

Какой именно желаемый результат и фактический вывод вашей программы? –

ответ

1

Этот блок кода не продумано.

for(f2 = 1; f2 < COUNT; f2++){ 
     if (result != 0){ 
      index = result % base; 
      store1[f2] = digit[index]; 
      result = result/base; 
     } 
    } 

Вы приращение f2 даже после того, как result является 0 и не устанавливая значение store1[f2] для этих значений. Затем вы продолжаете и пытаетесь распечатать содержимое store1. Поскольку store1 не инициализирован ничем разумным, вы получаете мусор.

Вот один из способов устранения этих проблем.

/*This condition outputs codes from bases 2-36*/ 
if (number != 0) { 
    for(f2 = 1; f2 < COUNT && result != 0; f2++){ 
     index = result % base; 
     store1[f2] = digits[index]; 
     result = result/base; 
    }    
} 

for (f2--; f2 > 0; f2--){ 
    fputc(store1[f2], stream); 
} 
+0

Спасибо. Я смог избавиться от мусора, но теперь я закончил выпуск дополнительных 123. Я редактировал код, который я написал выше, в новый код. Что-то не так с условием. Также f2--, поскольку начальное условие для цикла for все еще вызывает мусор, поэтому мне пришлось установить его в COUNT. –

+0

@BrianLeung, не уверен, что вы сделали. Я получаю разумный результат. Оформить рабочий код на странице http://ideone.com/pOZEWS. –

1

Ваш store1 массив в функции baseout не инициализируется. Ваша функция не заполняет каждый элемент в этом массиве, в результате чего мусор остается в некоторых более высоких элементах. Одним из решений является инициализировать массив всех пространств (или нулей или любого характера вы хотите) в начале функции: «(! Результат = 0), если»

for(index = 0; index < COUNT ; index++) 
{ 
    store1[index] = ' '; 
} 

Другая возможность заключается в том, чтобы удалить проверки в ваша базовая функция (вокруг строки 34). Это будет хранить ноль в массиве store1 для каждого элемента с нулем. Это приведет к печати «0000123» вместо «123»

Смежные вопросы