Dúvida separação e comparação de strings

1. Dúvida separação e comparação de strings

Rafael L.
SrKon

(usa Manjaro Linux)

Enviado em 03/05/2021 - 11:15h

Eu estou tentando fazer alguns exercícios e alguns aparecem da seguinte imagem anexa.

Eu entendo como imprimir os dados na tela. Como imprimir dados específicos. Mas comparar esses dados não me ocorre de forma alguma. Perdi boas horas tentando fazer similares, então acredito que deve ter alguma função padrão que possa fazer isto que ainda não encontrei.

Então gostaria de saber como posso fazer esta separação e a verificação.

O último código que fiz para tentar resolver foi este:
#include <stdio.h>
#include <string.h>

int main(void)
{
FILE *arq = fopen("doc.txt", "r");
int dataHoje[] = {03,05,2021};
char aniversario[100];
char *pointer;

if(arq)
{
fgets(aniversario, 100, arq);
//printf("%s", aniversario);
pointer = strtok(aniversario, " ");
while(pointer != NULL)
{
printf("%s", aniversario);
pointer = strtok(NULL, " ");
}

} else {
printf("Arquivo não encontrado.");
}

fclose(arq);

return 0;
}





  


2. Re: Dúvida separação e comparação de strings

Paulo
paulo1205

(usa Ubuntu)

Enviado em 03/05/2021 - 22:55h

O arquivo é de texto, então os números são escritos na forma de uma sequência de caracteres. Como esses numerais em texto correspondem a valores inteiros, creio que a forma mais simples de fazer comparações com eles é convertendo-os em valores numéricos do tipo int ou unsigned int.

Do enunciado da questão, eu fiquei na dúvida de se o nome tem largura fixa de 40 caracteres (por exemplo, o nome "Paulo" sendo seguido por 35 espaços, o nome "Pedro Silva" sendo seguido por 29 espaços, e o nome de D. Pedro I (“Pedro de Alcântara Francisco Antônio João Carlos Xavier de Paula Miguel Rafael Joaquim José Gonzaga Pascoal Cipriano Serafim de Bragança e Bourbon”) sendo truncado ali por volta do componente “João”). Se for assim, você pode ler a linha inteira (com fgets(), por exemplo), e começar a conversão de string para número a partir do 41º caráter da linha lida (usando strtol(), atoi() ou mesmo algum algoritmo de próprio punho). Se for largura fixa, você pode até já ler direto para número com fscanf() e uma string de formatação adequada, com algo como abaixo.
char nome[41];
int ano_nasc;
if(fscanf(" %40[^\n] %d", nome, &ano_nasc)!=2){
/* Formato da linha inválido. */
}

Se, por outro lado, a menção a 40 caracteres para o nome no enunciado for apenas um limite máximo, mas a largura do nome em cada linha for variável, a leitura e a interpretação de cada linha terão de ser feitas com muito mais cuidado. Mas mesmo assim você provavelmente vai querer converter o numeral expresso como texto em número com que o programa consiga trabalhar mais facilmente.

... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


3. Funções

Rafael L.
SrKon

(usa Manjaro Linux)

Enviado em 07/05/2021 - 15:02h


paulo1205 escreveu:

O arquivo é de texto, então os números são escritos na forma de uma sequência de caracteres. Como esses numerais em texto correspondem a valores inteiros, creio que a forma mais simples de fazer comparações com eles é convertendo-os em valores numéricos do tipo int ou unsigned int.

Do enunciado da questão, eu fiquei na dúvida de se o nome tem largura fixa de 40 caracteres (por exemplo, o nome "Paulo" sendo seguido por 35 espaços, o nome "Pedro Silva" sendo seguido por 29 espaços, e o nome de D. Pedro I (“Pedro de Alcântara Francisco Antônio João Carlos Xavier de Paula Miguel Rafael Joaquim José Gonzaga Pascoal Cipriano Serafim de Bragança e Bourbon”) sendo truncado ali por volta do componente “João”). Se for assim, você pode ler a linha inteira (com fgets(), por exemplo), e começar a conversão de string para número a partir do 41º caráter da linha lida (usando strtol(), atoi() ou mesmo algum algoritmo de próprio punho). Se for largura fixa, você pode até já ler direto para número com fscanf() e uma string de formatação adequada, com algo como abaixo.
char nome[41];
int ano_nasc;
if(fscanf(" %40[^\n] %d", nome, &ano_nasc)!=2){
/* Formato da linha inválido. */
}

Se, por outro lado, a menção a 40 caracteres para o nome no enunciado for apenas um limite máximo, mas a largura do nome em cada linha for variável, a leitura e a interpretação de cada linha terão de ser feitas com muito mais cuidado. Mas mesmo assim você provavelmente vai querer converter o numeral expresso como texto em número com que o programa consiga trabalhar mais facilmente.

... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


Olá novamente paulo, vou pesquisar essas funções e se tiver algum resultado posto aqui. Vlw Flw.