Jump to content

Dúvida em concatenação de strings


guilherme1805
 Share

Go to solution Solved by HappyHippyHippo,

Recommended Posts

Boas,

Estou a fazer um exercício onde me é dada uma string e partir da mesma tenho que criar outra string com as palavras da primeira dispostas de trás para a frente.

Ex:

String 1: o mundo e belo

String 2: belo e mundo o

Não faço a mínima ideia do processo que tenho que proceder para resolver o exercício. Se alguém pudesse ajudar? (Não quero o exercício resolvido quero apenas saber como chegar à sua resolução)

Edited by guilherme1805
Link to comment
Share on other sites

Segui os conselhos, cheguei a este resultado:

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

int main() {
char texto[]="um dois tres";
char texto2[20];
char matriz[40][40];
int i,palavra=0,caracter=0;

for(i=0;i<strlen(texto);i++){
if(texto[i]==' '){
matriz[palavra][caracter]=' ';
caracter++;
matriz[palavra][caracter]='\n';
palavra++;
caracter=0;
}
else{
matriz[palavra][caracter]=texto[i];
caracter++;
}
}

for(palavra;palavra>=0;palavra=palavra-1){
strcat(texto2,matriz[palavra]);
}

printf("%s",texto2);
return 0;
}

O output está assim:

69987204b4eda3f7055787008233510b.png

nao percebi qual é o erro no programa?!

Edited by guilherme1805
Link to comment
Share on other sites

Obrigado pela ajuda! Está resolvido.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char texto[]="um dois tres quatro cinco seis ";
char texto2[20]="";
char matriz[20][20];
int i,palavra=0,caracter=0;
for(i=0;i<strlen(texto);i++){
 if(texto[i]==' '){
  matriz[palavra][caracter]=' ';
  caracter++;
  matriz[palavra][caracter]='\0';
  palavra++;
  caracter=0;
 }
 else{
  matriz[palavra][caracter]=texto[i];
  caracter++;
 }
}
for(palavra--;palavra>=0;palavra--){
 strcat(texto2,matriz[palavra]);
}
printf("%s",texto2);
return 0;
}
Link to comment
Share on other sites

Ok quando chegar a cada testo e mando a minha solucao

edit

essa solução tem vários problemas e um deles é dados pelo próprio exemplo que apresentas. para veres esses problemas responde a estas duas questões

- qual o tamanho da string final e qual o tamanho reservado para esta (variável texto2) ?

- o que acontece se, por acaso, a frase tiver mais do que 20 palavras ?

ao responderes a estas questões, apresento-te a minha solução onde não terás esses problemas

Edited by HappyHippyHippo
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Ok quando chegar a cada testo e mando a minha solucao

edit

essa solução tem vários problemas e um deles é dados pelo próprio exemplo que apresentas. para veres esses problemas responde a estas duas questões

- qual o tamanho da string final e qual o tamanho reservado para esta (variável texto2) ?

- o que acontece se, por acaso, a frase tiver mais do que 20 palavras ?

ao responderes a estas questões, apresento-te a minha solução onde não terás esses problemas

Já consegui arranjar uma solução mais consistente embora não tenha sido feita por mim deu para perceber o método mais simples e correto

//by Tofran
#include <stdlib.h>
#include <string.h>

int main() {
   char st[] = "ola tudo bem";
   char * prev;

   for(int i = strlen(st)-1; i >= -1; i--){
    if(i == -1 || st[i] == ' '){
	    int j = i+1;
	    while(j < strlen(st) && st[j] != ' '){
		    printf("%c", st[j]);
		    j++;
	    }
	    printf(" ");
    }
    prev = st[i];
   }
   return 0;
}
Link to comment
Share on other sites

  • Solution

Já consegui arranjar uma solução mais consistente embora não tenha sido feita por mim deu para perceber o método mais simples e correto

//by Tofran
#include <stdlib.h>
#include <string.h>

int main() {
   char st[] = "ola tudo bem";
   char * prev;

   for(int i = strlen(st)-1; i >= -1; i--){
       if(i == -1 || st[i] == ' '){
           int j = i+1;
           while(j < strlen(st) && st[j] != ' '){
               printf("%c", st[j]);
               j++;
           }
           printf(" ");
       }
       prev = st[i];
   }
   return 0;
}

esse código não guarda a string final (só faz output), assim como não é nada eficiente.

isto porque vejo dois ciclo explícitos, e dois implícitos. olha que sempre que fazes a chamada da função strlen, é um ciclo.

e para piorar as coisas, uma dessas chamadas ao strlen, está numa verificação da condição de paragem de um ciclo, que quer dizer que será chamada sempre que ciclo while é executado.

a minha solução é :

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

int main() {
 char text[] = "um dois tres";
 char* reversed = NULL, *tok;

 printf("original : %s\n", text);

 if ((reversed = calloc(strlen(text) + 1, 1)) == NULL)
   return -1;

 tok = strtok(text, " ");
 while (tok) {
   size_t length = strlen(tok);
   memmove(&reversed[length + 1], reversed, strlen(reversed));
   memcpy(reversed, tok, length);
   reversed[length] = ' ';

   tok = strtok(NULL, " ");
 }

 printf("reversed : %s\n", reversed);
 free(reversed);

 return 0;
}

este solução tem somente um único problema, que se conseguires descubrir (ou até já sabes) dou-te os meus parabéns

Edited by HappyHippyHippo
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

só agora reparei que já tinha feito esse exercício ( e ainda por cima à poucos dias atrás), vou por isso deixar aqui a minha solução:

#include <stdio.h>
#include <math.h>
#include <string.h>
#define maxWords 150
#define maxLetters 100

void abrir(FILE **read,FILE **write) {
   *read = fopen("teste2.in","r");
   *write = fopen("resposta3","w");
}

void createSTR(FILE **read,char *str){
   int pos = 0;
   char ch;
   while ((ch = fgetc(*read)) != '\n')
       str[pos++] = ch;
   str[pos] = '\0';
}

int main() {
   FILE *read,*write;
   char *word[maxWords];
   char str[150];
   char words[maxWords][maxLetters];
   abrir(&read,&write);
   int e,i,k;
   char ch;
   short int N;
   char *token;
   fscanf(read,"%hd",&N);
   fgetc(read);
   for (e = 0;e<N;e++) {
       createSTR(&read,str);
       i = -1;
       fprintf(write,"Case #%d: ",e+1);
       for ( token = strtok(str," ") ; token != NULL ; token = strtok(NULL , " ")){
           word[++i] = token;
       }
       for (k = i;k >= 0;k--){
           fprintf(write," %s ",word[k]);
       }
       fprintf(write,"\n");
   }
   fclose(read);
   fclose(write);
   return 0;
}

O exercício não é igual mas no fundo é a mesma coisa

Edited by killezio
GeSHi
Link to comment
Share on other sites

Esse codigo tem chamada a codigo nao apresentado, e novamente nao guarda p resultado, somente envia para um stream

tens razão, devia ter comentado mas inicialmente este código era só para resolver um problema, não estava à espera de ter que o usar depois disso, por isso nem me lembrei de comentar quando postei aqui. Também o objetivo era por o resultado num ficheiro.. aqui está o problema para quem estiver interessado: https://code.google.com/codejam/contest/351101/dashboard#s=p1

Link to comment
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
 Share

×
×
  • Create New...

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.