执行 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?
这就是 %s
在 scanf
中指定要做的事情。在 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 是其中的一部分。
#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?
这就是 %s
在 scanf
中指定要做的事情。在 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
, orn
specifier.
因此,除了 %[
、%c
和 %n
之外的所有转换都会跳过初始的白色-space 字符,其中包括换行符。
一般来说,scanf
并不是一个功能强大的解析器,它有助于检查输入流中的每个字符。它旨在成为一种方便的机制,用于读取没有很多严格约束的简单数据格式。跳过 white-space 是其中的一部分。