[C++] Problema com uma função char - C/C#/C++ - Clube do Hardware
Problema com uma função char
C++ Problema com uma função char
Por Willian Riviera, 22 de maio de 2018 em C/C#/C++
Willian Riviera 0
Então, estou tendo um problema no meu código, estou tentando fazer uma função retornar um char, porém, está aparecendo "Segmentation Fault"
char FuncA(char* x){
printf("\nInforme o nome do aluno\n");
scanf(" %[^\n]s", &x);
Você está fazendo isto em C ou em C++? Seu código está usando funções do C, mas o cabeçalho do tópico diz que é sobre C++.
Em C não dá pra fazer isso, pois no C strings são armazenadas em vetores de chars, e não dá pra retornar um vetor no C.
Nesse caso o melhor seria não retornar nada, apenas usar o próprio x do parâmetro de entrada da função como a variável de "retorno", já que isto é um ponteiro (char *) logo recebe uma referência apontando para o espaço da memória onde está o vetor de chars passado para a função, portanto toda alteração que fizer dentro da função vai estar alterando os valores no vetor original fora da função, no escopo onde a função foi chamada.
void FuncA(char *x){
scanf(" %100[^\n]", x);
FuncA(x);
Note também as alterações que eu fiz no scanf... O nome de um ponteiro (sem asterisco), vetores e matrizes (sem colchetes) já são referências, logo não deve-se usar o & antes do nome. E o especificador de caracteres é %[], não vai um s depois, o %s é um especificador diferente (eu também limitei a 100 caracteres para não estourar o comprimento do vetor com uma string longa demais).
Obs: Em C++ você poderia retornar strings, mas lá também tem o tipo string.
@isrnick, tem como configurar o compilador só para aceitar instruções de uma linguagem? Por exemplo, o código é para ser feito em C, teria como fazer não aceitar "coisas" que são do C++ e vice-versa?
Obs.: No meu caso eu uso Dev++ v5.11 (4.92 x64)
*dev-c++
2 horas atrás, isrnick disse:
A menos que..... retorne uma struct com o vetor dentro sheushesuhesuh
Ou retorne um vetor dinâmico >_<
12 minutos atrás, vangodp disse:
O primeiro seria uma gambiarra se o objetivo é fazer a struct com o vetor dentro só pra poder retornar na função.
O segundo seria o jeito legítimo de retornar um 'vetor' criado dentro de uma função, a única complicação é que precisa lembrar de liberar a memória que foi reservada para o vetor.
@Simon Viegas Tecnicamente essas funções do C estão disponíveis no C++, logo podem ser usadas nele, embora seja preferível usar as funções próprias do C++ pois dão muito mais opções usando os recursos da linguagem.
O C normalmente não aceita as coisas do C++, e vai dar erro se tentar compilar no compilador do C.
O problema é que as pessoas usam a IDE de modo errado.
Para a IDE arquivos com extensão .c contém código em C logo a IDE usa o compilador da linguagem C para compilar, e arquivos com extensão .cpp ou .cc contém código em C++ logo usa o compilador do C++ para compilar.
O que normalmente acontece é que as pessoas criam arquivo com extensão .cpp e fazem o código em C, mas a IDE não tem como saber disso e compila usando o compilador do C++, aí o código roda porque os recursos usados também existem no C++. Aí depois o programador vai ter problemas lá na frente quando usar algum recurso do C que não funciona no C++...
É aí que acontecem as bizarrices, como usuário importar bibliotecas do C que já existem equivalentes no C++ e coisas do tipo, criando uma bagunça, frequentemente tem códigos no fórum com ambos <iostream> e <stdio.h> inclusos...
De uma forma geral quando se programa em C todos esses problemas podem ser evitados se o programador simplesmente colocar extensão .c no arquivo do código, aí a IDE compila com o compilador do C, e os recursos do C++ não são aceitos (também ajuda configurar para ativar alguns warnings/alertas durante a compilação, como colocando -Wall nas configurações de compilação).