1

Тема: Якийсь баг?

Доброго всім часу доби!

[code=C++]
#include <stdio.h>
#include <conio.h>

int main( void )
{
    char string[500];
    printf( "wwedi scanf: " );
    scanf( "%s", string, sizeof(string) );
    printf( "%s\n", string );
    printf( "wwedi gets: " );
    gets( string );
    printf( "%s\n", string );
    return 0;
}
[/code]

Прога навить не виконується до кінця, падає.  Двогодинне гуглення нічого не зясувало. Не пояснило.  Всюди мов Функція gets() зчитує символи з stdin і поміщає їх в масив символів, на який вказує str. Символи зчитуються доти, поки не зустрінеться новий рядок або EOF. Символ «новий рядок» не робиться частиною рядка, а транслюється в нульовий символ, завершиющучий рядок.

У разі успіху gets() повертає str, в іншому випадку вона повертає NULL. У випадку помилки читання вміст масиву, на який вказує str, не визначено.

2

Re: Якийсь баг?

gets забрали в стандарті с11
використовуйте fgets натомість, або послуговуйтесь компілятором який підтримує старіші стандарти

Подякували: М18х001

3

Re: Якийсь баг?

scanf( "%s", string, sizeof(string) );

І що scanf буде з числом 500 робити, на вашу думку?

Подякували: leofun011

4

Re: Якийсь баг?

І все-таки. Так чі інакше в цієї прозі міститься щось надзвичайно незрозуміле, якась таємниця.

Прога таки компілюється, тобто нічого поганого начебто немає.

[code=C++]#include <stdio.h>
#include <conio.h>

int main( void )
{
    char string[500];
    printf( "wwedi gets: " );
    gets( string );
    printf( "%s\n", string );
    printf( "wwedi scanf: " );
    scanf( "%s", string, sizeof(string) );
    printf( "%s\n", string );
    printf( "wwedi gets: " );
    gets( string );
    printf( "%s\n", string );
    return 0;
}[/code]

gets спочатку добряче працюе, а в кінці просто валить програму. Що може бути не так?
З чого може слідувати що праця gets залежить від попередній роботи функції scanf? Чі як?
Та і що може їх звьязувати? Потік? І що з ним? Ніби то всі симвозли зчітані, потік чистий.
А хоча б й нехай він містить символи, ну зчітає їх в змінну що тут такого. А потік чистий, адже з нього прочитали. Так що?

5

Re: Якийсь баг?

scanf не дістає зі вхідного потоку символ нового рядка, і gets його читає.
І, будь ласка, замість "валиться", "не працює", "ламається" і т.д. описуйте КОНКРЕТНО, що відбувається. Валитися програма може купою різних способів, а ми не телепати. "Завершується з повідомленням X" і "несподівано  закривається вікно без жодних повідомлень" - це різні речі.

Подякували: varkon, leofun012