subString em String [RESOLVIDO]

1. subString em String [RESOLVIDO]

Luís Antônio de Lima Guimarães
luisguima

(usa Outra)

Enviado em 14/05/2015 - 23:01h

Alguém pode me ajudar? Preciso achar a substring que eu digitar e for atribuida em 'procura', nas strings pertencentes ao registro, como RA, Nome, Curso, etc... travei nessa parte do códigoc, tentei várias maneiras de tentá=lo tornar efetivo, mas ele não funciona. Só posso usar a <stdio.h> e o meu código, até então, é esse:

#include<stdio.h>

typedef struct Aluno {
char ra[7], nome[100], curso[4], telefone[15], estado[3];

} Aluno;

int main() {
int i, n, m, g, h, j, k, aux, cont, tam=0;
char procura[100];

scanf("%[^\n]s", procura); getchar();
scanf("%d", &n);
Aluno a[n];

getchar();

for (i=0; i<=n; i++) {
scanf("%[^,]s", a[i].ra);
getchar();
scanf("%[^,]s", a[i].nome);
getchar();
scanf("%[^,]s", a[i].curso);
getchar();
scanf("%[^,]s", a[i].telefone);
getchar();
scanf("%[^\n]s", a[i].estado);
getchar();
}

i=0;
while(procura[i]!='\0'){
tam=tam+1;
i++;
}

g=0;
for(i=1; i<=n && g==0; i++){
cont=0;
m=0;
for(j=0, k=j+m; j<tam && k!='\0'; j++, k++){
if(a[i].ra[k]==procura[j]){
cont=cont+1;
if(cont==tam){

}
}
else{
m=m+1;
j=0;
}
}

}

return 0;
}



  


2. MELHOR RESPOSTA

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 14/05/2015 - 23:22h

Por exemplo, um código para comparar strings poderia ser assim:


#include <stdio.h>

int main(){

char f1[] = "Teste";
char f2[] = "Teste2";
int i, strlen = 0, aux = 0;

// Tamanho da String1
for(i = 0;f1[i] != '\0';i++){
strlen++;
}strlen++;

for(i = 0;i<strlen;i++){
if(f1[i] != f2[i]){
aux = 0;
break;
}else{
aux = 1;
}
}

printf("As strings sao %s!\n",aux?"Iguais":"Diferentes");
return 0;
}



Espero ter ajudado

[]'s

T+

--
Profissão: Ser Rejeitado pelo VOL!


3. Re: subString em String [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 14/05/2015 - 23:18h

Não entendi sua dúvida.

Não poderia utilizar a string.h? Mesmo assim, fazer comparações é bem simples.

Espero ter ajudado

[]'s

T+

--
Profissão: Ser Rejeitado pelo VOL!



4. Re: subString em String [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 19/05/2015 - 11:39h

Resolvido?

Se sim, marque o tópico como resolvido e clique em melhor resposta!

Espero ter ajudado

[]'s

T+

--
No meu dia a dia, quando pessoas me ofendem, eu finjo-me de bobo, mas... Não deixo passar!



5. Re: subString em String [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/05/2015 - 05:42h

Vamos construir a solução por partes, que serão progressivamente mais sofisticadas.

Você consegue fazer sua própria implementação de strcmp()? (strcmp() é a função da biblioteca padrão do C que percorre os sucessivos caracteres de duas strings enquanto eles forem iguais e não-nulos, e que devolve a diferença entre os caracteres quando essa condição de repetição não for mais verdadeira -- já dei a cola.)

Você consegue adaptar essa implementação, de modo a comparar apenas os n primeiros caracteres (i.e. implementar sua própria versão de strncmp())?

Você consegue, usando sucessivas invocações da sua versão de strncmp(), implementar sua própria versão de strstr()?

Se sim, então já resolveu o seu problema.

Se você quiser, porém, pode ir um passo além. Se você quiser economizar o tempo gasto para invocar múltiplas vezes a função strncmp() dentro de strstr(), pode trazer o conteúdo dela dentro da função strstr().


6. Re: subString em String

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/05/2015 - 11:26h

Em tempo: você usou para leitura o seguinte bloco de código.

/* Troquei i por j, por causa das tags de formatação do fórum. */
scanf("%[^,]s", a[j].ra);
getchar();
scanf("%[^,]s", a[j].nome);
getchar();
scanf("%[^,]s", a[j].curso);
getchar();
scanf("%[^,]s", a[j].telefone);
getchar();
scanf("%[^\n]s", a[j].estado);
getchar();


Ele me parece muito estranho.

Quando você diz, por exemplo, scanf("%[^,]s", a[i].nome);, diz, em Português, o seguinte: “coloque em a[i].nome os sucessivos caracteres da potencialmente infinita sequência de caracteres diferentes de vírgula, e depois procure (e descarte -- funciona como um delimitador) o caráter ‘s’”. Acho que não foi isso o que você quis dizer. Além do mais, ao aceitar sequências de tamanho indeterminado, você se expõe ao problema conhecido como buffer overrun (gravar dados além do espaço destinado para eles).

Olhando o bloco como um todo, parece que você gostaria de ler informação com o seguinte formato.

RA, NOME, CURSO, TELEFONE, ESTADO\n 


Considerando as larguras máximas dos campos do tipo Aluno, você poderia fazer a leitura, de forma segura, com as seguintes instruções.

int n_conversions;
char eol;

n_conversions=
scanf(
"%6[^,\n], %99[^,\n], %3[^,\n], %14[^,\n], %2[^\n]%c",
a[j].ra, a[j].nome, a[j].curso, a[j].telefone, a[j].estado, &eol
)
;
if(n_conversions==6 && eol=='\n'){
/* Leitura bem sucedida, em acordo com o formato esperado. */
}
else if(n_conversions==EOF){
/* Erro de leitura. */
}
else{
/*
Formato de dados inesperado. Um ou mais campos deixaram
de ser lidos (n_conversions é igual ao número de campos lidos
com sucesso).

A função parou antes da hora, assim que achou a discrepância
no formato. Então pode ser que os caracteres que permaneceram
no buffer de leitura continuem constituindo entrada inválida em
operações de leitura futuras. Você provavelmente vai querer
limpar a entrada e colocá-la num ponto consistente antes de
prosseguir.
*/
}



7. Re: subString em String [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 20/05/2015 - 11:33h

Sim, Paulo, também achei muito estranho quando eu ajudei ele em outro tópico[1]. Ele não quis alterar pois eu imagino que foi um trabalho "Copy-Paste", ou escreveu para teste. Mesmo assim, ele não quis utilizar o '[^\n]'. Mas fazer o que? Não podemos forçar ninguém a fazer nada contra a sua vontade, então tá certo ;)

[]'s

T+

--
No meu dia a dia, quando pessoas me ofendem, eu finjo-me de bobo, mas... Não deixo passar!


[1]http://www.vivaolinux.com.br/topico/C-C++/Alguem-pode-me-indicar-meu-erro


8. Re: subString em String

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/05/2015 - 20:32h

Thihup escreveu:

Sim, Paulo, também achei muito estranho quando eu ajudei ele em outro tópico[1]. Ele não quis alterar pois eu imagino que foi um trabalho "Copy-Paste", ou escreveu para teste. Mesmo assim, ele não quis utilizar o '[^\n]'. Mas fazer o que? Não podemos forçar ninguém a fazer nada contra a sua vontade, então tá certo ;)


A sua alteração não corrigiu a questão do "s" que está sobrando depois do "%[^,]" (ou do "%[^\n]", na sua versão). A rigor, ele vai fazer com que a string de formatação nunca seja totalmente encontrada.

Os colchetes e o que vai entre eles não são uma espécie de prefixo da conversão %s. Antes, %[ é um outro tipo de conversão, com regras bem diferentes da conversão %s.

Além do mais, o correto seria sempre testar o valor de retorno de scanf(), para saber se ela conseguiu fazer todas as conversões. O Ubuntu, por exemplo, vem com o GCC configurado de modo tal que o compilador emite avisos (e às vezes dá erro) se você usar scanf() sem jogar o valor retornado numa variável ou usá-lo como parte da expressão em um if ou while.

Mas mesmo isso nem sempre é suficiente para saber se houve uma correspondência exata entre a string de formatação e os caracteres consumidos da entrada de dados. Por exemplo, os caracteres consumidos mas que não sejam parte de uma conversão com atribuição de valor (e.g. espaços que sejam pulados, caracteres usados como delimitadores e dados consumidos em conversões com atribuição suprimida por meio do prefixo "*") não são refletidos no valor retornado pela função. Algumas vezes, é necessário usar a atribuição %n (que é uma atribuição que não consome caracteres da entrada e, portanto, não é considerada uma conversão e também não é conta para o valor de retorno da função) para identificar a efetivação de certas partes da verificação da string de formatação.

Por exemplo, os dois blocos de código abaixo produzem o mesmo efeito final.

int skip_and_count_spaces(void){
int ch, n_spaces;

n_spaces=0;
while(isspace(ch=getchar()))
n_spaces++;
if(ch!=EOF)
unget(stdin, ch); /* Devolve o não-espaço para o buffer de leitura. */
else if(n_spaces==0)
return -1; /* Indica erro de leitura com valor negativo. */

return n_spaces;
}


int skip_and_count_spaces(void){
int n_spaces, result;

n_spaces=0;
result=scanf(" %n", &n_spaces);
/*
Não há nenhuma conversão, então result só pode
valer 0 ou EOF.
*/

if(result==EOF || (n_spaces==0 && feof(stdin))
return -1; /* Indica erro de leitura com valor negativo. */

return n_spaces;
}


Este outro par de códigos também faz a mesma coisa.

char buffer[80];

if(fgets(buffer, sizeof buffer, stdin)==NULL){
if(feof(stdin))
fprintf(stderr, "Fim de arquivo antes de começar a ler.\n");
else
fprintf(stderr, "Erro de leitura.\n");
}
else{
int length=strlen(buffer);
if(buffer[length-1]=='\n'){
if(length==1)
printf("Leu linha vazia (apenas o '\\n').\n");
else
printf("Leu linha completa com %d caracteres (incluindo '\\n').\n", length);
}
else if(length+1<sizeof buffer){
if(feof(stdin)){
printf("EOF prematuro após ler com sucesso %d caracteres.\n", length);
else
printf("Leitura interrompida após %d caracteres.\n", length);
}
else{
printf("Tamanho da linha excedeu tamanho do buffer.\n");
}
}


char buffer[80], fmt_string[30];
int result, consumed, consumed2;

/*
Gera uma string de formatação para scanf() com a cara
"%@[^\n]%n%*1[\n]%n", onde "@" é substituído pelo tamanho
máximo da string que buffer pode conter.
*/
sprintf(fmt_string, "%%%zd[^\n]%%n%%*1[\n]%%n", (sizeof buffer)-1);

consumed2=consumed=0;
result=scanf(fmt_string, buffer, &consumed, &consumed2);
if(result!=1){
if(feof(stdin))
fprintf(stderr, "Fim de arquivo antes de começar a ler.\n");
else
fprintf(stderr, "Erro de leitura.\n");
}
else{
if(consumed2>consumed){
if(consumed2==1)
printf("Leu linha vazia (apenas o '\\n').\n");
else
printf("Leu linha completa com %d caracteres (incluindo '\\n').\n", consumed2);
}
else if(consumed+1<sizeof buffer){
if(feof(stdin)){
printf("EOF prematuro após ler com sucesso %d caracteres.\n", consumed);
else
printf("Leitura interrompida após %d caracteres.\n", consumed);
}
else{
printf("Tamanho da linha excedeu tamanho do buffer.\n");
}
}


No meu dia a dia, quando pessoas me ofendem, eu finjo-me de bobo, mas... Não deixo passar!


Cara, na boa... Essa sua nova mensagem final é até pior que a anterior. Seria melhor -- para você mesmo! -- deixar os choramingos e as ameaças não tão veladas de lado. Se você tiver algum problema pessoal para resolver, resolva-o fora do espaço público do fórum.


9. Re: subString em String [RESOLVIDO]

Luís Antônio de Lima Guimarães
luisguima

(usa Outra)

Enviado em 21/05/2015 - 19:23h


Então, ocorre que o programa é meio que pré-determinado pelo meu professor, ele propos o formato, ele quis fazer uma tabela CSV, que são valores separados por vírgula, sem espaço, sem quebra de linha... Esse é o porque eu não gostaria de mudar a base do programa! Eu nem poderia. Enfim, vocês me ajudaram bastante! No fim consegui fazer o programa com a ajuda do professor mesmo. Muito obrigado a todos! ;)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts