Les C
strings sont des séquences de caractères terminées par null
character (c'est-à-dire le caractère avec le code 0
). Il peut être exprimé comme '\0'
, '\x0'
ou simplement 0
.
Votre code remplit str
avec trois caractères mais ne produit pas le terminateur null
. Par conséquent, puts()
imprime les caractères qu'il trouve dans la mémoire jusqu'à ce qu'il atteigne le premier caractère null
. Votre code expose Undefined Behaviour. Il peut tout faire et ce n'est pas sa faute.
Pour le fixer, vous devez vous assurer que la chaîne se termine par le caractère de fin null
:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
// Make room for 3 useful chars and the null terminator
char str[4];
// Read three chars
for(i = 0; i < 3; i ++) {
str[i] = getc(stdin);
}
// Add the null terminator for strings
str[3] = 0;
puts(str);
return 0;
}
Mise à jour
Comme @JeremyP note dans un commentaire, si le fichier que vous lisez de (stdin
) se termine avant que le code ne lise 3
caractères, fgetc()
renverra EOF
(fin du fichier) caractères qui sont aussi des caractères non imprimables drôles qui vous fait vous demander d'où ils viennent.
La bonne façon d'écrire ce code est de vérifier si le fichier d'entrée a atteint son EOF (feof()
) avant d'y lire:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
// Make room for 3 useful chars and the null terminator
char str[4];
// Read at most three chars
for(i = 0; i < 3 && !feof(stdin); i ++) {
str[i] = getc(stdin);
}
// Add the null terminator for strings
str[i] = 0;
puts(str);
return 0;
}
En C 'chaînes de char' sont vraiment appelés *** * null fin ** * chaînes d'octets *. Cette partie "nulle terminée" est importante. Si vous ne l'avez pas dans une chaîne, alors toute la fonction de chaîne sortira des limites dans sa recherche, et vous aurez * un comportement non défini * qui rendra votre programme * mal formé * et invalide. –
@Some programmeur dude_Merci. Pourquoi ne pas ignorer l'entrée supplémentaire? Je sais que les index sont 0,1,2 et l'index-2 est nul. Si j'introduis la pile pourquoi ça ne passe pas ack? –
Mais vous * ne * terminez pas la chaîne dans 'str', vous lisez trois caractères et les placez dans le tableau. Si vous voulez lire trois caractères, le tableau doit être de * quatre * caractères, le dernier élément étant le caractère de terminaison (que vous devez explicitement initialiser comme tel). –