Logo Hardware.com.br
Pão Man
Pão Man General de Pijama Registrado
3.3K Mensagens 178 Curtidas

Dúvida Programa em C, string...

#1 Por Pão Man 02/11/2013 - 11:33
Galera a minha dúvida é a seguinte, estou estudando C aqui, voltei a ver um pouco. Então resolvi algumas questões com strings e matrizes, mas me deparei com uma aparentemente simples e estou me batendo...

É o seguinte a questão quer que escreva a frase da seguinte forma:

Ex:
Cachorro Gato
Gato Cachorro

Só que tipo, não estou achando alguma string para isso, nem uma lógica, fiz o teste de mesa com duas frases e não achei lógica.

Pois tipo se eu quisesse inverte:
Ex:
otag orrohcac

É bem mais simples, uso uma string strlen que calcula o tamanho da frase, exemplo tenho uma frase que vai de 0 a 8. A string ler 8 eu subtraio 1, e tenho 7, daí uso um for, para ir invertendo os espaços reservados na memória:

for (x=strlen(frase)-1; x>-1; x--)

E já esta resolvido, se fosse para inverter assim. Mas para o outro caso eu pensei em armazenar o primeiro nome e o segundo diferenciando pelo espaço e invertendo, mas como diferencio os nomes pelo espaço? Tem alguma outra lógica? Eu quero mais aprendizado e explicação, não código pronto que existe vários na net.
ripongao
ripongao Veterano Registrado
755 Mensagens 94 Curtidas
#2 Por ripongao
02/11/2013 - 13:24
Você cria um parser, não posso te ajudar com C, mas na lógica posso.
Você já falou a resposta, o "espaço","tabulação",..., é o caracter coringa que você procura. Do inicio da string até o 1o espaço encontrado vai para uma variável ou estrutura. Do 1o espaço até o 2o espaço para outra, até chegar ao fim. Você antes precisa saber o tamanho da string em questão (strlen).

Você pode armazenar o ponteiro de onde esta aquela 1a string juntamente com seu tamanho numa matriz ou tabela, depois onde esta a 2a string e seu tamanho, ... . Depois ecoa do fim da matriz até o seu começo.
Cabe a você decidir se o "espaço" estará no tamanho da string ou não, sugiro que não. Ecoe a 1a string, ecoe um espaço, ecoe a 2a string, ecoa um espaço.
Verifique erros, pode não existir espaços correto. A base então é o tamanho da string original.

Não sei se te ajuda, mas o "espaço" é o número hexadecimal 20, mas creio que seja mais fácil tratá-lo como caracter mesmo.
Desliguei-me do fórum. Conta canelada.
Pão Man
Pão Man General de Pijama Registrado
3.3K Mensagens 178 Curtidas
#3 Por Pão Man
02/11/2013 - 16:01
O problema é que isso é sem utilizar ponteiros kk...

E eu não estou conseguindo separa as palavras pelo espaço, tipo o espaço é o curinga como você falou, mas eu queria ter uma ideia de como usar esse espaço para pegar tudo que vem antes ou depois, isso sem usar ponteiros. Mas não achei nada ainda, estou dando uma lida em string e vendo se surge alguma lógica...
#Linux-User: 535210
[Indicação] Cursos de info Clique aqui: Curso 24H com diploma em casa.
Canal Youtube - https://www.youtube.com/jlucasengenharia
Robô e Kinect - https://www.youtube.com/watch?v=jcoaCoyohiQ
quemsou_naodigo
quemsou_naod... Cyber Highlander Registrado
28.8K Mensagens 1.8K Curtidas
#4 Por quemsou_naod...
02/11/2013 - 18:35
Como eu faria (não sei se é a forma mais eficiente):
Abre um loop contando até de 0 até tamanho da string -1. String é um vetor de caracteres. Você compara cada caractere do vetor com o caractere espaço (' '). Quando esse caractere espaço for detectado, você sabe que é possível separar duas palavras, uma no intervalo (em posições do vetor) [0, espaço - 1] e outra [espaço + 1, tamanho do vetor].

Daí é só atribuir os caracteres da segunda palavra a um novo vetor, os da primeira palavra em outro novo vetor e concatenar (strcat) os dois.
Leiam: Guia de Utilização (Novo Fórum) e Regras de Conduta.
---------------------------------------------
LinuxUser #468957
ripongao
ripongao Veterano Registrado
755 Mensagens 94 Curtidas
#5 Por ripongao
02/11/2013 - 18:38
Boas Pão Man;
Er, porque não pode ser usando ponteiros? Acho que é o jeito mais rápido de se fazer e o mais eficiente. O próprio C faz isso criando os argc,argv,e pont_var_ambiente.

Para encontrar os espaços suponho ter que fazer a string virar um aglomearado de caracteres:
if [caracter_atual] == " "
ou então
if [caracter_atual] == 0x20

hmm, talver um strcmp com a string espaço de um dígito apenas?

beleza quemsou_naodigo, esse exemplo mesmo, eles são eficientes, usam ponteiros. É igual pensar só no argc e argv, o tamanho de algo e o lugar de onde esta algo.
Desliguei-me do fórum. Conta canelada.
kungfukid
kungfukid Zerinho Registrado
76 Mensagens 5 Curtidas
#7 Por kungfukid
03/11/2013 - 11:51
Outra forma de se resolver isso é implementando uma função split (acho que em c não existe ou se existe é de terceiros).

Como funciona? Em linguagens modernas, a maioria possui um jeito de separar a string em vários elementos de um array (matriz de strings) pelo delimitador que você desejar, por exemplo:


...
split("Frase a ser separada", " \t\n"
...
Onde seu protótipo seria:


char **split(char *frase, char *delimitadores);
Tendo uma função dessas já é meio caminho andado, pois aí é só você "quebrar" a frase e percorrer o resultado (nesse caso uma matriz de string's) de baixo pra cima e mostrando cada elemento.
Pão Man
Pão Man General de Pijama Registrado
3.3K Mensagens 178 Curtidas
#8 Por Pão Man
03/11/2013 - 12:41
Amigos eu conseguir fazer usando a função sscanf(); que ela é capaz de delimitar palavras por espaços, achei no livro aqui, e utilizei. O problema agora é que ela é limitada ao número de espaços alocados que eu ordenar ao char.

Ou seja, se eu colocar o char [2][n], eu posso só frases com duas palavras, após escrever eu usei o strcat e contatenei. Agora que eu queria que pudesse colocar um numero maior de palavras e não delimitado pela especificação. Estou estudando aqui ainda. A lógica do Quemsou_naodigo é bem legal, mas ainda não conseguir colocar em prática.
#Linux-User: 535210
[Indicação] Cursos de info Clique aqui: Curso 24H com diploma em casa.
Canal Youtube - https://www.youtube.com/jlucasengenharia
Robô e Kinect - https://www.youtube.com/watch?v=jcoaCoyohiQ
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal