2010-03-19 75 views
2

我正在寫一個C程序,但我一直有問題與我的字符數組。當我用prinf打印時,我一直在收拾垃圾。這裏是我所得到的,當我打印的例子:如何擺脫字符數組中的垃圾?

焦炭在t.symbol是Aôÿ¿
焦炭在TABL [0] .symbol是一個
字符在TABL [1] .symbol被一個
炭在TABL [2] .symbol是在一個TABL
炭[3] .symbol是d
炭在TABL [4] .symbol爲e
炭在TABL [5] .symbol爲f
炭在TABL [6] .symbol是克在TABL
炭[7] .symbol是在TABLħ
炭[8] .symbol爲i
炭在TABL [9] .symbol是在t X
炭[0] .symbol是a0AÃ
炭在t [1] .symbol是B)@ A4
炭在t [2] .symbol是CKU *
炭在t [3] .symbol是Aôÿ¿
炭在t [4] .symbol是

所能

有人告訴我如何擺脫字符數組中的垃圾?

這裏是我的代碼

#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

你有兩個可能的問題之一。如果你真的只想要一個字符,你應該%c被打印出來,而不是%s這樣的:

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

如果你真的想你必須定義SYMBSIZE字符串比符號的最大長度高出1並在最後放置一個NUL(\0)字符。你能做到幾個方面:

  1. tabl[6].symbol[0] = 'g'; tabl[6].symbol[1] = '\0';
  2. strcpy(tabl[6].symbol, "g");
+0

謝謝,它解決了我的問題。 – 2010-03-19 17:41:23

+0

作爲gabe所說的擴展,當您嘗試打印爲字符串時,得到額外亂碼的原因是因爲您的數組未初始化。你看到的亂碼是在分配數組時使用的內存中的垃圾。 – bta 2010-03-19 22:00:36

2

你的陣列都不夠大來存儲字符串。您需要爲空字符的額外空間。將SYMBSIZE更改爲2或將其打印爲字符。任何一個人都應該工作。

編輯:另外,你不把空字符,無論如何。打印一個字符串將繼續下去,直到它打到\ 0,所以您需要製作SYMBSIZE = 2,然後製作symbol[1] = '\0';以打印爲字符串。

EDIT2:或者只是改變你的%s%c

+0

感謝您的幫助 – 2010-03-19 17:48:01

2

要打印出來,你應該使用%C的printf的一個char(在一個時間,而不是整個字符串打印單個字符)。

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

您的編譯器應該警告您格式字符串與傳遞的值不匹配。 編譯器警告是有原因的。

+0

感謝您的時間和幫助 – 2010-03-19 17:50:47

3

的問題是,在C字符串是空終止。然而,你的數組只有一個字符足夠大,所以它不能爲null終止(這需要至少2個字符)

爲什麼你得到的垃圾?當你說tabl[0].symbol[0] = 'A';,在內存tabl[0].symbol[0]你有A???,我們不知道什麼是???。顯然,它有時是0(你得到正確的輸出),有時它不是(垃圾)。

爲了解決這個問題,使用%c格式說明打印單個字符,而不是空終止字符串。如果你真的想打印字符串,你需要讓你的字符串緩衝區較大,空終止它:

SYMBSIZE = 10,然後有tabl[0].symbol[1] = '\0';注意,你通常要使用字符串函數:

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

如果您緩衝區對於字符串來說不夠大,它會超出緩衝區。

+0

GMAN我試圖用strcpy的,但我是越來越細分的錯,但我上心。我只是把'\ 0'放在我的字符串的末尾,垃圾就沒了。感謝您的幫助 – 2010-03-19 17:39:16

+0

您需要將參數切換爲strcpy – peje 2010-03-19 20:54:12

+0

@peje:謝謝,我忘了。 – GManNickG 2010-03-19 21:26:45

2

如果你想字符,那麼你需要使用%C,而不是%s到打印的字符。

printf("char at tabl[%d].symbol is %c \n",x, tabl[x].symbol); 
+0

謝謝你的時間 – 2010-03-19 17:48:49

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(); 
}