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
Vous devez vous connecter pour publier un commentaire.
Il est null. De sscanf():
Les exclus, les personnages sont non consommées par l'analyse et restent à être traitées. Une alternative spécificateur de format:
Le tableau est en fait une valeur null comme éléments restants sera initialisé à zéro:
Si elle n'est pas null, alors il serait de garder l'impression jusqu'à ce qu'un caractère null a été trouvée quelque part dans la mémoire, éventuellement overruning la fin du tableau provoquant un comportement indéterminé. Il est possible d'imprimer un non-null tableau:
Pouvez-vous indiquer clairement que, dans l'autre réponse, Tony demande de la deuxième partie, à tort lorsqu'il affirme que
%*c
ne devrait pas consommer les exclus de caractère?Je intuitivement d'accord avec vous que les exclus de caractères doivent d'être traitées, mais alors,Tony est aussi un ancien combattant et ne peut pas être ignoré, tout comme ça....
il n'est pas traité par l'analyse.
et reste ouvert à être traitées par la prochaine spécificateur de format, ce qui est
%*c
ou%c
dans mon cas?OriginalL'auteur hmjd
Elles sont stockées dans ASCIIZ format - avec un NUL/'\0' terminator.
Il ne devrait pas consommer le caractère suivant. Montre-nous ton code ou il n'a pas eu lieu ;-P.
(edit: ce qui suit répond à la question ci-dessus, qui parle de la matrice de comportements en général et est plus large que l'extrait de code dans la question spécifiquement posée le cas
char[10] = "abcd";
et est sûr)%s
doit être passé un pointeur vers un ASCIIZ texte... même si ce texte est explicitement dans un tableau de char, c'est la présence obligatoire de NUL, terminator qui définit le contenu textuel et non pas la longueur du tableau. Vous devez NUL de mettre fin à votre tableau de caractères ou vous avez un comportement indéterminé. Vous pourriez sortir avec elle parfois - par exemple, strncpy dans la matrice NULLE de le résilier si-et-seulement-si il ya de la place pour le faire, et les tableaux statiques commencer avec de tout contenu 0, donc si vous n'écraser avant le caractère final vous aurez un NUL, votre char[10] exemple arrive à avoir des éléments dont les valeurs ne sont pas spécifiés peuplée avec des NULs, mais vous devez prendre la responsabilité de veiller à ce que quelque chose est de s'assurer que NUL de terminaison.shouldn't
consommer,il dit qu'il fait.Je l'ai dit non.
Vous avez dit
It shouldn't consume the next character.
%*c
clairement il consomme.Votre 3) réponse genre d'affrontements avec des hmjd ainsi.Il déclare clairement que le personnage est null en raison de la nature même de l'initialisation.Il est donc question de AC en tant que par lui.Que diriez-vous?
OriginalL'auteur Tony Delroy