Ir para conteúdo
Fórum Script Brasil
  • 0

string


viciado

Pergunta

retornar 0 se duas strings forem iguais, caso contrario retorna o índice do primeiro caractere não coincidente

Como eu retorno o indice do caractere ?

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

int main()
{
  char str1[30];
  char str2[30];
  printf("Digite uma string \n");
  fgets(str1, 30, stdin);
  printf("Digite outra string \n");
  fgets(str2, 30, stdin);
  system("PAUSE");    
  return 0;
}
int verifica(char str1[30], char str2 [30]){
    if(strcmp(str1,str2)){
                          return(0);
                          }
    else{
         return

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

Cara, eu ainda não estudei strings e não conheço as funções de maniputação de strings muito bem. Mas o que deu a entender é que ele quer que você faça sua própria função para comparar duas strings, verificando a igualdade caractere por caractere... Algo tipo um laço que vá comparando os caracteres um por um e se eles forem diferentes retorna o indice daquele caractere, se não retorna zero mesmo.

Até mais, ;D

Editado por jth.
Link para o comentário
Compartilhar em outros sites

  • 0

Cara... eu fiz aqui do meu jeito, usando só o sizeof mesmo... não sei se tá certo:

int func1(char *v, char *m) {
    int size,i;
    if (sizeof v >= sizeof m) size = sizeof m;
          else size = sizeof v;
    for(i=0;i<size;i++) 
    if (v[i] != m[i]) {
             return i;
             }
    return 0;
}

Edição 2ª: Aff... é bem minha 2ª ou 3ª edição. Fiz novos testes, tem um erro... (tentando reparar)]

Edição 3ª: É, parece que tenho que estudar mais ponteiros... quando uso o sizeof v ele não remete ao tamanho da string mesmo... aqui fica só retornando valor 4...

Obs.: Se você não conhece o "sizeof" ele retorna o tamanho de uma varável ou um vetor em bytes. Como uma string é uma cadeira de "chars" (cada char pesa 1 byte) então eu usei ele para saber a "quantidade de elementos" da string.

Editado por jth.
Link para o comentário
Compartilhar em outros sites

  • 0
Obs.: Se você não conhece o "sizeof" ele retorna o tamanho de uma varável ou um vetor em bytes. Como uma string é uma cadeira de "chars" (cada char pesa 1 byte) então eu usei ele para saber a "quantidade de elementos" da string.

Não é bem assim.

sizeof() retorna o tamanho de um objeto em bytes, mas uma string sempre ocupa um bute a mais por causa do '\ 0'.

Teste:

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

int main()
{
    char *din_str, str[] = "teste";
    
    printf("sizeof(str)=%d\nstrlen(str)=%d\n", sizeof(str), strlen(str));
    
    return 0;
}
Saída:
sizeof(str)=6 strlen(str)=5
Por isso existe strlen(). ;) Lembrando que sizeof() só vai retornar o tamanho de um objeto aloca dinamicamente se a memória já estiver alocada. Você se lembrarão disso quando usarem ponteiros dentro de estruturas. ;) O programa em si é mais ou menos assim:
int main()
{
    char str1[] = "teste", str2[] = "testa";
    int i;
    
    for (i = 0; i < 5; i++)
    {
        if (str1[i] != str2[i])
        {
            printf("É diferente a partir da posição %d\n", i);
            break;
        }
    }
    
    return 0;
}

Coloquei um for que vai até 5 só para exemplificar, pois usei strings de 5 caracteres. O correto é ir até o tamanho da menor string, para não acessar memória errada.

Editado por Beraldo
Link para o comentário
Compartilhar em outros sites

  • 0
Não é bem assim.

sizeof() retorna o tamanho de um objeto em bytes, mas uma string sempre ocupa um bute a mais por causa do '\ 0'.

Sim, Beraldo, eu tinha me ligado do "\ O"... tanto que usei "i<size" e não "i<=size"...

Coloquei um for que vai até 5 só para exemplificar, pois usei strings de 5 caracteres. O correto é ir até o tamanho da menor string, para não acessar memória errada.

Toda a minha preocupação com o sizeof é por causa disso...

Não conhecia o strlen, na verdade ainda não estudei strings nem suas funções de verdade... o meu código atualizado ficou assim:

int func1(char *v, char *m) {
    int size,i;
    if (strlen(v) > strlen(m)) size = strlen(m);
          else size = strlen(v);
    for(i=0;i<=size;i++) 
    if (v[i] != m[i]) {
             return i;
             }
    return 0;
}

O código verifica inclusive no índice da string em que existe o "\ O" na tentativa de ver se as strings não são iguais... acho que assim ficou OK...

Mas ainda testando isso fiquei confuso. porque não posso usar o sizeof com os ponteiros? Fica retornando 4 sempre...

Editado por jth.
Link para o comentário
Compartilhar em outros sites

  • 0

int func1(char *v, char *m)
Até onde eu sei, quando eu faço isso estou criando dois ponteiros, v e m para serem usados dentro dessa função, que no caso vão apontar para o índice zero de dois vetores (as strings) que a função receberá como argumento. Quando eu uso "v" e "m" dentro desse meu bloco ele simplesmente deveria apontar para os vetores originais, não? Só que nos meus testes, quando eu uso sizeof(v), por exemplo, ele não retorna o tamanho em bytes do vetor para o qual o ponteiro "v" está apontando, mas sim o valor 4... O que eu teria que fazer para ele retornar o tamanho do vetor "original"? Eis um exemplo do mesmo problema:
int main() {
       char t[]="Testando...",*p;
       printf("sizeof(%s):%d      sizeof(p):%d \n",t,sizeof(t),sizeof(p));
       p = t;
       printf("sizeof(%s):%d      sizeof(%s):%d \n",t,sizeof(t),p,sizeof(p));

           /* Repare que mesmo depois de atribuir um valor à "p", sizeof(p) continua voltando '4'.
            * Minha dúvida esta aí... */
       }

Até mais ;D

Editado por jth.
Link para o comentário
Compartilhar em outros sites

  • 0

p é apenas um ponteiro. Ele contém um endereço de memória, representado por um long unsigned int.

Em máquinas de 32 bits, isso vale 4. A minha é de 64 bits e aparece sempre 8.

Com um ponteiro com memória própriua é diferente:

int main()
{
    char *p = (char *) malloc(8 * sizeof(char));
    strcpy(p, "Beraldo");
    
    printf("p=%s\nsizeof(p)=%lu\nstrlen(p)=%d", p, sizeof(p), strlen(p));
    
    free(p);
    
    
    return 0;
}

Saída:

p=Beraldo

sizeof(p)=8

strlen(p)=7

Link para o comentário
Compartilhar em outros sites

  • 0

Tentei assim mais está retornando sempre 0

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int verifica(char str1[30], char str2 [30]);
int main()
{
  char str1[30];
  char str2[30];
  printf("Digite uma string \n");
  fgets(str1, 30, stdin);
  printf("Digite outra string \n");
  fgets(str2, 30, stdin);
  printf("\n %d \n",verifica(str1,str2));
  system("PAUSE");    
  return 0;
}
int verifica(char str1[30], char str2 [30]){
    int i;
    if(strcmp(str1,str2)){
                          return(0);
                          }
    else{
         for(i=0;i<30;i++){
                           if(!strncmp(str1[i], str2[i], 30)){
                           return (i);
                           }
                           }
                           }
}

Link para o comentário
Compartilhar em outros sites

  • 0

Continua retornando sempre 0

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int verifica(char str1[30], char str2 [30]);
int main()
{
  char str1[30];
  char str2[30];
  printf("Digite uma string \n");
  fgets(str1, 30, stdin);
  printf("Digite outra string \n");
  fgets(str2, 30, stdin);
  printf("\n %d \n",verifica(str1,str2));
  system("PAUSE");    
  return 0;
}
int verifica(char str1[30], char str2 [30]){
    int i;
    if(strcmp(str1,str2)){
                          return(0);
                          }
    else{
         for(i=0;i<30;i++){
                           if(str1[i] != str2[i]){
                           return (i);
                           }
                           }
                           }
}

Link para o comentário
Compartilhar em outros sites

  • 0

Return Value

Returns an integral value indicating the relationship between the strings:

A zero value indicates that both strings are equal.

A value greater than zero indicates that the first character that does not match has a greater value in str1 than in str2; And a value less than zero indicates the opposite.

Fonte: http://www.cplusplus.com/reference/clibrar...ing/strcmp.html

Logo:

if(strcmp(str1,str2)== o){

Editado por Beraldo
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...