c - scanf之后get()如何工作?

时间:2017-09-07 20:11:55

标签: c scanf gets

我有两个问题:

  1. 为什么只有当我在“%d”中做空格时 - > scanf("%d ", &num);它有效吗?
  2. 我在scnaf和gets之间尝试fflush(stdin) \ _flushall()并且它不起作用,它会跳过获取。

    1. 当我做空间时,它首先执行scanf然后获取,然后打印数字并打印字符串。
    2. void main()
      {
          char ch, str[10];
          int num;
          printf("Enter your number : ");
          scanf("%d ", &num);
          printf("%d\n",num);
          gets(str);
          puts(str);
          system("pause");
      }
      

2 个答案:

答案 0 :(得分:3)

C FAQ涵盖scanf的所有这些问题。请参阅Why does everyone say not to use scanf? What should I use instead?及相关条目。通常,您会使用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会读取换行符或缓冲区可以容纳。如果该行大于您的缓冲区,则它可能只读取该行的一部分。接下来从输入读取将获得该行的其余部分。有避免这种情况的方法,例如the POSIX getline function,但至少你不会陷入无限循环。

让我们解读一些评论。

不要使用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()功能。"

是的, 是C中的gets()函数。

是的,不是 C中的gets()函数。

这取决于你在说什么C.

有些人说'C"意味着C11,现行标准。其他人说'" C"意味着C99以前的标准。有些人仍坚持原标准C90。 C90中有一个gets()函数。它在C99中已弃用。它已从C11中的语言中删除。

C编译器和文档落后于标准,非常非常远。许多人仍在全力支持C99。如果你为C11工作,你会因为缺乏支持而感到非常惊讶。如果您希望代码适用于大多数编译器,请写入C99。

无论如何,请勿使用gets

答案 1 :(得分:2)

  
      
  1. 为什么只有当我在“%d”中做空格时 - > scanf(“%d”,& num);它有效吗?
  2.   
scanf("%d", &num);之后没有空格的

"%d",在读取数字后停止扫描。因此,输入 1 2 3 输入'\n'保留在stdin中下一个输入函数,如现在的非标准gets()gets()读取单个'\n'并返回。通过添加空格,scanf("%d ", &num);会消耗数字后面的空格,并且在数字后面输入非白色景观后才会返回。

  
      
  1. 当我做空间时,它首先执行scanf然后获取,然后打印数字并打印字符串。
  2.   

通过添加空格,scanf("%d ", &num);不会返回,直到在数字后面输入非空格(如下面的'a'中所示)。由于stdin通常是行缓冲的,这意味着需要首先输入2行。 1 2 3 输入 a b C 输入

建议改为使用fgets()来阅读用户输入的

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("%d\n",num);

printf("Enter data : ");
fflush(stdout);
fgets(str, sizeof str, stdin);
fputs(str, stdout);

更强大的代码会检查fgets(), sscanf()的结果并使用strtol()而不是sscanf()