预期输入为: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 :(得分: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
}