2013-01-15 5 views
0

J'espérais pouvoir numériser une chaîne avec ce formatdeux espaces comme scanf délimiteur

"hello world  !!!!" 

à

{"hello world", "!!!!"} 

Ces 2 chaînes sont séparées avec un espace de plus de 1. Puis-je analyser ou au moins détecter 2 espaces consécutifs dans scanf?

+2

Ce sont trois chaînes, pas deux. Pour lire plusieurs caractères sans tenir compte des espaces, vous pouvez utiliser fgets(), puis analyser toute la chaîne. –

+1

Pour détecter deux espaces consécutifs, vous pouvez utiliser la fonction ['strstr()'] (http://en.cppreference.com/w/c/string/byte/strstr). – hmjd

Répondre

2

Ce code peut vous aider à

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

int main() 
{ 
    char a_buf[5][100] = {0}, sep[3] ,*buf = a_buf[0]; 
    int i = 0; 
    buf = a_buf[0]; 
    while (scanf("%s%2[ ]",buf,sep) > 1) { 
     if (strlen(sep)==1) 
     { 
      buf += strlen(buf); 
      *buf++ = ' '; 
     } 
     else 
      buf = a_buf[++i]; 
    } 
} 
-1

Selon le C++ référence (http://www.cplusplus.com/reference/cstdio/scanf/)

la fonction lire et ignorer les caractères blancs rencontrés avant le prochain caractère non-espaces (caractères blancs comprennent des espaces, des caractères de nouvelle ligne et onglet - voir isspace) . Un seul espace dans la chaîne de format valide toute quantité de caractères d'espaces extraite du flux (y compris aucune).

Je pense que vous devriez utiliser: http://www.cplusplus.com/reference/cstdio/gets/ puis analyser la chaîne retournée.

EDIT. Utilisez fgets(), not gets()

+1

Vous devriez * jamais *, jamais, peu importe les circonstances, utilisez gets(). Utilisez fgets() à la place. –

+1

'gets' est extrêmement dangereux car il n'y a aucun moyen d'empêcher les dépassements de tampon.Au moins, suggérez «fgets». Pour ne pas mentionner que C11 enlevé «obtient» tout à fait. – Shahbaz

2

De votre question, il semble que vous ne soyez pas intéressé par le fait qu'il y a plus d'un espace, mais juste un moyen de les analyser.

Ne craignez pas! Un caractère espace unique dans *scanf ignore déjà tous les espaces (y compris '\n', '\r', '\t' et dans les paramètres régionaux «C»). Donc, dans la forme la plus simple, vous pouvez lire comme ceci:

scanf("%s %s", str1, str2); 

Bien sûr, vous auriez besoin de vérifier les erreurs. Un moyen sûr serait:

char str1[100]; 
char str2[100]; 

scanf("%99s", str1); 
ungetc('x', stdin); 
scanf("%*s"); 

scanf("%99s", str2); 
ungetc('x', stdin); 
scanf("%*s"); 

Ce qui est une manière généralement sûre (non liée à votre question particulière). Ignorez ce qui reste de la chaîne (le cas échéant) ungetc + scanf("%*s") Notez que vous n'avez pas besoin d'espace avant la seconde scanf("%99s") parce que scanf ignore déjà tous les espaces avant %s (et en fait avant tous %* sauf %c et %[).


Si vous voulez vraiment vous assurer qu'il ya au moins deux espaces, et vous insistez sur l'utilisation scanf, vous pouvez faire comme ceci:

char str1[100]; 
    char str2[100]; 
    char c; 

    scanf("%99s", str1); 
    ungetc('x', stdin); 
    scanf("%*s"); 

    scanf("%c", &c); 
    if (c != ' ') 
     goto exit_not_two_spaces; 
    scanf("%c", &c); 
    if (c != ' ') 
     goto exit_not_two_spaces; 

    scanf("%99s", str2); 
    ungetc('x', stdin); 
    scanf("%*s"); 

    return /* success */ 
exit_not_two_spaces: 
    ungetc(c, stdin); 
    return /* fail */ 
Questions connexes