Ввод пропускается от A до B, и оба печатаются в одной строке.MacOS C - PullRequest
0 голосов
/ 18 февраля 2019
#include <stdio.h>
#include <string.h>

int main()
{
  char nameuser[12];
  int userChoice;

  printf("Name(Max. 12 Characters): ");
  gets(nameuser);

  do{
    char messageuser[127];
    FILE *fptr;

    printf("Message: ");
    gets(messageuser);

    fptr = fopen("/Users/exampleuser/Desktop/Test/chat.txt", "a");
    fprintf(fptr, "%s: %s\n", nameuser, messageuser);
    fclose(fptr);

    printf("Another Message? Yes = 1, No = 0: ");
    scanf("%d", &userChoice);
  }while(userChoice == 1);

  return 0;
}

Вот мой код.Работает на GNU / Linux нормально, но не на Mac.Вот как это должно работать:

Name: John
Message: Hello Guys!
Another Message? Yes = 1, No = 0: 1
Name... and so on until I stop it.

Но вот как это работает на моем Mac:

Name: John
Message: Hello Guys!
Another Message? Yes = 1, No = 0: 1
Message: Another Message? Yes = 1, No = 0:

Почему он ведет себя так, как работает?Я прошу прощения за мой английский.

1 Ответ

0 голосов
/ 18 февраля 2019

Есть несколько проблем в вашей программе

  • вы смешиваете получает и scanf ("% d") так, как было сказано в комментариях выполучит пустые строки
  • использование получает опасно, потому что нет защиты от переполнения буфера, используйте fgets
  • вы говорите Макс,12 символов но на самом деле это 11, потому что вам нужно место для завершающего нулевого символа
  • вы не проверяете результат получает и scanf
  • вы не проверяете результат fopen
  • не является мягким, чтобы просить 0/1, пока цель Y / N
  • получаетfgets ) возвращает \ n при чтении, но вы, вероятно, не хотите его

Вот предложение, учитывающее предыдущие замечания:

#include <stdio.h>
#include <string.h>

int main()
{
  char nameuser[12];
  int userChoice;

  printf("Name(Max. %d Characters): ", sizeof(nameuser) - 1);
  if (fgets(nameuser, sizeof(nameuser), stdin) == NULL)
    return 0;

  char * p = strchr(nameuser, '\n');

  if (p != NULL)
    *p = 0;

  for (;;) {
    char messageuser[127];

    printf("Message(Max. %d Characters): ", sizeof(messageuser) - 1);
    if (fgets(messageuser, sizeof(messageuser), stdin) == NULL)
      return 0;

    if ((p = strchr(messageuser, '\n')) != NULL)
      *p = 0;

    FILE * fptr = fopen("chat.txt", "a");

    if (fptr == NULL) {
      printf("cannot open file");
      return 0;
    }

    fprintf(fptr, "%s: %s\n", nameuser, messageuser);
    fclose(fptr);

    printf("Another Message? Y/N: ");
    if ((fgets(messageuser, sizeof(messageuser), stdin) == NULL) ||
    (*messageuser != 'Y'))
      return 0;
  }
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra q.c
pi@raspberrypi:/tmp $ rm -f chat.txt
pi@raspberrypi:/tmp $ ./a.out
Name(Max. 11 Characters): me
Message(Max. 126 Characters): this is me
Another Message? Y/N: Y
Message(Max. 126 Characters): and nobody else
Another Message? Y/N: N
pi@raspberrypi:/tmp $ cat chat.txt 
me: this is me
me: and nobody else

Примечание: я принимаю пустые имена и сообщения и пробелы в начале / конце, я позволю вам это исправить, иначе слишком просто ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...