1
I want to check if my strings (which are stored in an array), are integer or not for example a for the fourth row of the matrix 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();
}
Could you give an example of input ?
– rafael marques
I have a file with lines of the genus 2 ; 12 ; Funcionaio ; 10 ; 5 E I am dividing them this way (" ; "), counting the spaces before and after ";" then wanted to do this check to know if for example in a parameter that should have an integer I have a string or a float, for example
– Bruno Bacelar
failed to inform the language you are using.
– Jone Polvora
is on the tag, on the bottom
– Bruno Bacelar
Take out all the
for (int i = 0; i < 20; i++)
and leaves only the "stuffing" offor
because you’re not iterating ondados
, I mean, you’re not using the indexi
for nothing. Otherwise, putatoi(dados[4]) == 0
, at lastif
of the function instead ofdados[4] == 0
– Marcelo Shiniti Uchimura
Oh yes it makes sense! And yes tbm I’ve noticed == ?
– Bruno Bacelar
You have to use a structure that has all the information of all the lines. You have something like this?
– Marcelo Shiniti Uchimura
Yes I have everything, I can update the code on top, but there are still some lines of code
– Bruno Bacelar