Luthien 0 Denunciar post Postado Fevereiro 10, 2015 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
_Isis_ 202 Denunciar post Postado Fevereiro 10, 2015 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
Luthien 0 Denunciar post Postado Fevereiro 10, 2015 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
_Isis_ 202 Denunciar post Postado Fevereiro 10, 2015 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