2013-12-06 5 views
1

Ожидаемый ввод: SET_MINE X Y, а X и Y должны быть цифрами от 0-19; когда пользователь закончит вставлять свои данные, он, как ожидается, напишет SET_DONE. Я столкнулся с двумя проблемами здесь, которые, по-видимому, происходят по той же причине: 1. когда я вставляю: SET_MINE (а ​​затем нажмите ENTER) или SET_MINE X (вставляя только одно число, а не два), строка «Вставить не удалось» : недостаточно параметров "печатается на экране бесконечное количество раз! 2. То же самое происходит, когда я вставляю числа из диапазона [0,19], например: SET_MINE 56 7. Вот, я ожидаю увидеть эту строку на экране «Вставить не удалось: незаконная строка/столбец», но вместо этого я получаю это: «Вставка сбой: недостаточно параметров» напечатано бесконечно много раз.Ошибка при вводе недопустимого ввода

Вот мой код:

int main() 
{ 
int game_board[FIELD_ROWS][FIELD_COLS]={0}; 
char szLine[MAX_LINE_SIZE]; 
char* delimiters = " \t\n"; 
char* pszCommand; 
char* pszCol; 
char* pszRow; 

BOOL gameContinue= TRUE; 
MINE* pHead = NULL; 
POSITION pos; 

int stepDirection; 
int row=0; 
int col=0; 
int old_row=row, old_col=col, mine=0; 

fgets(szLine,MAX_LINE_SIZE,stdin);  // get line from standard input 
while (strncmp(szLine,"SET_DONE",8) != 0) 
{ 
    pszCommand = strtok(szLine, delimiters); 

    if (NULL == pszCommand) 
    { 
     continue; 
    } 
    if (0 == strcmp(pszCommand, "SET_MINE")) 
    { 
     pszRow = strtok(NULL, delimiters); 
     pszCol = strtok(NULL, delimiters); 
     if (NULL == pszCol || NULL == pszRow) 
     { 
      fprintf(stderr, "Insert failed: not enough parameters\n"); 
      continue; 
     } 
     row = atoi(pszRow); 
     col = atoi(pszCol); 
     if (row <0 || row >= FIELD_ROWS || col < 0 || col >= FIELD_COLS) 
     { 
      fprintf(stderr, "Insert failed: illegal row/col \n"); 
      continue; 
     } 

      game_board[row][col]=-1; // a mine is inserted to this place 
    } 

    fgets(szLine,MAX_LINE_SIZE,stdin); // get line from standard input 
} 

Любые идеи ?!

ответ

0

Это потому, что вы используете continue, так что ваш второй fgets никогда не будет выполнен. См. Стандарт: http://msdn.microsoft.com/en-us/library/6e3dc2z3.aspx (сайт Microsoft, но все еще применимый)

Подумайте о инструкции continue, как говорится в цикле «Ладно, эта итерация завершена, начните следующую».

Итак, когда вы достигнете части, где вы сообщить пользователю, что не поставлять достаточное количество параметров, это все, что петля видит:

fgets(szLine,MAX_LINE_SIZE,stdin);  // get line from standard input 
while (strncmp(szLine,"SET_DONE",8) != 0) 
{ 
    ...; 
    if (0 == strcmp(pszCommand, "SET_MINE")) 
    { 
     pszRow = strtok(NULL, delimiters); 
     pszCol = strtok(NULL, delimiters); 
     if (NULL == pszCol || NULL == pszRow) 
     { 
      fprintf(stderr, "Insert failed: not enough parameters\n"); 
      continue; 
     } 
    } 
    //nothing down here 
} 

В глазах программы, второй fgets на дно цикла не существует.

Вы можете исправить это, используя более умную условную логику.

Это (непроверенные) фрагмент кода должен исправить вещи:

while (strncmp(szLine,"SET_DONE",8) != 0) 
{ 
    pszCommand = strtok(szLine, delimiters); 

    if (pszCommand != NULL && 0 == strcmp(pszCommand, "SET_MINE")) 
    { 
     pszRow = strtok(NULL, delimiters); 
     pszCol = strtok(NULL, delimiters); 
     if (NULL != pszCol && NULL != pszRow) 
     { 
      row = atoi(pszRow); 
      col = atoi(pszCol); 
      if (row < 0 || row >= FIELD_ROWS || col < 0 || col >= FIELD_COLS) 
      { 
       fprintf(stderr, "Insert failed: illegal row/col \n"); 
      } 
      else 
      { 
       game_board[row][col]=-1; // a mine is inserted to this place 
      } 
     } 
     else{ 
      fprintf(stderr, "Insert failed: not enough parameters\n"); 
     } 

    } 

    fgets(szLine,MAX_LINE_SIZE,stdin); // get line from standard input 
} 
+0

Это действительно работает; Кроме того, я пробовал «делать-пока» и писал «fgets» только в начале цикла, что тоже работает. – user2750466

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