为什么我不能使用“%[^\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", &degree);
printf("Year: ");
scanf("%d", &yearLevel);

首先,scanf("%[^\n]s", &name)必须是scanf("%[^\n]", name),因为

  1. s 不是 %[ 格式说明符的一部分,正如 C 新手通常认为的那样。
  2. & 符号应该被删除,因为数组的名称衰减到指向其第一个元素的指针,该元素已经是 %[ 期望的类型。

现在,要回答您的问题,如果 %[^\n] 看到的第一个字符是 \n,它将失败。对于 studentIdscanf,您键入数字并按 Enterscanf 消耗了数字,但在输入流中留下了输入字符 (\n)。然后,namescanf 会看到换行符,因为它是它看到的第一个字符,所以它会在不触及 name 的情况下失败。由于同样的原因,下一个 scanf 失败,最后一个 scanf 等待一个数字。

但是等等!为什么最后一个 scanf 也没有失败?答案是某些格式说明符,如 %d 跳过前导白色 space 字符。 %[ 格式说明符没有。

现在我们该如何解决这个问题?一个简单的解决方案是告诉 scanf 跳过 %[ 格式说明符之前的白色 space 字符。您可以通过在它之前添加一个 space 来做到这一点:scanf(" %[^\n]", name)。当 scanf 看到 space 时,它将跳过输入流中的所有白色 space 字符,直到第一个非白色 space 字符。这应该可以解决您的问题。