EOF未按预期工作(C)

时间:2016-06-25 19:15:42

标签: c while-loop eof

我正在尝试使用EOF功能,但它不能像我预期的那样工作。在调试器模式下,它不会检测第二个“scanf”功能,只是继续。它不断地错过“scanf”功能。代码发布在

下面
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); 

    }
}

感谢您阅读

3 个答案:

答案 0 :(得分:3)

编辑:

首先,您省略scanf_s %c%s格式%c所需的长度参数。

其次,newline格式从输入缓冲区中获取下一个字符。在第二个(和后续)条目中,第一个输入的输入缓冲区中有一个space。在%c格式说明符之前添加%s会清除该前导空格。

其他格式,例如%d%c 执行会忽略前导空格,但不会忽略scanf

第三,使用EOF使用scanf不是要走的路,你应该使用scanf_s的返回值来控制循环,它会告诉你成功读取的项目数

此程序首先使用newline。第二个条目在第一个条目之后忽略getchar

然后它转向使用int。在此测试中,函数返回值为EOF,因此这里是我的数据类型。这样getchar( - 1)与任何所需的字符数据都不会发生冲突。请注意,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> ,你就可以这样做了

update users set email = Concat(id,'.',firstname,'@exampe.com')

答案 1 :(得分: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
}

答案 2 :(得分:0)

C

中scanf()函数的行为
  

是从键盘缓冲区读取输入,直到遇到EOF(即;直到我们    按回车键)

一般情况下,建议不要使用&#34;%c&#34;在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