Duvida em C

Haro_man

Power Member
Boas pessoal :)

Alguem me sabe dizer quais são os argumentos e o seu papel que existem na função main ?

Tenho aqui uma linha de codigo que não consigo decifrar realmente o que isto faz :

for (i = 0; s; s = s>=65 && s <=90 ? s + 32 : s, i++) ;

PS: este ? e os dois pontos a frente ainda nao chegei a perceber bem qual a sua função

:kfold:
 
Boas pessoal :)

Alguem me sabe dizer quais são os argumentos e o seu papel que existem na função main ?

int main(int argc, char* argv[]);

(salvo erro é assim)

O argc dá-te o número de argumentos que o programa recebe quando é executado, isto é, quando executas o comando na consola podes colocar algumas palavras à frente do nome do programa, isto são os argumentos.

O argv é o array desses argumentos, isto é, em cada posição do array está uma palavra, a separação é feita pelo space.

Tenho aqui uma linha de codigo que não consigo decifrar realmente o que isto faz :

for (i = 0; s; s = s>=65 && s <=90 ? s + 32 : s, i++) ;

PS: este ? e os dois pontos a frente ainda nao chegei a perceber bem qual a sua função

:kfold:


Não faço ideia do que é o s, mas quanto ao condição?valor1:valor2, isto é sinónimo a:

Código:
if (condição == true)
    return valor1;
else
    return valor2;

Atenção que este return que falo aqui, não é um return para interromper a função, mas sim o valor que vai ser considerado naquela operação. Em vez do tradicional if de statements, vais ter um if de expressions. Espero não te ter confundido com isto ;)
 
Código:
s[i] = s[i]>=65 && s[i] <=90 ? s[i] + 32 : s[i]

Este código utiliza o operador condicional '?', que é um operador ternário que indica que espera 3 argumentos.
É do tipo: condicao ? expressao1 : expressao2
Funciona da seguinte maneira:
- A condição é avaliada
- Se o resultado for verdade, então o resultado de toda a expressão é o valor devolvido por expressao1
- Senão é o valor devolvido por expressao2

É quase semelhante a:

Código:
if (s[i]>=65 && s[i]<=90)
        s[i]=s[i]+32;
     else
         s[i]=s[i];

Os argumentos da função main são argc e argv:
Código:
int main(int argc, char *argv[])

São 2 parâmetros que permitem que um programa receba argumentos passados na linha de comando.
argc - inteiro que indica quantos argumentos foram passados na linha de comando (incluindo o próprio nome do programa)
argv - vector contendo todas as strings passadas na linha de comando

Esse for que colocaste aí, tem um ; no fim o que quer dizer que não tem instruções, ou seja, só tem inicializações (i=0), condição (s) e pós-instruções (s = s>=65 && s <=90 ? s + 32 : s, i++).
Ou seja, é equivalente a:
Código:
i=0;
     while (s[i]) {
           s[i] = s[i]>=65 && s[i] <=90 ? s[i] + 32 : s[i];
           i++;
           }
ou seja, enquanto s!=0, ele faz o teste da condição, atribuindo em seguida um novo valor a s (estes 2 passos são feitos na 1ª linha de código do while). Para iterar no ciclo, incrementa-se o i.
 
Esse for não é nada mais que uma maneira estranha de converter uma string para minúsculas.

Código ASCII do 'A' = 65
Código ASCII do 'Z' = 90

Código ASCII do 'a' = 97 = 65 + 32 = 'A' + 32
Código ASCII do 'z' = 122 = 90 + 32 = 'Z' + 32


Sempre que esse ciclo encontra uma maiúscula converte-a para minúscula. O caracter de terminação de string é o '\0' que tem código ASCII 0, logo quando encontrar esse caracter o 0 é interpretado como false, e qualquer outro caracter que surja como true.
 
Código:
for(i = 0; stringX[i] != 0x00; i++)
 if(stringX[i] > 0x40 && stringX[i] < 0x5B)
 stringX[i] = stringX[i] | 0x20;

LOL mais simples e faz o mesmo e até mais rápido...

já agora no código que o Haro_man postou, o ciclo for termina quando??
OK já vi: executa enquanto s for verdadeiro (char não nulo)


Cumprimentos
 
Última edição:
Como referi o ciclo termina quando encontrar o caracter '\0' (termina a string) que tem código ASCII 0. Nessa altura a condição é falsa e o ciclo termina.
Mais simples? Não vejo onde... Mais rápido sim, dado que a adição foi substituída por um OU.

Se é para ser mais legível creio que assim fica melhor:
Código:
#include <ctype.h>

(...)
for( int i = 0; i < strlen( str[i] ); ++i )
    str[i] = tolower( str[i] );
(...)
 
Última edição:
E inadvertidamente acabaram de fazer todo o trabalho de casa do gajo. Boa.

Caro greatbunzinni , ha pessoas que não tem oportunidade de ter aulas , ou que alguem lhes ensine C, e tem de se safar sozinhos e a custa de algumas ajudas. No meu caso, tenho que re-aprender sozinho , porque quando tive a oportunidade de aprender não quis saber. Agora vou fazer exame e não tenho aulas , ou seja estou externo numa escola e tenho que me desenrascar , se andasse a ter aulas não vinha aqui para me fazerem os meus TPC's , mas vim sim obter ajuda.


Em relação ao resto obrigado a todos os que debateram o problema :)

De facto nao tava mesmo a chegar a conclusão que aquilo fossem os nr's da tabela asci para serem convertidos para minusculas.

Obrigado pela preciosa ajuda :001:
 
Caro greatbunzinni , ha pessoas que não tem oportunidade de ter aulas , ou que alguem lhes ensine C, e tem de se safar sozinhos e a custa de algumas ajudas. No meu caso, tenho que re-aprender sozinho , porque quando tive a oportunidade de aprender não quis saber. Agora vou fazer exame e não tenho aulas , ou seja estou externo numa escola e tenho que me desenrascar , se andasse a ter aulas não vinha aqui para me fazerem os meus TPC's , mas vim sim obter ajuda.
Podes vir aqui com o drama do "ai estou a tirar um curso mas não vou às aulas" mas a verdade é que vieste aqui, espetaste o enunciado dos problemas, não apresentaste qualquer trabalho autónomo e limitaste-te a colher as respostas.

Tendo em conta a altura do campeonato, o teu desespero para obter respostas e agora a tua declaração que nem pões os pés nas aulas então tudo indica que isso eram perguntas de algum mini-teste. Isso implica que vais receber um brinde de avaliação que não corresponde àquilo que sabes e que com certeza será superior a gente do teu curso que sabe mais que tu e, ao contrário do teu caso, esforçou-se para aprender alguma coisa.

Por isso podes achar o teu caso muito tocante mas na verdade isso não justifica absolutamente nada que andes a servir-te do pessoal dum forum para fazer os teus testes por ti.

No final ainda passas e acabas o curso sem saber absolutamente nada. Depois vais pedir ao pessoal do forum para trabalhar por ti?
 
Podes vir aqui com o drama do "ai estou a tirar um curso mas não vou às aulas" mas a verdade é que vieste aqui, espetaste o enunciado dos problemas, não apresentaste qualquer trabalho autónomo e limitaste-te a colher as respostas.

Tendo em conta a altura do campeonato, o teu desespero para obter respostas e agora a tua declaração que nem pões os pés nas aulas então tudo indica que isso eram perguntas de algum mini-teste. Isso implica que vais receber um brinde de avaliação que não corresponde àquilo que sabes e que com certeza será superior a gente do teu curso que sabe mais que tu e, ao contrário do teu caso, esforçou-se para aprender alguma coisa.

Por isso podes achar o teu caso muito tocante mas na verdade isso não justifica absolutamente nada que andes a servir-te do pessoal dum forum para fazer os teus testes por ti.

No final ainda passas e acabas o curso sem saber absolutamente nada. Depois vais pedir ao pessoal do forum para trabalhar por ti?

realmente.. eu n vou as aulas porque nao tenho aulas ! sabes o que e tar externo por acaso? so te podes inscrever aos exames , mas nem sequer tens aulas para isso . Quando nao se consegue resolver alguma coisa o que e que se faz? se calhar nao pedes ajuda..
 
Back
Topo