2016-06-01 3 views
0

Известно, что разница между функцией 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 :)

+4

Прежде всего и перед чтением вопроса, 'получает()' не должен использоваться, и это было устаревшим в последних версии [ тег: c] стандарт. У вашего кода также есть несколько других проблем, таких как использование оператора '&' для передачи массива для ''% s ''specifier для' scanf() '. Если компилятор (* или runtime ?, так как я бы никогда не использовал 'gets(), я не знал, что было предупреждение *) выдает предупреждение, почему вы продолжаете его использовать? –

+4

** Никогда ** не используйте 'gets'! Он даже был удален из стандарта C, что действительно является редким событием. – Olaf

+0

'scanf ("% s ", b)' == 'получает (b)' == отверстие, через которое ваш пользователь может сбой или взять под контроль вашу программу – PSkocik

ответ

3

Вы можете очистить ее вручную, чтение и отбрасывания символов до тех пор, пока не найдете '\n' или кто-то попадает соответствующие сочетания клавиш, чтобы вызвать EOF. Или вы можете попросить scanf() отбросить все, пока '\n' не найден, второй один может быть достигнуто, как это

char string[20]; 
scanf("%19s%*[^\n]\n", string); 

Есть другие вещи о вашем коде, которые неправильно

  1. Вы объявляете a как массив из 20 char, а затем вы передаете его адрес scanf(), где он ожидает указатель char, имя массива (переменная, если вы предпочитаете), автоматически преобразуется в точку r до char, когда это необходимо.

  2. Вы использовали gets(), это старая опасная и устаревшая функция, которая больше не является стандартной функцией. Вместо этого вы должны использовать fgets(), который принимает параметр perevent, переполняющий целевой массив.

Это пример тестирования предлагаемых исправлений

#include <stdio.h> 

int 
main(void) 
{  
    char string[20]; 

    string[0] = '\0'; /* Avoid Undefined behaviour 
         when passing it to `fprintf()' */ 

    scanf("%19s%*[^\n]\n", string); 
    fprintf(stdout, "%s\n", string); 

    fgets(string, sizeof(string), stdin); 
    fprintf(stdout, "%s\n", string); 

    return 0; 
} 
+0

Лучше использовать 'fscanf()' вместо проблемного 'scanf()'. – Destructor

+1

@Destructor: Единственная разница между 'fscanf()' и 'scanf()' заключается в том, что 'scanf()' читается из 'stdin', а' fscanf() 'принимает параметр, определяющий, откуда он читается. Вы хотели предложить прочитать строку с помощью 'fgets()', а затем сканировать ее с помощью 'sscanf'? –

Смежные вопросы