Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais...

Post on 03-Aug-2020

3 views 0 download

Transcript of Computadores Digitais 2 - UERJrodrigo/docs/compDig2/aula7.pdf · Computadores Digitais...

Linguagens de Programação – DEL-Poli/UFRJ Prof. Miguel Campista

Computadores Digitais 2

Prof. Rodrigo de Souza Couto

Aula de Hoje

• Cadeias de caracteres (strings)– Caracteres

– Definição e manipulação de strings

– Vetor de strings

– Parâmetros da função main

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

ATENÇÃO

• Esta apresentação foi baseada nos seguinte trabalhos:– Notas de aula do Prof. Marco Casanova da PUC-Rio

• http://www.inf.puc-rio.br/~inf1620/material.html

– Waldemar Celes, Renato Cerqueira, José Lucas Rangel, “Introdução a Estruturas de Dados”, Editora Campus, 2004

– Herbert Schildt, “C Completo e Total”, Makron Books, 3ª edição, 1997

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Parte 1

Programação (linguagem C)

Cadeias de Caracteres (Strings)

Caracteres

• Um texto é representado por uma sequência (ou cadeia) de caracteres

• Tipo char– Caracteres são representados internamente na memória

do computador por códigos numéricos

– 1 byte -> 256 valores distintos

– Tabela de códigos define a correspondência entre caracteres e códigos numéricos

• Ex: Tabela ASCII

– Caractere ‘a’ -> Código 97

– Caractere ‘A’ -> Código 65

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

• Tabela ASCII para alguns caracteres– Normal (32 a 127), Caracteres de Controle (0 a 31) e

Estendida (128 a 255)

0 1 2 3 4 5 6 7 8 9

30 us rs sp ! ’’ # $ % & ‘

40 ( ) * + , - . / 0 1

50 2 3 4 5 6 7 8 9 : ;

60 < = > ? @ A B C D E

70 F G H I J K L M N O

80 P Q R S T U V W X Y

90 Z [ \ ] ^ _ ` a b c

100 d e f g h i j k l m

110 n o p q r s t u v w

120 x y z { | } ~ del Ç ü

130 é â ä à å ç ê ë è ï

Exemplo

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char a=85,b=69,c=82,d=74;

...

printf(“%c%c%c%c \n”,a,b,c,d);

printf(“%d%d%d%d \n”,a,b,c,d);

...

• Primeiro printf imprime “UERJ”

• Segundo printf imprime “85698274”

Imprime cada variável no

formato do tipo int

Imprime cada variável no

formato do tipo char

Caracteres

• Constante de caractere– Caractere envolvido com aspas simples

– Evita a utilização de número para identificar caracteres• Não é necessário consultar a tabela ASCII

– Reescrevendo o exemplo anterior• Primeiro printf imprime “UERJ”

• Segundo printf imprime “85698274”

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char a=‘U’,b=‘E’,c=‘R’,d=‘J’;

...

printf(“%c%c%c%c \n”,a,b,c,d);

printf(“%d%d%d%d \n”,a,b,c,d);

...

Exercício• Crie uma função que retorne 1 se o caractere for um

dígito (um dos caracteres entre 0 e 9), e 0 em caso contrário

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int digito(char c);

Exercício• Crie uma função que retorne 1 se o caractere for um

dígito (um dos caracteres entre 0 e 9), e 0 em caso contrário

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int digito(char c){

if ((c>=‘0’) && (c<=‘9’))

return 1;

else

return 0;

}

int digito(char c){

if ((c>=48) && (c<=57))

return 1;

else

return 0;

}

0 1 2 3 4 5 6 7 8 9

40 ( ) * + , - . / 0 1

50 2 3 4 5 6 7 8 9 : ;

Tiramos proveito da codificação sequencial da tabela ASCII

Exercício

• Crie uma função que receba uma letra e retorne seu corresponde maiúsculo– Caractere retornado é o mesmo do recebido se esse não

for letra ou já for maiúsculo

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char maiuscula(char c);

Exercício

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char maiuscula(char c){

if ((c>=‘a’) && (c<=‘z’))

c = c – ‘a’ + ‘A’;

return c;

} Deslocamento do caractere c em

relação à letra ‘a’

0 1 2 3 4 5 6 7 8 9

60 A B C D E

70 F G H I J K L M N O

80 P Q R S T U V W X Y

90 Z a b c

100 d e f g h i j k l m

110 n o p q r s t u v w

120 x y z

Ex. com letra ‘e’:

‘E’ = ‘e’ – ‘a’ + ‘A’

69 = 101 – 97 + 65

Cadeias de Caracteres (strings)

• Conjunto de caracteres– Representação de palavras, mensagens, textos, etc.

• Não possuem um tipo específico em c

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Então, como podemos representá-las?

Cadeias de Caracteres (strings)

• Conjunto de caracteres– Representação de palavras, mensagens, textos, etc.

• Não possuem um tipo específico em c– Representadas por um vetor de elementos do tipo char

• Vetor terminado pelo caractere nulo (‘\0’)

• Tamanho alocado para o vetor é o número de caracteres mais o um elemento para o caractere ‘\0’

• Funções de manipulação de strings– Recebem como parâmetro vetor de char

– Processam caractere por caractere até encontrarem o valor ‘\0’

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Exemplos

• Atribuição de cada elemento char

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int main(void) {

char cidade[4];

cidade[0] = ‘R’;

cidade[1] = ‘i’;

cidade[2] = ‘o’;

cidade[3] = ‘\0’;

printf(“%s \n”,cidade);

return 0;

}

Declaração de vetor de char

Essencial para caracterizar o vetor

como uma string

printf com identificador de

formato para strings

Exemplos

• Código Equivalente: Cadeia de caracteres

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int main(void) {

char cidade[] = {‘R’,‘i’,‘o’,‘\0’};

printf(“%s \n”,cidade);

return 0;

} Como em qualquer vetor, não é

necessário especificar a dimensão

se todos seu elementos são

inicializados

Exemplos

• Código Equivalente: Cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int main(void) {

char cidade[] = “Rio”;

printf(“%s \n”,cidade);

return 0;

}

Exemplos

• Código Equivalente: Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int main(void) {

char cidade[4];

cidade = “Rio”;

printf(“%s \n”,cidade);

return 0;

}

Constante de cadeia de

caracteres não pode ser

atribuída a um vetor dessa

forma!!!!!

Exemplos

• Alguns exemplos de declarações– Conteúdo delimitado por aspas duplas (“”)

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char s1[] = “”;

char s2[] = “Rio de Janeiro”;

char s3[81];

char s4[81] = “Rio”;

string vazia, com apenas um

elemento (caractere ‘\0’)

Vetor com 15

elementos

Permite strings com até 80 caracteres

Apenas os 4 primeiros elementos foram

inicializados

Strings

• Leitura de caracteres e strings– Através de scanf

– Especificadores de formato definem o comportamento da scanf

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Strings

• scanf com especificador de formato %c– Lê o valor de um único caractere fornecido via teclado

– Diferente dos especificadores %d e %f, a função não ignora caracteres em branco (espaço, tabulação, nova linha)

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char a;

...

scanf(“%c”,&a);

...

Strings

• scanf com especificador de formato %c– Lê o valor de um único caractere fornecido via teclado

– Diferente dos especificadores %d e %f, a função não ignora caracteres em branco (espaço, tabulação, nova linha)

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char a;

...

scanf(“ %c”,&a);

...

Se inserirmos um espaço

em branco, a função

ignora os caracteres em

branco que antecedem a

entrada do caractere

Strings

• scanf com especificador de formato %s– Captura strings

– Uso muito limitado• Lê somente uma sequência de caracteres não brancos

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %s”,cidade);

...

Se o usuário digitasse

“Rio de Janeiro”, apenas a

string “Rio” seria

armazenada no vetor

Strings

• scanf com especificador de formato %s– Captura strings

– Uso muito limitado• Lê somente uma sequência de caracteres não brancos

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %s”,cidade);

...Repare que não é

necessário utilizar o especificador &, já que

cidade é um vetor,

possuindo um valor de

endereço

Strings

• scanf com especificador de formato %[...]– Solução mais adequada para leitura de strings

– Listagem entre colchetes de todos os caracteres que aceitaremos na leitura

• %[aeiou] -> lê sequência de vogais

– Leitura prossegue até se encontra um caractere que não seja vogal

• %[^aeiou] -> inverso do anterior

– Permite capturar nomes compostos

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %[^\n]”,cidade);

...

Strings

• scanf com especificador de formato %[...]– Solução mais adequada para leitura de strings

– Listagem entre colchetes de todos os caracteres que aceitaremos na leitura

• %[aeiou] -> lê sequência de vogais

– Leitura prossegue até que se encontra um caractere que não seja vogal

• %[^aeiou] -> inverso do anterior

• Permite capturar nomes compostos

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %[^\n]”,cidade);

...

Procede a leitura até

receber um Enter de

entrada

Strings

• scanf com especificador de formato %[...]– Solução mais adequada para leitura de strings

– Listagem entre colchetes de todos os caracteres que aceitaremos na leitura

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %[^\n]”,cidade);

...

Qual é o perigo dessa

utilização??

Strings

• scanf com especificador de formato %[...]– Solução mais adequada para leitura de strings

– Listagem entre colchetes de todos os caracteres que aceitaremos na leitura

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %[^\n]”,cidade);

...

Se o usuário digitar mais

de 80 caracteres, um

espaço de memória não

reservado será invadido!

Strings

• scanf com especificador de formato %[...]– Solução mais adequada para leitura de strings

– Listagem entre colchetes de todos os caracteres que aceitaremos na leitura

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[81];

...

scanf(“ %80[^\n]”,cidade);

...

Para resolver esse

problema, é necessário

especificar o número

máximo de caracteres que

serão capturados

Strings

• Manipulação de strings– Função que retorna o comprimento de uma string

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int comprimento(char* s) {

int i;

int n = 0; /*contador*/

for (i=0; s[i] != ‘\0’; i++)

n++;

return n;

}

Laço percorre caractere

por caractere até o final da

string

Strings

• Utilização da função de comprimento

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int comprimento(char* s) {

int i;

int n = 0; /*contador*/

for (i=0; s[i] != ‘\0’; i++)

n++;

return n;

}

int main(void){

int tam;

char cidade[] = “Rio de Janeiro”;

tam = comprimento(cidade);

printf(“A string \”%s\” tem %d caracteres”,cidade,tam);

return 0;

}

Strings

• Manipulação de strings (exercício)– Faça uma função que concatene (junte) duas strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

void concatena(char* dest, char* orig);

Supomos que o vetor dest tem espaço

suficiente para receber o vetor orig

dest vai receber

concatenação de dest

com orig

Strings• Manipulação de strings (exercício)

– Faça uma função que concatene (junte) duas strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

void concatena(char* dest, char* orig) {

int i = 0;

int j;

i = 0;

while ( dest[i] != ‘\0’ )

i++;

for (j=0; orig[j] != ‘\0’; j++){

dest[i] = orig[j];

i++;

}

dest[i] = ‘\0’;

}

Como dest pode já ter

algum caractere, esse

trecho verifica qual é o

próximo índice disponível

(concatenação irá

sobrescrever o ‘\0’ original)

Strings• Manipulação de strings (exercício)

– Faça uma função que concatene (junte) duas strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

void concatena(char* dest, char* orig) {

int i = 0;

int j;

i = 0;

while ( dest[i] != ‘\0’ )

i++;

for (j=0; orig[j] != ‘\0’; j++){

dest[i] = orig[j];

i++;

}

dest[i] = ‘\0’;

}

Copia os elementos a partir do elemento i

Strings• Manipulação de strings (exercício)

– Faça uma função que concatene (junte) duas strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

void concatena(char* dest, char* orig) {

int i = 0;

int j;

i = 0;

while ( dest[i] != ‘\0’ )

i++;

for (j=0; orig[j] != ‘\0’; j++){

dest[i] = orig[j];

i++;

}

dest[i] = ‘\0’;

}

Finaliza a string

Strings• Manipulação de strings

– Comparação de duas strings• String s1 é maior que s2 quando

– O primeiro caractere no qual s1 difere de s2 possuir código ASCII maior em s1

» Ex: s1 = “abcde” e s2= “abcDe”

– s2 possuir ‘n’ caracteres e os ‘n’ primeiro caracteres de s1 são idênticos aos de s2, mas s1 possui mais que ‘n’ caracteres

» Ex: s1 = “abcdef” e s2= “abcd”

• Retorna 1 se s1 > s2

• Retorna -1 se s1 < s2

• Retorna 0 se forem iguais

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int compara(char* s1, char* s2) ;

Stringsint compara(char* s1, char* s2) {

int i;

for (i=0; s1[i]!= ‘\0’ && s2[i]!= ‘\0’; i++){

if ( s1[i] < s2[i])

return -1;

else if ( s1[i] > s2[i])

return 1;

}

if ( s1[i]==s2[i])

return 0;

else if ( s2[i] != ‘\0’)

return -1;

else

return 1;

}

Compara caractere por

caractere até o término de uma das strings

São iguais pois as duas terminaram no for anterior

s2 ainda não terminou, sendo assim maior que s1

s1 ainda não terminou, sendo assim maior que s2

Biblioteca Padrão do C• Funções de manipulação de string

– #include <string.h>

– Algumas funções• size_t strlen(const char *str)

– Comportamento análogo ao da função ‘comprimento’

• char *strcpy(char *dest, const char *src)

– Comportamento análogo ao da função ‘copia’

– Retorna o endereço da string de destino

• char *strcat(char *dest, const char *src)

– Comportamento análogo ao da função ‘concatena’

– Retorna o endereço da string de destino

• int strcmp(const char *str1, const char *str2)

– Comportamento análogo ao da função ‘compara’

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Strings

• Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

• Com exceção da inicialização de strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[] = “Rio”;

int main(void) {

char cidade[4];

strcpy(cidade,“Rio”);

printf(“%s \n”,cidade);

return 0;

}

“Rio” é um ponteiro para

posição de memória que

possui a sequência de caracteres ‘R’, ‘i’, ‘o’, ‘\0’

Strings

• Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

• Com exceção da inicialização de strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[] = “Rio”;

int main(void) {

char *cidade;

cidade = “Rio”;

printf(“%s \n”,cidade);

return 0;

}

Também é possível copiar

a string dessa forma. Isso

é possível pois a string

“Rio” é um espaço alocado

em memória

Strings

• Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

• Com exceção da inicialização de strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[] = “Rio”;

int main(void) {

char *cidade;

cidade = “Rio”;

printf(“%s \n”,cidade);

return 0;

}

Como “Rio” é uma

constante, não é possível

modificar o conteúdo dos elementos de cidade.

Exemplo:

Não é possível fazer cidade[1] = ‘a’ ;

Strings

• Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

• Com exceção da inicialização de strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[] = “Rio”;

int main(void) {

char *cidade = “Rio”;

printf(“%s \n”,cidade);

return 0;

}

Mesmo caso para

inicialização de um

ponteiro para char com a

constante de string. Não é

possível modificar seu conteúdo!

Strings

• Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

• Com exceção da inicialização de strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[] = “Rio”;

int main(void) {

char cidade[4];

cidade = “Rio”;

printf(“%s \n”,cidade);

return 0;

}

Relembrando: Se a

variável for inicializada

como vetor, isso não é

permitido!

Strings

• Constante de cadeia de caracteres– Conteúdo delimitado por aspas duplas (“”)

• Com exceção da inicialização de strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

char cidade[] = “Rio”;

int main(void) {

char cidade[4] = “Rio”;

cidade[1] = ‘t’;

printf(“%s \n”,cidade);

return 0;

}

Entretanto, vetores

inicializados com uma

string podem ser

modificados!

Strings

• Cuidado!!!

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

int main(void) {

char cidade[4] = “Rio”;

cidade[1] = “t”;

printf(“%s \n”,cidade);

return 0;

}

Aspas duplas representam

strings. Nesse exemplo “t”

equivale a um vetor

constante com os

elementos “t” e “\0”. Assim,

a atribuição está errada

pois cidade[1] é um char

Strings• Como em qualquer tipo é possível alocar

dinamicamente vetores de caracteres– O Código abaixo copia a string “Rio” para outra posição

e modifica seu conteúdoint main(void) {

char *cop;

int n;

n = strlen(“Rio”);

cop = (char*) malloc((n+1)*sizeof(char));

strcpy(cop,“Rio”);

cop[1] = ‘t’;

printf(“%s \n”,cop);

return 0;

}

Resultado de strlen não

considera ‘\0’

Podemos modificar o vetor cop, já que ele recebe

apenas uma cópia do valor constante “Rio”

Vetor de Strings

• Exemplo para armazenar os nomes dos alunos de uma turma– 50 possíveis alunos

– Nome do aluno com até 80 caracteres

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

#define MAX_ALUNOS 50

#define MAX_NOME 80

char alunos[MAX_ALUNOS][MAX_NOME + 1];

Vetor de Strings

• Função para imprimir os nomes dos alunos

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

void imprime(int n, char alunos[][MAX_NOME +1]) {

int i;

for (i=0; i<n ; i++){

printf(“%s \n”,alunos[i]);

}

}

Vetor de Strings

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

#define MAX_ALUNOS 50

#define MAX_NOME 80

char alunos[MAX_ALUNOS][MAX_NOME + 1];

Temos um desperdício de memória muito grande nessa

utilização!

Raramente alunos tem nomes com 80 caracteres. Mas

precisamos garantir que o programa funcionará mesmo nesses

casos.

Como fazer uma forma mais eficiente?

Em cada registro de nome devemos alocar apenas a

quantidade de memória necessária para ele!!

Vetor de Strings

• Utilização de um vetor com 81 elementos para receber o nome

• Alocação dinâmica de cada linha a partir do comprimento do nome

Computadores Digitais II– DETEL-FEN/UERJ Prof. Rodrigo de Souza Couto

Apenas uma string com tamanho máximo permitido e demais

strings com o tamanho necessário!!

#include <stdio.h>

#include <stlib.h>

#include <string.h>

#define MAX_ALUNOS 50

#define MAX_NOME 80

int main(void) {

char aluno[MAX_NOME + 1] ;

char *listAlunos[MAX_ALUNOS];

int i;

int n;

int num;

do{

printf(“Digite o numero de Alunos \n”);

scanf(“%d \n”,&n);

}while (n > MAX_ALUNOS);

for (i=0; i<n; i++){

printf(“Digite o nome do aluno %d \n”,i);

scanf(“ %MAX_NOME[^\n]”,aluno);

num = strlen(aluno);

listAlunos[i] = (char*) malloc((num+1)*sizeof(char));

strcpy(listAlunos[i],aluno);

}

....

}

Variável que recebe o

nome a ser alocado no vetor

Vetor de ponteiros para

char. Armazena cada registro dos alunos

#include <stdio.h>

#include <stlib.h>

#include <string.h>

#define MAX_ALUNOS 50

#define MAX_NOME 80

int main(void) {

char aluno[MAX_NOME + 1] ;

char *listAlunos[MAX_ALUNOS];

int i;

int n;

int num;

do{

printf(“Digite o numero de Alunos \n”);

scanf(“%d \n”,&n);

}while (n > MAX_ALUNOS);

for (i=0; i<n; i++){

printf(“Digite o nome do aluno %d \n”,i);

scanf(“ %MAX_NOME[^\n]”,aluno);

num = strlen(aluno);

listAlunos[i] = (char*) malloc((num+1)*sizeof(char));

strcpy(listAlunos[i],aluno);

}

....

}

Lê nome

#include <stdio.h>

#include <stlib.h>

#include <string.h>

#define MAX_ALUNOS 50

#define MAX_NOME 80

int main(void) {

char aluno[MAX_NOME + 1] ;

char *listAlunos[MAX_ALUNOS];

int i;

int n;

int num;

do{

printf(“Digite o numero de Alunos \n”);

scanf(“%d \n”,&n);

}while (n > MAX_ALUNOS);

for (i=0; i<n; i++){

printf(“Digite o nome do aluno %d \n”,i);

scanf(“ %MAX_NOME[^\n]”,aluno);

num = strlen(aluno);

listAlunos[i] = (char*) malloc((num+1)*sizeof(char));

strcpy(listAlunos[i],aluno);

}

....

}

Verifica o tamanho

#include <stdio.h>

#include <stlib.h>

#include <string.h>

#define MAX_ALUNOS 50

#define MAX_NOME 80

int main(void) {

char aluno[MAX_NOME + 1] ;

char *listAlunos[MAX_ALUNOS];

int i;

int n;

int num;

do{

printf(“Digite o numero de Alunos \n”);

scanf(“%d \n”,&n);

}while (n > MAX_ALUNOS);

for (i=0; i<n; i++){

printf(“Digite o nome do aluno %d \n”,i);

scanf(“ %MAX_NOME[^\n]”,aluno);

num = strlen(aluno);

listAlunos[i] = (char*) malloc((num+1)*sizeof(char));

strcpy(listAlunos[i],aluno);

}

....

}

Aloca o vetor com o

número mínimo suficiente de caracteres

#include <stdio.h>

#include <stlib.h>

#include <string.h>

#define MAX_ALUNOS 50

#define MAX_NOME 80

int main(void) {

char aluno[MAX_NOME + 1] ;

char *listAlunos[MAX_ALUNOS];

int i;

int n;

int num;

do{

printf(“Digite o numero de Alunos \n”);

scanf(“%d \n”,&n);

}while (n > MAX_ALUNOS);

for (i=0; i<n; i++){

printf(“Digite o nome do aluno %d \n”,i);

scanf(“ % MAX_NOME[^\n]”,aluno);

num = strlen(aluno);

listAlunos[i] = (char*) malloc((num+1)*sizeof(char));

strcpy(listAlunos[i],aluno);

}

....

}

Copia o nome para o vetor