Frage

Ich schreibe ein C -Programm, aber ich habe immer wieder Probleme mit meiner Auswahl an Plätzen. Ich bekomme immer wieder Müll, wenn ich ihn mit Prinf drucke. Hier ist ein Beispiel für das, was ich bekomme, wenn ich es drucke:

Char von T.Symbol ist Aômt
char bei table [0] .symbol ist a
char bei table [1] .symbol ist a
char bei table [2] .symbol ist a
char bei tab [3] .symbol ist d
char bei tab [4] .symbol ist e
char bei tab [5] .symbol ist f
char bei table [6] .symbol ist g
char bei table [7] .symbol ist h
char bei table [8] .symbol ist ich
char bei tab [9] .symbol ist x
char bei t [0] .symbol ist a0aã
char bei t [1] .symbol ist b)@ã4
char bei t [2] .symbol ist CKU*
char bei t [3] .symbol ist Aômt
char bei t [4] .symbol ist gehen

Könnte mir jemand sagen, wie ich den Müll in der Auswahl der Chars loswerden kann?

Hier ist mein 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;
}
War es hilfreich?

Lösung

Sie haben eines von zwei möglichen Problemen. Wenn Sie wirklich nur einen einzelnen Charakter wollen, sollten Sie ihn drucken %c, nicht %s so was:

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

Wenn Sie wirklich Saiten wollen, müssen Sie definieren SYMBSIZE 1 höher sein als die maximale Länge eines Symbols und eine NUL (\0) char am Ende. Sie können es ein paar Arten tun:

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

Andere Tipps

Das Problem ist, dass Saiten in C null gekündigt sind. Ihr Array ist jedoch nur groß genug für einen Charakter, daher kann es nicht nullterminiert werden (dies erfordert mindestens 2 Zeichen).

Warum bekommst du Müll? Wenn du sagst tabl[0].symbol[0] = 'A';, bei tabl[0].symbol[0] Im Gedächtnis haben Sie A??? Und wir wissen nicht was ??? ist. Offensichtlich ist es manchmal 0 (wo man korrekte Ausgabe bekommt), manchmal nicht (Müll).

Um dies zu beheben, verwenden Sie die %c Formatspezifizierer zum Drucken eines einzelnen Zeichens anstelle einer null-terminierten Zeichenfolge. Wenn Sie wirklich Zeichenfolgen drucken möchten, müssen Sie Ihren String-Puffer größer und null machen, um sie zu beenden:

SYMBSIZE = 10, dann habe tabl[0].symbol[1] = '\0'; Hinweis, Sie möchten normalerweise String -Funktionen verwenden:

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

Wenn Ihr Puffer für die Zeichenfolge nicht groß genug ist, überrannt er den Puffer.

Ihre Arrays sind nicht groß genug, um Saiten zu speichern. Sie benötigen einen zusätzlichen Platz für den Nullcharakter. Ändern Sie das Symbize in 2 oder drucken Sie es als Zeichen. Beide sollte funktionieren.

Bearbeiten: Außerdem setzen Sie die Null -Chars sowieso nicht ein. Das Drucken einer String wird weitergehen, bis sie 0 trifft, also müssten Sie machen SYMBSIZE = 2 und dann machen symbol[1] = '\0'; Um als Zeichenfolge zu drucken.

Edit2: oder ändere einfach deine %s zu einem %c (Drucken Sie jeweils ein einzelnes Zeichen anstelle der gesamten Zeichenfolge)

Um ein Zeichen auszudrucken, sollten Sie %C im Printf verwenden.

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

Ihr Compiler sollte Sie warnen, dass die Format -Zeichenfolge nicht mit den übergabteten Werten übereinstimmt. Compiler -Warnungen sind aus einem bestimmten Grund vorhanden.

Wenn Sie die Zeichen wünschen, müssen Sie %C und nicht %s verwenden, um die Zeichen zu drucken.

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

Es gibt eine Möglichkeit, das Problem zu lösen. Grundsätzlich, sobald wir das Char -Array initialisieren, müssen wir es mit dem Müllwert auf Null überschreiben. 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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top