Jump to content

srtcmp


alphasil

Recommended Posts

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

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 by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

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 by alphasil
gmc11

 

Link to comment
Share on other sites

        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
Link to comment
Share on other sites

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

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

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
Link to comment
Share on other sites

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 by alphasil
gmc11

 

Link to comment
Share on other sites

Se é "começar por AB" deves usar antes o strncmp comparando os 2 primeiros chars.

if(strncmp(matriculas[i], "AB", 2) == 0)
Edited 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

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 by Dr_Lion
Link to comment
Share on other sites

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.