如何理解 C 中的 scanf 缓冲区和格式?
how to understand scanf buffer and format in C?
依稀记得scanf有问题,今天又遇到这种现象。我想这是一个众所周知的问题(?)。这是测试scanf的简单测试代码。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int8_t buff[1024];
int main()
{
char option;
printf("Welcome to the demo of character device driver...\n");
while (1) {
printf("***** please enter your option *****\n");
printf(" 1. Write \n");
printf(" 2. Read \n");
printf(" 3. Exit \n");
scanf("%c", &option); // line 18
printf("your option = %c\n", option);
switch(option) {
case '1' :
printf("Enter the string(with no space) :\n");
//scanf("%[\t\n]s", buff);
scanf("%s", buff); // line 24
break;
case '2' :
printf("Data = %s\n", buff);
break;
case '3' :
exit(1);
break;
default :
printf("Enter valid option. option = %c\n", option);
}
}
}
当我运行它(我用调试器跟踪它)时,当第18行scanf("%c", &option);
第二次运行s时,'\n'字符从输入第 24 行中的最后一个 scanf("%s", buff);
,使 option
\n
并且 switch 语句打印关于该选项的投诉并跳到 while 循环。
我观察到如果我把scanf("%c", &option);
改成scanf(" %c", &option);
,问题就没有了。我该如何理解这种现象?使用 scanf 函数时在 %c 或 %s 之前有一个 space 或一个制表符有什么影响?
来自C标准(7.21.6.2 fscanf函数)
5 A directive composed of white-space character(s) is executed by
reading input up to the first non-white-space character (which remains
unread), or until no more characters can be read.
因此在调用 scanf 时使用带有前导空格的格式
scanf(" %c", &option);
导致跳过输入流缓冲区中的空格。
依稀记得scanf有问题,今天又遇到这种现象。我想这是一个众所周知的问题(?)。这是测试scanf的简单测试代码。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int8_t buff[1024];
int main()
{
char option;
printf("Welcome to the demo of character device driver...\n");
while (1) {
printf("***** please enter your option *****\n");
printf(" 1. Write \n");
printf(" 2. Read \n");
printf(" 3. Exit \n");
scanf("%c", &option); // line 18
printf("your option = %c\n", option);
switch(option) {
case '1' :
printf("Enter the string(with no space) :\n");
//scanf("%[\t\n]s", buff);
scanf("%s", buff); // line 24
break;
case '2' :
printf("Data = %s\n", buff);
break;
case '3' :
exit(1);
break;
default :
printf("Enter valid option. option = %c\n", option);
}
}
}
当我运行它(我用调试器跟踪它)时,当第18行scanf("%c", &option);
第二次运行s时,'\n'字符从输入第 24 行中的最后一个 scanf("%s", buff);
,使 option
\n
并且 switch 语句打印关于该选项的投诉并跳到 while 循环。
我观察到如果我把scanf("%c", &option);
改成scanf(" %c", &option);
,问题就没有了。我该如何理解这种现象?使用 scanf 函数时在 %c 或 %s 之前有一个 space 或一个制表符有什么影响?
来自C标准(7.21.6.2 fscanf函数)
5 A directive composed of white-space character(s) is executed by reading input up to the first non-white-space character (which remains unread), or until no more characters can be read.
因此在调用 scanf 时使用带有前导空格的格式
scanf(" %c", &option);
导致跳过输入流缓冲区中的空格。