Ada: Obtenir des commentaires d'utilisateurs pour un String(1..10) et remplir le reste avec un espace
J'ai défini
subtype String10 is String(1..10);
et je suis d'essayer d'obtenir de clavier d'entrée sans avoir à saisir manuellement les espaces avant d'appuyer sur la touche enter. J'ai essayé get_line (), mais par une raison quelconque, il ne serait pas fait attendre pour l'entrée avant de sortir le get, put() de commande, et je pense aussi qu'il va juste laisser ce qui était dans la chaîne de l'avant et de ne pas le remplir avec de l'espace blanc.
Je connais et qui ont utilisé Bounded_String et Unbounded_String, mais je me demande si il existe un moyen de faire ce travail.
J'ai essayé de faire une fonction pour ça:
--getString10--
procedure getString10(s : string10) is
c : character;
k : integer;
begin
for i in integer range 1..10 loop
get(c);
if Ada.Text_IO.End_Of_Line = false then
s(i) := c;
else
k := i;
exit;
end if;
end loop;
for i in integer range k..10 loop
s(i) := ' ';
end loop;
end getString10;
mais, ici, je sais que le s(i)
ne fonctionne pas, et je ne pense pas que le
"if Ada.Text_IO.End_Of_Line = false then"
fait ce que je suis en espérant que cela ne soit. C'est un peu juste un espace réservé pendant que je regarde pour la façon de le faire.
J'ai été la recherche de quelques heures maintenant, mais Ada documentation n'est pas disponible clair que dans d'autres langues. J'ai trouvé beaucoup de choses sur obtenir les cordes, mais pas ce que je suis à la recherche d'.
true
et false
ne sont pas particulièrement clair. Plutôt que de if Ada.Text_IO.End_Of_Line = false then
, il suffit d'écrire if not Ada.Text_IO.End_Of_Line then
. (Bien que je ne pense pas que vous devez utiliser End_Of_Line
de toute façon.)
OriginalL'auteur user1279914 | 2012-12-01
Vous devez vous connecter pour publier un commentaire.
Pré-initialisation de la chaîne avec des espaces avant d'appeler
Get_Line
.Voici un petit programme, j'ai juste jeté:
et le résultat que j'obtiens quand je le lance:
Une autre possibilité, plutôt que de pré-initialisation de la chaîne, est de mettre le reste des espaces après la
Get_Line
appel:Pour de très grands tableaux, la dernière approche peut être plus efficace, car elle permet de ne pas attribuer la portion initiale de la chaîne deux fois, mais dans la pratique, la différence est peu probable pour être significatif.
+1 pour le fait d'aborder la question. 🙂 @user1279914: Voir aussi 4.3.3 Tableau Agrégats.
Oui, un
others
clause dans un tableau d'agrégation se réfère à tous les éléments non spécifiés ailleurs. Si il y a unothers
clause, il se réfère à tous les éléments de la matrice.OriginalL'auteur Keith Thompson
Comme une alternative, utiliser
function Get_Line
, qui renvoie une longueur fixeString
que "a une limite inférieure de 1 et une limite supérieure du nombre de caractères à lire." L'exempleLine_By_Line
utilise la variation qui lit un fichier. Si besoin, vous pouvez ensuite utiliserde la procédure Déplacer
pour copier leSource
chaîne à laTarget
chaîne; la procédure automatiquement plaquettes avec de l'espace par défaut.Addendum: Par exemple, ce
Line_Test
plaquettes avec*
et silencieusement tronque de longues lignes sur la droite.Vous pouvez peut-être voir l'effet que décrit ici. Ping-moi ici si vous mettez à jour votre question avec le nouveau code.
OriginalL'auteur trashgod