Pergunta

Estou escrevendo um programa C, mas continuo tendo problemas com minha variedade de chars. Eu continuo recebendo lixo quando o imprimir usando o Prinf. Aqui está um exemplo do que recebo quando o imprimi:

char em t.symbol é Aôÿ
char em tabl [0]. Symbol é um
char em tabl [1]. Symbol é um
char em tabl [2]. Symbol é um
char em tabl [3]. Symbol é D
char em tabl [4]. Symbol é e
char em tabl [5]. Symbol é f
char em tabl [6]. Symbol é g
char em tabl [7]. Symbol é h
char em tabl [8]. Symbol é eu
char em tabl [9]. Symbol é x
char em t [0]. Symbol é a0aã
char em t [1]. Symbol é b)@ã
char em t [2]. Symbol é cku*
char em t [3]. Symbol é Aôÿ
char em t [4]. Symbol é vai

Alguém poderia me dizer como se livrar do lixo na variedade de chars?

Aqui está o meu código

#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;
}
Foi útil?

Solução

Você tem um dos dois problemas possíveis. Se você realmente quer apenas um único personagem, deve imprimi -lo com %c, não %s assim:

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

Se você realmente quer cordas, você tem que definir SYMBSIZE para ser 1 maior que o comprimento máximo de um símbolo e colocar um nul (\0) char no final. Você pode fazer isso de algumas maneiras:

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

Outras dicas

O problema é que as cordas em C são encerradas. No entanto, sua matriz é grande o suficiente para um personagem, por isso não pode ser terminado nulo (isso requer pelo menos 2 caracteres)

Por que você está pegando lixo? Quando voce diz tabl[0].symbol[0] = 'A';, no tabl[0].symbol[0] na memória você tem A??? E nós não sabemos o que ??? é. Obviamente, às vezes é 0 (onde você obtém a saída correta), às vezes não é (lixo).

Para consertar isso, use o %c Especificador de formato para imprimir um único caractere em vez de uma string terminada nula. Se você realmente deseja imprimir strings, precisa aumentar seu buffer de cordas e terminá-lo nulo:

SYMBSIZE = 10, então tem tabl[0].symbol[1] = '\0'; Observe que você geralmente deseja usar funções de string:

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

Se o seu buffer não for grande o suficiente para a corda, ele invadirá o buffer.

Suas matrizes não são grandes o suficiente para armazenar strings. Você precisa de um espaço extra para o caractere nulo. Altere o simbsize para 2 ou imprima -o como um char. Qualquer um deve funcionar.

EDIT: Além disso, você não está colocando os chars nulos de qualquer maneira. Imprimir uma string continuará até atingir 0, então você precisará fazer SYMBSIZE = 2 e então faça symbol[1] = '\0'; Para imprimir como uma string.

Edit2: ou apenas mude seu %s para um %c (Imprima um único char de cada vez em vez de toda a corda)

Para imprimir um char, você deve usar %c no printf.

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

Seu compilador deve estar avisando que a sequência do formato não corresponde aos valores passados. Os avisos do compilador estão lá por uma razão.

Se você deseja os chars, precisa usar %C e não %s para imprimir os caracteres.

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

Existe uma maneira de resolver o problema. Basicamente, depois de inicializar a matriz de char, então precisamos substituí -la com o valor do lixo para nulo. 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();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top