Ir ao conteúdo

C retornar uma string no if


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

Bom dia!

 

Estou com uma dúvida:

 

#include <stdio.h>
  
  
  int main(){

  // lugar = 0 -> DISPONIVEL // lugar = 1 -> OCUPADO
  
  int lugar=0;
  
  lugar==1? return 'OCUPADO' : return 'DISPONIVEL';
  
  
  return 0;
  
}

 

o que devo fazer para isso funcionar?

  • Solução
Postado
  Em 04/09/2019 às 13:50, Reberth Siqueira disse:

lugar==1? return 'OCUPADO' : return 'DISPONIVEL'; return 0;

Expandir  

 

Olá!

  • o return 0; nunca ia ser executado se o comando anterior funcionasse. Isso deveria gerar um erro de compilação marcando essa linha do return 0; como código inatingível. Sem surpresas afinal ele é mesmo, já que de qualquer maneira teria retornado na linha anterior
  • 'OCUPADO' está errado. O delimitador para string é " e deveria escrever "OCUPADO". Para um único caracter, char, você escreveria 'O' e estaria ok.
  • Você declarou int main() então main() retorna um int
  • O operador ? deve ser seguido por expressões, não comandos. E return é um comando.Exemplo
int valor = 0;
int valor_final = valor > 30 ? valor+30 : valor+25;
printf("valor final: %d valor %d\n", valor_final, valor);

mostraria 

valor final: 25 valor 0

Você pode conseguir o resultado que quer com uma função assim por exemplo

char* status_lugar(int lugar)
{
    char* o = "OCUPADO";
    char* d = "DISPONIVEL";
    char* status = lugar == 1 ? o : d;
    return status;
}

A função assim declarada :

  • retorna (char*) que é o caso aqui.
  • A expressão define o valor da variável status em uma expressão então está ok usar o operador
  • O return retorna um (char*) então ok.

e teria essa saída 

status_lugar(1) retornou 'OCUPADO'
status_lugar(0) retornou 'DISPONIVEL'
status_lugar(1500) retornou 'DISPONIVEL'
valor final: 25 valor 0

para esse programa de teste

#include <stdio.h>

char* status_lugar(int lugar)
{
    char* o = "OCUPADO";
    char* d = "DISPONIVEL";
    char* status = lugar == 1 ? o : d;
    return status;
}

int main(int argc, char** argv)
{
    printf("status_lugar(1) retornou '%s'\n", status_lugar(1));
    printf("status_lugar(0) retornou '%s'\n", status_lugar(0));
    printf("status_lugar(1500) retornou '%s'\n", status_lugar(1500));
  
    int valor = 0;
    int valor_final = valor > 30 ? valor + 30 : valor + 25;
    printf("valor final: %d valor %d\n", valor_final, valor);

    return 0;
}

Espero que ajude a entender

  • Curtir 1
  • Amei 1
Postado
  Em 04/09/2019 às 14:54, arfneto disse:

 

Olá!

  • o return 0; nunca ia ser executado se o comando anterior funcionasse. Isso deveria gerar um erro de compilação marcando essa linha do return 0; como código inatingível. Sem surpresas afinal ele é mesmo, já que de qualquer maneira teria retornado na linha anterior
  • 'OCUPADO' está errado. O delimitador para string é " e deveria escrever "OCUPADO". Para um único caracter, char, você escreveria 'O' e estaria ok.
  • Você declarou int main() então main() retorna um int
  • O operador ? deve ser seguido por expressões, não comandos. E return é um comando.Exemplo
int valor = 0;
int valor_final = valor > 30 ? valor+30 : valor+25;
printf("valor final: %d valor %d\n", valor_final, valor);

mostraria 

valor final: 25 valor 0

Você pode conseguir o resultado que quer com uma função assim por exemplo

char* status_lugar(int lugar)
{
    char* o = "OCUPADO";
    char* d = "DISPONIVEL";
    char* status = lugar == 1 ? o : d;
    return status;
}

A função assim declarada :

  • retorna (char*) que é o caso aqui.
  • A expressão define o valor da variável status em uma expressão então está ok usar o operador
  • O return retorna um (char*) então ok.

e teria essa saída 

status_lugar(1) retornou 'OCUPADO'
status_lugar(0) retornou 'DISPONIVEL'
status_lugar(1500) retornou 'DISPONIVEL'
valor final: 25 valor 0

para esse programa de teste

#include <stdio.h>

char* status_lugar(int lugar)
{
    char* o = "OCUPADO";
    char* d = "DISPONIVEL";
    char* status = lugar == 1 ? o : d;
    return status;
}

int main(int argc, char** argv)
{
    printf("status_lugar(1) retornou '%s'\n", status_lugar(1));
    printf("status_lugar(0) retornou '%s'\n", status_lugar(0));
    printf("status_lugar(1500) retornou '%s'\n", status_lugar(1500));
  
    int valor = 0;
    int valor_final = valor > 30 ? valor + 30 : valor + 25;
    printf("valor final: %d valor %d\n", valor_final, valor);

    return 0;
}

Espero que ajude a entender

Expandir  

Boa tarde @arfneto,

 

Sensacional tua explicação! Muito obrigado! 

 

Fiquei apenas com duas dúvidas:

  • Porque "char*" invés de "char"?
  • Qual finalidade dos parametros "int argc" e "char** argv" dentro da função main?

sds,

 

 

Postado

olá

 

pensando ainda em sua função e o operador ? note que para uma função que não seja declarada como void() o comando return é seguido por uma expressão, ainda que seja só um número constante, tipo um return 0; para a função main().

 

Isso quer dizer que você pode usar esse operador ? na avaliação da expressão que vai retornar. Não para escolher entre comandos return, espero que tenha entendido isso agora.

 

Essa função que usamos no exemplo

char* status_lugar(int lugar)
{
    char* o = "OCUPADO";
    char* d = "DISPONIVEL";
    char* status = lugar == 1 ? o : d;
    return status;
}

Poderia muito bem ser escrita assim

char* outra_status_lugar(int lugar)
{
    char* o = "OCUPADO";
    char* d = "DISPONIVEL";
    return (char*) lugar == 1 ? o : d;
}

Ou mesmo assim, mais perto do  que você escreveu inicialmente

char* ainda_outra_status_lugar(int lugar) { return (char*)(lugar == 1) ? "OCUPADO" : "DISPONIVEL"; };

Com o mesmo resultado...

 

(char) ou (char*)

(char) descreve um único caracter. (char*) por outro lado descreve uma variável que tem o endereço de um char, se diz que aponta para um char. Veja:

char letra='A';
char vetor="A";

letra é um variável, ocupa em geral um byte e lá estará gravado um A.

mas vetor, por outro lado, tem o valor de um endereço na memória. E ao acessar esse endereço estará lá gravado um 'A'. E no endereço seguinte estará gravado um byte com 0, e é assim que se identifica uma string em C: um conjunto de caracteres seguidos por um byte com valor zero, um NULL.

Então vetor vale  "A" e ocupa dois bytes a partir do endereço gravado em vetor. e letra vale 'A' e é exatamente esse valor que está no endereço de letra, que se escreve  &letra. Entenda que uma string de tamanho zero ocupa um byte, onde está o 0 que marca o fim dela. strlen() devolve o tamanho de uma string e está declarada em string.h. sizeof() devolve o tamanho de uma variável e é um operador padrão, como o

Exemplo

    char    letra = 'A';
    char*    vetor = "A";
    printf("%d\n", sizeof(letra));
    printf("%d\n", strlen(vetor));

mostraria

1
1

O operador * nesse caso denota o que se chama de nível de referência, nível de direcionamento escrevem alguns, indicando que a variável que vem a seguir aponta para algo do tipo, não sendo ela própria algo do tipo. Mesmo caso de (char**) ou (char***). Muito dessa confusão talvez venha dos cursos de programação onde se ensina a declarar coisas assim

char letra, *vetor;

Não quero entrar em discussões religiosas sobre o que está certo, mas entendo que o mais importante para o aluno era aprender que char* valor indica que valor é um ponteiro para um char, antes de entender que char *valor indica que *valor é um char e então valor contem o endereço de um char.

char letra;
char* vetor;
char** vetor_de_vetores;
char*** vetor_de_vetor_de_vetores;

Isso declara sem ambiguidade, na minha opinião. E ajuda a entender.

E que p$%%a é essa de (char*) então? Pois é: isso indica mais do mesmo: no endereço de memória contido em vetor está um endereço de um char. E de modo similar para o caso de (char**) ou (char***).

 

O caso clássico de (char**) e a sua pergunta sobre argv e argv

Quando você roda um programa C, digamos chamado p, o sistema monta uma série de parâmetros para você, quer você use ou não, e são chamados de argumentos da linha de comando. Eu costumo dizer que esse programa que vou postar aqui deveria ser o segundo programa em C que se escreve num curso, depois do clássico HelloWorld.c.

Ao declarar main() como int main(int argc, char** argv) você está dizendo que main() retorna um int, e recebe esses dois argumentos. E de onde vem esses caras? O sistema prepara isso a partir da linha de comando.

 

Exemplo p -r teste.c no Linux

Nosso hipotético programa p.c receberia argc = 3; argv é do tipo char**, de modo que aponta para endereços de strings e o sistema vai montar isso de graça com os valores digitados. Nesse caso

argv[0] = "p"
argv[1] = "-r"
argv[2] = "teste.c"

todos strings bem arrumadinhas. 

A primeira delas é o nome do programa executável. Sempre.

 

Exemplo da saída do programa

O primeiro argumento, argv[0], sempre existe e tem o nome completo do executavel

Nesse caso: [C:\Users\toninho\source\repos\ch-190827-argv\x64\Debug\ch-190827-argv.exe]

O programa foi chamado agora com 8 argumentos

Eis os argumentos:

0: 'C:\Users\toninho\source\repos\ch-190827-argv\x64\Debug\ch-190827-argv.exe'
1: 'A'
2: 'B'
3: 'C'
4: 'D'
5: 'E'
6: 'Qualquer'
7: '132'

So isso

O  programa

#include "stdio.h"
int main(int argc, char** argv)
{
    printf("\n\n\nO primeiro argumento, argv[0], sempre existe e tem o nome completo do executavel\n");
    printf("\nNesse caso: [%s]\n", argv[0]);
    printf("\nO programa foi chamado agora com %d argumentos\n", argc);
    printf("\nEis os argumentos:\n\n");
    for (int i = 0; i < argc; i++)
    {
        printf("%d: '%s'\n", i, argv[i]);
    }    // end for
    printf("\nSo isso\n");
}    // end main()

Chamado desse jeito

ch-190827-args A B C D E Qualquer 132

Espero ter ajudado

 

 

adicionado 2 minutos depois
  Em 04/09/2019 às 13:50, Reberth Siqueira disse:

Bom dia!

 

Estou com uma dúvida:

 

#include <stdio.h>
  
  
  int main(){

  // lugar = 0 -> DISPONIVEL // lugar = 1 -> OCUPADO
  
  int lugar=0;
  
  lugar==1? return 'OCUPADO' : return 'DISPONIVEL';
  
  
  return 0;
  
}

 

o que devo fazer para isso funcionar?

Expandir  

 

Então uma resposta curta seria :

declare uma função assim

char* status_lugar(int lugar)
{ 
    return (char*)(lugar == 1) ? "OCUPADO" : "DISPONIVEL";
};


 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Mostrar mais  

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

Mostrar mais  
×
×
  • Criar novo...