2015-12-06 5 views
-1

это моя функция ввода:Дополнительные/пропущенные символы в зсапЕ

int input(int array[500][500], int *x0, int *y0) { 
    int x = 0; 
    int y = 0; 
    int err = 0; 
    int temp = 0; 
    char c; 
    char s[2]; 
    printf("Enter sizes:\n"); 
    if (scanf("%d %d%c", x0, y0, &c) !=3 || 
     *x0 <= 0 || *y0 <= 0 || *x0 > 500 || *y0 > 500 || c!='\n') { 
     printf("Invalid input.\n"); 
     return 0; 
    } 
    while (y < *y0) { 
     x = 0; 
     temp = 0; 
     while (x < *x0) { 
      if (scanf("%1s", s)==1) { 
       c = *s; 
      } // so that ooo is written into three array fields 
      switch(c) { // only these three chars are accepted 
      case 'o': 
       array[y][x] = 1; 
       break; 
      case '.': 
       array[y][x] = 0; 
       break; 
      case '!': 
       array[y][x] = 2; 
       break; 
      default: 
       err = 1; 
       break; 
      } 
      x++; 
      temp = x; 
      if (temp > *x0) // my attempt 
       err = 1; 
     } 
     if (x != *x0) 
      err = 1; 
     y++; 
    } 
    if (y != *y0) 
     err = 1; 
    if (err == 1) { 
     printf("Invalid input.\n"); 
     return 0; 
    }  
    return 1; 
} 

В принципе, если I вход:

3 3 
oooo 
ooo 
ooo 

Он должен печатать Invalid input., поскольку вторая запись имеет 4 символов, а не 3. Аналогично, если я написал 2 символа вместо трех, он должен также распечатать сообщение об ошибке.

Мое мышление заключается в том, что после каждого считываемого символа я записываю этот символ в массив (если символы приняты), а затем x++, поэтому я могу написать следующий ввод в следующее поле. Так что, если у меня есть 4 символа, и только 3 следует принять, x будет 4 и temp будет 4 тоже. 4 > 3 so err=1.

Так что же случилось с моим решением? Какое правильное решение? Заранее спасибо.

+0

Какая часть логики не видна? Сначала я пишу 3 числа, в основном размер матрицы. Затем я пишу матрицу - допускаются только 'o','! 'Или' .'. Если бы я написал, что матрица будет 3x3, и я ввожу строку, которая имеет 4 символа, конечно, это неправильно, и мне нужно уметь распознавать эту ошибку. –

+0

Что происходит, когда scanf не возвращается 1 –

+0

Тогда ничего. scanf не вернет 1, если это не строка. Даже если это была строка, мой переключатель говорит, что если это не один из трех символов, появляется мой флаг ошибки. –

ответ

1

Если вы хотите утверждать, что пользователь вводит символы в отдельных строках для каждой строки матрицы, используйте fgets(), чтобы прочитать строку и проанализировать эту строку вручную, пропустив символы пробела и обработав принятые символы соответствующим образом. Как только вы дойдете до конца строки матрицы, пожалуйтесь, если в строке остались пробелы.

Кстати, вы должны увеличить только x, если персонаж был принят. В текущей версии вы увеличиваете x даже при обнаружении неправильного символа.

+0

. Разделите строку вручную, вы имеете в виду писать во временный массив символов, а затем проверить, сколько писем было, а затем записать это в мой массив? –

+0

Извините, что снова вас беспокоил. Я пробовал играть с ним немного, и это то, что я придумал: [code] (http://pastebin.com/5qsfNnN2). Этот код всегда останавливается на y-2 входах, несмотря на то, что я не изменил 'y' в коде. –

+0

В коде, на который вы ссылаетесь, 'fgets()' не хватает места для чтения '' \ n'' в буфере для первой строки. Вторая строка будет пустой: вы просто прочитаете '' \ n'' из первой строки. Код сканирования не останавливается на '' \ 0'', этот '' \ 0'' будет считаться недопустимым символом, установив «err = 1». В конце строки вы рано сломаетесь из линейного цикла с 'y' =' 1' из-за теста на 'err'. Сделайте буфер 501 байт, остановите сканирование на '' \ 0'', не увеличивайте 'x' на недопустимые или пробельные символы. – chqrlie