Está impossível (funções) [RESOLVIDO]

1. Está impossível (funções) [RESOLVIDO]

Felipe RR
Phodalao

(usa Outra)

Enviado em 11/05/2018 - 00:59h

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


void funcao(char *);

main()
{
char nome[10][10];
int x = 1;

while(x <5){

printf("digite um nome");
gets(nome[x]);
fflush(stdin);
x++;
}

funcao(nome[1]);

getchar();
return 0;
}

void funcao(char *var){
int x = 1;
while(x <5){

printf("%s \n", var[x]);

x++;
}
return 0;



}






Bom galera, era pra ser uma função simples, apenas para imprimir os nomes que foram registrados, porém não funciona de jeito nenhum quando eu uso mais de um nome.


  


2. Re: Está impossível (funções)

Paulo
paulo1205

(usa Ubuntu)

Enviado em 11/05/2018 - 15:38h

Phodalao escreveu:

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


Você está programando com Turbo C ou Turbo C++? Se não, esqueça esse negócio de <conio.h>.



void funcao(char *);


Note que, com essa declaração, você pode receber apenas um ponteiro para caracteres, que pode ser derivado de uma única string, não um ponteiro para múltiplas strings.


main()


Por padrão, em C, a declaração de main deve ter uma das seguintes formas:
int main(void)  // Se você não quiser receber argumentos do ambiente de execução. 
ou
int main(int argc, char **argv)  // Se você quiser argumentos do ambiente de execução.
// Nesse caso, “argv” funcionará como um array de strings, um total de “argc” argumentos,
// onde argv[0] corresponde ao nome usado para invocar o programa e argv[1]...argv[argc-1]
// contêm a representação textual dos argumentos passados ao programa.


{
char nome[10][10];


Aqui você declara nome como sendo um “array com dez elementos do tipo ‘array com dez elementos do tipo char’”.

	int x = 1; 


Lembre-se que arrays em C têm índices que começam em 0 e vão até o tamanho usado na declaração menos um. No seu caso, nome tem índices que vão de 0 a 9, e cada um dos nome[0] a nome[9] tem índices que vão de 0 a 9.

	
while(x <5){

printf("digite um nome");


Desse jeito, o nome que você digitar vai aparecer colado na mensagem que acabou de imprimir. Coloque um espaço um pule uma linha após a palavra “nome” na string acima.

	gets(nome[x]); 


gets() é uma função perigosa, que foi removida na última revisão do padrão do C. Aprenda a usar fgets() ou getline().

	fflush(stdin); 


Com gets() ou com fgets() você não precisa de fflush(stdin).

Além disso, o padrão do C não define o comportamento de fflush() para um stream de leitura, como é stdin. Seu programa pode não funcionar num compilador diferente do que você está usando hoje.

x++;	
}

funcao(nome[1]);


O que você passa para a função nesse caso não é o array nome inteiro, mas apenas seu segundo elemento (lembre-se que os índices começam em 0, não em 1).

Você acabou acertando a sintaxe, porque você passou uma única string (que, nesse caso, tem decaimento para ponteiro para caracteres), e a função recebe um único ponteiro para caracteres. Mas, ao que pareceu pela sua descrição, você errou a semântica, porque possivelmente gostaria de passar um vetor de strings.

	
getchar();


Por que você usou esse getchar() aqui?

	return 0;
}

void funcao(char *var){


Veja o comentário que fiz acima, no momento da declaração da função funcao. Seu argumento aponta para o conteúdo de uma única strings, não para múltiplas strings.

	int x = 1; 


Aqui você comete, de novo, o erro com os índices.

	while(x <5){

printf("%s \n", var[x]);


Aqui há um erro mais grave (mas que o compilador pode deixar passar, dependendo de como você o tiver invocado). var[x] corresponde a um único caráter da única string recebida pela função como argumento. Contudo, a conversão "%s" de printf() esperaria receber como argumento um ponteiro para caracteres (geralmente quatro ou oito bytes), não um único caráter (um único byte, convertido para inteiro, tipicamente com quatro bytes).

Existe uma explicação para que o seu compilador deixe passar esse erro. printf() é uma função com número de parâmetros variável (na verdade, o primeiro parâmetro, que corresponde à string de formatação tem um tipo fixo, mas os demais parâmetros são variáveis, podendo inclusive não existir nenhum outro parâmetro). Em casos assim, o compilador tem uma capacidade limitada de inferir se os argumentos estão corretos (a não ser que o compilador seja especialmente configurado para tratar funções da família de printf() de modo particular, em vez de como outra função qualquer).


x++;
}
return 0;



}


Bom galera, era pra ser uma função simples, apenas para imprimir os nomes que foram registrados, porém não funciona de jeito nenhum quando eu uso mais de um nome.


Há três coisas principais que você tem de consertar:

  • Use índices começando em 0 e terminando em, no máximo, tamanho_da_declaracao-1.

  • O parâmetro de funcao() tem de ter um tipo diferente, que lhe permita receber um ponteiro para strings (que seria o resultado do decaimento de um array de strings), em vez de apenas um ponteiro para caracteres (decorrente do decaimento de uma única string). O problema é que o C não tem um tipo string nativo, e você acaba tendo de emular tal tipo através de arrays de caracteres. E o problema continua porque a dimensão de um array faz parte do seu tipo, de modo que se você tem uma string armazenada num vetor de caracteres com 20 elementos, ela não será compatível com uma função que espera tratar strings armazenadas em vetores com 10 (ou qualquer outro valor diferente de 20) caracteres.

No seu caso, como todas as suas strings têm tamanho de 10 caracteres (9 úteis, mais um para guardar o nyte nulo que funciona como terminador), você poderia declarar a função do seguinte modo.
void funcao(char *str[10])  // Significa que str é um ponteiro para arrays com 10 elementos do tipo char. 


  • Ao invocar a função, você terá de passar como parâmetro o array nome inteiro (ou um ponteiro para seu conteúdo, o que acontece naturalmente por decaimento).


Uma solução mais genérica, que acomodasse strings com tamanhos não-fixos necessitaria de alocação dinâmica de memória. Já trabalhou com isso?






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts