web-dev-qa-db-fra.com

Comment lire depuis l'entrée jusqu'à ce que la nouvelle ligne soit trouvée en utilisant scanf ()?

On m'a demandé de faire un travail en C quand je suis supposé lire à partir d'une entrée jusqu'à ce qu'il y ait un espace, puis jusqu'à ce que l'utilisateur appuie sur Entrée. Si je fais ça:

scanf("%2000s %2000s", a, b);

Il suivra la 1ère règle mais pas la 2ème.
Si j'écris:

Je suis intelligent

Ce que je reçois équivaut à:
a = "I";
b = "am";
Mais cela devrait être:
a = "I";
b = "suis intelligent";

J'ai déjà essayé:

scanf("%2000s %2000[^\n]\n", a, b);

et

scanf("%2000s %2000[^\0]\0", a, b);

Dans le premier, il attend que l'utilisateur appuie sur Ctrl+D (envoyer EOF) et ce n'est pas ce que je veux. Dans le second, cela ne compilera pas. Selon le compilateur:

avertissement: pas de fermeture ']' pour le format '% ['

Un bon moyen de résoudre ce problème?

17
brunoais

scanf (et les cousins) ont une caractéristique légèrement étrange: tout espace blanc dans la chaîne de format (en dehors d'un scanset) correspond à une quantité arbitraire d'espace blanc dans l'entrée. En réalité, au moins dans les paramètres régionaux "C" par défaut, une nouvelle ligne est classée dans les espaces. 

Cela signifie que le '\n' final essaye de faire correspondre non seulement une nouvelle-ligne, mais également tout espace blanc qui le suit. Il ne sera pas considéré comme correspondant jusqu'à ce que vous signaliez la fin de l'entrée ou entrez un caractère non blanc.

Pour faire face à cela, vous voulez généralement faire quelque chose comme ceci:

scanf("%2000s %2000[^\n]%c", a, b, c);

if (c=='\n')
    // we read the whole line
else
    // the rest of the line was more than 2000 characters long. `c` contains a 
    // character from the input, and there's potentially more after that as well.
35
Jerry Coffin
scanf("%2000s %2000[^\n]", a, b);
7
VHaravy

utiliser getchar et un moment qui ressemble à ceci

while(x = getchar())
{   
    if(x == '\n'||x == '\0')
       do what you need when space or return is detected
    else
        mystring.append(x)
}

Désolé si j'ai écrit un pseudo-code mais je ne travaille pas avec le langage C depuis un moment.

4
darkito.net
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main(void)
{
  int i = 0;
  char *a = (char *) malloc(sizeof(char) * 1024);
  while (1) {
    scanf("%c", &a[i]);
    if (a[i] == '\n') {
      break;
    }
    else {
      i++;
    }
  }
  a[i] = '\0';
  i = 0;
  printf("\n");
  while (a[i] != '\0') {
    printf("%c", a[i]);
    i++;
  }
  free(a);
  getch();
  return 0;
}
2

Je suis trop tard, mais vous pouvez aussi essayer cette approche. 

#include <stdio.h>
#include <stdlib.h>

int main() {
    int i=0, j=0, arr[100];
    char temp;
    while(scanf("%d%c", &arr[i], &temp)){
        i++;
        if(temp=='\n'){
            break;
        }
    }
    for(j=0; j<i; j++) {
        printf("%d ", arr[j]);
    }

    return 0;
}
1
sameera sy

Cela ressemble à un problème de devoirs. scanf () est la mauvaise fonction à utiliser pour résoudre le problème. Je recommanderais getchar () ou getch ().

Remarque: je ne résous pas intentionnellement le problème car cela semble être un devoir, mais vous indique simplement la bonne direction.

0
bsegraves