2016-06-25 4 views
-1

Я пытаюсь использовать функцию EOF, но это не работает, как я ожидаю. В режиме отладки он не обнаруживает вторую функцию «scanf» и просто продолжает работу. Он продолжает пропускать функцию «scanf» время от времени. Код размещен нижеEOF не работает как ожидалось (C)

int main() { 
    char tempString; 
    int i = 0; 
    printf("Enter your letter\n"); 
    scanf_s("%c", &tempString); 

    while (tempString != EOF) { 

     printf("You entered:%c\n", tempString); 
     scanf_s("%c", &tempString); 
    } 
} 

Я также пробовал с помощью функции GetChar(), но то же самое происходит, код размещен ниже:

int main() { 
    char tempString; 
    int i = 0; 
    printf("Enter your letter\n"); 


    while ((tempString = getchar()) != EOF) { 

     printf("You entered:%c\n", tempString); 

    } 
} 

Спасибо за чтение

+2

'tempString' должен быть' 'int' – pzaenger

+0

полукокса tempString;' - >> 'int tempString;' во второй ptogram. В первой программе вы можете проверить возврат из scanf(). (и scanf_s() нонсенс) – wildplasser

+0

@wildplasser scanf_s - это термин для визуальных студий –

ответ

3

EDIT:

Во-первых, вы пропустили аргумент длины, требуемый scanf_s для %c и %s форматов.

Во-вторых, формат %c принимает следующий символ из входного буфера. Во второй (и последующей) записи остался newline, оставшийся во входном буфере от первого входа. Добавление space перед спецификатором формата %c очищает это ведущее пробельное пространство.

Другие форматы, такие как %s и %dсделать игнорировать ведущие пробелы, но не %c.

В-третьих, с scanf использование EOF не путь, вы должны контролировать цикл с возвращаемым значением из scanf который говорит вам количество элементов, успешно считаны.

Эта программа начинается с использования scanf_s. Вторая запись игнорирует newline после первой записи.

Затем он переходит к использованию getchar. В этом тесте возвращаемое значение функции равно int, так что это мой тип данных. Таким образом, EOF (-1) не будет конфликтовать с любыми требуемыми символьными данными. Обратите внимание, что getchar начинается с чтения newline, оставленного после предыдущего scanf_s (который игнорирует только пробел.

#include <stdio.h> 

int main(void) 
{ 
    char ch_scanf;         // char type 
    int ch_getchar;         // int type 
    printf("Using scanf_s\n"); 
    if (scanf_s(" %c", &ch_scanf, 1) == 1) {  // consumes any leading whitespace 
     printf("scanf_s value: %d\n", ch_scanf); 
    } 
    if (scanf_s(" %c", &ch_scanf, 1) == 1) {  // consumes any leading whitespace 
     printf("scanf_s value: %d\n", ch_scanf); 
    } 

    printf("\nUsing getchar\n"); 
    while ((ch_getchar = getchar()) != EOF) { 
     printf("getchar value: %d\n", ch_getchar); 
    } 

    return 0; 
} 

Пример сессия:

Using scanf_s 
A 
scanf_s value: 65 
B 
scanf_s value: 66 

Using getchar 
getchar value: 10 
C 
getchar value: 67 
getchar value: 10 
^Z 

Наконец, если вы хотите использовать стандартную функцию библиотеки scanf без MSVC тикает тебя, вы можете сделать это, как этот

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
+0

во-первых, спасибо за сообщение ответа, но я не вижу, чтобы вы использовали функцию EOF с петлей while –

+0

Повесьте меня, я отредактирую ... –

+0

@BiaKhan, если вы изменили ответ, чтобы сравнить использование 'scanf_s' и' getchar' ... отмечают, что 'EOF' не является функцией. Это макрос, дающий целочисленное значение. –

1

попробовать этот

#include <stdio.h> 

int main(void) { 
    char tempString; 

    printf("Enter your letter\n"); 

    while (scanf_s("%c%*c", &tempString, 1) != EOF) {//%*c for consume newline, 1 is buffer size 
     printf("You entered:%c\n", tempString); 
    } 

    return 0; 
} 
Функция
int tempString;//int for check EOF 

printf("Enter your letter\n"); 

while ((tempString = getchar()) != EOF) { 
    printf("You entered:%c\n", tempString); 
    getchar();//consume newline 
} 
0

Поведение зсапЕ() в C

ли читать входные данные из буфера клавиатуры, пока она не встречает EOF (то есть; пока мы нажмите клавишу ввода)

В общем, не рекомендуется использовать «% C» в C для чтения входного символа, потому что

Значение собирают в буфере клавиатуры, пока мы не попали введите, и мы не смогли ограничить ввод пользователем одного символа

Итак, лучший способ получить символ - с помощью функции getchar().

В программе, которую вы предоставили, вы можете использовать любой другой символ для проверки на конец, а не EOF, поскольку он используется в реализации scanf(), чтобы отметить входной конец.

Вы можете другие ключи, такие как esc, чтобы проверить на конец

#include <stdio.h> 
#include <stdlib.h> 

#define esc 27 

int main() 
{ 
    char ch; 

    while((ch = getchar()) != esc) { 

     //print the entered character here 
    } 
} 

знать подробно о scanf() реализации заглянуть в эту scanf() source code

+0

_ В функции 'main': неопределенная ссылка на' getch'_. Я думаю, это должно быть 'getchar()'? Если это так, то это также должно быть 'int ch''. – pzaenger

+0

Да! Это getchar() согласно C99. Изменили код. @pzaenger – lsof

+0

«до тех пор, пока он не встретит EOF», это не «до тех пор, пока мы не нажмем клавишу ввода», это может быть конец строки, но не конец файла (и 'scanf()' будет читать конец конца строки в любом случае). Кажется, вы связываете буферизацию строк с помощью 'scanf()' ... но буферизация строк - это отдельная вещь, которая происходит до того, как вход переходит к 'scanf()' или другим входным функциям и не изменяет, какой ввод может быть прочитан, только когда. Кроме того, 'getch()' является нестандартным и на самом деле не эквивалентен 'getchar()' в любом случае - один не является новой версией другого ... они просто разные функции, которые делают подобные вещи, но по-разному. – Dmitri