Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ricardo gomes araujo

[Resolvido] String - Função rodar string

Recommended Posts

Estou tentando fazer o seguinte programa

 

Fazer uma função que receba uma string como parâmetro e desloque os caracteres para a direita. Exemplo: casa deverá ficar assim: "acas".

E deverá obedecer ao prótotipo: void roda_string (char* str);

 

Tentei fazer assim:

 

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

void roda_oposta (char* str)
{

int i=0;

for (i = 0; str[i] != '\0'; i++ )
{
	if ( ( ( str[i] >= 'a' ) && ( str[i] <= 'z' ) ) )
		str[i]++;

}

}

int main(void)
{
char frase[100] = { '\0' }; 
char c;

printf("digite uma frase:\n");
scanf("%s", frase); 
roda_string(frase);

printf("A string modificada é: %s\n", frase );

system("pause");

return 0;

}

 

Mas não estou conseguindo fazer rodar a string.

 

Alguém poderia me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, sou programador PHP não C.

 

Mas acredito que você não precise dar tanta volta para chegar a isso:

 

Veja se o C não tem funções similares ao str_split, array_reverse e implode do php.

 

Que você faz isso com 3 linhas de código:

 

$teste = "aqui vai seu texto";		// Texto normal

$teste = str_split($teste);		// Converte string em array -> http://www.php.net/manual/pt_BR/function.str-split.php
$teste = array_reverse($teste);		// Inverte ordem da array -> http://www.php.net/manual/pt_BR/function.array-reverse.php
$teste = implode('',$teste);		// Uni itens da array para tornar uma string -> http://www.php.net/manual/pt_BR/function.implode.php

echo $teste;				// Exibe valor invertido -> "otxet ues iav iuqa"

 

Flw ae

 

=)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, em C++ vce tem a função strlen(string), que vcê conta o número de caracteres que tem em uma string. Se não tiver na lib da C, faça um desse.

 

 

Aí vce pega o número retornado pelo strlen e coloca como índice da matriz, o que vai apontar pra o último caracter (a não ser que o strlen() conte o caractere nulo também, aí vce teria que diminuir um caractere antes...)

 

Continuando, você passa esse caracter pra um char temporário e depois aumenta em um todos os caracteres da string, passando o c do [0] pra c[1], o a do c[1] pra a c[2], etc, substitui o caractere que vce passou pro temporário no final da string e passa o temporário pro inicio da mesma.

 

 

Essa é uma de muitas formas que devem existir...

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que entendi, você não precisa incrementar o ocntador de um em um. Pode ser de dois em dois, já que você altera a posição de dois caracteres

 

E basta uma variável auxiliar (um char). Por exemplo:

 

for (i = 0; str[i] != '\0'; i+=2 )
{
   aux = str[i];
   str[i] = str[i+1];
   str[i+1] = aux;
}

 

PS: C não tem essa mordomias do PHP... :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo

 

Obrigado pela ajuda funcionou certo o trecho de código que você passou

 

Segue o código para estudo de outros membros

 

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

void string_oposta (char* str)
{

int i=0;
int aux;

for (i = 0; str[i] != '\0'; i+=2 )
{    
     aux = str[i];   
     str[i] = str[i+1]; 
     str[i+1] = aux;

}



}

int main(void)
{
char frase[100] = { '\0' }; 
char c;

printf("digite uma frase:\n");
scanf("%s", frase); 

string_oposta(frase);

printf("A string modificada é: %s\n", frase );

system("pause");

return 0;

}

 

Tópico resolvido

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se a descrição do problema e o exemplo estão confusos, mas acredito que possa haver falta de entendimento.

 

 

Pelo que eu entendi, "deslocar os caracteres de uma string para a direita" consiste no seguinte (usando '[]' para representar um char vazio, ou sem conteúdo significante):

 

String inicial: casa\0

String final: acas\0

 

...

 

String inicial: casa\0[][]

String final: []casa\0[]

 

...

 

String inicial: elefante\0[]

String final: []elefante\0

 

 

Se for este o caso, os códigos propostos não resolvem o problema.

 

O código postado pelo Nicolas reverte a ordem das letras da string, e o código acima troca a posição das letras duas a duas.

 

 

 

Outra coisa importante, independente deste exercício:

 

char arr[100];

 

Qual o tipo de arr[10]? O que acontece se eu fizer arr[10]++?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Programa exemplo:

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

char * rorString(char *str, size_t len, unsigned n)
{
   n %= len;
   if(n == len || !n)
       return str;
   char *temp = malloc(n);
   memcpy(temp, str+len-n, n);
   memmove(str+n, str, len-n);
   memcpy(str, temp, n);
   free(temp);
   return str;
}

int main()
{
   unsigned u;
   char myStr[30];
   printf("Digite uma frase [max 30 caracteres]:");
   scanf("%30s", myStr);
   printf("Digite a rotacao:");
   scanf("%u", &u);
   printf("Frase rotacionada:%s\n", rorString(myStr, strlen(myStr), u));
   scanf("%*c%*c");
   return 0;
}

Tinha esquecido,em C++ tem jeitos muito mais simples de fazer isso,tem até uma função chamada rotate pra isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Apenas para complementar a discussão e finaliza-la com o código:

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

void string_oposta (char* str[media][/media])
{

int i = 0;
char aux;

for (i = 0; str != '\0'; i+=2 )
{
aux = str;
str = str[i+1];
str[i+1] = aux;
}

}

int main()
{
char frase[100] = { '\0' };
char c;

/* Para que o programa funcione de forma correta, a parte abaixo tem a seguinte definição:
* Segundo a descrição de Luiz Damas - Linguagem C (2007, pg 158), quando uma variavel do tipo
* char[N] ou um vetor de strings recebe valores com caracteres alfanumericos, eles podem ser
* recebidos por "gets(variavel)".
* gets() e similar ao scanf("%s", variavel), porem gets pode receber mais do que uma
* palavra (com espacos, igual a uma frase). Rodando o programa anterior com a seguinte frase:
* "A casa do barnabe e verde", exibiria na tela apenas a palavra acas. Abaixo exibira:
* "aacasd oabnrba e eevdr"
*/

printf("digite uma frase:\n");
gets(frase); // ao inves de scanf("%s", frase);

string_oposta(frase);

printf("A string modificada é: %s\n", frase );

system("pause");

return 0;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Insisto que não deve utilizar gets() e system("pause").

 

Ao invés de gets(), procure pelo fgets(), ele costuma resolver o problema (o gets() permite buffer overruns, o que é um modo muito comum de ataque).

 

Ao invés do system("pause"), procure por uma opção mais portável, usar isso só funciona no Windows.

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.