2014-12-01 6 views
3

Я написал код, чтобы создать правильную пирамиду из персонажа.Символы мусора в строке

Однако, когда я выполняю программу, последние две строки пирамиды содержат символы мусора, размещенные после них, даже когда они превышают размер массива.

Код здесь:

#include <stdio.h> 
#include <string.h> 

#define ROW 5 
int main(void) { 
    char array[ROW]; 
    int x = 0; 
    int row = 0; 

    for (row = 0; row < ROW; row++) { 
    array[x] = 'a'; 
    if (x < ROW) { 
     printf("%s\n", dolla); 
    } 
    x++; 
    } 
    getchar(); 
} 

Где персонажи мусора приходят? Это только на линиях после третьего.

+1

Попробуйте выполнить программу по строкам в отладчике. Обратите пристальное внимание на 'array [x] = 'a';' –

+0

, вам нужно его обнулить. –

+1

Что такое 'dolla'? Я не вижу, чтобы это определялось где угодно. –

ответ

3

Проблема в вашем коде заключается в том, что вы не завершили свою строку символом \0 (null). Вот тренировки для вашего кода:

#include <stdio.h> 
#include <string.h> 
#define ROW 5 
int main(void) 
{ 
char array[ROW]; 
int x = 0; 
int row = 0; 


for(row = 0; row < ROW; row++) 
{ 
array[x] = 'a'; 

    if(x < ROW) 
    { 
     array[x+1]='\0'; 
     printf("%s\n", array); 
    } 
x++; 
} 

getchar(); 
} 

Я не специалист, но я прочитал следующее во многих типичных книгах C: int массивы в C инициализируются в 0, в то время как char массивы инициализируются мусора ,

И да, забыл упомянуть, это не dolla, это array.

+0

"' char' массивы инициализируются мусором. " Чтобы добавить некоторые детали, чтобы понять, почему память, инициализированная «мусором» на C, обычно означает, что процесс резервирует блок памяти, но ничего не записывает в этот блок памяти. Независимо от того, что было раньше, если эта часть памяти уже использовалась в прошлом той же программой или другой программой, это «мусор», который вы получаете. – Laogeodritt

2

char array[ROW+1] = {0}; поможет вам много. Возможно, вы предположили, что массив пуст, но он был заполнен случайными символами. Путем инициализации с помощью {0} массив начинается со всех нулей.

Я собираюсь предположить, что dolla была ошибка транскрипции и что либо dolla должны быть array или что array используется, чтобы быть названным dolla.

+0

@tac @ js1 Возможно, обратите внимание, что 'array' имеет размер 5 в коде вопроса, и цикл будет писать' array [i] = 'a'' для 'i' в 0 до 4. Это означает, что на окончательная итерация цикла, все 5 элементов строки будут заполнены, и строка не обязательно будет заканчиваться нулем в этой точке (удача ничьей по следующей памяти).Строки C (массивы символов с нулевым символом) всегда должны иметь размер не менее 'max_string_length + 1', чтобы учесть нулевой нуль. – Laogeodritt

+0

@Laogeodritt В исходном коде строка никогда не была завершена нигде в любой точке, кроме удачи. С моим изменением я выделил 6 байтов нулей, чтобы он всегда был нулевым. Наверное, я не указал это конкретно. – JS1

+0

Извините, я пропустил, что вы изменили выделение на ROW + 1 в предлагаемых вами изменениях. Я только заметил инициализацию. – Laogeodritt

0

Возможно, вы превысили значения в массиве, чтобы сделать пирамиду, которая приводит к печати значений мусора, которые были там до того, как вы даже скомпилировали свой код. Когда вы печатаете значения, а не распечатываете весь массив (это означает, что в него могут быть включены значения мусора), вы можете печатать до той точки, где у вас есть допустимые значения, и это можно сделать, введя нулевой символ '\ 0' в конец массива. Изначально вам будет выбран массив, который поможет вам лучше отладить ваш код после просмотра вывода.

 Смежные вопросы

  • Нет связанных вопросов^_^