Как избавиться от мусора в множестве чарсов?

StackOverflow https://stackoverflow.com/questions/2475354

  •  21-09-2019
  •  | 
  •  

Вопрос

Я пишу программу C, но у меня возникают проблемы со своим массивом Chars. Я продолжаю получать мусор, когда печатаю его с помощью Prinf. Вот пример того, что я получаю, когда печатаю:

char at.symbol Ай -
char at tab [0] .symbol
char at tab [1] .symbol
char at tab [2] .symbol
char at tab [3] .symbol is d
char at tab [4] .symbol e e
char at tab [5] .symbol is f
char at tab [6] .symbol is g
char at tab [7] .symbol is h
char at tab [8] .symbol Is I
char at tab [9] .symbol is x
char at t [0] .symbol A0Aã
char at t [1] .symbol б)@4
char at t [2] .Symbol CKU*
char at t [3] .Symbol Ай -
char at t [4] .symbol идти

Может ли кто -нибудь сказать мне, как избавиться от мусора во множестве Chars?

Вот мой код

#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;
}
Это было полезно?

Решение

У вас есть одна из двух возможных проблем. Если вы действительно просто хотите одного персонажа, вы должны печатать его с %c, нет %s как это:

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

Если вы действительно хотите строк, вы должны определить SYMBSIZE быть на 1 выше максимальной длины символа и положить NUL (\0) в конце. Вы можете сделать это пару способов:

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

Другие советы

Проблема в том, что строки в C являются нулевыми прекращенными. Тем не менее, ваш массив достаточно большой для одного персонажа, поэтому он не может быть нулевым (это требует не менее 2 символов)

Почему ты получаешь мусор? Когда ты говоришь tabl[0].symbol[0] = 'A';, в tabl[0].symbol[0] В памяти у вас есть A??? И мы не знаем, что ??? является. Очевидно, это иногда 0 (где вы получаете правильный вывод), иногда это не (мусор).

Чтобы исправить это, используйте %c Спецификатор формата для печати одного символа вместо строки с нулевым концевым. Если вы действительно хотите распечатать строки, вам нужно сделать свой буфер струнного буфера больше и нулевой его:

SYMBSIZE = 10, тогда есть tabl[0].symbol[1] = '\0'; Обратите внимание, вы обычно хотите использовать строковые функции:

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

Если ваш буфер недостаточно велик для строки, он перевернет буфер.

Ваши массивы недостаточно большие для хранения струн. Вам нужно дополнительное место для нулевого персонажа. Измените SymbSize на 2 или распечатайте его как символ. Любой должен работать.

РЕДАКТИРОВАТЬ: Кроме того, вы в любом случае не кладете NULL Chars. Печать строки будет продолжаться до тех пор, пока она не достигнет 0, поэтому вам нужно было сделать SYMBSIZE = 2 а затем сделать symbol[1] = '\0'; Чтобы печатать как строку.

Edit2: или просто измените свой %s в %c (Распечатайте один символ за раз вместо всей строки)

Чтобы распечатать символ, вы должны использовать %c в печатном виде.

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

Ваш компилятор должен предупредить вас о том, что строка формата не соответствует пройденным значениям. Предупреждения компилятора есть по причине.

Если вы хотите Chars, вам нужно использовать %C, а не %s для печати символов.

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

Есть способ решить проблему. В основном, как только мы инициализируем массив ЧАР, мы должны переопределить его с стоимостью мусора в 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();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top