BillCats Posted May 24, 2006 at 10:51 PM Report #29407 Posted May 24, 2006 at 10:51 PM Boas a todos 👍 exemplo de string: space space "ol space a" space space a funçao coloca a string da seguinte maneira: "ola" void middletrim(char *p) { int j=0,i=0,x; while(p[i]==' '){ i++; } x=mystrlen(p)-1; while(p[x]==' '){ x--; } while(i<x){ while(p[i]!=' '){ p[j]=p[i]; j++; i++; } } p[j]='\0'; } Aceito ajudas 😁 Obrigado ?
BillCats Posted May 24, 2006 at 10:53 PM Author Report #29408 Posted May 24, 2006 at 10:53 PM mystrlen é uma funçao implementada por mim que me devolve o numero de caracteres da string (o seu tamanho)...
theproject Posted May 24, 2006 at 11:44 PM Report #29413 Posted May 24, 2006 at 11:44 PM Tens uma maneira muita simples de fazer isso... alocas uma nova string , mantens um indice j para a nova string e depois percorres a string velha de i=0 ate ao tamanho dela e sp que encontrares uma cena diferente de 0 copias para o novo array na posicao j e incrementas o j... claro que consegues fazer isso sem teres de arranjar outra string... depende do que queres...
Rui Carlos Posted May 24, 2006 at 11:53 PM Report #29416 Posted May 24, 2006 at 11:53 PM Tens uma maneira muita simples de fazer isso... alocas uma nova string , mantens um indice j para a nova string e depois percorres a string velha de i=0 ate ao tamanho dela e sp que encontrares uma cena diferente de 0 copias para o novo array na posicao j e incrementas o j... claro que consegues fazer isso sem teres de arranjar outra string... depende do que queres... podes seguir a mesma ideia usando apenas uma string (acho eu...) basta ter dois inteiros: um indicando o caracter que vais processar de seguida e outro indicando onde o irás escrever; e nem sequer é necessário determinar o tamanho da string, basta terminar quando encontrar-mos o caracter '\0'. Rui Carlos Gonçalves
TheDark Posted May 24, 2006 at 11:54 PM Report #29417 Posted May 24, 2006 at 11:54 PM Então queres remover todos os espaços de uma string? Se bem percebi do teu exemplo, tendo uma string "___ol__a__" (em que _ representa um espaço), queres que a função devolva "ola"? Vou dar-te algumas pistas: Só precisas de um while com um if lá dentro; não precisas de saber o tamanho da string. o algoritmo será algo do género: 1. i e j começam a 0; 2. enquanto o indice i da string nao for o caracter terminador 2.1. se o indice i da string nao for espaço 2.1.1 copia indice i para indice j 2.1.2 incrementa j 2.2 incrementa i 2.3 voltar a 2 3. inserir o caracter terminador na posição j EDIT: outros responderam enquanto eu estava a elaborar o meu post :😁 Desaparecido.
entering Posted May 25, 2006 at 08:26 AM Report #29425 Posted May 25, 2006 at 08:26 AM mystrlen é uma funçao implementada por mim que me devolve o numero de caracteres da string (o seu tamanho)... porque não usar a strlen?!
BillCats Posted May 25, 2006 at 02:49 PM Author Report #29472 Posted May 25, 2006 at 02:49 PM antes de mais obrigado a todos que estao a tentar ajudar.... quanto ao uso da strlen: estou a usar o dev-c++ nao sei se ele traz essa funçao, mas como é um trabalho é mais valorizado se apresentar estas funçoes feitas 👍 nao referi uma coisa...esta funçao vai trabalhar a seguir a inserçao de um nome e juntamente com ela tenha mais duas, uma que elimina espaços a esquerda e outra que elimina espaços a direita...ou seja, essa apenas tem que eliminar espaços que se encontrem no meio de palavras e claro deixar um espaço entre elas....entretanto vou pegar nisso e alguma duvida ou problema passo cá... 😁
entering Posted May 25, 2006 at 03:54 PM Report #29478 Posted May 25, 2006 at 03:54 PM o Dev-C++ é um IDE que usa o gcc como compilador a função strlen faz parte da biblioteca string.h e é ANSI-C por isso é suportada por todos os compiladores que respeitem o ANSI-C incluindo o gcc claro BillCats "quanto ao uso da strlen: estou a usar o dev-c++ nao sei se ele traz essa funçao, mas como é um trabalho é mais valorizado se apresentar estas funçoes feitas Smiley" já foram apresentadas soluçoes para o teu problema 😁
Rui Carlos Posted May 25, 2006 at 05:59 PM Report #29506 Posted May 25, 2006 at 05:59 PM quanto ao uso da strlen: estou a usar o dev-c++ nao sei se ele traz essa funçao, mas como é um trabalho é mais valorizado se apresentar estas funçoes feitas 😁 será? pelo menos os meus professores não acham muita piada a isso... eles preferem que utilizemos sempre funções predefinidas, caso elas existam. até porque não é difícil encontrar a sua definição na net. Rui Carlos Gonçalves
Guest id194 Posted May 25, 2006 at 06:44 PM Report #29512 Posted May 25, 2006 at 06:44 PM tb axo um bocado estranho, alguem valorizar a construção de uma função quando ela já existe e seria mt mais fácil se fosse usada.
entering Posted May 25, 2006 at 08:28 PM Report #29531 Posted May 25, 2006 at 08:28 PM também acho que nao vai valorizar já tive um teste a uns anitos que foi so tratamento de strings e nao podiamos usar o string.h mas isso é um caso a parte eu nao valorizaria por usares essa função, aliás até dava menos cotação visto que ao ver de um professor pode pensar que nao conheçesses a strlen
BillCats Posted May 25, 2006 at 08:45 PM Author Report #29534 Posted May 25, 2006 at 08:45 PM bom pessoal quanto aquilo de valorizar passo a explicar: tivemos uma aula em que aprendemos assim muito rapidamente a manipular strings e inclusive isto de organizar foi entao o que fizemos nesta aula. Eu tinha estas funçoes aqui num ficheiro mas pelo vistos nao estavam la muito bem :bored: ...como estou a fazer um trabalho e vou precisar delas para organizar o nome (coisa que eu quero colocar pois assim o trabalho tem + valor para o prof.) perguntei ao prof. o nome das funçoes da biblioteca que me faziam isto inclusive incluir a strlen, a resposta dele foi que como tinhamos feito na aula para eu copiá-las desse ficheiro e colá-las neste que estou a realizar, por isso eu querer utiliza-la assim... quanto ao problema de organizar espaços multiplos: decidi por fim fazer uma funçao que faz logo tudo, organiza um nome eliminando espaços à esquerda, à direita e no meio deixando 1 espaço entre dois ou mais nomes (este "entre mais" acho que nao tem de ser doutra maneira)...mas ta-me a dar um problemazito qualquer e nao consigo descobrir.... void organizarnome(char *p) { int j=0,i=0,x; while(p[i]==' '){ i++; } while(p[i]!=' '){ if(p[i]!=' '){ p[j]=p[i]; j++; } i++; } p[j+1]=' '; j++; x=mystrlen(p)-1; while(p[x]==' '){ x--; } while(p[x]!=' '){ x--; } while(p[x]!='\0'){ if(p[x]!=' '){ p[j]=p[x]; j++; } x++; } p[j]='\0'; } Aqui fica o codigo para teste desta funçao: #include<stdio.h> #include<stdlib.h> int mystrlen(char *s) { int i=0; while(s[i]!='\0') i++; return i; } void lefttrim(char *a) { int i=0,j=0; while(a[i]==' '){ i++; } while(a[i]!='\0'){ a[j]=a[i]; i++; j++; } a[j]='\0'; } void righttrim(char *s) { int j,i; j=mystrlen(s); for(i=j-1;i>=0;i--) if(s[i]==' ') s[i]='\0'; } void middletrim(char *p) { int j=0,i=0,x; while(p[i]==' '){ i++; } while(p[i]!=' '){ if(p[i]!=' '){ p[j]=p[i]; j++; } i++; } p[j+1]=' '; j++; x=mystrlen(p)-1; while(p[x]==' '){ x--; } while(p[x]!=' '){ x--; } while(p[x]!='\0'){ if(p[x]!=' '){ p[j]=p[x]; j++; } x++; } p[j]='\0'; } int menu() { int op; do { printf("\n\nMENU\n"); printf(" 1 - Inserir string\n"); printf(" 2 - Tamanho string\n"); printf(" 3 - Eliminar espaços esquerda\n"); printf(" 4 - Eliminar espaços direita\n"); printf(" 5 - Eliminar espaços intermedios\n"); printf(" 0 - Sair \n"); printf(" Opcao --> "); scanf("%d",&op); } while(op<0 || op>5); return op; } int main() { int opcao; char str[30]; int x; do { opcao=menu(); switch(opcao){ case 1: fflush(stdin); printf("Introduza a string: "); gets(str); break; case 2: x=mystrlen(str); printf("Numero de caracteres: %d",x); puts(str); break; case 3: lefttrim(str); puts(str); break; case 4: righttrim(str); puts(str); break; case 5: middletrim(str); puts(str); break; } } while(opcao); }
TheDark Posted May 25, 2006 at 11:09 PM Report #29551 Posted May 25, 2006 at 11:09 PM Na função righttrim tens um problema: tens que mudar o for para for(i=j-1;i>=0;i--) if(s[i]!=' ') break; s[i]='\0'; , para saires do ciclo for assim que encontras um caracter não espaço, senão se tiveres uma string "uma string ", a função percorre toda a string até ao início e coloca um '\0' também a seguir à palavra "uma", e acabas por ficar com a string "uma". Pior ainda, se tiveres a string " uma string", com espaços no início, ficas com uma string vazia, porque a função coloca um '\0' na 1ª posição da string. Nota que a linha s[ i ]='\0'; está fora do for. Depois, temos a middletrim. Consegui fazê-la com com 2 indices, um while com dois ifs dentro, e outro fora. Parte do teu raciocínio está correcta. Vamos utilizar 2 índices, um a dizer onde queres escrever (j), e outro a dizer de onde queres ler (i). A partir daí é utilizares um while para percorrer a string de ponta a ponta; se o caracter que lês é um espaço, apenas incrementas i; senão, tens que fazer duas coisas: copiar a posição i para a posição j, e incrementar i e j; ver se o caracter na posição a seguir a i é espaço, e caso seja colocas um espaço na posição j, e incrementas i e j novamente; Quando termina o while, vês se a posição j-1 é um espaço; se for decrementas j; Finalmente, colocas o '\0' na posição j. Desaparecido.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now