2016-07-05 2 views
-4

Я пытаюсь получить свой код для преобразования текстового файла с 3 столбцами, xcoor, ycoor и символом с 2 символами в карту 30x30, которая печатает второй символ символа, а остальные пробелы заполняются а '.' Однако мой код, похоже, не запускается, и я получаю ошибку сегментации, когда я пытаюсь ввести текстовый файл, что я делаю неправильно? Заранее спасибоОшибка сегментации, что отсутствует в моем коде?

int main(void) 
{ 
    char grid[30][30]; 
    for(int i=0;i<30;i++){ 
     for(int j=0;j<30;j++){ 
     grid[i][j]='.'; 
     } 
    } 

    int xcoor,ycoor; 
    char symbol[2]; 
    while((xcoor!=0)||(scanf("%d",&xcoor))) 
    { 
     while(xcoor==0){ 
     scanf("%d",&xcoor); 
     } 
     scanf("%d %c%c",&ycoor,&symbol[0],&symbol[1]); 
     grid[xcoor-1][ycoor-1]=symbol[1]; 
    } 

    for(int i=0;i<30;i++){ 
     for(int j=0;j<30;j++){ 
     printf("%c ",grid[i][j]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 
+0

Попробуйте использовать отладчик и посмотрите, где сбой кода. BTW: Код почти нечитабель. Жестко закодированные номера - лучший способ успеха :-) – Klaus

+0

Пожалуйста, добавьте [assertions] (http://en.cppreference.com/w/c/error/assert), которые подтверждают, что 'xcoor-1' и' ycoor-1' находятся в допустимом диапазоне '[0, 30]'. –

+1

1) 'xcoor' неинициализируется. 2) Если есть недопустимый ввод, вам необходимо очистить входной буфер (stdin). – BLUEPIXY

ответ

2

Это не может покрыть все ваши ошибки, но тут я вижу это:

int xcoor,ycoor; 
char symbol[2]; 
while((xcoor!=0) 

Как вы думаете, xcoor имеет действительное значение сейчас? Должно ли это? Потому что это не так. Вы создали переменную, а затем, прежде чем на самом деле ее установить, вы проверяете ее значение.

Это более чем вероятно, ваш звонок scanf вызывает у вас проблемы. Независимо от того, попытайтесь установить эти переменные. Скорее всего, это устранит ваши проблемы.

Смотрите здесь для получения дополнительной информации: Is reading from unallocated memory safe?

0

Вы используете в условном из while заявления неинициализированной переменной xcoor.

Вы можете исправить это, выполнив инициализацию xcoor.

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

while (scanf("%d%d %c%c", &xcoor, &ycoor, &symbol[0], &symbol[1]) == 4) 
{ 
    if (xcoor < 0 || xcoor >= 30) 
    { 
     // Deal with problem. 
     fprintf(stderr, "Out or range value of xcoor: %d\n", xcoor); 
     exit(1); 
    } 
    if (ycoor < 0 || ycoor >= 30) 
    { 
     // Deal with problem. 
     fprintf(stderr, "Out or range value of ycoor: %d\n", ycoor); 
     exit(1); 
    } 

    grid[xcoor-1][ycoor-1] = symbol[1]; 
} 
Смежные вопросы