Ir para conteúdo
Fórum Script Brasil
  • 0

Problema com Strings


Felipe Nóbrega

Pergunta

Olá! Eu estou estudando linguagem C por conta própria. Não faço nenhum curso na área, porém sempre admirei e ainda admiro programação. Eu sou bem novato no assunto e encontrei um problema em um "programa" que estou fazendo que tem apenas a função de imprimir na tela uma string a partir de um ciclo for. Eu sei que tem uma biblioteca em C, a string.h que é feita especificamente para tratar de Strings, porém eu ainda não quero utilizá-la, já que mal entendo ainda como funciona a linguagem.

O compilador que eu uso é o Dev-C++ 5.11; Já vi em vários locais a sugestão de não utilizá-lo, porém eu tentei instalar o Code::Blocks e o mesmo não está funcionando, já que ele não está instalando o GCC. De início, eu achei que o defeito fosse no Dev-C++, mas eu cheguei até a criar uma máquina virtual, instalar o Linux nela e a compilar diretamente pelo GCC no Terminus, e ainda assim não deu certo. O erro que dá no Dec-C++ é que o programa simplesmente para de funcionar quando chega na etapa que eu quero. Ele para de responder. Eu pensei que fosse problema do Dev-C++, por isso fui buscar outros, mas quando fui para o GCC, descobri que era um problema na memória. Parece que eu estava "invadindo" uma memória que "não me pertencia", porém só achei soluções em fóruns em inglês, e isso foi o máximo que consegui descobrir, não sabendo aonde eu estava, especificamente, errado. Irei copiar o código e me perdoem se errei no local de postagem ou outra coisa do gênero. E agradeço desde já!

#include <stdio.h>

int main()
{
	int i;
	char nome[100];

	scanf("%s", nome); /*eu sei que não é a melhor função para 'pegar' strings,
						 mas basta para o quê eu quero.*/
	
	for(i=; nome[i]!='\0'; i++)
		printf("%s", nome[i]);

}
#include <stdio.h>

int main()
{
	int i;
	char nome[100];

	scanf("%s", nome); /*eu sei que não é a melhor função para 'pegar' strings,
						 mas basta para o quê eu quero.*/
	
	for(i=; nome[i]!='\0'; i++)
		printf("%s", nome[i]);

}

Não entendi por que ficaram dois e não consegui excluir o outro :v

 

Obs: Eu estou estudando C pelo livro Linguagem C de Luís Damas, 10ªed. E comprei recentemente outro, o Use a Cabeça sobre Linguagem C. Se tiverem algumas sugestões de livros, sites ou artigos para me ajudar, também agradeço!

Editado por Felipe Nóbrega
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

C funciona da seguinte forma...
quando você tem um string dessa forma:
char frase[100]

frase é um conjunto de 100 espaços reservados na RAM do seu computador, nunca use 100 em caso de strings, use sempre um menos por causa do null que deve marcar o fin da string, si não invadimos memória que não nos pertence. Então literamente se eu declaro 100 posso só usar 99 letras.

Continuando...
Quando chegar no scanf
scanf("%s",frase);

o programa se coloca em modo de espera e habilita a entrada de dados por teclado(entrada padrão). Quando eu escrevo algo como "Alo mundo" isso tudo se vai acumulando no buffer de entrada padrão, e justo quando pulso enter é quando tudo o que está no buffer vai parar na string frase, pois ao pulsar enter o buffer de entrada será esvaziado nas seguintes variáveis que vão aparecendo, nesse caso frase. Um detalhe é que o compilador bota u NULL no fim do "Alo mundo\0", o NULL é o \0. Para que serve o NULL? já pensou como sabe printf onde tem que parar de imprimir se eu reservei 100 letras e só usei "Alo mundo"? O printf só imprime até o \0, si não se imprimiria algo como "Alo mundo...                          ..." XD.

Bem... quando você quer imprimir letra por letra do seu string, você deve usar o especificador %c e não %s, pois %s já tem um loop interno que faz o trabalho por vc, então acho que seu programa na verdade o que você quer é isso:
 

#include <stdio.h>

int main()
{
	int i;
	char nome[100];

	scanf("%s", nome); /*eu sei que não é a melhor função para 'pegar' strings,
						 mas basta para o quê eu quero.*/
	
	for(i=; nome[i]!='\0'; i++)
		printf("%c", nome[i]);

}

o segredo está em que nome será impresso letra a letra até encontrar o NULL que marca o fim da string que é justo esse comando aqui: nome!='\0' que quer dizer por enquanto nome seja diferente que '\0' (NULL).... a variável i incrementará.

não sei se ficou claro. ;)

Link para o comentário
Compartilhar em outros sites

  • 0

Mano, ficou claro sim! Resolvido, era o %c que estava dando o problema, eu creio que usando o %s + o for gerava algum tipo de problema, vou pesquisar mais a fundo. Obrigado! Eu queria esse programa funcionando pois agora eu posso comparar palavras e vou tentar dar um jeito de alterá-las, quando estiver usando arquivos. Obrigado pela ajuda!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...