Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luthien

Função q verifica se uma string está no inicio ou final de outra

Recommended Posts

Fu fazer um programa pra verificar se uma string está no começo ou final de outra, mas n ta dando certo, na hora de imprimir a resposta n imprime nada. Pelo menos o meu raciocínio ta certo? N consigo pensar em outra forma de fazer D:

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

int StrEnd(char *str, char *t){
    int i = 0, j = 0;
    while(*(t+i) != '\0')//conta os caracteres em t
        i++;
    --i;
    while(*(str + j) != '\0'){// conta os caracteres em str
        j++;
    --j;
    }
    /*a condição j <=i é para verificar os caracteres até o tamanho da string t*/
    while(j<=i){
        /*verifica se é igual, se for continua verificando, quando j = i, retorno 0*/
        if(*(str + 1) == (*(t + 1))){
            *str++;
            *t++;
            if(j = i)
                return 0;
        }
    }
    j -= i;//j = j - i para verificar os i's ultimos caracteres
    /*continua enquanto for diferente de \0, na verdade não precisava do &&*/
    while(*str != '\0' && *t != '\0'){
        /*verifico se é igual a partir da posição j de str com a primeira posição d         e t,se for, incremento e quando for igual a \0 retorno 1*/
        if(*(str + j) == *(t + 1)){
            *str++;
            *t++;
            if(*str == '\0' || *t == '\0')
                return 1;
        }
    }
}

int main(){
    //declaro as variaveis
    int resp;
    char *string, *caracter;
    //aloco memoria
    string = (char*)malloc(sizeof(char));
    caracter = (char*)malloc(sizeof(char));
    //leio as strings
    printf("Digite a String: ");
    fflush(stdin);
    fgets(string,50,stdin);
    printf("Digite o caracter: ");
    fflush(stdin);
    fgets(string,50,stdin);
    /*dúvida na hora de passar parâmetro: sempre que for passagem 
    por referencia na hora da chamada vou colocar os endereços dos ponteiros?*/
    resp = StrEnd(&string,&caracter);
    printf("Valor de resp: ", resp);//fiz pra testar se ia imprimir alguma coisa e nao imprimiu
    //imprime resultado
    if(resp == 0)
        printf("Caracter no início da string");
    if(resp == 1 )
        printf("Caracter no final da string");
    if(resp != 1 && resp != 0)
        printf("Caracter no meio da string");
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tópico fixo: não use fflush na entrada padrão.
Vc lembrou que tem que tirar o \n que vem na leitura do fgets?

Compartilhar este post


Link para o post
Compartilhar em outros sites
 string = (char*)malloc(50*sizeof(char));
    caracter = (char*)malloc(50*sizeof(char));
    //leio as strings
    printf("Digite a String: ");
    scanf("%s%*c", &string);
    printf("Digite o caracter: ");
    scanf("%s%*c", &caracter);

Fiz isso e continua nao imprimindo nada dps q digito o caracter, ta certo quando aloco espaço pra 50 chars? pq 1 char é apensa 1 caractere n é? Tinha esquecido do detalhe do fflush() hsuahsuahsa xD, mas se o fgets() pega o '\n', como faço pra pular o '\n' sem usar fflush()? Não queria usar scanf() pq li q ele "invade memoria" se eu digitar mais caracteres do que deveria

Compartilhar este post


Link para o post
Compartilhar em outros sites

O scanf possui um "operador de limitação" (na verdade faz parte da string de formatação): scanf("%50s").

Não te garanto o código abaixo, porque estou bem enferrujada com ponteiros e strings (não programo em C faz uns 5 anos), mas dê uma olhada nele com calma.

#include <stdlib.h>
#include <stdio.h>
#define MAX_CHAR 50
 
int strfind(const char * needle, int needle_len, const char * haystack, int hay_len) {
  int first_letter_pos=0;
  int needle_index;
 
  while (first_letter_pos < hay_len) {
    for(; first_letter_pos<hay_len && haystack[first_letter_pos] != needle[0]; first_letter_pos++); //Encontrar a posição da primeira letra na segunda palavra.
    if (first_letter_pos >= hay_len) return -1; // Não foi encontrada a primeira letra da primeira palavra na segunda palavra.
    for(needle_index=0;
        needle_index < needle_len
        && first_letter_pos + needle_index < hay_len // Limitando até o final da palavra mais longa
        && haystack[needle_index + first_letter_pos] == needle[needle_index] // Verificar se as letras combinam
        ; needle_index++);
    if (needle_len == needle_index) return 0;
    first_letter_pos++;
  }
  return -1;
}

int strstr(const char * a, const char * b) {
  int len_a, len_b;
 
  for(len_a=0; a[len_a] != '\n'; len_a++);
  for(len_b=0; b[len_b] != '\n'; len_b++);
 
  if (!len_a || !len_b) { // temos uma string vazia. retornando erro.
     return -1;
  }
 
  if (len_b < len_a)
    return strfind(b, len_b, a, len_a);
  else
    return strfind(a, len_a, b, len_b);
}

int main(void) {
  char * string_a = (char *) malloc(MAX_CHAR * sizeof(char));
  char * string_b = (char *) malloc(MAX_CHAR * sizeof(char));
 
  if (!string_a || !string_b) {
    puts("Erro ao alocar espaço.");
    return 1;
  }
 
  printf("Informe a primeira string: ");
  fgets(string_a, MAX_CHAR, stdin);
 
  printf("Informe a segunda string: ");
  fgets(string_b, MAX_CHAR, stdin);
 
  if (strstr(string_a, string_b)) puts("String não encontrada");
  else puts("String encontrada");
 
  free(string_a);
  free(string_b);
  return 0;
}

Eu devia ter dado outro nome, diferente de strstr, porque existe uma strstr que faz exatamente o que o exercício pede. Mas essa criada só faz uma preparação para o strfind.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.