Ir ao conteúdo
  • Cadastre-se

C Como escrever um caractere até certo ponto de uma string em C?


Posts recomendados

Olá. Eu estou estudando C e estou precisando fazer algo do tipo:

#include <stdio.h>
void main()
{
char str[100];
str [1] [50]='|';//estou interessado que isso colocaria o caracter "|" do ponto 1 até o ponto 50 da string 
printf("%s\n", str);
}

Mas esse código não funciona. O que seria equivalente a esse (str [1] [50]='|';)  ?|

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Que tal

unsigned char p=50;
void main()
{
char str[100]="abc---------------------------------------------------------xyz";
str [55]='|'; //teste
printf("%s\n", str);
//memset(&str[1], '|', 50);
while((--p>0)) str [p]='|';
//while((p-->0)) str [p]='|';

printf("%s\n", str);
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Aquiles Augusto disse:

char str[100];
str [1] [50]='|';//estou interessado que isso colocaria o caracter "|" do ponto 1 até o ponto 50 da string
printf("%s\n", str);

 

Está errado.

 

Um vetor é só um endereço. E cada elemento é acessado pelo deslocamento, o índice, a distância do início.

 

Como apontado,  o que quer fazer é o que faz memset()

 

 

    memset( str+1, '|', 50);

 

Sobre esse trecho @.if

 

1 hora atrás, .if disse:

while((--p>0)) str [p]='|';

unsigned char p=50;
void main()
{
char str[100]="abc---------------------------------------------------------xyz";
str [55]='|'; //teste
printf("%s\n", str);
//memset(&str[1], '|', 50);
while((--p>0)) str [p]='|';
//while((p-->0)) str [p]='|';

printf("%s\n", str);
}
  • Nunca use variáveis globais. É proibido em toda parte, empresas e escolas. E é um desastre de manutenção. Nem todos programas vão ter 10 linhas e é bem  importante manter um padrão.
  • para p = 50 não faz diferença declarar unsigned char num programa para iniciantes. um char vai de -128 a 127.
  • main() retorna um int. Sempre. Declare como tal. E se não usar os parâmetros declare void.
  • use memset() sempre que possível.
  • while para um loop que tem condição definida de início e fim e um contador é a expressão natural do comando for. É mais legível e permite declara a variável DENTRO do loop, o que é importante também.
  • Do modo como escreveu vai operar em 49 símbolos. Aparentemente o autor queria de fato escrever 50 '|' da posição 1 até a posição 50, inclusive. Está um pouco ambíguo o post do autor, claro. Mas o fato é que você opera com o valor de p antes de copiar então nunca vai usar 50 posições. Use p=51 se vai programar assim.

 

1 hora atrás, .if disse:

Detalhe curioso é que é possível sentir a diferença entre p-- e --p

 

Não sei o que quer dizer com "possível sentir a diferença"  mas entenda que esses operadores são diferentes. Quando você escreve 
 

    --p>0

o valor de p é decrementado antes de comparar. E o primeiro '|' vai para a posição 49. De modo análogo quando usa
 

    p-->0


o valor de p é decrementado depois, e o primeiro '|' vai para a posição 50. E assim os resultados vão claro diferir em uma posição

 

Evite esse tipo de construção. Porque? Veja:

 

1 hora atrás, .if disse:

while((--p>0)) str [p]='|';

   

Ao escrever assim com p = 1 vai comparar 0 com 0 e não vai alterar str[0]. mas se escrever 

 

1 hora atrás, .if disse:

while((p-->0)) str [p]='|';

 

para p = 1 vai comparar 1 com 0 e vai alterar str[0]

 

Veja esse programa
 

#include <stdio.h>
int main(void)
{
    char p = 50;
    printf("p = %d\n", p);
    printf("--p = %d\n", --p);
    p = 50;
    printf("p-- = %d\n", p--);
    printf("p ao final %d\n", p);
    return 0;
}

 

que mostra
 

p = 50
--p = 49
p-- = 50
p ao final 49

 

e vai entender

 

Prefira algo assim

 

#include <stdio.h>
int main(void)
{
    char regua[100] = "01234567890123456789";
    char str[100] = "abc--------------fim";
    printf("%s\n%s\n", regua, str);
    str[19] = '|'; //teste
    printf("\npoe | na ultima posicao\n");
    printf("%s\n%s\n", regua, str);
    printf("\npoe 12 | nas posições 1 a 12 inclusive\n");
  
    for ( int idx = 1; idx <= 12; idx+=1)
        str[idx]='|';
  
    printf("%s\n%s\n", regua, str);
    return 0;
}

 

Que mostra um gabarito e o vetor antes e depois:

 

01234567890123456789
abc--------------fim

poe | na ultima posicao
01234567890123456789
abc--------------fi|

poe 12 | nas posições 1 a 12 inclusive
01234567890123456789
a||||||||||||----fi|

 

Esse loop seria o trivial sem usar memset():
 

  for ( int idx = 1; idx <= 50; idx+=1) str[idx]='|';

 

Que diz claramente o que vai acontecer, e a variável só existe aí dentro do loop

  • Curtir 2
  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
2 horas atrás, arfneto disse:

o que quer dizer com "possível sentir a diferença"

É o resultado que dá no https://www.programiz.com/c-programming/online-compiler/

um deles dá o mesmo que o tal memset.

2 horas atrás, arfneto disse:

Nunca use variáveis globais. É proibido em toda parte, empresas e escolas. E é um desastre de manutenção. Nem todos programas vão ter 10 linhas e é bem  importante manter um padrão.

Meu mundo é micro... mesmo. Uma variável global me (me) é útil quase que à nível de hardware. P.ex. uma interrupção altera seu valor ... algo como ela tem vida própria... e sendo global me é mais fácil compartilhar. Mas nada impede de eu dar uma revisada e procurar alternativas. Não comento à altos níveis.

 

Eu particularmente prefiro fazer na unha pois pode ter virus dentro do memset() 😁... brinc... claro. São só heranças tolas. O fato é que rotinas advindas de libs prontas no meu (meu) micromundo usam comer muito escasso recurso do sistema. P.ex. um simples printf() pode comer mais da metade da memória do meu mc. Por isso sempre que possível.. mãos à obra.

De toda a forma como sempre dicas nota 10! Quando eu crescer quer ser igual a você! kk

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Aquiles Augusto          creio que esses primeiros colchetes sejam desnecessario ,  pois ali será apenas uma string mesmo , com eles ou sem eles ,  no entanto se voce quer fazer desse modo ,  entao use o memset como disse  @Midori    ,   e voce precisa de uma posicao a mais nessa string para adicionar o fim de string que eh o      '\0'  ,  senao ela nao poderah ser escrita .

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, .if disse:

e sendo global me é mais fácil compartilhar

 

Seria o caso de dizer que é inevitável compartilhar. E esse é o problema. Nem todos os programas tem 10 linhas e ao compartilhar uma variável ela pode ser alterada em QUALQUER ponto do programa. E quando alguém altera sem querer ou sem saber um programa não tem como controlar isso. 

 

Por essa razão há um esforço enorme em diminuir o escope --- scope --- de toda e qualquer variável. Em C++ ou java por exemplo qualquer bloco de { } cria um novo escopo e tudo declarado ali dentro é local.

 

Em C++ você pode declarar variáveis dentro de um switch() ou mesmo de um if. Em C apenas dentro de um for. E deve mesmo fazer isso...

 

Em assembler ou C em micro controladores se pode conseguir o mesmo efeito usando blocos de código separados e deixando o LINK resolver, algo com o extern em C.

 

1 hora atrás, .if disse:

É o resultado que dá no https://www.programiz.com/c-programming/online-compiler/

um deles dá o mesmo que o tal memset.

 

Entendeu a razão depois de ler o que eu expliquei acima sobre esses operadores?

7 horas atrás, Aquiles Augusto disse:

str [1] [50]='|';//estou interessado que isso colocaria o caracter "|" do ponto 1 até o ponto 50 da string

 

47 minutos atrás, devair1010 disse:

creio que esses primeiros colchetes sejam desnecessario ,  pois ali será apenas uma string mesmo , com eles ou sem eles ,  no entanto se voce quer fazer desse modo

 

Se fala dos colchetes como acima está só errado mesmo. A ideia do autor era uma notação para alterar da posição 1 até a posição 50 com esse símbolo '|\ . Acho que foi só uma tentativa mesmo :) 
 

49 minutos atrás, devair1010 disse:

e voce precisa de uma posicao a mais nessa string para adicionar o fim de string que eh o      '\0'  ,  senao ela nao poderah ser escrita .

 

Essa parte não entendi: str é char[100]; tem espaço suficiente.

 

7 horas atrás, Aquiles Augusto disse:

char str[100];


O que falta mesmo é inicializar a string, ou colocar na posicao 51.

 

    char str[100] = 0;
// ou
    str[51] = 0;

 

:) 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
13 horas atrás, arfneto disse:

Seria o caso de dizer que é inevitável compartilhar. E esse é o problema. Nem todos os programas tem 10 linhas e ao compartilhar uma variável ela pode ser alterada em QUALQUER ponto do programa. E quando alguém altera sem querer ou sem saber um programa não tem como controlar isso

No meu caso o "problema" é solução 😁 e sim inevitável. Mas como sou exército de uma pessoa só, então .. tudo sob controle. Talvez numa situação que não faz parte de meu escopo é quando tem uma grande equipe a trabalhar num projeto em c. Entrosamento de fato é necessário.

 

13 horas atrás, arfneto disse:

Em C++ você pode declarar variáveis dentro de um switch() ou mesmo de um if. Em C apenas dentro de um for. E deve mesmo fazer isso...

Bacana! Vou refletir!.

 

13 horas atrás, arfneto disse:

Em assembler ou C em micro controladores se pode conseguir o mesmo efeito usando blocos de código separados e deixando o LINK resolver, algo com o extern em C

Já fiz isso pra conversar do c com o asm mas apenas quando foi "inevitável". Atualmente prefiro deixar tudo num textão só. Preferência pessoal claro. Editor de texto dedicado a linguagem facilitam a vida e até deixa o visual simpático. P.ex. o notepad++

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!