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>.
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 .
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.
Aqui você declara nome como sendo um “array com dez elementos do tipo ‘array com dez elementos do tipo
char ’”.
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 () é uma função perigosa, que foi removida na última revisão do padrão do C. Aprenda a usar
fgets () ou
getline ().
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.
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 .
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 .
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?