Неожиданный результат с Fgets

int main(int argc, char** argv)
{
//Local Declaration
char last_name[20];
char first_name[20];
char phone_number[20];
char address[30];

//Statement
printf("Enter your last name: ");
fgets(last_name, 20, stdin);

printf("Enter your first name: ");
fgets(first_name, 20, stdin);

printf("Enter your phone number: ");
fgets(phone_number, 20, stdin);

printf("Enter your address: ");
fgets(address, 30, stdin);

printf("=====Address book=====\n");
printf("Name: %s%s\n", first_name, last_name);
printf("Phone Number: %s\n", phone_number);
printf("Address: %s\n", address);
return (EXIT_SUCCESS);
}

Результат не получается так, как я ожидал... Я имел в виду, что имя и фамилия должны быть в одной строке (например, Марк Цукерберг). Но получается так

отметка

Цукерберг

Что здесь не так? Почему между ними новая линия?

3 ответа

Смотрите страницу руководства

Цитата:

Функция fgets() считывает из потока не более одного символа меньше размера и сохраняет их в буфере, указанном s. Чтение останавливается после EOF или новой строки. Если читается новая строка, она сохраняется в буфере. Завершающий нулевой байт (aq\0aq) сохраняется после последнего символа в буфере.

Таким образом, строка, читаемая fgets, содержит символ новой строки в конце. Вам нужно будет удалить его.

РЕДАКТИРОВАТЬ

Чтобы удалить конец строки (и разрешить DOS), выполните

int end = strlen(first_name) - 1;
if (end >= 0 && '\n' == first_name[end])
{
   first_name[end--] = 0;
   if (end >= 0 && '\r' == first_name[end]) first_name[end] = 0;
}

Как предположил Эд, см. Руководство, простой способ заменить '\n' от ' ' (простое пространство) может быть:

first_name[strlen(first_name) - 1] = ' ';

strlen использования string.hне забудьте включить его

fgets(), будет хранить '\n' в переменной first_name, когда вы нажмете Enter, после того, как вы введете Mark, поэтому строка, хранящаяся в first_name, будет "Mark\n", printf() просто сделает свою работу и напечатает символ новой строки.

Другой хорошей альтернативой является использование fscanf()

fscanf (stdin, "%s", first_name);

РЕДАКТИРОВАТЬ:

Проверить на fscanf() ошибки.

char str[50];
int bytes = -1;
fscanf (stdin, "%s%n",str,&bytes);
 if(bytes == -1)
    perror("\nIncomplete Bytes Parsed\n");
Другие вопросы по тегам