执行 scanf("%s",ch);跳过先前输入的前导空格?

does scanf("%s",ch); skips the leading whitespaces from previous input?

#include <stdio.h>
#include <string.h>
#include<stdio.h>
int main()
{
   int ch;
   char str;
   scanf("%d", &ch);
   scanf("%c", &str);
   printf("x = %d, str = %c", ch, str);
   return 0;
}

Input: 10(enter)
Output: x = 10, str =

在此代码中 scanf("%d", &ch); 读取一个整数并在缓冲区中留下一个换行符。所以 scanf("%c", &str); 只读取换行符。 我明白了。

但是当我运行这个代码时:

#include <stdio.h>
#include <string.h>
#include<stdio.h>
int main()
{
   int ch;
   char str[54];
   scanf("%d", &ch);
   scanf("%s",str);
   printf("x = %d, str = %s", ch, str);
   return 0;
}

Input: 10(enter) test
Output: x = 10, str = test

这里似乎 scanf("%s",str); 忽略缓冲区中的换行符并从中读取 test控制台。

为什么会这样?

“测试”它没有被忽略,问题是你在请求一个 int(只读数字),然后是一个字符串(读到 \n 或 space,而不读那些)。

int ch;
char str[100];
scanf("%d", &ch); // this will read "10" and leave "\ntest\n" on the buffer
scanf("%s", str); // this will read "", so it will ask to the user an input. ("\ntest\n" is still on the buffer)

你要的是这个:

int ch;
char str[100];
scanf("%d", &ch); // this will read "10" and leave "\ntest\n" on the buffer
scanf("%c", &str[0]); // this will read "\n" and leave "test\n" on the buffer
scanf("%s", str); // this will read "test" and leave "\n" on the buffer

Why this is happening?

这就是 %sscanf 中指定要做的事情。在 2018 C 标准中,第 7.21.6.2 条第 7 和第 8 段说:

… A conversion specification is executed in the following steps:

Input white-space characters (as specified by the isspace function) are skipped, unless the specification includes a [, c, or n specifier.

因此,除了 %[%c%n 之外的所有转换都会跳过初始的白色-space 字符,其中包括换行符。

一般来说,scanf 并不是一个功能强大的解析器,它有助于检查输入流中的每个字符。它旨在成为一种方便的机制,用于读取没有很多严格约束的简单数据格式。跳过 white-space 是其中的一部分。