为什么 %*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
之一读取输入时,行为定义明确(即 接收数据的对象对应于%[
指令未溢出),必须在s
或d
处存在输入失败或匹配失败。这是因为 scanf
期望其中的每一个都匹配一个文字字符(文字 's' 或 'd'),但是如果有更多可用字符,那么下一个必须是换行符. %[
.
将消耗任何其他内容
也许您的意思是 %[^\n]%d
、%[^\n]%*s
或类似的。 %s
和 %d
指令跳过前导空格,包括换行符(与 %c
或 %*c
不同),因此它们会尝试读取下一个换行符(如果有的话)输入。
另请注意,正如我已经提到的,所有这些替代方案都存在 输入失败 的可能性。也就是说,如果 %[
消耗了直到流末尾的所有字节,使得还有 none 剩余要读取,然后 scanf
退出。它的 return 值将反映这一点。但是,请注意不要将“流结束”与暂时没有可读字符混淆。这些根本不是一回事。
这是代码:
#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
之一读取输入时,行为定义明确(即 接收数据的对象对应于%[
指令未溢出),必须在s
或d
处存在输入失败或匹配失败。这是因为 scanf
期望其中的每一个都匹配一个文字字符(文字 's' 或 'd'),但是如果有更多可用字符,那么下一个必须是换行符. %[
.
也许您的意思是 %[^\n]%d
、%[^\n]%*s
或类似的。 %s
和 %d
指令跳过前导空格,包括换行符(与 %c
或 %*c
不同),因此它们会尝试读取下一个换行符(如果有的话)输入。
另请注意,正如我已经提到的,所有这些替代方案都存在 输入失败 的可能性。也就是说,如果 %[
消耗了直到流末尾的所有字节,使得还有 none 剩余要读取,然后 scanf
退出。它的 return 值将反映这一点。但是,请注意不要将“流结束”与暂时没有可读字符混淆。这些根本不是一回事。