Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

thinkabout

Meter uma palavra numa determinada posição numa string.

Mensagens Recomendadas

thinkabout

A construção da string já consegui , só me falta por o espaço...

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h> // strlen
#define Dim 200
/*
a)  Desenvolva uma função que insira uma palavra no meio de uma frase. A frase é um
conjunto de palavras separadas por um ou mais espaços A função deve receber por
argumento uma frase, uma palavra e um valor inteiro positivo.
Este valor indica qual é a posição da tabela frase a partir da qual a nova palavra deve ser inserida.
Exemplo:
Se função for chamada com o valor 16 e duas tabelas (frase e palavra) com
o conteúdo:
"A Pizzaria Pepe serve pizzas muito quentes." e
"Verde",
Na primeira tabela (frase) deve ficar guardada a seguinte informação:
"A Pizzaria Pepe Verde serve pizzas muito quentes."
b)  Teste a função anterior. Tanto a frase como a palavra deverão estar armazenadas em
tabelas de caracteres locais ao main() com a seguinte declaração:
#define TAM_FRASE 150
#define TAM_PALAVRA 20
...
void main (void
{
char frase[TAM_FRASE], palavra[TAM_PALAVRA];
...
}
A frase armazenada é um conjunto de palavras separadas por um ou mais espaços.
Considere que, quando a função a desenvolver for chamada, as duas estruturas já devem
estar inicializadas (respectivamente com uma frase e uma palavra, terminadas com ‘\0’).
*/

void Nova_Frase(char Frase[], char InserePalvavra[],int posicao)
{
int i,j;
char aux[Dim];
for (i=0 ; i<strlen(Frase) ; i++)
aux[i]=Frase[i];
for (i = posicao , j=0 ; j <= strlen(InserePalvavra); i++,j++)
aux[i]=InserePalvavra[j]; // Ele não me mete um espaço após escrever a palavra ...
for (i=posicao+strlen(InserePalvavra); i < strlen(Frase)+strlen(InserePalvavra)+1; i++, posicao++)
aux[i]=Frase[posicao];
puts(aux);
}

void main()
{
char Frase[Dim], InserePalvavra[Dim];
int posicao;
puts("Introduza uma Frase");
gets(Frase);
puts("Introduza uma Palavra");
gets(InserePalvavra);
puts("Introduz o numero da posicao");
scanf("%d",&posicao);
Nova_Frase(Frase,InserePalvavra,posicao);
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

tens de começar a usar as funcionalidades que tens disponíveis:

char * NoveFrase(char * destino, char * frase, char * palavra, int pos)
{
 // validação de entradas
 if (destino == NULL ||
     frase == NULL ||
     palavra == NULL ||
     pos >= strlen(frase))
 {
   return NULL; // retornar NULL sinalizando erro
 }

 // gravar o início da frase
 if (pos > 0)
 {
   memcpy(destino,
          frase,
          pos);
 }

 // gravar a palavra no local correcto
 memcpy(&destino[pos],
        palavra,
        strlen(palavra));

 // gravar o fim da frase
 if (pos < strlen(frase) - 1)
 {
   memcpy(&destino[pos + strlen(frase)],
          &frase[pos],
          strlen(frase) - pos);
 }

 return destino;
}

int main()
{
 char frase = "xpto";
 char palavra = " XYZ ";
 char destino[256];

 destino = NoveFrase(destino, frase, palavra, 2);

 printf("Frase     : %s\n", frase);
 printf("Palavra   : %s\n", palavra);
 printf("Resultado : %s\n", resultado);

 return 0;
}

ps : não testado mas parece que está bem


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

podes trocar o memcpy com :

// nota que não deverás usar este nome para a função !!!
// é só para perceberes que o resultado da função é o mesmo que o memcpy
void * memcpy(void * destino, void * origem, size_t quantity)
{
 int i;

 if (destino == NULL || origem == NULL)
 {
   return NULL;
 }

 for (i = 0; i < quantity; i++)
 {
   destino[i] = origem[i];
 }

 return destino;
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Desculpa mas ainda estou no nível de noob, NULL e * ainda não peguei nisso.

Penso que os * são ponteiros, algo que vou ver no segundo semestre.

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Já arranjei uma solução meia chanata a meu ver mas funciona.

for (i = posicao+1 , j=0 ; j <= strlen(InserePalvavra); i++,j++)
 aux[i]=InserePalvavra[j];
for (i=posicao+1+strlen(InserePalvavra); i < strlen(Frase)+strlen(InserePalvavra)+2; i++, posicao++)
 aux[i]=Frase[posicao];
puts(aux);

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Já com o ponto B, se é que o entendi.



#define TAM_FRASE 150
#define TAM_PALAVRA 20

void Nova_Frase(char Frase[], char InserePalvavra[],int posicao)
{
int i,j;
char aux[Dim];
for (i=0 ; i<strlen(Frase) ; i++)
 aux[i]=Frase[i];
for (i = posicao+1 , j=0 ; j <= strlen(InserePalvavra); i++,j++)
 aux[i]=InserePalvavra[j];
for (i=posicao+1+strlen(InserePalvavra); i < strlen(Frase)+strlen(InserePalvavra)+2; i++, posicao++)
 aux[i]=Frase[posicao];
puts(aux);

}

void main()
{
int posicao=15;
char Frase[TAM_FRASE] = "A Pizzaria Pepe serve pizzas muito quentes." , InserePalvavra[TAM_PALAVRA] = "Verde" ;
Nova_Frase(Frase,InserePalvavra,posicao);
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Repara que no exemplo apresentado (introduzir "Verde" na posicao 16 da frase "...") o que na realidade é acrescentado é "Verde " com um espaço (conta os espaços dos exemplos antes e depois da inserçao). O enunciado do problema é ambiguo no que respeita a espaços.

Para resolver a ambiguidade tens várias soluções:

1) desambiguas pelo texto e ignoras o exemplo fornecido (resultado: "... Pepe Verdeserve ...")

2) desambiguas pelo exemplo e ignoras o texto do problema (resultado: "... Pepe Verde serve ...")

3) pensas mais no problema e resolves de "forma natural"

De qualquer maneira convem falares com o professor para saber o que ele pensa da ambiguidade e da maneira que decidiste resolve-la.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.