2

I'm writing a C program but I keep having problems with my array of chars. I keep getting garbage when I print it using prinf. here is an example of what I get when I print it:

char at t.symbol is Aôÿ¿
char at tabl[0].symbol is A
char at tabl[1].symbol is a
char at tabl[2].symbol is a
char at tabl[3].symbol is d
char at tabl[4].symbol is e
char at tabl[5].symbol is f
char at tabl[6].symbol is g
char at tabl[7].symbol is h
char at tabl[8].symbol is i
char at tabl[9].symbol is x
char at t[0].symbol is a0AÃ
char at t[1].symbol is b)@Ã4
char at t[2].symbol is ckU*
char at t[3].symbol is Aôÿ¿
char at t[4].symbol is

could someone tell me how to get rid off the garbage in the array of chars?

here is my code

#define MAX 100
#ifndef SYMBSIZE
 #define SYMBSIZE 1
#endif    

typedef struct tableme 
{
    char symbol[SYMBSIZE];
    int value;
    int casenmbr;
    int otherinfo;
}tabletype;
int main(int argc, char **argv)
{
    tabletype t[MAX];
    t[3].symbol[0] = 'A';

    t[0].value=1;  
    t[0].casenmbr = 7;
    t[0].otherinfo = 682;

    tabletype tabl[MAX];
    tabl[0].value = 1;
    tabl[0].symbol[0] = 'A';
    tabl[1].value = 11;
    tabl[1].symbol[0]= 'a';
    tabl[2].value = 12;
    tabl[2].symbol[0] = 'a';
    tabl[3].value = 13;
    tabl[3].symbol[0] = 'd';
    tabl[4].value = 14;
    tabl[4].symbol[0] = 'e';
    tabl[5].value = 15;
    tabl[5].symbol[0] = 'f';
    tabl[6].value = 16;  
    tabl[6].symbol[0] = 'g';
    tabl[7].value = 17;
    tabl[7].symbol[0] = 'h';
    tabl[8].symbol[0] = 'i';
    tabl[9].symbol[0] = 'x';
    t[1].symbol[0] = 'b';
    t[0].symbol[0]= 'a';
    t[2].symbol[0]= 'c';

    t[4].symbol[0]= 'g';
    printf("char at t.symbol is %s \n", t[3].symbol);

    for( x=0;x<10;x++)
    {
            printf("char at tabl[%d].symbol is %s \n",x, tabl[x].symbol);
    }
    int j;
    for(j = 0; j<5;j++)  
    {
            printf("char at t[%d].symbol is %s \n",j, t[j].symbol);
    }
    return 0;
}
4

6 に答える 6

4

考えられる 2 つの問題のうちの 1 つがあります。本当に単一の文字が必要な場合は、次のようで%cはなく、で印刷する必要があります。%s

printf("char at t.symbol is %c \n", t[3].symbol[0]);

本当に文字列が必要な場合SYMBSIZEは、シンボルの最大長よりも 1 長くなるように定義し\0、最後に NUL ( ) 文字を配置する必要があります。いくつかの方法でそれを行うことができます:

  1. tabl[6].symbol[0] = 'g'; tabl[6].symbol[1] = '\0';
  2. strcpy(tabl[6].symbol, "g");
于 2010-03-19T06:31:11.213 に答える
3

問題は、C の文字列が null で終了することです。ただし、配列は 1 文字に十分な大きさしかないため、null で終了することはできません (これには少なくとも 2 文字が必要です)。

なんでゴミが出るの?あなたが言うときtabl[0].symbol[0] = 'A';、あなたtabl[0].symbol[0]は記憶の中にあり、私たちは何がA???何であるかを知りません???。明らかに、0 の場合 (正しい出力が得られる場合) もあれば、そうでない場合 (ガベージ) もあります。

これを修正するには、%c書式指定子を使用して、null で終わる文字列の代わりに単一の文字を出力します。本当に文字列を出力したい場合は、文字列バッファを大きくして null で終了する必要があります。

SYMBSIZE = 10、次にtabl[0].symbol[1] = '\0';注意してください。通常は文字列関数を使用します。

// copy "a" to that memory location, will be null-terminated.
strcpy(tabl[0].symbol, "a"); 

バッファーが文字列に対して十分な大きさでない場合、バッファーがオーバーランします。

于 2010-03-19T06:30:21.480 に答える
2

文字が必要な場合は、文字を出力するために %s ではなく %c を使用する必要があります。

printf("char at tabl[%d].symbol is %c \n",x, tabl[x].symbol);
于 2010-03-19T07:59:25.303 に答える
2

配列が文字列を格納するのに十分な大きさではありません。ヌル文字用に余分なスペースが必要です。SYMBSIZE を 2 に変更するか、文字として出力します。どちらかが機能するはずです。

編集:また、とにかくヌル文字を入れていません。文字列の出力は \0 に達するまで続行されるため、文字列として出力するにSYMBSIZE = 2は、makesymbol[1] = '\0';してから make する必要があります。

EDIT2: または、単に変更%sします%c(文字列全体ではなく、一度に 1 つの文字を出力します)。

于 2010-03-19T06:25:42.663 に答える
2

文字を出力するには、printf で %c を使用する必要があります。

   printf("char at t.symbol is %c \n", t[3].symbol);

コンパイラは、フォーマット文字列が渡された値と一致しないことを警告するはずです。コンパイラの警告には理由があります。

于 2010-03-19T06:28:47.613 に答える
0

問題を解決する方法があります。基本的に、char配列を初期化したら、ガベージ値でNUllにオーバーライドする必要があります。 enter code here

void main()
{
    int amsb[10];
    int i,k,i1;
    char arr[25];
    clrscr();
    printf("Enter the 10 element");

    for( i1=0;i1<25;i1++) {
        arr[i1]='\0';
    }

    for( k=0;k<25;k++) {
        printf("%c",arr[k]) ;

        if(arr[k]=='\0')  {
            break;                
        }
    }

    getch();
}
于 2016-02-03T08:58:59.497 に答える