Check if a string is composed of digits

1

I want to check if my strings (which are stored in an array) are integers or not for example a for the fourth row of the array I have the following code.

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

struct informacaoFicheiroInput{
int id;
int acompanhantes;
char tipo[13];
int entrada;
int saida;
int servico;

};

void toString(struct informacaoFicheiroInput info){

   if(strcmp("Visitante",info.tipo) == 0){

   printf("ID: %d | ",info.id);
   printf("%s | ",info.tipo);
   printf("Entrada: %d | ", info.entrada);
   printf("Saida: %d | ",info.saida);
   printf("Serviço: %d\n",info.servico);

   }else{
   printf("ID: %d | ",info.id);
   printf("Acompanhantes: %d | ",info.acompanhantes);
   printf("Tipo: %s | ",info.tipo);
   printf("Entrada: %d | ", info.entrada);
   printf("Saida: %d | \n",info.saida);
   }
}

int validacaoVisitante(char dados[5][20]){

if(atoi(dados[0]) == 0  ){ //validação do ID
    return 0;
}

    //Validação da entrada
if(!isDigit(dados[2]) || atoi(dados[2])>24 || atoi(dados[2])<0){
     return 0;
}
    //Validação saida
if (!isDigit(dados[3]) || atoi(dados[3])>24 || atoi(dados[3])<=0){
     return 0;
}


    //validação do serviço
if(!isDigit(dados[4]) && dados[4] == 0){
     return 0;
}
return 1;

}


int isDigit(char *string){
char *p;
int firstDigit = 0; // A princípio, nenhum dígito foi encontrado.
int lastDigit = 0;  // A princípio, nenhum dígito foi encontrado.
int result = 1;     // A princípio, considera-se verdadeiro, que é digito.

p = string;

while (*p){
    if (*p >= '0' && *p <= '9'){
        p++;
        firstDigit = 1;
    }
    else if (*p == ' ' && !firstDigit){
        p++;
    }
    else if (*p == ' ' && firstDigit && !lastDigit){
        lastDigit = 1;
        p++;
    }
    else if (*p == ' ' && lastDigit){
        p++;
    }
    else{
        result = 0;
        break;
    }
}

return firstDigit && result;
}


void lerFicheiroInput(){
struct informacaoFicheiroInput informacao[20];
int tokenCount=0;
FILE* file;
file = fopen("input.txt","r");

if(file == NULL){
    printf("Não foi possivel abrir o arquivo.\n");
}

char line[100], *token, dados[5][20];
int info = 0;

while(fgets(line, sizeof line, file) != NULL){
    int count=0,i=0;
    token = strtok(line," ; ");

    while(token != NULL && count < 15){

        strcpy(dados[count++], token);
        token = strtok(NULL, " ; ");
        i++;
        tokenCount++;
    }

    // Mete os dados lidos da info-esima linha
    // em informacao.
    if(strcmp("Visitante", dados[1]) == 0 && validacaoVisitante(dados)==1){
       informacao[info].id = atoi(dados[0]);
       strcpy(informacao[info].tipo, dados[1]);
       informacao[info].entrada = atoi(dados[2]);
       informacao[info].saida = atoi(dados[3]);
       informacao[info].servico = atoi(dados[4]);
       info++;
    }else if (atoi(dados[0])!=0 &&(strcmp("Diretor",dados[2])==0 || 
strcmp("Funcionario",dados[2])==0)) {
       informacao[info].id = atoi(dados[0]);
       informacao[info].acompanhantes = atoi(dados[1]);
       strcpy(informacao[info].tipo, dados[2]);
       informacao[info].entrada = atoi(dados[3]);
       informacao[info].saida = atoi(dados[4]);
       info++;
   }
    count++;
}

fclose(file);
for(int j = 0; j< info; j++){
   toString(informacao[j]);
}


}


void main(){
setlocale(LC_ALL,"");
lerFicheiroInput();

}
    
asked by anonymous 08.06.2018 / 20:57

3 answers

0
int isDigit(char *string)
{
    char *p;
    int firstDigit = 0; // A princípio, nenhum dígito foi encontrado.
    int lastDigit = 0;  // A princípio, nenhum dígito foi encontrado.
    int result = 1;     // A princípio, considera-se verdadeiro, que é digito.

    p = string;

    while (*p)
    {
        if (*p >= '0' && *p <= '9')
        {
            ++p;
            firstDigit = 1;
        }
        else if (*p == ' ' && !firstDigit)
        {
            ++p;
        }
        else if (*p == ' ' && firstDigit && !lastDigit)
        {
            lastDigit = 1;
            ++p;
        }
        else if (*p == ' ' && lastDigit)
        {
            ++p;
        }
        else
        {
            result = 0;
            break;
        }
    }

    return firstDigit && result;
}

Usage:

for (i = 0; i < 20; i++) 
{
    if (!isDigit(dados[3][i]))
    {
        return 0;
    }
}
return 1;
    
08.06.2018 / 21:28
1

You can use the isdigit() function of the default library ctype.h . See:

#include <ctype.h>
#include <stdio.h>

int isDigit( const char * str )
{
    if(!str) return 0;     /* Se string for NULL, retorna 0 */
    if(!(*str)) return 0;  /* Se string for VAZIA, retorna 0 */

    while( *str )
        if( !isdigit( *str++ ) )
            return 0;     

    return 1;
}

int main( void )
{
    printf( "%d\n", isDigit( "1234567890" ) );
    printf( "%d\n", isDigit( " 123" ) );
    printf( "%d\n", isDigit( "987 " ) );
    printf( "%d\n", isDigit( "1234aeiou" ) );
    printf( "%d\n", isDigit( "  ABC1234567 " ) );
    printf( "%d\n", isDigit( "" ) );
    printf( "%d\n", isDigit( NULL ) );
    return 0;
}

Output:

1
0
0
0
0
0
0

If you want to ignore the espaços em branco contained before and / or after the digits, you can combine the isdigit() and isblank() functions:

#include <ctype.h>
#include <stdio.h>

int isDigit( const char * str )
{
    int ret = 0;

    if(!str) return 0;
    if(!(*str)) return 0;

    while( isblank( *str ) )
        str++;

    while( *str )
    {
        if( isblank( *str ) )
            return ret;

        if( !isdigit( *str ) )
            return 0;

        ret = 1;

        str++;
    }

    return ret;
}

int main( void )
{
    printf( "%d\n", isDigit( "1234567890" ) );
    printf( "%d\n", isDigit( " 123" ) );
    printf( "%d\n", isDigit( "987 " ) );
    printf( "%d\n", isDigit( " 567 " ) );
    printf( "%d\n", isDigit( "0 1 2 3 4 5 6 7 8 9 0" ) );
    printf( "%d\n", isDigit( " 0 1 2 3 4 5 6 7 8 9 0 " ) );
    printf( "%d\n", isDigit( "1234aeiou" ) );
    printf( "%d\n", isDigit( "  ABC1234567 " ) );
    printf( "%d\n", isDigit( "" ) );
    printf( "%d\n", isDigit( NULL ) );

    return 0;
}

Output:

1
1
1
1
1
1
0
0
0
0
    
09.06.2018 / 01:35
0
#include <stdio.h>
#include <string.h>
int verifica(char *nome);

int main(int argc, char** argv)
{
  char nomes[4][100];
  int tam, resultado;
  for(int i = 0; i < 4; i++)
  {
    scanf("%s", nomes[i]);
  }
  for(int i = 0; i < 4; i++)
  {
     tam = strlen(nomes[i]);
     resultado = verifica(nomes[i]);
     if(resultado == tam) //se o tamanho for igual o ao que função retornar ele só contem numeros
     {
        printf("%s\n", nomes[i]);
     }
  }
   return 0;
}

int verifica(char *nome)
{
  int tam = strlen(nome), cont = 0;
  for(int i = 0; i < tam; i++)
  {
     if(nome[i] >= '0' && nome[i] <= '9') // se ele for numero, o contador e incrementado
     {
        cont++;
     }
  }
  return cont;
}
    
08.06.2018 / 21:31