Dúvida Simples sobre declaração de variáveis em C [RESOLVIDO]

1. Dúvida Simples sobre declaração de variáveis em C [RESOLVIDO]

Steve
Steve

(usa Slackware)

Enviado em 06/05/2018 - 21:21h

Estou estudando C por conta própria, motivo de minhas dúvidas.

Olhando diversas formas de declarar uma variável do tipo char, percebi que posso também declarar elas assim, sem definir seu tamanho:
char Nome;

Como consigo atribuir um valor para ela via código?

Pois isso abaixo não funciona:
strcpy(Nome, "My God");
strcpy(Nome, "M");
// Neste caso cheguei a pensar que 1 caracter ela aceitaria, mas também não

Ainda no Caso acima, como ela não possue um tamanho, existe uma forma de eu colocar nela um valor, atribuindo um tamanho neste caso?

OBS:
- Respostas para declarar como: char Nome[100] não me servem, pq assim sei que funciona!
- ISSO não se trata de exercícios de Curso ou Faculdade, Já informei, Estudo por minha conta!

RESPOSTA QUE USEI
Resposta que SamL deu e que me ajudou a resolver a questão, junto claro dos outros que adicionaram ainda mais informações. Como SamL apagou o que escreveu, resolvi POSTAR aqui para ajudar quem ler esse tópico a Resposta Original que eu havia salvo!

MELHOR RESPOSTA
SamL - Samuel Leonardo - Enviado em 06/05/2018 - 21:44h

Quando você ver algo assim: char letra; é porque você só pode iniciar ela dessa forma: char letra = 'A'; ou qualquer outra letra da tabela ASCII. Pesquise no google sobre a tabela, vá ao google images e veja uma tabela ascii pra ter ideia como é. por exemplo, o que você tem que saber é que caracteres minusculos são diferentes de maiusculos, pois, você não pode representar o mesmo caractere com o mesmo valor. Sendo assim char repesenta um número, apesar de ser chamado de char, ele pode ser um numero entre 0 e 256 (até 255) esse é o unsigned char (caractere sem sinal), ou com sinal com valores de -128 até 127.

Exemplos de aplicação:
char letra = 'C';//certo, letra é um 'C' maiusculo inciado com uma =letra entre aspas simples
char letra = "nome";//errado, aqui "nome" é uma string (cadeia de caracteres)
char nome[100] = "Samuel";
char letra = nome[2];//certo, aqui letra tem valor 'm' (terceiro caractere da string nome
char letra = 83;//também é certo, aqui 83 é a letra 'S' (maiusculo)
int S = 83;
char letra = (char)S; //converte S para char e então letra vira 'S' maiusculo

O que você também tem que ter em mente é que na tabela ASCII os carcteres também são dispostos numa ordem para facilitar seu uso:
char letra = 'a' + 2;// letra agora é 'c' minusculo, pois o alfabeto minusculos está disposto sequencialmente

A Linha abaixo está errada Foi apenas falta de atenção!
char letra = '0' + 5;//agora letra é '5' pois os algarismos também são dispostos sequencialmente 

Para ler caracteres do terminal você pode usar:
char letra;
scanf("%c", &letra);
Ou entçao
letra = getchar();

Para escrever caracteres na tela você pode usar:
char letra = 'A';
printf("letra é %c\n", letra);
Vai imprimir no terminal: "letra é A"

Edit: corrigido pra melhor informação. SamL



  


2. MELHOR RESPOSTA

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 06/05/2018 - 21:44h



3. Re: Dúvida Simples sobre declaração de variáveis em C [RESOLVIDO]

Steve
Steve

(usa Slackware)

Enviado em 06/05/2018 - 23:46h

SamL escreveu: Quando você ver algo assim...


UAU, seus exemplos e explicações me ajudaram muito, porque agora estou fazendo e anotando ainda mais formas de declarar a variável char.

Seu printf("letra é %c\n", letra);
Também me ajudou, porque estava usando "s" para imprimir e claro dá erro. E Olhando o comando printf já sei o porque não funcionava.

Eu havia entendido que ele seria tipo um texto, mas analisando seus exemplos, não é isso!
Eu havia lido sobre o tipo char, mas vejo que terei que ler novamente, e ao que parece entendi somente agora o que ele quis dizer com a Tabela ASCII. Entendi AGORA que ele na verdade armazena a posição da tabela, ou seja o valor verdadeiro armazenado não é um texto, e sim um número inteiro.

Me corrija se eu estiver errado: Quando eu declaro char Nome = 'N'
O Programa estaria guardando de verdade o número decimal 78 da tabela ASCII certo?
Entendi que char não tem nada de texto, e sim ele armazena a posição do caractere correspondente na tabela ASCII...




4. Re: Dúvida Simples sobre declaração de variáveis em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/05/2018 - 00:37h

SamL escreveu:

Quando você ver algo assim: char letra; é porque você só pode iniciar ela dessa forma: char letra = 'A'; ou qualquer outra letra da tabela ASCII.


Cuidado aqui. char não tem nenhuma relação necessária com ASCII ou qualquer outro conjunto de caracteres. char é tão somente a menor unidade endereçável da máquina com oito bits ou mais. Ele é um tipo numérico que pode ser, mas não obrigatoriamente tem de ser, usado para representar caracteres.

Até porque, como já muito se discutiu neste fórum, oito bits de um dado do tipo char não são mais suficientes para representar todos os caracteres que nós usamos modernamente no dia-a-dia — e menos ainda são os sete bits do ASCII. Cada vez mais, conjuntos de caracteres que não cabem num char vêm sendo usados por bibliotecas de amplo uso e, no caso do C++, vêm ganhando mais e mais suporte mesmo em nível de linguagem.

Pesquise no google sobre a tabela, vá ao google images e veja uma tabela ascii pra ter ideia como é. por exemplo, o que você tem que saber é que caracteres minusculos são diferentes de maiusculos, pois, você não pode representar o mesmo caractere com o mesmo valor. Sendo assim char repesenta um número, apesar de ser chamado de char, ele pode ser um numero entre 0 e 256 (até 255) esse é o unsigned char (caractere sem sinal), ou com sinal com valores de -128 até 127.


A única relação entre ASCII e char que eu enxergo é que um valor de índice do ASCII cabe num char. De resto, não creio que seja uma informação tão relevante assim.

Exemplos de aplicação:
char letra = 'C';//certo, letra é um 'C' maiusculo inciado com uma =letra entre aspas simples
char letra = "nome";//errado, aqui "nome" é uma string (cadeia de caracteres)


Concordo que seja errado, mas pode compilar com pouca (ou, dependendo do compilador, nenhuma!) reclamação.

me@mymachine:/tmp [504]: cat > x.c
void f(void){
char letra = "nome";
}
me@mymachine:/tmp [505]: gcc -c x.c
x.c: In function ‘f’:
x.c:2:15: warning: initialization makes integer from pointer without a cast [enabled by default]
char letra = "nome";
^
me@mymachine:/tmp [506]: ls -la x.?
-rw-r--r-- 1 me mygroup 38 May 7 00:16 x.c
-rw-r--r-- 1 me mygroup 1416 May 7 00:16 x.o


O arquivo x.o é sinal de que o código compilou, apesar da mensagem de aviso sobre a conversão de tipos perigosa.

Acidentes assim são comuns e relativamente capazes de acometer mesmo programadores experientes, pois ninguém consegue prestar atenção a tudo o tempo todo (e, além disso, aspas e apóstrofo compartilham a mesma tecla!). Por isso mesmo, eu recomendo que se usem opções do compilador para transformar avisos em erros (as quais, no caso do GCC, seriam “-Werror -pedantic-errors -O2”).

char nome[100] = "Samuel";
char letra = nome[2];//certo, aqui letra tem valor 'm' (terceiro caractere da string nome
char letra = 123;//também é certo, aqui 123 é a letra 'S' (maiusculo)


Em qual conjunto de caracteres? Certamente não no ASCII, cujo caráter “S” tem o índice 83 (talvez você tenha sido traído pela notação em base octal, mas se for, em C você teria de expressá-la como “0123”). Ao índice 123 (octal 0173) corresponde o caráter “{”.

int S = 123;
char letra = (char)S; //converte S para char e então letra vira 'S' maiusculo


Essa conversão infelizmente não precisa ser explícita. Você poderia ter dito simplesmente “char letra=S;” (com S previamente declarado com o inteiro), e o compilador aceitaria de muito bom grado.

O que você também tem que ter em mente é que na tabela ASCII os carcteres também são dispostos numa ordem para facilitar seu uso:
char letra = 'a' + 2;// letra agora é 'c' minusculo, pois o alfabeto minusculos está disposto sequencialmente
char letra = '0' + 5;//agora letra é '4' pois os algarismos também são dispostos sequencialmente


Opa!! '0'+5=='5'!!!


5. Re: Dúvida Simples sobre declaração de variáveis em C

???
gokernel

(usa Linux Mint)

Enviado em 07/05/2018 - 12:31h

Olá Pessoal !

O pessoal acima já explicaram ...

Veja também esse exemplo interessante para quem está começando ...

//-------------------------------------------------------------------
//
// Programa com 2 funcoes:
// Demonstra o uso de variavel tipo char (signed & unsigned)
//
// ARQUIVO:
// test.c
//
// COMPILE:
// gcc test.c -o test -Wall
//
//-------------------------------------------------------------------
//
#include <stdio.h>

char var_i_127 = 1; // valores entre: 0 ... 127 && -128 ... -1 | 0

unsigned char var_i_255 = 1; // valores entre: 0 ... 255


void funcao_127 (void) {

//-------------------------------------------
//
// imprime:
//
// 1 ... 127 && -128 ... -1
//
//-------------------------------------------
//
while (var_i_127) {

printf ("i: %d\n", var_i_127++);

}
}
void funcao_255 (void) {

//-------------------------------------------
//
// imprime:
//
// 1 ... 255
//
//-------------------------------------------
//
while (var_i_255) {

printf ("i: %d\n", var_i_255++);

}
}

int main (int argc, char **argv) {

funcao_127();

// descomente a linha abaixo ... e comente a linha acima ...
// funcao_255();

return 0;
}



Essa info é para plataforma 32 bits:
-------------------------------------------------------------------------
Variavel tipo ( char ) consome apenas 1 byte de memória.
Variavel tipo ( short ) consome 2 bytes de memória.
Variavel tipo ( int ou long ) consome 4 bytes de memória.
-------------------------------------------------------------------------

E parabéns para vc que realmente que aprender ... "divirta-se enquanto aprende" ... o caminho é longo !!!






6. Re: Dúvida Simples sobre declaração de variáveis em C

Steve
Steve

(usa Slackware)

Enviado em 14/05/2018 - 03:22h

gokernel escreveu: Olá Pessoal ! O pessoal acima já explicaram ...
Veja também esse exemplo interessante para quem está começando ...

//-------------------------------------------------------------------
//
// Programa com 2 funcoes:
// Demonstra o uso de variavel tipo char (signed & unsigned)
//
// ARQUIVO:
// test.c
//
// COMPILE:
// gcc test.c -o test -Wall
//
//-------------------------------------------------------------------
//
#include <stdio.h>

char var_i_127 = 1; // valores entre: 0 ... 127 && -128 ... -1 | 0

unsigned char var_i_255 = 1; // valores entre: 0 ... 255


void funcao_127 (void) {

//-------------------------------------------
//
// imprime:
//
// 1 ... 127 && -128 ... -1
//
//-------------------------------------------
//
while (var_i_127) {

printf ("i: %d\n", var_i_127++);

}
}
void funcao_255 (void) {

//-------------------------------------------
//
// imprime:
//
// 1 ... 255
//
//-------------------------------------------
//
while (var_i_255) {

printf ("i: %d\n", var_i_255++);

}
}

int main (int argc, char **argv) {

funcao_127();

// descomente a linha abaixo ... e comente a linha acima ...
// funcao_255();

return 0;
}



Essa info é para plataforma 32 bits:
-------------------------------------------------------------------------
Variavel tipo ( char ) consome apenas 1 byte de memória.
Variavel tipo ( short ) consome 2 bytes de memória.
Variavel tipo ( int ou long ) consome 4 bytes de memória.
-------------------------------------------------------------------------

Seu Código retornou o seguinte no Terminal:

i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
i: 10
i: 11
i: 12
i: 13
i: 14
i: 15
i: 16
i: 17
i: 18
i: 19
i: 20
i: 21
i: 22
i: 23
i: 24
i: 25
i: 26
i: 27
i: 28
i: 29
i: 30
i: 31
i: 32
i: 33
i: 34
i: 35
i: 36
i: 37
i: 38
i: 39
i: 40
i: 41
i: 42
i: 43
i: 44
i: 45
i: 46
i: 47
i: 48
i: 49
i: 50
i: 51
i: 52
i: 53
i: 54
i: 55
i: 56
i: 57
i: 58
i: 59
i: 60
i: 61
i: 62
i: 63
i: 64
i: 65
i: 66
i: 67
i: 68
i: 69
i: 70
i: 71
i: 72
i: 73
i: 74
i: 75
i: 76
i: 77
i: 78
i: 79
i: 80
i: 81
i: 82
i: 83
i: 84
i: 85
i: 86
i: 87
i: 88
i: 89
i: 90
i: 91
i: 92
i: 93
i: 94
i: 95
i: 96
i: 97
i: 98
i: 99
i: 100
i: 101
i: 102
i: 103
i: 104
i: 105
i: 106
i: 107
i: 108
i: 109
i: 110
i: 111
i: 112
i: 113
i: 114
i: 115
i: 116
i: 117
i: 118
i: 119
i: 120
i: 121
i: 122
i: 123
i: 124
i: 125
i: 126
i: 127
i: -128
i: -127
i: -126
i: -125
i: -124
i: -123
i: -122
i: -121
i: -120
i: -119
i: -118
i: -117
i: -116
i: -115
i: -114
i: -113
i: -112
i: -111
i: -110
i: -109
i: -108
i: -107
i: -106
i: -105
i: -104
i: -103
i: -102
i: -101
i: -100
i: -99
i: -98
i: -97
i: -96
i: -95
i: -94
i: -93
i: -92
i: -91
i: -90
i: -89
i: -88
i: -87
i: -86
i: -85
i: -84
i: -83
i: -82
i: -81
i: -80
i: -79
i: -78
i: -77
i: -76
i: -75
i: -74
i: -73
i: -72
i: -71
i: -70
i: -69
i: -68
i: -67
i: -66
i: -65
i: -64
i: -63
i: -62
i: -61
i: -60
i: -59
i: -58
i: -57
i: -56
i: -55
i: -54
i: -53
i: -52
i: -51
i: -50
i: -49
i: -48
i: -47
i: -46
i: -45
i: -44
i: -43
i: -42
i: -41
i: -40
i: -39
i: -38
i: -37
i: -36
i: -35
i: -34
i: -33
i: -32
i: -31
i: -30
i: -29
i: -28
i: -27
i: -26
i: -25
i: -24
i: -23
i: -22
i: -21
i: -20
i: -19
i: -18
i: -17
i: -16
i: -15
i: -14
i: -13
i: -12
i: -11
i: -10
i: -9
i: -8
i: -7
i: -6
i: -5
i: -4
i: -3
i: -2
i: -1

Eu não entendi o porque de vc informar que rodaria apenas para 32 Bits? Pois rodou aqui em X64 no Slackware
Eu conheço esse código abaixo para imprimir a tabela ASCII, mas nunca consegui imprimir a versão extendida dessa tabela, onde contem os caracteres acentuados e etc...

#include <stdio.h>
void main () {
for (int i = 32; i <= 126; i++)
printf("%c - %d\n", i, i);
}


Eu limpei o seu código que vc mostrou em sua msg anterior e modifiquei para mostrar a Tabela ASCII pra tentar entender melhor para que ele serve e ficou assim:

#include <stdio.h>
void main () {
char var_i_127 = 1; //valores entre: 0 ... 127 && -128 ... -1 | 0
unsigned char var_i_255 = 1; //valores entre: 0 ... 255

while (var_i_127) //imprime: 1 ... 127 && -128 ... -1
printf("%c = %d\n", var_i_127, var_i_127++); //MODIFIQUEI para Mostrar a Tecla ASCII

while (var_i_255) //imprime: 1 ... 255
printf("%c = %d\n", var_i_255, var_i_255++); //MODIFIQUEI para Mostrar a Tecla ASCII
}



7. Re: Dúvida Simples sobre declaração de variáveis em C

???
gokernel

(usa Linux Mint)

Enviado em 18/05/2018 - 10:42h

Steve escreveu:

Eu não entendi o porque de vc informar que rodaria apenas para 32 Bits? Pois rodou aqui em X64 no Slackware.


Cara, eu não disse que rodaria apenas em 32 Bits ... minhas palavras foram:

Essa info é para plataforma 32 bits:
-------------------------------------------------------------------------
Variavel tipo ( char ) consome apenas 1 byte de memória.
Variavel tipo ( short ) consome 2 bytes de memória.
Variavel tipo ( int ou long ) consome 4 bytes de memória.
-------------------------------------------------------------------------


Me referi apenas para essas linhas acima. OK?

Para saber quantos bytes uma variável consome, use o "word" sizeof(ALGUMA_COISA), exemplo:



int i;

printf ("Tamanho de i: %d\n", sizeof( i ));



DICA:
Para quem está aprendendo, aconselho de sempre manter um "cabeçalho" no inicio do arquivo com informações básicas tipo o que postei no meu código acima ... isso será importante para seus estudos quando tiver muitos arquivos, vc saberá o que cada um faz.



8. Re: Dúvida Simples sobre declaração de variáveis em C [RESOLVIDO]

Steve
Steve

(usa Slackware)

Enviado em 18/05/2018 - 13:14h

gokernel escreveu: Para saber quantos bytes uma variável consome, use o "word" sizeof(ALGUMA_COISA), exemplo:

int i;
printf ("Tamanho de i: %d\n", sizeof( i ));

Obrigado pelo esclarecimento que você deu!
Obrigado também por esse exemplo que você postou! Gostei dele também! Pois já tinha visto esse sizeof em alguns exemplos e eu estava me preparando para entender o que ele fazia. E com seu exemplo agora eu SEI o que é o sizeof e como ele funciona. Isso ajudou MUITO!







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts