为什么我不能使用“%[^\n]”扫描集?
Why can't I use "%[^\n]" scanset?
我正在尝试为我的程序中包含空格的字符串获取用户输入,但由于某些原因 %[^\n]
不起作用。
%
部分标记为红色。我不明白为什么。它只是跳过而不要求用户输入。
int prelim, midterm, semiFinal, final, totalScore, yearLevel, studentId;
float averageScore = 0;
char name[25], degree[25];
printf("Enter your student id: ");
scanf("%d", &studentId);
printf("Name: ");
scanf("%[^\n]s", &name);
printf("Degree: ");
scanf("%[^\n]s", °ree);
printf("Year: ");
scanf("%d", &yearLevel);
首先,scanf("%[^\n]s", &name)
必须是scanf("%[^\n]", name)
,因为
s
不是 %[
格式说明符的一部分,正如 C 新手通常认为的那样。
- & 符号应该被删除,因为数组的名称衰减到指向其第一个元素的指针,该元素已经是
%[
期望的类型。
现在,要回答您的问题,如果 %[^\n]
看到的第一个字符是 \n
,它将失败。对于 studentId
的 scanf
,您键入数字并按 Enter。 scanf
消耗了数字,但在输入流中留下了输入字符 (\n
)。然后,name
的 scanf
会看到换行符,因为它是它看到的第一个字符,所以它会在不触及 name
的情况下失败。由于同样的原因,下一个 scanf
失败,最后一个 scanf
等待一个数字。
但是等等!为什么最后一个 scanf
也没有失败?答案是某些格式说明符,如 %d
跳过前导白色 space 字符。 %[
格式说明符没有。
现在我们该如何解决这个问题?一个简单的解决方案是告诉 scanf
跳过 %[
格式说明符之前的白色 space 字符。您可以通过在它之前添加一个 space 来做到这一点:scanf(" %[^\n]", name)
。当 scanf
看到 space 时,它将跳过输入流中的所有白色 space 字符,直到第一个非白色 space 字符。这应该可以解决您的问题。
我正在尝试为我的程序中包含空格的字符串获取用户输入,但由于某些原因 %[^\n]
不起作用。
%
部分标记为红色。我不明白为什么。它只是跳过而不要求用户输入。
int prelim, midterm, semiFinal, final, totalScore, yearLevel, studentId;
float averageScore = 0;
char name[25], degree[25];
printf("Enter your student id: ");
scanf("%d", &studentId);
printf("Name: ");
scanf("%[^\n]s", &name);
printf("Degree: ");
scanf("%[^\n]s", °ree);
printf("Year: ");
scanf("%d", &yearLevel);
首先,scanf("%[^\n]s", &name)
必须是scanf("%[^\n]", name)
,因为
s
不是%[
格式说明符的一部分,正如 C 新手通常认为的那样。- & 符号应该被删除,因为数组的名称衰减到指向其第一个元素的指针,该元素已经是
%[
期望的类型。
现在,要回答您的问题,如果 %[^\n]
看到的第一个字符是 \n
,它将失败。对于 studentId
的 scanf
,您键入数字并按 Enter。 scanf
消耗了数字,但在输入流中留下了输入字符 (\n
)。然后,name
的 scanf
会看到换行符,因为它是它看到的第一个字符,所以它会在不触及 name
的情况下失败。由于同样的原因,下一个 scanf
失败,最后一个 scanf
等待一个数字。
但是等等!为什么最后一个 scanf
也没有失败?答案是某些格式说明符,如 %d
跳过前导白色 space 字符。 %[
格式说明符没有。
现在我们该如何解决这个问题?一个简单的解决方案是告诉 scanf
跳过 %[
格式说明符之前的白色 space 字符。您可以通过在它之前添加一个 space 来做到这一点:scanf(" %[^\n]", name)
。当 scanf
看到 space 时,它将跳过输入流中的所有白色 space 字符,直到第一个非白色 space 字符。这应该可以解决您的问题。