Comparar vetor de char em c

Olá Pessoal, estou com uma dúvida, gostaria de saber como comparar um caracter (digitado pelo usuario) se possui no meu vetor de string.

Pelo o que li a respeito a função strcmp compara apenas dois vetores ( de caracter ou inteiro)

Exemplo

//inteiro

vet.codigo == x

//string

vet.nome == letra // supondo que letra esteje declarada como vetor(letra[30]).

Meu código está assim:

struct dados {

int codigo;

char nome[30];

float n1,n2;

};

int main() {

dados vet[100];

int ultimo=0,i;

char achouletra;

printf("==================\n");

printf("informe primeira letra do nome:");

scanf("%c",&achouletra);

for(i=0;i<30;i++) // não sei se esse for esta correto

{

if(?) // como faço a comparação?

{

printf("codigo = %d\n",vet.codigo);

printf("nome = %s\n",vet.nome);

}

}

}

Primeiramente, boa noite a todos. 

O problema é o seguinte:

Eu tenho um vetor char chamado alfa, e o outro vetor, chamado mensagem.

O vetor alfa contém as 26 letras do alfabeto, e o vetor mensagem, contém algo digitado pelo usuário, com um máximo de até 1000 caractéres.

Eu preciso fazer com que, cada caractére da variável mensagem, seja comparada à cada caractére da variável alfa, e que, quando for verdadeiro (ou seja, quando forem iguais ambos os caractéres), a posição desse caractére (já que é um vetor) na variável alfa, seja jogado em outro vetor,  por exemplo, um vetor do tipo char, chamado novamensagem.

Por exemplo. Tendo uma mensagem "abcde", e meu alfa sendo "abcdefghijklmnopqrstuvwxyz".

Ao comparar mensagem[0] com alfa[0], ambos serão "a", então, como "a" ocupa a 1ª posição no vetor, 

a 1ª posição do vetor novamensagem[0], deverá ter o valor 1, em seguida, ele irá comparar, mensagem[0] com alfa[1],alfa[2], e assim por diante, mas como não serão mais iguais, não retornará mais nenhum valor.

E assim por diante, até alfa[4], que será a letra "e", que nesse caso, terá que retornar o valor 5, que é a posição da letra"e" no vetor alfa..

Agradeço desde já por qualquer ajuda.

Segue abaixo meu código. Só preciso implementar esta função.

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> int main (void) { /*declaração de variáveis do tipo char*/ char alfa[27]; char mensagem[1000]; int novamensagem[1000]; int cont = 0; int j = 0; /*atribuição de ponteiro do tipo file, para o arquivo crip.txt, no modo escrita "write"*/ FILE *file; file = fopen("C:/Users/Denis/Desktop/Crip.txt", "w"); printf("Digite sua mensagem:\n"); /*lê mensagem digitada por usuario, e atribui à variável mensagem*/ scanf("%[A-Z a-z0-9]", &mensagem); /*Conta o número de caractéres do vetor mensagem*/ while (mensagem[cont] != NULL) { cont++; } /*atribuição de ponteiro do tipo file, para o arquivo alfa.txt, no modo leitura "read"*/ FILE *abcd; abcd = fopen("C:/Users/Denis/Desktop/alfa.txt", "r"); /*lê conteúdo do arquivo alfa, até o caractere ser nulo, e joga na variável alfa*/ while (fgets(alfa, 27, abcd) != NULL) for (int abc = 0; abc < 27; abc++) { for (int i = 0; i <= cont; i++) { if (mensagem[i].Equals(alfa[abc])) { novamensagem[j] = abc; j++; } else { j = j; } } } fprintf(file, "%d", novamensagem); fclose(file); fclose(abcd); printf("Sua mensagem foi salva com sucesso."); getch(); return 0; }

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

How do I compare these two character arrays to make sure they are identical?

char test[10] = "idrinkcoke" char test2[10] = "idrinknote"

I'm thinking of using for loop, but I read somewhere else that I couldnt do test[i] == test2[i] in C.

I would really appreciate if someone could help this. Thank you.

8

"Não consegue" fazer a comparação com operadores relacionais pois as variáveis que representam os vetores são ponteiros para os seus primeiros elementos.

Por esse motivo quando compara por exemplo com == está a comparar se os ponteiros tem o mesmo valor, ou seja, apontam para o mesmo local na memoria. Isso só irá acontecer se forem o mesmo vetor. Em relação ao facto de estarem ou não numa área estática não vai influenciar em nada a comparação.

Considere o seguinte exemplo:

char texto1[] = "um texto"; char texto2[] = "um texto"; printf("\n%d", texto1 == texto2); //0 - que representa falso char *texto3 = texto1; printf("\n%d", texto1 == texto3); //1 - que representa verdadeiro

No ultimo exemplo texto3 foi um ponteiro que coloquei manualmente a apontar para o vetor texto1.

Em contraste, comparar com <= ou >= apenas lhe vai dizer se um ponteiro é maior que o outro, que não é util.

A comparação deve então ser feita com um laço/ciclo, que passa a cada letra e faz a comparação entre cada vetor. Utilizando uma versão bem simples poderia fazer assim:

int compara_strings(char str1[], char str2[]){ int i; for (i = 0; str1[i] != '\0' && str2[i] != '\0'; i++){ //assim que uma letra seja diferente if (str1[i] != str2[i]){ //retorna -1 se a primeira for menor ou 1 caso contrário return str1[i] < str2[i] ? -1 : 1; } } //Se as duas acabaram, são iguais e retorna 0. Se a str1 acabou e str2 não //retorna um valor negativo. Se str2 acabou e a str1 retorna um valor positivo return str1[i] - str2[i]; }

Repare que aqui os retornos tem significados especificos:

  • 0 - strings iguais
  • negativo - primeira string menor que a segunda
  • positivo - primeira string maior que a segunda

Quando se diz que uma string é maior ou menor, é uma comparação lexicográfica (alfabética).

No entanto estaria a reinventar a roda pois já existe uma função para fazer esta mesma comparação em <string.h> que se chama strcmp.

Utilizar essa função no exemplo inicial seria:

char texto1[] = "um texto"; char texto2[] = "um texto"; printf("\n%d", strcmp(texto1,texto2)); //0 - que representa iguais