alphasil Posted July 15, 2012 at 10:03 PM Report Share #468749 Posted July 15, 2012 at 10:03 PM Oi ppl; Quero usar o strcmp para comparar se o primeiro elemento do array começa por M mas não consigo for(i=0; i<MAX; i++) { if(strcmp((char*)candidatos[0],"M")==0) { fprintf(f, "%s",(char*)candidatos[i]); } else { printf("Nada a escrever..."); return 0; } } Não é assim?? gmc11 Link to comment Share on other sites More sharing options...
polska Posted July 15, 2012 at 10:15 PM Report Share #468753 Posted July 15, 2012 at 10:15 PM Oi ppl; Quero usar o strcmp para comparar se o primeiro elemento do array começa por M mas não consigo for(i=0; i<MAX; i++) { if(strcmp((char*)candidatos[0],"M")==0) { fprintf(f, "%s",(char*)candidatos[i]); } else { printf("Nada a escrever..."); return 0; } } Não é assim?? se queres comparar elementos, usa o == , são chars, não strings ;D Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás. Link to comment Share on other sites More sharing options...
alphasil Posted July 15, 2012 at 10:40 PM Author Report Share #468755 Posted July 15, 2012 at 10:40 PM Mas é que assim if((char*)candidatos[i]=="M") warning: comparison with string literal results in unspecified behavior [-Waddress]| gmc11 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted July 15, 2012 at 10:53 PM Report Share #468764 Posted July 15, 2012 at 10:53 PM (edited) se queres verificar se uma string começa por uma letra expecífica basta comparar o caracter ... char * texto; ... if (texto[0] == 'M') { // <<----- o uso das ' em vez das " é importante printf("A string começa por M"); } Edited July 15, 2012 at 10:53 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
alphasil Posted July 15, 2012 at 10:59 PM Author Report Share #468767 Posted July 15, 2012 at 10:59 PM (edited) Oi HHH Pois mas é uma função que tenho de implementar que escreve num ficheiro se os nomes começam por M Assim como sugeriste int escreveCandidatosTXT(char candidatos[][100]) { FILE *f; int i; f=fopen("candidatosM.txt", "a+"); if(!f) { printf("Erro no ficheiro"); return -1; } for(i=0; i<MAX; i++) { if((char*)candidatos[0]=='M') //warning: comparison between pointer and integer [enabled by default]| { fprintf(f, "%s",(char*)candidatos[i]); } else { printf("Nada a escrever..."); return 0; } } return 0; } Edited July 15, 2012 at 10:59 PM by alphasil gmc11 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted July 15, 2012 at 11:02 PM Report Share #468768 Posted July 15, 2012 at 11:02 PM if((char*)candidatos[0]=='M') //warning: comparison between pointer and integer [enabled by default]| porque candidatos[] é um array (o nome) o que tu queres é if(candidatos[i][0]=='M') // ve como o "i" faz o redirecionamento para o elemento iterado e o "0" é o primeiro caracater IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
alphasil Posted July 15, 2012 at 11:07 PM Author Report Share #468771 Posted July 15, 2012 at 11:07 PM Por acaso já tinha posto assim só que estava assim if(strcmp(candidatos[i][0], 'M')>0) O estranho é que não me gravou nada no ficheiro e entrou o "Nada a escrever"....lol gmc11 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted July 15, 2012 at 11:56 PM Report Share #468775 Posted July 15, 2012 at 11:56 PM if(strcmp(candidatos[i][0], 'M')>0) 'M' é um caracter "M" é uma string O estranho é que não me gravou nada no ficheiro e entrou o "Nada a escrever"....lol eu não sei os dados que estás a testar IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
alphasil Posted July 16, 2012 at 09:21 AM Author Report Share #468806 Posted July 16, 2012 at 09:21 AM Oi HHH Isso é um exame do ano passado em que estou a tentar resolvê-lo. Diz o seguinte. array de caracteres candidatos[MAX][100] declarado local à função main() 1. Implemente a função ordenar - Está feito e a funcionar. 2. Implemente a função escreveCandidatos que imprime para o ficheiro de texto "candidatosM.txt" os nomes armazenados no array cujo nome começa pela letra 'M' Fiz assim: #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 3 int ordenaCrescente(char candidatos[][100]) { int i,j; char aux[100]; for(i=0; i<MAX-1; i++) { for(j=MAX-1;j>i; j--) { if(strcmp((char*)candidatos[j],(char*)candidatos[j-1])<0) { strcpy(aux,(char*)candidatos[j]); strcpy((char*)candidatos[j],(char*)candidatos[j-1]); strcpy((char*)candidatos[j-1], aux); } } } return 0; } int escreveCandidatosTXT(char candidatos[][100]) { FILE *f; int i; f=fopen("candidatosM.txt", "a+"); if(!f) { printf("Erro no ficheiro"); return -1; } for(i=0; i<MAX; i++) { if(candidatos[i][0]=='M') { fprintf(f, "%s",(char*)candidatos[i]); } else { printf("Nada a escrever..."); return 0; } } return 0; } int listar(char candidatos [][100]) { int i; for(i=0; i<MAX; i++) { printf("%s",(char*)candidatos[i]); } return 0; } int main() { char candidatos[MAX][100]; int i; for(i=0; i<MAX;i++) { printf("Nome: \n"); fgets((char*)candidatos[i], 100, stdin); } printf("Listagem de candidatos: \n"); listar(candidatos); printf("Listagem de candidatos ordenados crescente: \n"); ordenaCrescente(candidatos); for(i=0; i<MAX;i++) { printf("%s",(char*)candidatos[i]); } escreveCandidatosTXT(candidatos); return 0; } Só que ponho nomes começados por M e nada....lol gmc11 Link to comment Share on other sites More sharing options...
pmg Posted July 16, 2012 at 09:33 AM Report Share #468809 Posted July 16, 2012 at 09:33 AM Parece-me que o teu programa está bem. Lembra-te que 'M' e 'm' são caracteres diferentes. Os nomes devem ser introduzidos com maisusculas: "Manuel" e não "manuel". What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted July 16, 2012 at 09:56 AM Report Share #468811 Posted July 16, 2012 at 09:56 AM o teu código parece estar correto, quer dizer que deverá apresentar o nome que comece com um 'm' maiúsculo no ficheiro. o que te deve estar a fazer confusão é o aparecer a mensagem "Nada a escrever ..." porque isso está fora do sítio vê o código que te alterei #include <stdio.h> #include <stdlib.h> #include <string.h> // 1º nota : começa a comentar o teu próprio código // apesar de este código ser bem pequeno, é sempre // mais fácil e rápido descubrir os teu erros e os dos outros // é aconselhavel nunca espalhar constantes numéricas pelo código // para isso deverá ser usado sempre definições/macros #define MAX_CANDIDATOS 3 #define MAX_TAMANHO 100 int ordenaCrescente(char candidatos[][MAX_TAMANHO]) { int i = 0, j = 0; char aux[MAX_TAMANHO]; printf(">>> Ordenar candidatos por ordem crescente\n"); // os dois ciclos da ordenação for(i=0; i<MAX_CANDIDATOS-1; i++) { for(j=MAX_CANDIDATOS-1;j>i; j--) { // comparação do elemento a ser ordenado if(strcmp((char*)candidatos[j],(char*)candidatos[j-1])<0) { // trocar os dois elementos para ficarem ordenados strcpy(aux,(char*)candidatos[j]); strcpy((char*)candidatos[j],(char*)candidatos[j-1]); strcpy((char*)candidatos[j-1], aux); } } } return 0; } int escreveCandidatosTXT(char candidatos[][MAX_TAMANHO]) { FILE *f = NULL; int i = 0, count = 0; // abrir/criar o ficheiro com as candidaturas if ((f=fopen("candidatosM.txt", "w+")) == NULL) { printf(">>> Erro no ficheiro\n"); return -1; } // ciclo de escrita das candidaturas no ficheiro for(i=0; i<MAX_CANDIDATOS; i++) { // verifica se o nome começa com a letra m maiuscula if(candidatos[i][0]=='M') { // escrever o nome da candidatura no ficheiro fprintf(f, "%s\n",(char*)candidatos[i]); count++; } } // verifica se nenhuma condidatura foi escrita no ficheiro if (count == 0) printf(">>> Nada a escrever...\n"); return 0; } int listar(char candidatos [][100]) { int i = 0; // ciclo de apresentação das candidaturas printf(">>> Listagem de candidatos: \n"); for(i=0; i<MAX_CANDIDATOS; i++) printf("%s\n",(char*)candidatos[i]); return 0; } int main() { char candidatos[MAX_CANDIDATOS][MAX_TAMANHO]; char * aux = NULL; int i = 0; // ciclo de leitura das candidaturas do teclado while (i < MAX_CANDIDATOS) { // pedir o nome da candidatura printf(">>> Nome (%d) : ", i); fflush(stdout); // ler o nome do teclado verificando se foi correctamente lido if (fgets((char*)candidatos[i], 100, stdin)) { // retirar o caracter '\n' do fim da string lida do teclado *(strrchr(candidatos[i], '\n')) = '\0'; i++; } } listar(candidatos); ordenaCrescente(candidatos); listar(candidatos); escreveCandidatosTXT(candidatos); return 0; } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
alphasil Posted July 16, 2012 at 01:20 PM Author Report Share #468858 Posted July 16, 2012 at 01:20 PM Oi HHH É isso mesmo, assim já funciona. Obrigadom mais uma vez.... gmc11 Link to comment Share on other sites More sharing options...
alphasil Posted July 16, 2012 at 02:13 PM Author Report Share #468865 Posted July 16, 2012 at 02:13 PM (edited) Oi Olha, e se for duas letras Ou seja se começar por AB, tenho de pôr as duas posições do array bidimensional, não è?' char matriculas[MAX][20]; for(i=0; i<MAX; i++) { if(matriculas[i][0]=='A' && matriculas[i][1]=='B') { fprintf(f,"%s",(char*)matriculas[i]); count++; } } Edited July 16, 2012 at 02:13 PM by alphasil gmc11 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted July 16, 2012 at 02:37 PM Report Share #468870 Posted July 16, 2012 at 02:37 PM como as tuas strings são de tamanho fixo, não terás problemas em comparar dessa forma. ou então podes usar o método que inicialmente estavas a aplicar if(strcmp(matriculas[i], "AB") == 0) IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
mogers Posted July 16, 2012 at 02:57 PM Report Share #468873 Posted July 16, 2012 at 02:57 PM (edited) Se é "começar por AB" deves usar antes o strncmp comparando os 2 primeiros chars. if(strncmp(matriculas[i], "AB", 2) == 0) Edited July 16, 2012 at 02:58 PM by mogers "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
Dr_Lion Posted July 24, 2012 at 01:25 PM Report Share #469984 Posted July 24, 2012 at 01:25 PM (edited) Vai para aqui alguma confusão... Para comprar caracteres, e como tens definido é um array de carateres, podes comparar um a um: nome[0]='A'; nome[1]='b'; nome[2]='c'; //é o mesmo que nome[3]="Abc"; strcmp(nome, "Abc"); //nao esquecer o terminador na definição da string nome, ou dá erro! if (strncmp(nome+1, "bc", 2)==0) if (strncmp(nome, "Ab", 2)==0) if (nome[1]==b) printf("Certo."); -atenção que não incluí o terminador da string '\0' que deve ser sempre incluido. nome é um ponteiro para uma string. Se quiseres comparar uma string (entenda-se) mais que um caracter, podes optar por usar o strcmp ou o strncmp usando os ponteiros, ou uma string estática no formato "texto", em que o segundo compara os primeiros "n" caracteres das duas strings. O primeiro compara as strings até ao '\0' Edited July 24, 2012 at 01:30 PM by Dr_Lion Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted July 24, 2012 at 01:27 PM Report Share #469985 Posted July 24, 2012 at 01:27 PM Vai para aqui alguma confusão... Para comprar caracteres, e como tens definido é um array de carateres, podes comparar um a um: escreve o código que compara os 50 primeiros caracteres .... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
pmg Posted July 24, 2012 at 01:33 PM Report Share #469988 Posted July 24, 2012 at 01:33 PM nome[3]="Abc"; nome é um ponteiro para uma string. Não! nome é um array de caracteres (sem um terminador). Em especial, nome não é um ponteiro. Arrays e ponteiros são coisas diferentes. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
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