Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] Controllo se una stringa è un intero

    C'è una funz che mi controlla se una intera stringa è un intero???

    Oppure devo utilizzare "atoi" e controllare se il risultato è 0??
    Il fatto è che zero per me è un valore accettabile non errore!!

    Tutto questo perchè la stringa è letta da file!!!

    tipo:


    codice:
     fscanf(in_file, "%s %s", prima, seconda);
    dove prima e seconda sono stringhe!!!
    Linguaggi : C/C++
    SO: WinXP, Slack 10

  2. #2
    La cosa interessa anche a me, nessuno che sappia risolvere l'enigma!!!

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Beh... io ho sviluppato questa funzione:
    codice:
    int intero(char *x, int pos) {
       int result = 0;
       if (x[pos]) {
          result = (x[pos] >= '0' && x[pos] <= '9' && intero(x, pos+1));
       } else {
          result = -1;
       }
       return result;
    }
    Questa funzione restituisce 0 se la stringa passata NON rappresenta un intero.

    Va utilizzata nel modo seguente:
    codice:
    char *miaStringa;
    
    /* Controllo se il primo carattere è il segno */
    if (miaStringa[0] == '-' || miaStringa[0] == '+') {
       if (intero(miaStringa, 1)) {
          printf("E' un intero!!\n");
       } else {
          printf("NON è un intero!!");
       }
    } else {
       if (intero(miaStringa, 0)) {
          printf("E' un intero!!\n");
       } else {
          printf("Non è un intero!!\n");
       }
    }
    Nella funzione non è implementato il controllo del primo carattere per il segno (quindi non funzionerebbe se gli si passa, per esempio, "-12"), perciò questo va fatto a parte, ma è banale.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Grazie mi è stata molto utile!!! ^^

  5. #5
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520

    ATOI(ITOA)

    prova anche questo se non ti fa fatica, non garantisco il risultato

    strcmp(Stringa,itoa(atoi(Stringa)));

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    L'idea sembra buona, però ci sono 2 dettagli:

    1) itoa() vuole 3 parametri, come da prototipo:

    char *itoa (int valore, char *buffer, int base)

    2) Non sembra essere una funzione standard, anche se da quello che ho letto sembra supportata dalla maggior parte dei compilatori.

    Quindi, questo dovrebbe essere il programma modificato:
    codice:
    itoa(atoi(miaStringa), buffer, 10); // viene memorizzata la nuova stringa in 'buffer'
    
    // poi si esegue il confronto:
    strcmp(miaStringa,buffer);
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520

    SI SI

    char *itoa (int valore, char *buffer, int base)
    Giusto Giusto vuole tre parametri sai sono 4-5 anni che non faccio un programma in C, comunque era così per buttare l'idea.
    Il problema dello standard potrebbe essere un bel problema se mi devo scrivere io la itoa tanto vale scrivere il codice LeleFT

    :adhone:

  8. #8
    La stringa passata a Convert(char*),nn ha fine linea '\n'
    è fatta cosi' |1 2 3 4 5 6 y 7 f '\0'|
    codice:
    #define PLUS '+'
    #define MINUS '-'
    #define POINT '.'
    #define INT 1
    #define REAL 2
    #define STRING 3
    #define IS_DIGIT(x) ((x>='0')&&(x<='9'))
    .....
    ...
    .....
    int Convert(char* a)
               {
               int flag=0,cont=1;
              if((*a==PLUS)||(*a==MINUS)||IS_DIGIT(*a))
                 {
                  flag=1; 
                  a++;
                  while(((*a)!='\0')&&flag)
                       {
                        if(IS_DIGIT(*a))
                           a++;
                        else if((*a==POINT)&&(cont<2))
                             { 
                             cont++;
                             a++;
                             } 
                         else   
                            flag=0;
                       }
                  }
               if((cont==2)&&flag)
                 return REAL;
               else if(flag)
                 return INT;
               else
                  return STRING;
               }
    N.B. Nn tiene conto del caso in cui 1 numero reale
    comincia col la virgola POINT-->.474764
    Deve sempre cominciare con 1 zero-->0.474764
    TheEnd

  9. #9

    x tutti

    per controllare se leggevo una stringa da input facevo dei controlli utilizzando la funzione isdigit(char elem) all'interno di un ciclo while(1), e per tradurlo in un numero facevo una cosa del genere:
    '
    '
    i=0;
    elem=str[i];
    while(str[i]!='\0'){
    if(isdigit(elem))
    tmp=tmp*(elem-'0'); //conversione da carattere ASCII a intero
    elem=str[i++];
    }
    .
    .
    vi posso garantire ke funziona, perkè nei miei progetti ha sempre funzionato, al massimo mi posso essere scordato una cosa, cmq x sicurezza controllerò meglio.
    DD

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.