C-扫描后如何get()工作



我有两个问题:

  1. 为什么只有在"%d"中进行空间 -> scanf("%d ", &num);它起作用?

我尝试了scnnf和get之间的 fflush(stdin) _flushall(),但它不起作用,它跳过了。

  1. 当我做空间时,它首先进行scanf,然后进行获取,然后打印数字并打印字符串。
void main(){    char ch,str [10];    int num;    printf("输入您的号码:");    scanf("%d",&num);    printf("%d  n",num);    得到(str);    puts(str);    系统("暂停");}
  1. 为什么只有在我在"%d"中进行空间 -> scanf("%d",& num);它有效吗?

scanf("%d", &num); "%d"之后没有空间,在阅读数字后停止扫描。因此,使用输入 1 2 3 enter Enter 'n'仍在stdin中,例如现在的NONE INTUP函数 - 标准gets()gets()读取单个'n'并返回。通过添加一个空间,scanf("%d ", &num);在数字之后消耗白色空间,并且在数字之后输入非白色scape之前才返回。

  1. 当我做空间时,它首先进行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

最新更新