2010-03-19 1 views
2

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

символ на t.symbol является Aôÿ¿
символ в табл [0] .symbol есть А
символ в табл [1] .symbol является
символ в табл [2] .symbol является
символа в табл [3] .symbol является д
символа в табл [4] .symbol является электронной
символа в табл [5] .symbol является F
char at tabl [6] .symbol is g
char at tabl [7] .symbol is h
char at tabl [8] .symbol есть я
символа в табл [9] .symbol есть х
символа при Т [0] .symbol является a0AÃ
символа при Т [1] .symbol является б) @ a4
символа при Т [2] .symbol является ЦХПОМ *
символа при Т [3] .symbol является Aôÿ¿
символа при Т [4] .symbol является Перейти

может

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

вот мой код

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

ответ

4

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

спасибо, он решил мою проблему. –

+0

В качестве дополнения к тому, что сказал gabe, причина, по которой вы получаете дополнительную тарабарщину, когда пытаетесь напечатать в виде строки, состоит в том, что ваши массивы не инициализированы. Таблетка, которую вы видите, - это мусор, который оказался в памяти, используемой массивами, когда они были выделены. – bta

2

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

EDIT: Кроме того, вы не ставите нулевые символы в любом случае. Печать строки будет продолжаться до тех пор, пока она не ударит \ 0, поэтому вам нужно будет сделать SYMBSIZE = 2, а затем сделать symbol[1] = '\0';, чтобы печатать как строку.

EDIT2: Или просто изменить ваш %s к %c (печать одного полукокса в то время, вместо целой строки)

+0

спасибо за вашу помощь –

2

Чтобы распечатать полукокса вы должны использовать% с в Printf.

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

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

+0

спасибо за ваше время и помочь –

3

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

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

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

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

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

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

+0

GMan я пытался использовать STRCPY, но я получаю ошибку сегментации, но у меня появилась идея. Я просто помещаю '\ 0' в конец моей строки, и мусор ушел. спасибо за вашу помощь –

+0

Вам нужно переключить аргументы на strcpy – peje

+0

@peje: Спасибо, я забыл. – GManNickG

2

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

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

спасибо за ваше время –

0

Существует способ решить эту проблему. В принципе, как только мы инициализируем массив 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(); 
} 
Смежные вопросы