Dúvida bem iniciante

1. Dúvida bem iniciante

jose augusto kochem
kochem

(usa Debian)

Enviado em 24/09/2019 - 16:13h

Olá pessoal sou novo em C, bem como em programação, estou cursando uma cadeira em programação de software básico, e após quebrar muito a cabeça, resolvi pedir ajuda.

Questão é que preciso redirecionar um arquivo.txt para meu programa em .C, mas eu não abro um ficheiro, ele somente lê os dados do .txt e trabalha com eles no .C.

o terminal então ficaria ./Q1 < arquivo.txt

meu arquivo .C
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
char s[300];
char texto[300];
char tam;
while (s != -1) {
if (scanf("%lf", &s) != 1) {
return 1;
}
if (s != -1) { // -1 sinaliza o final, e NÃO é somado
tam=len(s);
printf("TEXTO = %s\n", s);
for(int i=0;i<tam;i++){
printf("TEXTO = %s\n", s[i]);
}
}
}

return 0;
}



meu arquivo .txt

um frase qualquer para teste de leitura
-1



PROBLEMA : o compilador executa sem erro a principio, só dando warning mas deve ser por que todas variaveis ainda nao receberão o valor. No final ele executa todo o programa, mas nao imprimi na tela o texto do arquivo, com podem ver tentei até de várias maneiras imprimir, mas sem sucesso.


  


2. Re: Dúvida bem iniciante

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/09/2019 - 03:49h

Não ignore alertas que o compilador lhe dá. Tais alertas têm razão de ser — até no caso de variáveis que ainda não receberam valor (e o alerta está ali justamente porque o compilador detectou que você está tomando decisões a partir de valores não definidos).

kochem escreveu:

meu arquivo .C
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
char s[300];
char texto[300];
char tam;
while (s != -1) {


Aqui você está comparando o endereço do primeiro elemento do vetor com o valor inteiro -1. Possivelmente um dos alertas que você recebeu é a respeito da diferença de tipos (ponteiro para caráter × inteiro) dessa comparação, que acaba não fazendo sentido, e que, se levada a cabo, muitíssimo provavelmente será sempre falsa (i.e. o laço de repetição nunca será executado).

Além disso, eu suspeito que você gostaria de, de alguma maneira, comparar o conteúdo do vetor com o valor -1, não o endereço que ele ocupa na memória. Para tanto, primeiro você deveria fazê-lo da forma correta, referindo-se especificamente ao conteúdo com algo como s[n], sendo n um valor inteiro menor que o tamanho do vetor, ou através de uma função que compare elementos sucessivos do vetor, tal como memcmp() ou strcmp(). E também seria muito importante que você populasse o vetor antes de fazer a primeira comparação de conteúdo, pois, na forma como está, o vetor começa com 300 elementos de valor indefinido, implicando que mesmo que, a comparação tivesse sido expressa na forma correta, ela produziria resultado imprevisível numa primeira ocorrência, já que os valores comparados seriam desconhecidos, quase aleatórios.

    if (scanf("%lf", &s) != 1) { 


Antes de apontar os erros na linha acima, quero parabenizá-lo por algo que é raro ver um iniciante — e mesmo alguns nem tão iniciantes assim — fazer, que e testar o valor de retorno de scanf(). Mantenha esse hábito.

Porém, aqui também você tem um erro de incompatibilidade de tipos, para o qual possivelmente o compilador também emitiu um alerta, entre a especificação da conversão, que comanda a extração de um valor de ponto flutuante de dupla precisão (tipo double), e o ponteiro para o local em que o valor extraído será guardado (cujo tipo é ponteiro para vetor de 300 elementos do tipo char).

Se você quiser ler um valor do tipo double, o segundo argumento deveria ser o endereço (ponteiro) para variável do tipo double.

Se, por outro lado, você quiser ler uma sequência de caracteres, então tem de trocar tanto a especificação da conversão (para algo como "%s" ou "%[" — recomendo enfaticamente que você leia a documentação de scanf()) quanto o destino dos dados extraídos, de modo que o tipo seja ponteiro para caracteres, em vez de ponteiro para vetor de caracteres. Alternativamente, você poderia usar outra forma de leitura, voltada especificamente para a leitura de linhas de texto, tais como fgets() ou getline(),

      return 1;
}
if (s != -1) { // -1 sinaliza o final, e NÃO é somado


Aqui você repete o erro de comparar endereço (ponteiro) com inteiro, que é algo que não faz sentido.

      tam=len(s); 


A função len() não existe como parte da biblioteca padrão do C. É algo que você implementou, ou você quis dizer strlen()?

	printf("TEXTO = %s\n", s);
for(int i=0;i<tam;i++){
printf("TEXTO = %s\n", s[i]);
}
}
}

return 0;
}




... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


3. Re: Dúvida bem iniciante

jose augusto kochem
kochem

(usa Debian)

Enviado em 26/09/2019 - 12:21h

paulo1205 escreveu:





Não ignore alertas que o compilador lhe dá. Tais alertas têm razão de ser — até no caso de variáveis que ainda não receberam valor (e o alerta está ali justamente porque o compilador detectou que você está tomando decisões a partir de valores não definidos).

kochem escreveu:

meu arquivo .C
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
char s[300];
char texto[300];
char tam;
while (s != -1) {


Aqui você está comparando o endereço do primeiro elemento do vetor com o valor inteiro -1. Possivelmente um dos alertas que você recebeu é a respeito da diferença de tipos (ponteiro para caráter × inteiro) dessa comparação, que acaba não fazendo sentido, e que, se levada a cabo, muitíssimo provavelmente será sempre falsa (i.e. o laço de repetição nunca será executado).

Além disso, eu suspeito que você gostaria de, de alguma maneira, comparar o conteúdo do vetor com o valor -1, não o endereço que ele ocupa na memória. Para tanto, primeiro você deveria fazê-lo da forma correta, referindo-se especificamente ao conteúdo com algo como s[n], sendo n um valor inteiro menor que o tamanho do vetor, ou através de uma função que compare elementos sucessivos do vetor, tal como memcmp() ou strcmp(). E também seria muito importante que você populasse o vetor antes de fazer a primeira comparação de conteúdo, pois, na forma como está, o vetor começa com 300 elementos de valor indefinido, implicando que mesmo que, a comparação tivesse sido expressa na forma correta, ela produziria resultado imprevisível numa primeira ocorrência, já que os valores comparados seriam desconhecidos, quase aleatórios.

    if (scanf("%lf", &s) != 1) { 


Antes de apontar os erros na linha acima, quero parabenizá-lo por algo que é raro ver um iniciante — e mesmo alguns nem tão iniciantes assim — fazer, que e testar o valor de retorno de scanf(). Mantenha esse hábito.

Porém, aqui também você tem um erro de incompatibilidade de tipos, para o qual possivelmente o compilador também emitiu um alerta, entre a especificação da conversão, que comanda a extração de um valor de ponto flutuante de dupla precisão (tipo double), e o ponteiro para o local em que o valor extraído será guardado (cujo tipo é ponteiro para vetor de 300 elementos do tipo char).

Se você quiser ler um valor do tipo double, o segundo argumento deveria ser o endereço (ponteiro) para variável do tipo double.

Se, por outro lado, você quiser ler uma sequência de caracteres, então tem de trocar tanto a especificação da conversão (para algo como "%s" ou "%[" — recomendo enfaticamente que você leia a documentação de scanf()) quanto o destino dos dados extraídos, de modo que o tipo seja ponteiro para caracteres, em vez de ponteiro para vetor de caracteres. Alternativamente, você poderia usar outra forma de leitura, voltada especificamente para a leitura de linhas de texto, tais como fgets() ou getline(),

      return 1;
}
if (s != -1) { // -1 sinaliza o final, e NÃO é somado


Aqui você repete o erro de comparar endereço (ponteiro) com inteiro, que é algo que não faz sentido.

      tam=len(s); 


A função len() não existe como parte da biblioteca padrão do C. É algo que você implementou, ou você quis dizer strlen()?

	printf("TEXTO = %s\n", s);
for(int i=0;i<tam;i++){
printf("TEXTO = %s\n", s[i]);
}
}
}

return 0;
}




... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)





int main(void) {
char s[300];
char texto[300];
char tam;
while (s != -1) {


Nesse trecho do meu While seria em que meu vetor S, iria receber o texto do arquivo, e dentro do meu arquivo a ultima linha era -1, então a ideia seria que while iria passar do .txt para vetor de s, até chegar no -1, que é a minha ultima linha. quando visse que a ultima linha era -1, sairia do while e o vetor estaria carregado com o texto, mas vendo isso, e lendo seus argumentos, deveria fazer while (s strcpr "-1")\ seria mais ou menos isso certo?

Paulo muito obrigado pelas suas dicas, apontado meu erros, irei procurar estudar esses erros bem como implementar as soluções do mesmo.
Venho da cadeira de algoritmos de programação que foi feita em JavaScript, onde posso dizer que as coisas estão mais mastigadas para nós, e como C já é uma linguagem mais baixo nível, enfrento muitos problemas em trabalhar com a memória. Já notei que muitas vezes eu estou buscando o endereço da memória e não o valor que está nela.

Mais uma vez muito obrigado.









Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts