как избавиться от мусора в массиве символов? - PullRequest
2 голосов
/ 19 марта 2010

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

символ на t.symbol составляет Aôÿ¿
char на tabl [0] .символ A
символ в таблице [1] .Символ является
символ в таблице [2] .Символ является
char на tabl [3] .символ d
char на tabl [4] .символ e
char на tabl [5] .символ f
char на tabl [6]. Символ - это
символ в таблице [7]. Символ h
char на tabl [8] .символ это я
char на tabl [9]. символ равен x
символ при t [0]. Символ равен a0AÃ
символ при t [1] .символ равен b) @ М4
char при t [2]. Символ равен cKU *
char при t [3]. Символ равен Aôÿ¿
char при t [4] .символ равен

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

вот мой код

#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;
}

Ответы [ 6 ]

4 голосов
/ 19 марта 2010

У вас есть одна из двух возможных проблем. Если вам действительно нужен только один символ, вы должны напечатать его с %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");
3 голосов
/ 19 марта 2010

Проблема в том, что строки в 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"); 

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

2 голосов
/ 19 марта 2010

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

printf("char at tabl[%d].symbol is %c \n",x, tabl[x].symbol);
2 голосов
/ 19 марта 2010

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

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

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

2 голосов
/ 19 марта 2010

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

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

РЕДАКТИРОВАТЬ 2: Или просто измените %s на %c (печатайте один символ за раз вместо всей строки)

0 голосов
/ 03 февраля 2016

Есть способ решить проблему. В основном, как только мы инициализируем массив char, мы должны переопределить его значением мусора в 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...