Pregunta

Estoy escribiendo un programa en C pero sigo teniendo problemas con mi serie de caracteres. Sigo recibiendo basura cuando lo imprimo usando prinf. aquí es un ejemplo de lo que me pasa cuando lo imprimo:

Char en t.symbol es Aôÿ¿
Char en tabl [0] .symbol es un
Char en tabl [1] es un .symbol
Char en tabl [2] es un .symbol
Char en tabl [3] .symbol es D
Char en tabl [4] es .symbol e
Char en tabl [5] .symbol es decir f
Char en tabl [6] .symbol es G
Char en tabl [7] .symbol es h
Char en tabl [8] es .symbol i
Char en tabl [9] .symbol es x
Char en t [0] .symbol es a0AÃ
Char en t [1] .symbol es b) @ A4
Char en t [2] .symbol es CKU *
Char en t [3] .symbol es Aôÿ¿
Char en t [4] .symbol es Ir

podría alguien decirme cómo deshacerse de la basura en el conjunto de caracteres?

Aquí está mi 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;
}
¿Fue útil?

Solución

Usted tiene uno de dos problemas posibles. Si realmente quiere un solo carácter, debe ser imprimirlo con %c, no %s como esto:

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

Si realmente quiere cuerdas tiene que definir SYMBSIZE ser 1 superior a la longitud máxima de un símbolo y poner un char NULL (\0) al final. Puede hacerlo un par de maneras:

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

Otros consejos

El problema es que las cadenas de C se terminan nulo. Sin embargo, la matriz es lo suficientemente grande para un solo carácter, por lo que no puede ser terminada en nulo (esto requiere al menos 2 caracteres)

¿Por qué estás recibiendo basura? Cuando usted dice tabl[0].symbol[0] = 'A';, en tabl[0].symbol[0] en la memoria que ha A??? y que no sabe lo que es ???. Obviamente, a veces es 0 (donde se obtiene un resultado correcto), a veces no es (basura).

Para solucionar este problema, utilice el especificador de formato %c para imprimir un solo carácter en lugar de una cadena terminada en cero. Si realmente desea imprimir cadenas, que necesita para hacer su búfer de cadena más grande y nulo terminarlo:

SYMBSIZE = 10, y luego tener tabl[0].symbol[1] = '\0'; Tenga en cuenta, por lo general, que desee utilizar las funciones de cadena:

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

Si el búfer no es lo suficientemente grande para la cadena, conseguirá superar el búfer.

Sus matrices no son lo suficientemente grande como para cadenas de tiendas en. Es necesario un espacio adicional para el carácter nulo. SYMBSIZE cambiar a 2 o imprimirlo como un char. Cualquiera de los dos debería funcionar.

EDIT: Además, no se está poniendo los caracteres nulos en cualquier caso. Impresión de una cadena será seguir adelante hasta que choca con \ 0, por lo que se necesitaría para hacer SYMBSIZE = 2 y luego hacer symbol[1] = '\0'; con el fin de imprimir como una cadena.

Edit2: O simplemente cambiar su %s a un %c (imprimir una sola carbón a la vez en lugar de toda la cadena)

Para imprimir un char que usted debe utilizar% c en el printf.

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

Su compilador debe usted estar advirtiendo de que la cadena de formato no coincide con los valores pasados. advertencias del compilador están ahí por una razón.

Si desea que los caracteres, entonces es necesario utilizar% C y no% s para imprimir los caracteres.

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

Hay una manera de resolver el problema. Básicamente, una vez que inicializar la matriz de caracteres así que tenemos que reemplazar con el valor de la basura a 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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top