Как избавиться от мусора в множестве чарсов?
Вопрос
Я пишу программу 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
) в конце. Вы можете сделать это пару способов:
tabl[6].symbol[0] = 'g'; tabl[6].symbol[1] = '\0';
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();
}