прочитать и сохранить строковое значение C - PullRequest
0 голосов
/ 09 марта 2019

Инструкция попросила меня прочитать и сохранить строковое значение C, которое пользователь вводит в соответствующий элемент Name.

Код

struct Name {
    char firstName[31];
    char middleInitial[7];
    char lastName[36];
};



struct Name coolname={{0}};

printf("Please enter the contact's first name: ");
scanf("%31s[^\n]", coolname.firstName); 

Два вопроса:

  • Правильно ли я прочитал и сохранил значение строки c?
  • Есть ли другие способы сделатьэто и минусы плюсы?

1 Ответ

1 голос
/ 10 марта 2019

's' не требуется: scanf("%31s[^\n]", coolname.firstName); пытается прочитать ввод без пробелов до 31 символа, а затем прочитать [, ^ , любые пробелы , ] .

Конечно, нет- 's' на один шаг лучше: scanf("%31[^\n]"..., поскольку он попытается прочитать до 31 не-1015 * символов.

Тем не менее, это не будет использовать трейлинг '\n'.


Рекомендовать читать все пользовательские вводы с fgets().Возможно, в качестве вспомогательной функции.

int read_line(const char *prompt, char *dest, size_t n) {
  fputs(prompt, stdout);
  fflush(stdout);

  dest[0] = '\0';
  char buf[n*2 + 2];
  if (fgets(buf, sizeof buf, stdin) == NULL) return EOF;

  size_t len = strlen(buf);
  if (len > 0 && buf[len - 1] == '\n') { // lop off potential \n
    buf[--len] = '\0';  
  }

  if (len >= n) { //  maybe add a `len == 0` test
    return 0; // indicate invalid input, 
  }

  strcpy(dest, buf);
  return 1; 
}

Теперь используйте вспомогательную функцию

if (read_line("Please enter the contact's first name: ", coolname.firstName, sizeof coolname.firstName) == 1) {
  // Oh happy day, got first name
}
if (read_line("Please enter the contact's middle name: ", coolname.middleInitial, sizeof coolname.middleInitial) != 1)) {
  // Oh happy day, got middle name
}
if (read_line("Please enter the contact's last name: ", coolname.lastName, sizeof coolname.lastName) != 1)) {
  // Oh happy day, got last name
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...