Como entrar com uma frase para const char.Em C [RESOLVIDO]

1. Como entrar com uma frase para const char.Em C [RESOLVIDO]

Marcos Souza
IUseLinux

(usa Slackware)

Enviado em 21/12/2016 - 11:19h


#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 5000
int main()
{
puts("encryptme começou!");
FILE *f = fopen("encryptme.txt", "w");
if( f == NULL )
{
puts("Erro! \n");
exit(1);
}
puts("Escreva o seu texto");
const char *mode = malloc(MAX_LENGTH);
scanf("%s", &mode);
fprintf(f ,"Text: %s", mode);
return 0;

}

Tenho que fazer o o usuario colocar um texto para gerar um txt com fprintf para encripitar com shell script(ativando o ccrypt)


OBS:Eu sei que o nome do programa ficou parecido com nome de ransomware mas não é rsrsr.
Output:

encryptme começou!
Escreva o seu texto
aaaaaaaaaaaaaa
Segmentation fault


Arquivo criado:Fica sem conteudo.




  


2. Re: Como entrar com uma frase para const char.Em C [RESOLVIDO]

Marcos Souza
IUseLinux

(usa Slackware)

Enviado em 21/12/2016 - 11:49h

IUseLinux escreveu:


#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 5000
int main()
{
puts("encryptme começou!");
FILE *f = fopen("encryptme.txt", "w");
if( f == NULL )
{
puts("Erro! \n");
exit(1);
}
puts("Escreva o seu texto");
const char *mode = malloc(MAX_LENGTH);
scanf("%s", &mode);
fprintf(f ,"Text: %s", mode);
return 0;

}

Tenho que fazer o o usuario colocar um texto para gerar um txt com fprintf para encripitar com shell script(ativando o ccrypt)


OBS:Eu sei que o nome do programa ficou parecido com nome de ransomware mas não é rsrsr.
Output:

encryptme começou!
Escreva o seu texto
aaaaaaaaaaaaaa
Segmentation fault


Arquivo criado:Fica sem conteudo.



Eu resolvi!! era so tirar do scanf o "&", e deixar o "mode" puro, ai foi kkkk.

"Talk is cheap, show me the code"



3. Re: Como entrar com uma frase para const char.Em C [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/12/2016 - 17:12h

Se você aloca um ponteiro para caracteres constantes, não deveria em hipótese nenhuma querer escrever na região alocada.

Seu programa apenas parece que deu certo, mas ele está errado. No mínimo errado conceitualmente. E compiladores mais modernos vão alertar sobre esse erro. Veja o que mostra o GCC quando eu tento compilar seu programa.

gcc -Wall -Werror -O2 -pedantic-errors x.c -o x
x.c: In function ‘main’:
x.c:15:5: error: writing into constant object (argument 2) [-Werror=format=]
scanf("%s", mode);
^


Se você quer uma região de memória num contexto em que os dados que possam ser modificados, deve referir-se a ela através de um ponteiro que não considere tais dados constantes.


4. Re: Como entrar com uma frase para const char.Em C [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/12/2016 - 17:17h

E outra coisa: em C é inadequado declarar main como “int main()”. Ou você diz “int main(void)”, ou diz “int main(int argc, char **argv)”. No primeiro caso, você indica que seu programa não quer receber argumentos do ambiente de execução. No segundo, você diz que tais argumentos podem estar presentes; se estiverem, a quantidade de argumentos estará contida em argc, e argv se comportará como um vetor de strings, contendo o valor de cada argumento.


5. Re: Como entrar com uma frase para const char.Em C [RESOLVIDO]

Marcos Souza
IUseLinux

(usa Slackware)

Enviado em 21/12/2016 - 18:42h

paulo1205 escreveu:

E outra coisa: em C é inadequado declarar main como “int main()”. Ou você diz “int main(void)”, ou diz “int main(int argc, char **argv)”. No primeiro caso, você indica que seu programa não quer receber argumentos do ambiente de execução. No segundo, você diz que tais argumentos podem estar presentes; se estiverem, a quantidade de argumentos estará contida em argc, e argv se comportará como um vetor de strings, contendo o valor de cada argumento.


Hum obrigado pelas dicas.
Fiz uma correçao e coloquei int main(void)
E inves de colocar scanf coloquei fgets, e agora?

"Talk is cheap, show me the code"



6. Re: Como entrar com uma frase para const char.Em C [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 22/12/2016 - 12:45h

O problema não é trocar scanf() por fgets(). O problema é você dizer que um ponteiro aponta para dados constantes,as tratar tais dados como se não fossem constantes.

Tanto scanf() quanto fgets() são funções que recebem ponteiros para dados não-constantes. Assim sendo, a maneira certa de corrigir seu programa é retirar o atributo const da declaração do ponteiro.


7. Re: Como entrar com uma frase para const char.Em C [RESOLVIDO]

Marcos Souza
IUseLinux

(usa Slackware)

Enviado em 22/12/2016 - 13:56h

paulo1205 escreveu:

O problema não é trocar scanf() por fgets(). O problema é você dizer que um ponteiro aponta para dados constantes,as tratar tais dados como se não fossem constantes.

Tanto scanf() quanto fgets() são funções que recebem ponteiros para dados não-constantes. Assim sendo, a maneira certa de corrigir seu programa é retirar o atributo const da declaração do ponteiro.


Ok, obrigado de novo.

"Talk is cheap, show me the code"