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:
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]
Thihupusa Manjaro Linux
Post recolhido
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]
paulo1205usa Ubuntu
Post recolhido
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
paulo1205usa Ubuntu
Post recolhido
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]
Thihupusa Manjaro Linux
Post recolhido
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!
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]
luisguimausa Outra
Post recolhido
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! ;)