C: функция пропускает ввод пользователя в коде - PullRequest
1 голос
/ 25 февраля 2012

У меня возникла проблема с этой функцией (частью игры «Морской бой»), когда она однажды будет прекрасно проходить через нее, но в последующих выполнениях она пропускает:

    scanf("%c",&rChar);

По какой-то причине rChar превращается в другое значение без ввода пользователем кода выше. Я попытался вставить в printf операторы, показывающие значение rChar во всей функции.

Функция Conv_rChar_Int() конвертирует Char, введенный пользователем, в целочисленное значение. Но поскольку rChar не передается в качестве указателя, значение rChar остается неизменным до тех пор, пока пользователь не заменит его на следующей итерации. (Проверено еще раз с printf). Странная вещь, это меняется прямо между этими строками кода. и никогда не запрашивает у пользователя rChar.

    printf("please enter the row you want to place your %d ship in\n",length);
    scanf("%c",&rChar);

Помните, это происходит только ПОСЛЕ первого раза. Даже если я переинициализирую переменные rChar, r, c и dir после каждой итерации, эта проблема все еще возникает. Я на 99% уверен, что проблема в этой функции, а не в какой-либо из функций, вызываемых внутри нее (потому что rChar остается неизменным после каждой отдельной строки, за исключением двух строк выше).

Заранее спасибо за помощь. Если у вас есть какие-либо вопросы по поводу кода, я постараюсь объяснить его подробнее.

int Gen_Ship_Place(int length, int flag3, int PlayGrid[10][10]){
int ShipPlaceFlag = 0;

//coordinates and direction
int r;
char rChar;
int c;
int dir;

//this loops until a ship location is found
while(ShipPlaceFlag == 0)
{
    //enters row
    printf("please enter the row you want to place your %d ship in\n",length);
    scanf("%c",&rChar);

    r = Conv_rChar_Int(rChar);

    //adjusts row
    r--;
    //enter column
    printf("please enter the column you want to place your %d ship in\n",length);
    scanf("%d",&c);

    //adjust column
    c--;

    //enter direction
    printf("please enter the direction you want your %d ship to go\nwith\n0 being north\n1 being east\n2 being south\n3 being west\n",length);

    scanf("%d",&dir);

    //checks ship placement
    ShipPlaceFlag = Check_Ship_Place(length,dir,flag3,r,c,PlayGrid);

    //tells player if the location is wrong or not
    if(ShipPlaceFlag == 0)
    {
        printf("****the location and direction you have chosen is invalid please choose different coordinates, here is your current board*****\n\n");
    }
    else
    {
        printf("****great job, here is your current board*****\n\n");
    }

    //prints grid so player can check it for their next move
    Print_Play_Grid(PlayGrid);

}

Ответы [ 2 ]

4 голосов
/ 25 февраля 2012

Ваша программа печатает это приглашение:

please enter the row you want to place your 2 ship in

и вызывает scanf.Вы набираете 5 и нажимаете return.Вы ввели два символа: 5 и символ новой строки \n.(Или, может быть, \r в Windows.) Этот символ новой строки находится в буфере ввода до следующего вызова scanf, который читает символ новой строки и сразу возвращается без необходимости вводить дополнительные данные.* Вы можете scanf пропустить последние строки (и другие пробелы) при чтении одного символа, поместив пробел перед спецификатором %c, например:

scanf(" %c", &c);
1 голос
/ 25 февраля 2012

Когда пользователь нажимает ввод, это также символ, который будет во входном буфере.Вам нужно будет прочитать это.

//prints grid so player can check it for their next move
Print_Play_Grid(PlayGrid);
while (fgetc(stdin)!='\n') { }
...