Ir ao conteúdo

Posts recomendados

Postado

Bom dia, queria saber como faço para preencher o espaço restante de um vetor com " - ", estou tentando assim:

Edit: Ja tentei com if(nome == NULL)...

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

int main()
{
    char nome[31] = "", sabor[21] = "", data[11] = "";
    int i;
    scanf("%s",&nome);
    for(i = 0; 1<31; i++)
    {
        if(nome[i] == "")
        {
            nome[i] = "-";
        }
    }
    scanf("%s",&sabor);

    i = 0;
    for( i = 0; i<21; i++)
    {
        if(sabor[i] == "")
        {
            sabor[i] == "-";
        }
    }
    scanf("%s",&data);

    i = 0;
    for(i=0;i<11;i++)
    {
        if(data[i] == "")
        {
            data[i] = "-";
        }
    }
    printf("%s%s%s", nome, sabor, data);
}

 

  • Curtir 1
Postado

@Bruno César Oliveira Dias     esse vetor de char , nome , é uma string ,e   nesses casos o scanf para pegar string não precisa usar o simbolo & , e as strings ali não precisam ser inicializadas pois em seguida você preencherá elas com o scanf ,  e para comparar os caracteres use aspas simples e também na string não haverá espaços vazios , o que pode ter são caracteres espaços mesmo digitado no teclado e cujo código ASCII  eh 32 ,   mas se você usar esse scanf você nunca terá uma string com espaço nela , pois o comando scanf não pega o espaço ele pega os caracteres digitados ate antes do espaço , então se você quer pegar o mome e sobrenomes  incluindo todos os espaços digitados use o comando gets ou fgets ,  mas esse ultimo não eh muito bom pois ele pega também o newline , e na hora que vai imprimir ele pula uma linha automaticamente .

Postado

Olá!

 

Em C vetores --- strings --- são declaradas como char* ou char[] e são apenas uma sequência de bytes terminadas por um byte com valor 0, que você pode escreer 0, \0, NULL, mas é só isso: um byte com valor zero.

 

Quando você usa scanf() no seu programa a rotina lê uma sequência de caracteres da entrada e coloca a partir do endereço apontado pela variável, como char nome[31] no seu caso. E acrescenta o terminador 0 no final. Então o seu vetor nome pode ter até 30 caracteres.

 

Pra você "completar" com '- ' precisa saber quanto já foi usado da área que declarou, e o tamanho da área que declarou --- 31 bytes --- e "completar" colocando os '-' e depois o 0 no final

 

Eis a saída de um programa de exemplo


Conteudo original do vetor no formato int

  0   1   2   3   4   5   6   7   8   9 Posicao
-52 -52 -52 -52 -52 -52 -52 -52 -52 -52

Depois de ler [abcde]

  0   1   2   3   4   5   6   7   8   9 Posicao
097 098 099 100 101 000 -52 -52 -52 -52

vetor em formato string:[abcde] com 5 bytes

Preenchendo com '-' ate o final...

vetor em formato string:[abcde-----------------------------------] com 40 bytes

E o programa

int    main(int argc, char** argv)
{
    //int v;
    char    vetor[41];
    char* pVetor = vetor;
    char* nome = "abcde";

    printf("\nConteudo original do vetor no formato int\n");
    printf("\n  0   1   2   3   4   5   6   7   8   9 Posicao\n");
    for (int i = 0; i < 10; i++)
    {
        printf("%03d ", (int)(vetor[i]));
    }    // end for
    printf("\n");

    printf("\nDepois de ler [%s]\n", nome);
    strcpy(vetor, nome);
    printf("\n  0   1   2   3   4   5   6   7   8   9 Posicao\n");
    for (int i = 0; i < 10; i++)
    {
        printf("%03d ", (int)(vetor[i]));
    }    // end for
    printf("\n");

    printf("\nvetor em formato string:[%s] com %d bytes\n", vetor, strlen(vetor));
    printf("\nPreenchendo com '-' ate o final...\n");
    for (int i = strlen(vetor); i < 41; i++)
    {
        vetor[i] = '-';
    }    // end for
    vetor[40] = 0;

    printf("\nvetor em formato string:[%s] com %d bytes\n", vetor, strlen(vetor));
    return 0;
}

Deve ajudar a entender. Veja lá a posição do 0 depois de ler "abcde"

 

Sobre os códigos veja a tabela ASCII em http://www.asciitable.com por exemplo. 'a' = 97 por exemplo

 

  • Curtir 3
Postado

Olá!

 

Vou postar uma maneira mais formal de preencher um vetor com uma letra até o tamanho total declarado porque muitas vezes gera dúvida e então pode ser útil...

 

imagine que você tenha uma função declarada assim

int    completar_com(char c, char* v, int t);

E os vetores de teste 

    char    vetor[10];
    char*   nome = "abcde";

Um retorno útil dessa função seria o número de caracteres inseridos, ou (-1) em caso de erro

Então se rodar

strcpy(vetor,nome);
completar_com('-', vetor, 10); 

Ela deve retornar 4 e o vetor ficar com "abcde----"

E aí se chamar de novo com a string completa deve retornar 0, já que não cabe mais nenhum.

E se rodar

vetor[0]=0;
completar_com('*', vetor, 10); 

deve retornar 9 e o vetor ficar com "*********" nove asteriscos, claro.

 

Uma possível função dessas:

int    completar_com(char c, char* v, int t)
{
    // completa o vetor v de tamanho t com o caracter c
    // retorna -1 se deu erro
    // retorna o numero de caracteres inseridos
    int i;
    if (t < 1) return -1;    // parametro errado
    if (v == NULL) return -1;
    for (i = 0; i < t; i++)
    {
        if (v[i] == 0) break;
    }    // end for
    // aqui ou i aponta para o zero ou chegou ao fim e nao achou
    if (i ==(t-1)) return 0;    // ou nao achou nenhum ou estava cheio
    for (int j = i; j < t - 1; j++) v[j] = c;    // completa
    v[t-1] = 0; // claro, tem que ter um zero no final
    return (t-i-1);    // desconta o zero no final
}    // end completar_com()

Um teste com legenda :D mostrando o que acontece no vetor:

(1) vetor com "abcde"
  0   1   2   3   4   5   6   7   8   9 Posicao
097 098 099 100 101 000 -52 -52 -52 -52
  a   b   c   d   e NUL ??? ??? ??? ???

"completar_com('-', vetor, 10)" retornou 4

no retorno da rotina
  0   1   2   3   4   5   6   7   8   9 Posicao
097 098 099 100 101 045 045 045 045 000
  a   b   c   d   e   -   -   -   - NUL

(2) depois de colocar um '0' no inicio, vetor vazio
  0   1   2   3   4   5   6   7   8   9 Posicao
000 098 099 100 101 045 045 045 045 000
NUL   b   c   d   e   -   -   -   - NUL

"completar_com('*', vetor, 10)" retornou 9

no retorno da rotina
  0   1   2   3   4   5   6   7   8   9 Posicao
042 042 042 042 042 042 042 042 042 000
  *   *   *   *   *   *   *   *   * NUL

(3) ja com o vetor preenchido com asteriscos ate o fim
  0   1   2   3   4   5   6   7   8   9 Posicao
042 042 042 042 042 042 042 042 042 000
  *   *   *   *   *   *   *   *   * NUL

"completar_com('+', vetor, 10)" retornou 0

no retorno da rotina
  0   1   2   3   4   5   6   7   8   9 Posicao
042 042 042 042 042 042 042 042 042 000
  *   *   *   *   *   *   *   *   * NUL

Eis o programa de teste --- a função bem besta 

void        mostra_vetor(char* vetor, int t, char * msg);

imprime o grid e os valores em decimal e caracter e a mensagem 

#define _CRT_SECURE_NO_WARNINGS
#include "ctype.h"
#include <stdio.h>
#include <stdlib.h>
#include "string.h"


void        mostra_vetor(char* vetor, int t, char * msg)
{
    int i;
    printf("\n%s\n", msg);
    printf("  0   1   2   3   4   5   6   7   8   9 Posicao\n");

    for (i = 0; i < t; i++)
    {
        printf("%03d ", (int)(vetor[i]));
    }    // end for
    printf("\n");

    for (i = 0; i < t; i++)
    {
        if (((int)(vetor[i])>0) && ((int)(vetor[i]) < 255))
        {
            printf("%3c ", (int)(vetor[i]));
        }
        else
        {
            if (vetor[i] == 0)
            {
                printf("NUL ");
            }
            else
            {
                printf("??? ");
            }    // endif
        }    // end if
    }    // end for
        printf("\n");

        return;
}    // end mostra_vetor()


int    completar_com(char c, char* v, int t)
{
    // completa o vetor v de tamanho t com o caracter c
    // retorna -1 se deu erro
    // retorna o numero de caracteres inseridos
    int i;
    if (t < 1) return -1;    // parametro errado
    if (v == NULL) return -1;
    for (i = 0; i < t; i++)
    {
        if (v[i] == 0) break;
    }    // end for
    // aqui ou i aponta para o zero ou chegou ao fim e nao achou
    if (i ==(t-1)) return 0;    // ou nao achou nenhum ou estava cheio
    for (int j = i; j < t - 1; j++) v[j] = c;    // completa
    v[t-1] = 0; // claro, tem que ter um zero no final
    return (t-i-1);    // desconta o zero no final
}    // end completar_com()


int    main(int argc, char** argv)
{
    char    vetor[10];
    char* nome = "abcde";
     int i;

    strcpy(vetor, nome);    // completa a partir de "abcde"

    mostra_vetor(vetor, 10, "(1) vetor com \"abcde\"");
    i = completar_com('-', vetor, 10);
    printf("\n\"completar_com('-', vetor, 10)\" retornou %d\n", i);
    mostra_vetor(vetor, 10, "no retorno da rotina");

    vetor[0] = 0;            // completa a partir do vetor vazio

    mostra_vetor(vetor, 10, "(2) depois de colocar um '0' no inicio, vetor vazio");
    i = completar_com('*', vetor, 10);
    printf("\n\"completar_com('*', vetor, 10)\" retornou %d\n", i);
    mostra_vetor(vetor, 10, "no retorno da rotina");

    // agora testa com a string completa
    mostra_vetor(vetor, 10, "(3) ja com o vetor preenchido com asteriscos ate o fim");
    i = completar_com('+', vetor, 10);
    printf("\n\"completar_com('+', vetor, 10)\" retornou %d\n", i);
    mostra_vetor(vetor, 10, "no retorno da rotina");

    return 0;
}

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!