Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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");
}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 deveriaO 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.
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?