Вот что содержит руководство Beez C (ССЫЛКА) сообщает о спецификаторе формата %[]
:
It allows you to specify a set of characters to be stored away (likely in an array of chars). Conversion stops when a character that is not in the set is matched.
Я был бы признателен, если бы вы могли прояснить некоторые основные вопросы, возникающие из этой предпосылки:
1) Являются ли данные, полученные этими двумя спецификаторами формата, сохраненными в аргументах (типа char*
) в виде массива символов или массива символов с завершающим символом \0
(строка)? Если это не строка, как сохранить ее как строку в случаях, подобных приведенной ниже программе, где мы хотим получить последовательность символов в виде строки и остановиться, когда встречается определенный символ (в наборе символов с отрицанием)?
2) Моя программа, по-видимому, предполагает, что обработка для спецификатора %[^|]
останавливается, когда встречается отрицательный символ |
. Но когда она начинается снова для следующего спецификатора формата, начинается ли она с инвертированного символа, где он остановился раньше? В моей программе я намерен игнорировать |
, поэтому я использовал %*c
. Но я проверил и обнаружил, что если я использую %c
и дополнительный аргумент типа char
, то символ |
действительно сохраняется в этом аргументе.
3) И, наконец, что очень важно для меня, в чем разница между передачей массива символов для спецификатора формата %s
в printf()
и строкой (массив символов с нулевым завершением)? В моей другой программе под названием character array vs string
я передали массив символов (не завершающийся NULL) для спецификатора формата %s
в printf()
, и он будет напечатан так же, как строка. В чем разница?
//Программа для иллюстрации спецификатора %[^]
#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);
}
//массив символов и строка
#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);
}
Вывод fruit,apple,lemon,and the character is |