Lire une chaîne à partir d’une entrée avec un caractère d’espace?

J’utilise Ubuntu et j’utilise aussi Geany et CodeBlock comme IDE. Ce que j’essaie de faire, c’est de lire une chaîne (comme "Barack Obama" ) et de la mettre dans une variable:

 #include  int main(void) { char name[100]; printf("Enter your name: "); scanf("%s", name); printf("Your Name is: %s", name); return 0; } 

Sortie:

 Enter your name: Barack Obama Your Name is: Barack 

Comment puis-je faire en sorte que le programme lise le nom complet?

Utilisation:

 fgets (name, 100, stdin); 

100 est la longueur maximale du tampon. Vous devriez l’ajuster selon vos besoins.

Utilisation:

 scanf ("%[^\n]%*c", name); 

Le [] est le caractère scanset. [^\n] indique que l’entrée n’est pas une nouvelle ligne ( '\n' ). Puis, avec le %*c il lit le caractère de nouvelle ligne du tampon d’entrée (qui n’est pas lu), et le * indique que cette entrée en entrée est supprimée (suppression d’affectation) car vous n’en avez pas besoin Le tampon ne crée aucun problème pour les entrées suivantes que vous pourriez prendre.

Lisez ici sur le scanset et les opérateurs de suppression d’affectation .

Notez que vous pouvez également utiliser gets mais ….

N’utilisez jamais gets() . Comme il est impossible de savoir sans connaître à l’avance le nombre de caractères que get () va lire, et que gets() continuera à stocker les caractères après la fin du tampon, il est extrêmement dangereux de l’utiliser. Il a été utilisé pour briser la sécurité informatique. Utilisez fgets() place.

Essaye ça:

 scanf("%[^\n]s",name); 

\n définit simplement le délimiteur de la chaîne scannée.

Voici un exemple de la façon dont vous pouvez obtenir des entrées contenant des espaces en utilisant la fonction fgets .

 #include  int main() { char name[100]; printf("Enter your name: "); fgets(name, 100, stdin); printf("Your Name is: %s", name); return 0; } 
 scanf(" %[^\t\n]s",&str); 

str est la variable dans laquelle vous obtenez la chaîne.

 #include int main() { char name[100]; printf("Enter your name: "); scanf("%[^\n]s",name); printf("Your Name is: %s",name); return 0; } 

REMARQUE: Lors de l’utilisation de fgets (), le dernier caractère du tableau sera ‘\ n’ lorsque vous utilisez fgets () pour les petites entrées dans l’interface de ligne de commande (CLI), lorsque vous terminez la chaîne avec ‘Entrée’. Ainsi, lorsque vous imprimez la chaîne, le compilateur ira toujours à la ligne suivante lors de l’impression de la chaîne. Si vous souhaitez que la chaîne d’entrée ait un comportement de type chaîne nul, utilisez ce simple hack.

 #include int main() { int i,size; char a[100]; fgets(a,100,stdin);; size = strlen(a); a[size-1]='\0'; return 0; } 

Mise à jour: mise à jour avec l’aide d’autres utilisateurs.

En utilisant ce code, vous pouvez saisir des données en appuyant sur Entrée de votre clavier.

 char ch[100]; int i; for (i = 0; ch[i] != '\n'; i++) { scanf("%c ", &ch[i]); } 
 #include  // read a line into str, return length int read_line(char str[]) { int c, i=0; c = getchar(); while (c != '\n' && c != EOF) { str[i] = c; c = getchar(); i++; } str[i] = '\0'; return i; } 

"%s" lira l’entrée jusqu’à ce que les espaces soient atteints.

get peut être un bon sharepoint départ si vous voulez lire une ligne (c’est-à-dire tous les caractères, y compris les espaces, jusqu’à ce qu’un caractère de nouvelle ligne soit atteint).

“Barack Obama” a un espace entre “Barack” et “Obama”. Pour tenir compte de cela, utilisez ce code;

 #include  int main() { printf("Enter your name\n"); char a[80]; gets(a); printf("Your name is %s\n", a); return 0; } 

La bonne réponse est la suivante:

 #include  int main(void) { char name[100]; printf("Enter your name: "); // pay attention to the space in front of the % //that do all the sortingck scanf(" %[^\n]s", name); printf("Your Name is: %s", name); return 0; } 

Cet espace devant% est très important, car si vous avez dans votre programme quelques autres scanf, supposons que vous ayez 1 scanf d’une valeur entière et un autre scanf avec une double valeur … lorsque vous atteignez le scanf pour votre char (chaîne name) cette commande sera ignorée et vous ne pouvez pas entrer de valeur pour elle … mais si vous mettez cet espace devant% sera tout ok et ne sautez rien.

Bien que les méthodes mentionnées ci-dessus fonctionnent, mais chacune a ses propres problèmes.

Vous pouvez utiliser getline() ou getdelim() si vous utilisez la plate-forme supscope par posix. Si vous utilisez Windows et Minigw comme compilateur, il devrait être disponible.

getline() est défini comme:

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

Pour saisir des données, vous devez d’abord créer un pointeur sur le type de caractère.

 #include  #include // s is a pointer to char type. char *s; // size is of size_t type, this number varies based on your guess of // how long the input is, even if the number is small, it isn't going // to be a problem size_t size = 10; int main(){ // allocate s with the necessary memory needed, +1 is added // as its input also contains, /n character at the end. s = (char *)malloc(size+1); getline(&s,&size,stdin); printf("%s",s); return 0; } 

Sample Input: Hello world to the world!

Sortie: Hello world to the world!\n

Une chose à noter ici est que, même si la mémoire allouée pour s est de 11 octets, où la taille en entrée est de 26 octets, getline réalloue s utilisant realloc() .

Donc, peu importe la durée de votre saisie.

size est mise à jour avec le nombre d’octets lus, conformément à la size échantillon ci-dessus.

getline() considère également \n comme entrée. Ainsi, votre “s” tiendra “\ n” à la fin.

Il existe également une version plus générique de getline() , qui est getdelim() , qui prend un argument supplémentaire, à savoir le delimiter .

getdelim() est défini comme:

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

Page de manuel de Linux

Si vous avez besoin de lire plus d’une ligne, vous devez effacer le tampon. Exemple:

 int n; scanf("%d", &n); char str[1001]; char temp; scanf("%c",&temp); // temp statement to clear buffer scanf("%[^\n]",str); 
 scanf("%s",name); 

utiliser & avec scanf entrée