为什么 %*c 在表达式 "%[^\n]s%*c" 中不起作用

why %*c not working in the expression "%[^\n]s%*c"

这是代码:

#include <stdio.h>
#include <string.h>

struct driverDetail
{
    char name[20];
    int licenseNumber;
    char route[20];
    int kms;
};

int main()
{
    struct driverDetail drivers[1];

    for (int i = 0; i < 1; i++)
    {
        printf("\nEnter details for driver %d :\n", i+1);
        printf("Enter driver's name : ");
        scanf("%[^\n]s%*c", &drivers[i].name);
        printf("Enter driver's license number : ");
        scanf("%[^\n]d%*c", &drivers[i].licenseNumber);
        printf("Enter driver's route : ");
        scanf("%[^\n]s%*c", &drivers[i].route);
        printf("Enter driver's kilometers driven : ");
        scanf("%[^\n]d%*c", &drivers[i].kms);
    }

    for (int i = 0; i < 1; i++)
    {
        printf("driver %d name : %s\n", i+1, drivers[i].name);
        printf("driver %d license number : %d\n", i+1, drivers[i].licenseNumber);
        printf("driver %d route : %s\n", i+1, drivers[i].route);
        printf("driver %d kilometers driven : %d\n", i+1, drivers[i].kms);
    }

    return 0;
}

%[^\n]%*c 工作完全正常,但为什么 %[^\n]s%*c 不工作。

当我使用 %[^\n]%*c\n 被第一个格式说明符拒绝,然后 %*c 读取 \n 并丢弃它。但是为什么 *%c 在与 %[^\n]s%*c 一起使用时不丢弃 \n.

%d 相同的情况,*%c 适用于 %d%*c 但不是 %[^\n]d%*c.

为什么会这样?谁能解释一下。

当 scanf 根据格式 %[^\n]s%*c%[^\n]d%*c 之一读取输入时,行为定义明确( 接收数据的对象对应于%[指令未溢出),必须在sd处存在输入失败或匹配失败。这是因为 scanf 期望其中的每一个都匹配一个文字字符(文字 's' 或 'd'),但是如果有更多可用字符,那么下一个必须是换行符. %[.

将消耗任何其他内容

也许您的意思是 %[^\n]%d%[^\n]%*s 或类似的。 %s%d 指令跳过前导空格,包括换行符(与 %c%*c 不同),因此它们会尝试读取下一个换行符(如果有的话)输入。

另请注意,正如我已经提到的,所有这些替代方案都存在 输入失败 的可能性。也就是说,如果 %[ 消耗了直到流末尾的所有字节,使得还有 none 剩余要读取,然后 scanf 退出。它的 return 值将反映这一点。但是,请注意不要将“流结束”与暂时没有可读字符混淆。这些根本不是一回事。