Dúvida concatenação --> strcat() [RESOLVIDO]

1. Dúvida concatenação --> strcat() [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 15/07/2015 - 21:23h

Boa noite à todos;

Fiquei sumido por um bom tempo do VoL devido a falta de tempo que vinha tendo, mas tudo está ok, rsrsrsr.
----------

Bom, sobre a dúvida, vou resumi-la agora: estou estudando C por uma apostila em PDF da UFMG (link e detalhes no fim) e, na parte das strings, havia um exercício mais ou menos assim: "crie um programa que leia quatro palavras digitadas pelo usuário, salve-as em quatro strings diferentes e depois concatene-as numa única, imprimindo na tela esta (única string concatenada) como resposta".

Até aí beleza, criei meu programa com o seguinte código:

#include <stdio.h>
#include <string.h>
int main ()
{
/* a variável "str" salva a string concatenada;
* as variáveis "str1", ..., "str4" salvam a
* 1ª, a 2ª, a 3ª e a 4ª strings (fornecidas
* pelo usuário), respectivamente */
char str[100], str1[100], str2[100], str3[100], str4[100];

/* as próximas linhas lêem as strings: */
printf ("\n\nDigite a 1ª string: ");
fgets (str1, 100, stdin);

printf ("\nDigite a 2ª string: ");
fgets (str2, 100, stdin);

printf ("\nDigite a 3ª string: ");
fgets (str3, 100, stdin);

printf ("\nDigite a 4ª string: ");
fgets (str4, 100, stdin);

/* as próximas linhas concatenam as strings na var. "str" */
strcat (str, str1);
strcat (str, str2);
strcat (str, str3);
strcat (str, str4);

/* imprime a variável concatenada */
printf ("\n\n%s\n", str);

return(0);
}


Esse programa faz o que o exercício pede, porém, ao imprimir a string concatenada como resposta, invés das palavras virem uma ao lado da outra (como seria de se imaginar), elas vêm uma abaixo da outra - esta é a minha dúvida. Exemplo: eu abro o programa e digito, na sequência, as palavras "alfa" "beta" "gama" "delta"; na resposta, ao invés de aparecer "alfabetagamadelta" como seria de se esperar, aparece:
alfa
beta
gama
delta
uma abaixo da outra.

Então eu pensei: será que o Enter que é pressionado também conta na string? a partir disso, criei outro código, onde a string lida era passada, temporariamente, para a str, onde era repassada (caracter por caracter) para a string correspondente, finalizando-a com um espaço (" "). O código resultante está abaixo:

#include <stdio.h>
#include <string.h>
int main ()
{
int count;
char str[100], str1[100], str2[100], str3[100], str4[100];

printf ("\n\nDigite a 1ª string: ");
fgets (str1, 100, stdin);
for (count = 0; count < strlen(str1); count++)
{
str[count]=str1[count];
if (count == (strlen(str1) - 1))
{
str[count + 1]=' ';
str[count + 2]='\0';
}
}
strcpy (str1, str);
strcpy (str, "");

printf ("\nDigite a 2ª string: ");
fgets (str2, 100, stdin);
for (count = 0; count < strlen(str2); count++)
{
str[count]=str2[count];
if (count == (strlen(str2) - 1))
{
str[count + 1]=' ';
str[count + 2]='\0';
}
}
strcpy(str2, str);
strcpy (str, "");

printf ("\nDigite a 3ª string: ");
fgets (str3, 100, stdin);
for (count = 0; count < strlen(str3); count++)
{
str[count]=str3[count];
if (count == (strlen(str3) - 1))
{
str[count + 1]=' ';
str[count + 2]='\0';
}
}
strcpy (str3, str);
strcpy (str, "");

printf ("\nDigite a 4ª string: ");
fgets (str4, 100, stdin);
for (count = 0; count < strlen(str4); count++)
{
str[count]=str4[count];
if (count == (strlen(str4) - 1))
{
str[count + 1]=' ';
str[count + 2]='\0';
}
}
strcpy (str4, str);
strcpy (str, "");

strcat (str3, str4);
strcat (str2, str3);
strcat (str1, str2);
strcat (str, str1);

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

return(0);
}


Porém, o resultado é o mesmo. Tentei também mexer com outras coisas/fazer de outro jeito e também não deu certo. Pesquisei na internet mais sobre a função strcat e não achei nada que pudesse me ajudar.

E minha dúvida é essa: é possível imprimir as palavras na mesma linha (o exercício não pede isso, mas gostaria de saber)?
----------

Por fim, segue o link da apostila, para quem quiser consultar:
http://www.inf.ufsc.br/~fernando/ine5412/C_UFMG.pdf
(o exercício em questão está no final da página 48)


  


2. Re: Dúvida concatenação --> strcat() [RESOLVIDO]

-
preroeb

(usa Outra)

Enviado em 15/07/2015 - 22:05h

Eu já tive um problema com o fgets, mas eu tava fazendo um programa para ler o arquivo de texto e mostrar o conteúdo do arquivo de texto na tela.

A solução que encontrei foi usar a função strcspn(). Ficaria assim:
str[strcspn(str,"\n")] = 0; 

Essa linha irá procurar e tirar o que tiver de newline na string.

Se quiser ver mais soluções (inclusive a solução que eu mostrei) veja esse link:
https://stackoverflow.com/questions/2693776/removing-trailing-newline-character-from-fgets-input


3. Re: Dúvida concatenação --> strcat() [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 15/07/2015 - 22:09h

SamL escreveu:

É porque assim, ao ler a string com fgets, a função colocará na string de destino todos os caracteres lidos mais o ''\n' (caractere de nova linha). Por isso, suponha que você digite a primeira palavra como "casa". Então a composição da string é: "casa\n\0" Ou seja, são 6 caracteres, sendo que o '\n' e '\0' representam um caractere cada. '\n' de quebra de linha (nova linha) e o '\0' caractere de fim da string.

Para resolver o problema você precisará remover o caractere '\n' da string. Ele fica uma posição a menos que o '\0'. Ou melhor, faça assim:
str[strlen(str) - 1] = '\0'; // str é uma string qualquer
-strlen() identifica o tamanho da string (retorna um inteiro com o números de caracteres até o '\0')
O código acima coloca um '\0' na penúltima posição da string (antes de '\0' que é reservada).
Mas aí ficarão com dois '\0', mas não tem problema, o que vale é o '\0' mais a esquerda.


Opa, valeu mesmo!! o problema certamente é esse mesmo, o \n; só que não sabia que ele representava o penúltimo caractere da string, nem mesmo que ele é gerado pelo fgets - muito obrigado!! já faço o teste e logo posto o resultado.


4. Re: Dúvida concatenação --> strcat() [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 15/07/2015 - 22:12h

SamL escreveu:

Ah sim, tem outro possível (improvável talvez) problema que esqueci de falar.
A sua string de destino das outras 4 deve ter um tamanho suficiente para caber o máximo de caracteres possíveis de cada string. Por exemplo, suponha que tenha 4 strings com tamanho 5, então a string que cabe todas as quatro strings de tamanho 5 deve ter no mínimo 4 * (5 - 1) + 1 caracteres. Ou seja, para suportar 4 strings de 5 chars deve-se usar uma de 17 chars.
Lembre-se que o último char deve ser um '\0' e ele conta no tamanho da declaração da string.


Verdade, bem lembrado!


5. Re: Dúvida concatenação --> strcat() [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 15/07/2015 - 22:13h

preroeb escreveu:

Eu já tive um problema com o fgets, mas eu tava fazendo um programa para ler o arquivo de texto e mostrar o conteúdo do arquivo de texto na tela.

A solução que encontrei foi usar a função strcspn(). Ficaria assim:
str[strcspn(str,"\n")] = 0; 

Essa linha irá procurar e tirar o que tiver de newline na string.

Se quiser ver mais soluções (inclusive a solução que eu mostrei) veja esse link:
https://stackoverflow.com/questions/2693776/removing-trailing-newline-character-from-fgets-input


Comando interessante! vou dar uma olhada


6. Re: Dúvida concatenação --> strcat()

Perfil removido
removido

(usa Nenhuma)

Enviado em 15/07/2015 - 22:35h

Consegui: realmente, foi só remover o \n das strings, e isso foi possível usando o mesmo código do programa anterior (só tive que substituir o (strlen(strn) - 1) por (strlen(strn) - 2) - só que, ao invés de substituir o '\n' por um '\0', troquei ele por um espaço ' ', já que assim a string já termina com um espaço (dando lugar a outra) e o '\0' fica na posição original:

#include <stdio.h>
#include <string.h>
int main ()
{
int count;
char str[100], str1[100], str2[100], str3[100], str4[100];

printf ("\n\nDigite a 1ª string: ");
fgets (str1, 100, stdin);
for (count = 0; count < (strlen(str1) - 1); count++)
{
str[count]=str1[count];
if (count == (strlen(str1) - 2))
{
str[count + 1]=' ';
str[count + 2]='\0';
}
}
strcpy (str1, str);
strcpy (str, "");

printf ("\nDigite a 2ª string: ");
fgets (str2, 100, stdin);
for (count = 0; count < (strlen(str2) - 1); count++)
{
str[count]=str2[count];
if (count == (strlen(str2) - 2))
{
str[count + 1]=' ';
str[count + 2]='\0';
}
}
strcpy(str2, str);
strcpy (str, "");

printf ("\nDigite a 3ª string: ");
fgets (str3, 100, stdin);
for (count = 0; count < (strlen(str3) - 1); count++)
{
str[count]=str3[count];
if (count == (strlen(str3) - 2))
{
str[count + 1]=' ';
str[count + 2]='\0';
}
}
strcpy (str3, str);
strcpy (str, "");

printf ("\nDigite a 4ª string: ");
fgets (str4, 100, stdin);
for (count = 0; count < (strlen(str4) - 1); count++)
{
str[count]=str4[count];
if (count == (strlen(str4) - 2))
{
str[count + 1]=' ';
str[count + 2]='\0';
}
}
strcpy (str4, str);
strcpy (str, "");

strcat (str3, str4);
strcat (str2, str3);
strcat (str1, str2);
strcat (str, str1);

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

return(0);
}


Mas que coisa esse fgets, ele lê até a "quebra" de linha!
Mas muito obrigado mesmo pelas informações!


7. Re: Dúvida concatenação --> strcat() [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 15/07/2015 - 23:26h

Eu também fiz vários testes usando o comando proposto pelo preroeb, que também funcionou corretamente; abaixo o código final, baseado no primeiro programa:

#include <stdio.h>
#include <string.h>
int main ()
{
/* a variável "str" salva a string concatenada;
* as variáveis "str1", ..., "str4" salvam a
* 1ª, a 2ª, a 3ª e a 4ª strings (fornecidas
* pelo usuário), respectivamente */
char str[100], str1[100], str2[100], str3[100], str4[100];

/* as próximas linhas lêem as strings e eliminam os '\n's: */
printf ("\n\nDigite a 1ª string: ");
fgets (str1, 100, stdin);
str1[strcspn(str1, "\n")] = ' ';

printf ("\nDigite a 2ª string: ");
fgets (str2, 100, stdin);
str2[strcspn(str2, "\n")] = ' ';

printf ("\nDigite a 3ª string: ");
fgets (str3, 100, stdin);
str3[strcspn(str3, "\n")] = ' ';

printf ("\nDigite a 4ª string: ");
fgets (str4, 100, stdin);
str4[strcspn(str4, "\n")] = ' ';

/* as próximas linhas concatenam as strings na var. "str" */
strcat (str, str1);
strcat (str, str2);
strcat (str, str3);
strcat (str, str4);

/* imprime a variável concatenada */
printf ("\n\n%s\n", str);

return(0);
}


Mais uma vez, agradeço a vocês pela ajuda e pelas informações/explicações fornecidas ;)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts