我有两个问题:
- 为什么只有在"%d"中进行空间 ->
scanf("%d ", &num);
它起作用?
我尝试了scnnf和get之间的 fflush(stdin) _flushall()
,但它不起作用,它跳过了。
- 当我做空间时,它首先进行scanf,然后进行获取,然后打印数字并打印字符串。
void main(){ char ch,str [10]; int num; printf("输入您的号码:"); scanf("%d",&num); printf("%d n",num); 得到(str); puts(str); 系统("暂停");}
- 为什么只有在我在"%d"中进行空间 -> scanf("%d",& num);它有效吗?
scanf("%d", &num);
"%d"
之后没有空间,在阅读数字后停止扫描。因此,使用输入 1 2 3 enter Enter ,'n'
仍在stdin
中,例如现在的NONE INTUP函数 - 标准gets()
。gets()
读取单个'n'
并返回。通过添加一个空间,scanf("%d ", &num);
在数字之后消耗白色空间,并且在数字之后输入非白色scape之前才返回。
- 当我做空间时,它首先进行scanf,然后进行获取,然后打印数字并打印字符串。
通过添加一个空间,scanf("%d ", &num);
直到在数字之后输入非白色空间之前返回(如以下'a'
所示)。由于stdin
通常是线条缓冲的,因此这意味着首先需要2行的输入。 1 2 3 enter a b c enter 。
建议使用fgets()
读取用户输入的 line 。
char str[10*2]; // no need for such a small buffer
int num;
printf("Enter your number : ");
fflush(stdout);
fgets(str, sizeof str, stdin);
sscanf(str, "%d", &num);
printf("%dn",num);
printf("Enter data : ");
fflush(stdout);
fgets(str, sizeof str, stdin);
fputs(str, stdout);
更强大的代码将检查fgets(), sscanf()
的结果并使用strtol()
而不是sscanf()
。
C FAQ用scanf
涵盖了所有这些问题。参见为什么每个人都说不使用scanf?我应该使用什么?和相关条目。通常,您将使用fgets
,然后使用sscanf
等结果线并检查sscanf
是否成功。这避免了留下无与伦比的输入并冒着无限循环的风险。
int number;
char line[255];
fgets( line, sizeof(line), stdin );
if( sscanf( line, "%d", &number ) != 1 ) {
fputs("That doesn't look like a number.n", stdin);
}
请注意,fgets
将读取到newline 或您的缓冲区所能容纳的程度。如果该行大于您的缓冲区,则可能只读取一部分行。接下来的输入读取将获得其余部分。有一些方法可以避免这种情况,例如Posix Getline功能,但至少您不会在无限的循环中结束。
让我们解密一些评论。
永远不要使用gets
。使用fgets
。
您不使用gets
的原因是因为没有办法限制从stdin
读取多少。这意味着用户可以溢出缓冲区,从而造成破坏。
char buffer[32];
// What the line is more than 31 characters?
gets(buffer);
fgets()
采用缓冲区的大小,最多会读取许多字符。这样可以防止缓冲区溢出。
char buffer[32];
// If there's more than 31 characters it will stop reading.
// The next read of stdin will get the rest of the line.
fgets( buffer, sizeof(buffer), stdin );
" c。中没有gets()
功能
是的,是 gets()
c。
是的,不是 c。
中的gets()
功能这取决于您在谈论哪个C。
有些人说" C"是指当前标准的含义C11。其他人说" C"是指先前的标准。有些仍然遵守C90,这是原始标准。C90中有gets()
功能。它在C99中被弃用。它已从C11中的语言中删除。
c编译器和文档滞后非常非常非常远,远远落后于标准。许多仍在全力支持C99。如果您在C11上工作,那么缺乏支持会感到非常惊讶。如果您希望代码在大多数编译器上使用,请写入C99。
无论如何,不要使用gets
。