2011-05-12 4 views
2

dire que je dois lire en deux nom comme, [name name]\n .... (peut-être plus [name name]\n. En supposant que le nom peut avoir une longueur de 19, mon code jusqu'à présent est, comment pourrais-je réellement empêcher une entrée comme [name name name]\n ou plus [name name name...]\n dans mon cas? J'ai entendu parler fgets() et fscanf mais que quelqu'un me montrer gentiment un exemple comment les utiliser? Merci d'avance.scanf à fgets C

char name1[20]; 
char name2[20]; 
for(int i=0; i < numberOfRow ; i++){ 
    scanf(" %s %s", name1, name2); 
} 

Ok donc j'ai trouvé un moyen pour s'assurer qu'il n'y a que deux éléments, mais je ne suis pas sûr de savoir comment les remettre en variable ...

char str[50]; 
int i; 
int count = 0; 
fgets(str, 50, stdin); 

i = strlen(str)-1; 
for(int x=0; x < i ;x++){ 
    if(isspace(str[x])) 
    count++; 
} 
if(counter > 1){ 
    printf("Error: More than 2 elements.\n"); 
}else if{ 
//How do i place those two element back into the variable ? 
char name1[20]; 
char name2[20]; 

}

+1

Il y a une possibilité pour un comportement non défini si les chaînes d'entrée sont plus de 20 caractères. Utilisez '% 20s% 20s' à la place. –

+0

Vous devez tenir compte du terminateur NULL ** NOT ** compté par le spécificateur 'width' dans la chaîne de format' scanf'. Un tableau avec 20 caractères doit avoir une chaîne de format '"% 19s "' (ou '"% 19 ["'). – pmg

Répondre

0

Vous pouvez utiliser strtok (string.h). S'il vous plaît soyez prudent, cette fonction va modifier votre chaîne source (vous pouvez copier la chaîne avant).

Exemple strtok:

char* word; 

// First word: 
word = strtok(str, " "); // space as the delimiter 
strncpy(name1, word, sizeof(name1) - 1); 
name1[sizeof(name1) - 1] = 0; // end of word, in case the word size is > sizeof(name1)  

// Second word 
word = strtok (NULL, " "); 
strncpy(name2, word, sizeof(name2) - 1); 
name2[sizeof(name2) - 1] = 0; 

Aussi, je pense que vous devriez CHEC

0

Si vous allez l'entrée standard, il n'y a pas moyen d'arrêter cela, l'utilisateur peut entrer dans ce qu'ils aiment. Il serait préférable de lire d'abord toutes les entrées, puis de vérifier les résultats.

+0

Puis-je lire dans toute la ligne, puis vérifier s'il n'y a que deux noms? – Jono

+0

Cela dépend, fondamentalement, vous auriez besoin d'examiner l'entrée pour voir ce que vous avez. Vous pouvez avoir toutes sortes de caractères dans cette chaîne, y compris des nombres, des caractères spéciaux, etc. Je ne recommanderais pas d'utiliser sscanf sur l'entrée si c'est ce que vous voulez dire. – ColWhi

+0

Jusqu'ici, j'ai utilisé fgets, j'ai obtenu la ligne entière, et j'ai utilisé isspace pour déterminer s'il y a plus d'un espace ... est-ce correct? – Jono

0

Vous pouvez utiliser fgets pour lire toute la ligne, puis analyser les résultats. par exemple:

char name[256]; 
for (int i = 0; i < numberOfRow; i++) 
{ 
    if (fgets(name, 256, stdin) != NULL) 
    { 
     // Parse string 
    } 
} 

fgets lit la ligne, jusqu'à ce que vous appuyez sur Entrée. Vous devez maintenant analyser cette chaîne, si l'utilisateur saisit une mauvaise entrée (comme "aaa" ou "aaa bbb ccc"), renvoyer l'erreur, sinon ("aaa bbb"), diviser la chaîne et utiliser "aaa" comme nom1 et "bbb "as name2

+0

fgets est de lire à partir du fichier, pas de clavier. – Amir

+0

Et si on nous fournissait un fichier de cas de test comme, test00.in test00.out. Dans ce cas, serait-il approprié? – Jono

+0

Oui. aussi, pmg a raison, vous pouvez utiliser la console comme fichier. Voir l'exemple dans le wiki: http://en.wikipedia.org/wiki/Fgets – Amir