Неожиданный результат с 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");