C установка значения переменной на \ n

Возможный дубликат:
Программа не ждет ввода пользователя с помощью scanf («% c», & yn);

Я только начал программировать на C, и тут всплывает что-то странное (чего я не встречал в C ++).

В моем заголовочном файле я объявляю переменную (см. onemoretime в коде для .h файла), значение которой позже устанавливается с использованием пользовательского ввода через scanf(). По какой-то причине условные выражения, использующие переменную, не работали должным образом, либо возвращали бесконечно повторяющийся результат, либо просто ничего не делали. Я установил несколько точек останова и обнаружил, что при первом вызове onemoretime в функции main() значение onemoretime по какой-то причине установлено на \n.

Это не то значение, которое scanf() должно распознавать, но ввод обрабатывается как новая строка (очевидно). Когда я ввожу y, что должно вызвать else if условие и вернуться к началу main(), отладчик Xcode просто говорит: error: 'y' is not a valid command.

Вот мой .h файл:

#ifndef C1_Header_h
#define C1_Header_h

float num1, num2;
char op, onemoretime;

#endif

... А вот соответствующий код из файла .c:

#include <stdio.h>
#include <math.h>
#include "Header.h"

int main(int argc, const char * argv[])
{
    printf("Enter a two-number calculation below:\n");
    while (1)
    {
        scanf("%f%c%f", &num1, &op, &num2);

        // addition
        if (op == '+')
        {
            printf("%f\n", num1+num2);
            printf("\nDone. Would you like to solve another math problem (y/n)?\n");
            scanf("%c", &onemoretime);
            while (1)
            {
                if (onemoretime == 'n') 
                {
                    printf("Ok. Terminating program.");
                    return 0;
                }
                else if (onemoretime == 'y') 
                {
                    // loop back to start main function
                }
            }
        }
    }
        // rest of code, irrelevant here
}

Если это вообще фактор, то при наведении курсора на переменную onemoretime в Xcode (с отображением ее основных свойств) каждый экземпляр переменной после первоначального объявления в файле заголовка показывает значение \n.

Что я делаю неправильно? Как значение onemoretime может быть установлено пользователем, а не программой, прежде чем пользователь сможет до него добраться?


person Jules    schedule 02.02.2013    source источник
comment
Что я делаю неправильно? - две вещи на первый взгляд: 1 вы начали с C ++, а потом пытаетесь изучить C, 2. вы получаете ввод пользователя с помощью scanf(), который, в свою очередь, не делает того, что вы думаете.   -  person    schedule 02.02.2013
comment
Что плохого в изучении C вместе с C ++?   -  person Jules    schedule 02.02.2013
comment
У nC есть несколько концепций, которые вам обязательно нужно усвоить, чтобы не ошибаться. В C ++ они тоже есть, но с изюминкой, и поскольку C ++ является более сложным (и, на самом деле, более трудным для понимания) языком, я обычно рекомендую людям освоить C, прежде чем углубляться в C ++, иначе они будут есть проблемы, подобные этой.   -  person    schedule 02.02.2013
comment
Просто чтобы не согласиться с H2CO3 - если вы хотите изучить только C ++, нет причин сначала изучать C. Это просто создаст вам еще один набор проблем при повторном обучении. Если вы хотите изучить любую комбинацию языков C, C ++, C # и Java, у вас будут проблемы с тем, что они выглядят одинаково, работают по-разному, в каком бы порядке вы их не пытались изучить.   -  person Bo Persson    schedule 02.02.2013
comment
H2CO3: ... и что происходит, когда выясняется, что оператор по модулю в C ++ не действует так же, как оператор по модулю в C, после того, как они написали двадцать тысяч строк кода, в котором предполагается, что они действуют как тем же?   -  person autistic    schedule 02.02.2013


Ответы (2)


[\n] не является значением, которое scanf() должно распознавать, []

В целом это так, но «Обычный пропуск символов пробела подавляется в [случае %c]» [ссылка].

Чтобы получить op и onemoretime, я бы рекомендовал использовать fgetc (ссылка) а не scanf, и самостоятельно обрабатывать пропуски пробелов.

person ruakh    schedule 02.02.2013

Всякий раз, когда вы хотите получить один единственный символ с scanf(), вы всегда должны использовать что-то для поглощения символа новой строки. Вы можете сделать что-то вроде этого scanf("%c\n",&onemoretime);

person Manolis Ragkousis    schedule 02.02.2013