为什么我会收到垃圾字符?

时间:2014-10-14 21:05:22

标签: c loops for-loop garbage

当我输出“123”和“0”时,我一直收到垃圾字符。

我能够将其缩小到baseout方法,我相信它可能是我的“for循环”条件之一,但我似乎无法删除垃圾字符。

如果你能提供帮助,请做。计划在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[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

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

123

0

0x0FEEDDAD

当前输出为:

Hola Mundo

Hello World

123

0123

0x0FEEDDAD

2 个答案:

答案 0 :(得分:1)

函数baseout中的数组store1未初始化。您的函数不会填充该数组中的每个元素,从而导致垃圾留在某些较高元素中。一种解决方案是在函数开头将数组初始化为所有空格(或零或任何你想要的字符):

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

另一种可能性是删除&#34; if(结果!= 0)&#34;检查你的基本功能(第34行)。对于每个具有零的元素,这将在store1数组中存储零。这将导致打印&#34; 0000123&#34;而不是&#34; 123&#34;

答案 1 :(得分:1)

这段代码没有经过深思熟虑。

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

即使f2result并且没有为这些值设置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);
}