N'a pas d' %[] ou %[^] spécificateur de scanf(),sscanf() ou fscanf() magasin de la saisie de caractères terminée par null tableau?

Voici ce que le Beez C guide (LIEN) raconte la %[] spécificateur de format:

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.

Je vous serais reconnaissant si vous pouvez clarifier certaines questions fondamentales qui se posent à partir de cette prémisse:

1) Sont l'entrée extraites par ces deux spécificateurs de format stockées dans les arguments(de type char*) comme un tableau de caractères ou un tableau de caractères avec un \0 la résiliation de caractère (string)? Si ce n'est une chaîne de caractères, comment le rendre en magasin en chaîne , dans des cas comme le programme ci-dessous où nous voulons aller chercher une séquence de caractères une chaîne de caractères et de s'arrêter quand un personnage en particulier (dans le nié jeu de caractères) est rencontré?

2) Mon programme semble suggérer que le traitement s'arrête pour la %[^|] spécificateur lorsque le caractère niées | est rencontré.Mais quand il commence à nouveau pour la prochaine spécificateur de format,est-il commencer par le caractère niées, où il avait arrêté plus tôt?Dans mon programme j'ai l'intention d'ignorer la | donc j'ai utilisé %*c.Mais je l'ai testé et trouvé que, si j'utilise %c et un argument supplémentaire de type char,alors le caractère | est en effet stocké dans cet argument.

3) Et enfin mais, aussi et surtout, pour moi,quelle est la différence entre le passage d'un tableau de caractères pour un %s spécificateur de format dans printf() et une chaîne de caractères(NULL tableau de caractères)?Dans mon autre programme intitulé character array vs string,j'ai passé un tableau de caractères(non NULL) pour un %s spécificateur de format dans printf() et il est imprimé comme une chaîne.Quelle est la différence?

//Programme pour illustrer %[^] spécificateur de

#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);
}

//tableau de caractères vs chaîne

#include<stdio.h>

int main()
{
char test[10]={'J','O','N'};
printf("%s",test);
}

Sortie JON

//À l'aide de %c au lieu de %*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);

}

Sortie fruit,apple,lemon,and the character is |

OriginalL'auteur Rüppell's Vulture | 2013-05-09