以下是基于此前提产生的一些基本问题,请予以澄清:
1)这两个格式说明符获取的输入是否以字符数组或带有 \0 结尾字符的字符数组(字符串)的形式存储在参数(char* 类型)中?如果不是字符串,则如何使其以字符串的形式存储,在下面的程序中,我们想要将一系列字符作为字符串获取,并在遇到特定字符(在否定字符集中)时停止?
2)我的程序似乎表明,当否定字符 | 被匹配到时,%[^|] 格式说明符的处理会停止。但是,当它开始处理下一个格式说明符时,它会从之前停止的否定字符处重新开始吗?在我的程序中,我打算忽略 |,因此我使用了 %*c。但是我进行了测试,发现如果我使用 %c 和额外的 char 类型参数,则字符 | 确实存储在该参数中。
3)最后但对我来说至关重要的是,printf() 中传递字符数组和字符串(NULL 结尾字符数组)的 %s 格式说明符有什么区别?在我的另一个名为 character array vs string 的程序中,我传递了一个字符数组(未 NULL 结尾)作为 printf() 中的 %s 格式说明符,并且它被打印出来就像字符串一样。这有什么区别吗?
//以下是演示 %[^] 格式说明符的程序
#include<stdio.h>
int main()
{
char *ptr="fruit|apple|lemon",type[10],fruit1[10],fruit2[10];
sscanf(ptr, "%[^|]%*c%[^|]%*c%s", type,fruit1, fruit2);
printf("%s,%s,%s",type,fruit1,fruit2);
}
//character array vs string
#include<stdio.h>
int main()
{
char test[10]={'J','O','N'};
printf("%s",test);
}
输出 JON
//使用%c代替%*c
#include<stdio.h>
int main()
{
char *ptr="fruit|apple|lemon",type[10],fruit1[10],fruit2[10],char_var;
sscanf(ptr, "%[^|]%c%[^|]%*c%s", type,&char_var,fruit1, fruit2);
printf("%s,%s,%s,and the character is %c",type,fruit1,fruit2,char_var);
}
输出 水果,苹果,柠檬,字符是 |
%*c
不应该消耗被排除的字符? - Rüppell's Vulture