Ir para conteúdo

POWERED BY:

Arquivado

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

Yuri Rodrigues Braz

funções

Recommended Posts

Pessoal, olá a todos!

 

Eu estou tentando aprender a programar em C, só que a coisa está difícil.

Fui fazer um programa para inverter uma string, funcionou tudo bem, mas quando inventei de separar em funções não funciona mais.

 

Está dando o seguinte erro na linha em negrito:

incompatible types in assignment

 

Alguém pode me ajudar??

 

Obrigado!

 

#include <stdio.h>

 

main()

{

/* string chamada texto com no maximo 100 caracteres */

char texto[100];

char novotexto[100];

 

/* obtendo a string do usuario */

printf("Por favor, digite um texto: ");

gets(texto);

 

/* chamando a funcao */

novotexto = inverte(texto);

printf("Seu texto ao inverso: [%s]\n",novotexto);

}

 

char inverte(char arg)

{

int i, tamanho, p;

char inverso[100];

i = 0; p = 0;

tamanho = strlen(arg);

while (tamanho >= i) {

--tamanho;

inverso[p] = arg[tamanho];

p++;

}

return inverso;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa eu ver se eu entendi, você passa um char* de parametro no função q recebe soh char ??

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa, mas estou realmente aprendendo o básico. O C não tem o tipo string, que facilitaria minha vida, então eu vi que para strings usa-se o char como uma forma de array de caracteres que forma a string. Pois bem, declarei a variável como sendo char texto[100], mas como faço na função?

 

Tentei colocar char inverte(char arg[100]) mas deu exatamente o mesmo erro. Como que faz para declarar uma string no argumento de uma função?

Eu já tentei aqui de todo jeito que conheço, mas conheço pouco, o que dificulta as coisas.

 

Como posso corrigir o erro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado!!!

 

Eu na verdade estou tentando fazer isso com o intuito de aprender, por isso, como se prontificou, prefiro que explique.

Na verdade acho que tenho que estudar mais para tentar fazer isso, não sei o que significa do asterisco do char* e estou tendo muita dificuldade com os tipos que sempre parecem conflitantes.

 

Um abraço,

 

Yuri.

 

Aquele link que me enviou por exemplo, usando o primeiro exemplo, recursivo em void sem retorno, funcionou bem. Mas quando tentei a dica do outro amigo lá, não deu certo de novo.

 

#include <stdio.h>

int main(){
   char contrario;
   contrario = inv("kandrade");
   return 0;
}

char* inv(char* string)
{
        int iTam = strlen(string);
        char *cRetorno = new char[iTam+1];
        cRetorno[iTam] = 0; //fechar a string de retorno
        int i=0;
        while(i != iTam)
        {
                cRetorno[i] = string[(iTam-i)-1];
                i++;
        }
        delete string;
        return cRetorno;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

o segundo exemplo é C++ ok?

e a variavel contrario tem q ser *char

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como o intuito é aprender, você tem que implementar. Eu fiz pra você ver como é, só quero que entenda o código. Qualquer coisa que você não entender, posta que eu tento explicar melhor.

 

O problema que você teve com os tipos é que

 

char *var;

define um ponteiro pra char (usado pra armazenar o endereço inicial de uma array de caracteres, ou, como o pessoal geralmente fala, "string"). Assim, é reservado o espaço necessário para armazenar um endereço de memória.

 

char var;

define uma variável tipo char. No C, por definição, sizeof(char) == 1, independente da arquitetura. Isso não significa que todas as implementações do C utilizem 1 byte para armazenar um char. Apenas significa que chars utilizam uma unidade de armazenamento (a partir da qual os tamanhos dos outros tipos são estipulados).

 

Dependendo da sua arquitetura, sizeof(char *) (ou seja, o tamanho necessário para armazenar um endereço de memória) varia (e este geralmente é diferente de sizeof(char)). Na x86, por exemplo, esse tamanho é 4 (e 4 != 1). Por causa dessa diferença é necessário que haja compatibilidade de tipos em C.

 

Eu fiz duas implementações. Uma reverter_simples, com sintaxe mais simples e com menos "atalhos". Como você disse que está começando a aprender C, recomendo que leia esta (inclusive comentei o código linha-a-linha). A outra é a reverter, que usa menos linhas de código. Daqui a um tempo seria legal você voltar a esse código e ver se entende como ele funciona.

 

Seguem as soluções:

 


// Ambas as funcoes fazem a mesma coisa. //

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



char *reverter_simples(char *texto)
{
	char *saida;	// array que serah retornado, contendo o texto invertido
	int i, j;	// i serah indice do texto original (e decrementado), j serah o do novo (incrementado)

	i = strlen(texto);	// i serah decrementado, e deve comecar pelo ultimo indice do texto original
	saida = malloc(i+1);	// alocacao de espaco (numero de caracteres + o 0 final)

	i--;			// comecaremos a partir do ultimo caracter valido (diferente de 0)
	for (j = 0; texto[j]; j++) // a condicao de parada eh que texto[j] seja igual a (nullbyte, indica ultimo char)
	{
		saida[j] = texto[i]; 	// copia
		i--;			// decrementa contador do original
	}
	saida[j] = 0;			// termina o texto invertido com o nullbyte

	return saida;
}


char *reverter(char *texto)
{
	char *saida = 0;
	int i, j;

	i = strlen(texto);
	saida = malloc(i+1);
	i--;
	for (j = 0, saida[i+1] = 0; texto[j]; saida[j++] = texto[i--]);
	return saida;
}




int main()
{

	char *texto = "testando";
	char *novo = 0;
	novo = reverter_simples(texto);

	printf("\n\n\t Novo texto: %s\n\n", novo);

	return 0;
}

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.