2010-03-19 8 views
2

J'écris un programme C mais j'ai toujours des problèmes avec mon tableau de caractères. Je continue à obtenir des ordures quand je l'imprime en utilisant prinf. voici un exemple de ce que je reçois quand je l'imprimer:comment se débarrasser des déchets dans un tableau de caractères?

omble chevalier à t.symbol est Aôÿ¿
omble chevalier à tabl [0] .symbol est un
omble chevalier à tabl [1] .symbol est un
carbonisation à tabl [2] .symbol est un
carbonisation à tabl [3] .symbol est d
carbonisation à tabl [4] .symbol est e
carbonisation à tabl [5] .symbol est f
char à tabl [6] .symbol est g
char à tabl [7] .symbol est h
char à tabl [8] .symbol est i
carbonisation à tabl [9] est .symbol x
carbonisation à t [0] .symbol est a0AÃ
carbonisation à t [1] .symbol est b) @ Ã4
carbonisation à t [2] .symbol est CKU *
carbonisation à t [3] .symbol est Aôÿ¿
carbonisation à t [4] .symbol est aller

pourrait Quelqu'un me dit comment se débarrasser de la poubelle dans la gamme de caractères?

ici est mon 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; 
} 

Répondre

4

Vous avez l'un des deux problèmes possibles. Si vous voulez vraiment un caractère unique, vous devez l'imprimer avec %c, non %s comme ceci:

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

Si vous voulez vraiment des chaînes, vous devez définir SYMBSIZE être 1 supérieure à la longueur maximale d'un symbole et mettez un caractère NUL (\0) à la fin. Vous pouvez le faire deux manières:

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

merci, ça a résolu mon problème. –

+0

Comme une extension de ce que Gabe a dit, la raison pour laquelle vous obtenez le charabia supplémentaire lorsque vous essayez d'imprimer en tant que chaîne est parce que vos tableaux ne sont pas initialisés. Le charabia que vous voyez est la poubelle qui se trouvait dans la mémoire utilisée par les tableaux quand ils ont été attribués. – bta

2

Vos tableaux ne sont pas assez grand pour stocker des chaînes. Vous avez besoin d'un espace supplémentaire pour le caractère nul. Modifiez SYMBSIZE sur 2 ou imprimez-le en tant que caractère. L'un ou l'autre devrait fonctionner.

EDIT: De plus, vous ne mettez pas les caractères null de toute façon. L'impression d'une chaîne continuera jusqu'à ce qu'elle frappe \ 0, donc vous devrez faire SYMBSIZE = 2 et ensuite faire symbol[1] = '\0'; afin d'imprimer comme une chaîne.

EDIT2: Ou tout simplement changer votre %s à un %c (imprimer un seul omble chevalier à la fois au lieu de toute la chaîne)

+0

Merci pour votre aide –

2

Pour imprimer un omble chevalier, vous devriez utiliser% c dans le printf.

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

Votre compilateur devrait vous avertir que la chaîne de format ne correspond pas aux valeurs transmises. Les avertissements du compilateur sont là pour une raison.

+0

Merci pour votre temps et aider –

3

Le problème est que les chaînes dans C sont terminées par zéro. Cependant, votre tableau est seulement assez grand pour un caractère, donc il ne peut pas être terminé par zéro (cela nécessite au moins 2 caractères)

Pourquoi obtenez-vous des ordures? Lorsque vous dites tabl[0].symbol[0] = 'A';, au tabl[0].symbol[0] en mémoire vous avez A??? et nous ne savons pas ce que ??? est. Évidemment, c'est parfois 0 (où vous obtenez une sortie correcte), parfois ce n'est pas (ordures).

Pour résoudre ce problème, utilisez le spécificateur de format %c pour imprimer un seul caractère au lieu d'une chaîne terminée par un caractère nul.Si vous voulez vraiment imprimer des chaînes, vous devez faire votre tampon de chaîne plus grande et null-résiliez il:

SYMBSIZE = 10, alors tabl[0].symbol[1] = '\0'; note, vous voulez généralement d'utiliser les fonctions de chaîne:

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

Si votre le tampon n'est pas assez grand pour la chaîne, il débordera le tampon.

+0

GMan j'ai essayé d'utiliser strcpy mais je recevais une erreur de segmentation, mais j'ai eu l'idée. Je place juste le '\ 0' au bout de ma ficelle et la poubelle était partie. merci pour votre aide –

+0

Vous devez passer les arguments à strcpy – peje

+0

@peje: Merci, j'ai oublié. – GManNickG

2

Si vous voulez que les caractères, vous devez utiliser% c et non% s pour imprimer les caractères.

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

merci pour votre temps –

0

Il existe un moyen de résoudre le problème. Fondamentalement, une fois que nous initialisons le tableau char, nous devons le remplacer par la valeur garbage à 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(); 
} 
Questions connexes