插入无效输入时出错

时间:2013-12-06 19:48:37

标签: c visual-c++ null strtok

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

有什么想法吗?!

1 个答案:

答案 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
}