Escreva um programa em c que leia uma frase do usuário e imprima em tela.(Obs.: o vetor declarado para armazenar a frase deve caber ate 100 caracteres)

Estou começando a estudar C queria saber se este código está correto?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h> 
#define TAMMAX 100

int main()
{
int x,tam;
 char nome[100];
 printf("Digite uma frase: ");
 gets(nome);
 tam = length(nome);
 
for (x=1; x <= tam; x++)
 {
printf("%c",nome);
}

system("pause");
return 0;
}

À primeira vista, parece que vai funcionar. Contudo, você pode melhora-lo um pouquinho. Pode ficar algo assim:

char nome[TAMMAX];
printf("Digite seu nome: ");
fgets(nome, TAMMAX, stdin);
printf("O tamanho do seu nome é: %lu\n", strlen(nome));
printf("Seu nome é: %s", nome);
return 0;

Você deve evitar ao máximo utilizar a função gets. Ela é conhecida por poder ser uma falha de segurança. Você não especifica quantos characteres você quer ler, e isso é bem problemático! Imagine alguém mal intensionado coloca ali uma string maior do que o buffer que você declarou. Isso, no melhor dos casos, vai causar um erro de overflow. Porém, o que acontece, é que o sistema operacional não tem impede de escrever em posições fora do teu array. Experimente declarar um array com 5 posições, e escrever na posição 10, por exemplo.

Fiz um teste aqui:

int x[1];
x[100] = 3;

Gerou um warning quando compilei, mas rodou sem problema nenhum. E se naquela área da memória em que o 3 foi escrito estiver o conteúdo de alguma outra variável?

Por isso, você pode utilizar a função fgets em seu lugar. Os três argumentos pra essa função são:

  1. O buffer pra onde deve ser lido a string (é aqui que vai ser armazenado oq você leu)
  2. Quantos characters devem ser lidos
  3. De onde deve ser lido (stdin significa standard input, é onde você digita no terminal)

Você pode verificar o tamanho da string lida através da função strlen. Ela nada mais faz do que iterar no array procurando o character de finalização, ou character nulo, que é o ‘\0’. Quem insere esse character no final da string do usuário é a função fgets.

Só mais uma coisa. Imagine que você digita isso no terminal: guj. Em seguida, lê com fgets e imprime o tamanho da string. Vai aparecer que o tamanho é 4, e não 3 como parece. A primeira reação é achar que está errado, mas não está. O fgets pega o enter que a gente aperta para dizer que terminamos de digitar. A string que vai para o buffer é: guj\n. Se você quiser corrigir isso, pode fazer assim, depois do código que citei anteriormente:

char* letra = nome;
while (*letra != '\n') letra++;
*letra = 0;

Isso vai percorrer a string lida procurando pelo character de quebra de linha. Assim que ele for achado, é substituído pelo character nulo (0, ou \0). Se for chamado o strlen no buffer nome de novo, o resultado vai ser a contagem certa, sem quebra de linha. É uma abordagem muito simples, e está ignorando a situação onde não há quebra de linhas no buffer.

Correto está, mas tem um modo mais simples de se fazer isso.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h> 
#define TAMMAX 100

int main()
{

 char nome[100];

 printf("Digite uma frase: ");
 fgets(nome, TAMMAX, stdin);

printf("%s", nome);

system("pause");
return 0;
}
  • Nunca use gets, ele tem várias falhas. Use sempre o fgets. Explicando ele (variável, tamanho máximo do vetor, stdin é a saída do texto na tela).

  • %s vc imprime a string com todos os caracteres digitados, não precisa se preocupar com espaços em branco.

  • Quando você iniciar a usar arquivos, irá entender mais a fundo o fgets.

  • Quando tiver dúvidas sobre alguma função, utilize esse site aqui: “http://www.cplusplus.com”. Me ajudou muito quando eu era um iniciante.

Você pode usar o método scanf para ler uma string, usando %s que indica que vai ser lindo é uma string, obs.: não se usa & pelo fato de que quando é posto o nome de um vetor é equivalente a colocar o endereço do primeiro elemento.

#include <stdio.h>
#define TAM 100 //Questão de manutenibilidade do código, torna mais fácil mudar o tamanho do vetor

int main( ){
    
    char string[TAM];
    scanf("%s", string);
    printf("%s", string);
    return 0;

}

Usar scanf acarreta no mesmo problema de gets. Dá problema se a string informada for maior do que o buffer.

olá alguém poderia me ajudar estou confusa nos arquivos. O exercício pede isto.

Faça um programa que receba uma frase e um caractere e verifique em que posição da frase o caractere digitado
aparece pela primeira vez.

#include <iostream>
#include<fstream>

int main()
 {
 	ifstream fin ("arq1.txt");
 	char vetor [200];
 	char temp;
 	int i=0;
 	while (! fin.eof())
 	{
 		fin.get (temp);
 		if (temp ! = ' ')
 		{
 			vetor [i] = temp;
 			i ++;
		 }
		 for (int j= 0; j< i; j++)
		 {
		 	cout<< vetor [j];
		 	
		 }
	 }
	return 0;
}

onde errei …socorrr kkk quando compilo pede pra declarar a variável …porém criei um arquivo que não lê espaço e conta o que está escrito mas quero que leia apenas um caractere. Estou no caminho …ou não!