C строка (массив символов): игнорирует следующее сканирование из-за пробелов - PullRequest
4 голосов
/ 04 декабря 2011

произнесите что-то вроде этого:

#include <stdio.h>

void main() {

  char fname[30];
  char lname[30];

  printf("Type first name:\n");
  scanf("%s", fname);

  printf("Type last name:\n");
  scanf("%s", lname);

  printf("Your name is: %s %s\n", fname, lname);
}

, если я наберу "asdas asdasdasd" для fname, он не попросит меня ввести что-то для lname.Я просто хочу спросить, как я могу это исправить, спасибо.

Ответы [ 3 ]

5 голосов
/ 04 декабря 2011

Помещение %s в список форматирования заставляет scanf() читать символы, пока не будет найден пробел .Ваша входная строка содержит пробел, поэтому первый scanf() читает только asdas.Также scanf() считается опасным (подумайте, что произойдет, если вы введете более 30 символов), поэтому, как указано другими, вы должны использовать fgets().

Вот как вы можете это сделать:

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

int main()
{
    char fname[30];
    char lname[30];

    printf("Type first name:\n");
    fgets(fname, 30, stdin);

    /* we should trim newline if there is one */
    if (fname[strlen(fname) - 1] == '\n') {
        fname[strlen(fname) - 1] = '\0';
    }

    printf("Type last name:\n");
    fgets(lname, 20, stdin);
    /* again: we should trim newline if there is one */
    if (lname[strlen(lname) - 1] == '\n') {
        lname[strlen(lname) - 1] = '\0';
    }

    printf("Your name is: %s %s\n", fname, lname);

    return 0;
}

Однако этот фрагмент кода еще не завершен.Вы все еще должны проверить, если fgets() обнаружил некоторые ошибки.Подробнее о fgets() здесь .

4 голосов
/ 04 декабря 2011

Используйте fgets (или getline, если вы используете GNU), чтобы получить всю строку, а не до первого пробела.

if (fgets(fname, 30, stdin) == NULL) {
    // TODO: Read failed: handle this.
}

Смотрите, как работает онлайн: ideone

Вы также можете использовать функцию fgets_wrapper из этого ответа , так как он также удалит символ новой строки для вас.

1 голос
/ 05 декабря 2011

изменение

scanf("%s", fname);

до

scanf("%[^\n]%*c", fname);

[^ \ n] принимает, кроме '\ n'

% * c игнорирует один символ ('\ n')

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