fork(1) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void clearBuffer(FILE *fp) {
  6. // limpa os caracteres do buffer (aqueles que não foram lidos no fgets, por exemplo, porque passou o tamanho máximo)
  7. int c;
  8. while ((c = fgetc(fp)) != EOF && c != '\n');
  9. }
  10.  
  11. char *fgets_wrapper(char *buffer, size_t buflen, FILE *fp) {
  12. if (fgets(buffer, buflen, fp) != 0) { // se leu corretamente
  13. size_t len = strlen(buffer);
  14. if (len > 0 && buffer[len - 1] == '\n') {
  15. // tem quebra de linha, podemos removê-la do final
  16. buffer[len - 1] = '\0';
  17. } else {
  18. // não tem quebra de linha, então foram digitados mais caracteres que o tamanho máximo
  19. // por isso precisa limpar o buffer e retirá-los de lá, senão eles serão lidos na próxima chamada
  20. clearBuffer(fp);
  21. }
  22. return buffer;
  23. }
  24.  
  25. return 0;
  26. }
  27.  
  28. int main() {
  29. char buffer[10];
  30. int tam;
  31. printf("Tamanho: ");
  32. // leia com fgets, e depois converta o que foi lido para número
  33. if (fgets_wrapper(buffer, 10, stdin) == 0) {
  34. printf("Erro ao ler o tamanho\n");
  35. exit(-1);
  36. }
  37. // sscanf retorna a quantidade de itens lidos (no caso, se não for 1 é porque deu errado)
  38. if (sscanf(buffer, "%d", &tam) != 1) {
  39. printf("Não foi digitado um número\n");
  40. exit(-1);
  41. }
  42.  
  43. // use o tamanho que foi lido para criar o array com o tamanho correto
  44. char nome[tam][10];
  45.  
  46. for (int i = 0; i < tam; i++) {
  47. printf("Entrada: ");
  48. if (fgets_wrapper(nome[i], 10, stdin) == 0) {
  49. printf("Erro ao ler o nome\n");
  50. exit(-1);
  51. }
  52. }
  53.  
  54. printf("\nNomes:\n");
  55. for (int i = 0; i < tam; i++) {
  56. printf("%s\n", nome[i]);
  57. }
  58.  
  59. return 0;
  60. }
  61.  
Success #stdin #stdout 0s 5488KB
stdin
3
Fulano de Tal
Ciclano da Silva
Beltrano de Souza
stdout
Tamanho: Entrada: Entrada: Entrada: 
Nomes:
Fulano de
Ciclano d
Beltrano