Известно, что разница между функцией scanf() и gets() заключается в том, что scanf() продолжает читать входную строку до тех пор, пока не встретит пробел, тогда как gets() продолжает читать ввод строки до тех пор, пока она не встретит \ n или EOF (конец файла).c программирование: (scanf и gets)
Чтобы увидеть эту разницу в действии, я пытался писать пример на моем собственном, который выглядит следующим образом:
#include <stdio.h>
int main()
{
char a[20];
printf("enter the string\n");
scanf("%s",&a);
printf("the string is %s\n",a);
char b[20];
printf("enter the string\n");
gets(b);
printf("the string is %s\n",b);
return 0;
}
Когда переменная а была дана строка «Манчестер Юнайтед» в качестве входных данных, выход был:
enter the string
manchester united
the string is manchester
enter the string
warning: this program uses gets(), which is unsafe.
the string is united
то, что я ожидал, как выход был только первой частью строки данной переменной а, это манчестер, а затем, программа побудило меня ввести новую строку ввода для переменной Ь. Вместо этого я получил вышеупомянутый результат.
Основываясь на выходе, что я понимаю, это:
можно видеть, что, как только зсапЕ() встречает пробел, он прекращает чтение строки после этого, и, таким образом, оставшуюся часть строки : united, присваивается переменной b, даже если программа не предложит мне ввести строку для переменной b.
Как очистить оставшуюся часть (часть после пробела) строки, заданной переменной a?
так что я могу ввести целую новую строку ввода для переменной b.
Любое дальнейшее объяснение того, что здесь происходит и при выполнении кода, будет с благодарностью оценено.
Извинения за самые основные ошибки (как видно из ответов) !! Просто новичок в программировании C :)
Прежде всего и перед чтением вопроса, 'получает()' не должен использоваться, и это было устаревшим в последних версии [ тег: c] стандарт. У вашего кода также есть несколько других проблем, таких как использование оператора '&' для передачи массива для ''% s ''specifier для' scanf() '. Если компилятор (* или runtime ?, так как я бы никогда не использовал 'gets(), я не знал, что было предупреждение *) выдает предупреждение, почему вы продолжаете его использовать? –
** Никогда ** не используйте 'gets'! Он даже был удален из стандарта C, что действительно является редким событием. – Olaf
'scanf ("% s ", b)' == 'получает (b)' == отверстие, через которое ваш пользователь может сбой или взять под контроль вашу программу – PSkocik