我正在尝试使用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);
}
}
感谢您阅读
答案 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