Como se livrar do lixo na matriz de chars?
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;
}
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:
tabl[6].symbol[0] = 'g'; tabl[6].symbol[1] = '\0';
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();
}