Jump to content
  • 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.

Recommended Posts

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);
}

Edited by thinkabout

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Edited by thinkabout

Share this post


Link to post
Share on other 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);

Share this post


Link to post
Share on other 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);
}

Edited by thinkabout

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.