В C, как остановить gets(), печатающую новую строку из предыдущего ввода?

У меня возникают проблемы при использовании gets в C.

...
int main()
{
    char test[20], m[20];
    int n;

    scanf("%d", &n);

    while(n)
    {   
        gets(test);
        test.kolona = n;

        m = decode(test); //some function

        printf("%s",m.sif);
        putchar('\n');

        scanf("%d", &n);
    }
}

Когда я ввожу число и нажимаю ввод, он автоматически «печатает» новую строку, прежде чем вы введете строку. Я немного поискал и обнаружил, что этого можно избежать, если вы поставите gets перед этим, например:

...
scanf("%d", &n);
gets(test)

while(n);
{
    gets(test);
    ...
}

Но затем он снова портится, поскольку цикл продолжается :(

Есть ли элегантное решение для этого?


person Kok Nikol    schedule 21.11.2014    source источник
comment
Никогда не используйте gets. Это настолько плохо, что его даже исключили из стандарта C в 1999 году. Посмотрите на fgets. (Который по-прежнему включает окончание строки \n.) used" title="почему функция gets опасна, почему ее не следует использовать">stackoverflow.com/questions/1694036/ stackoverflow.com/questions/4309746/безопасная альтернатива для получения   -  person Deduplicator    schedule 21.11.2014
comment
И выход таков: получить строку с помощью fgets, а затем отсканировать ее на предмет всего, что вы хотите, с помощью sscanf или чего-то еще.   -  person Deduplicator    schedule 21.11.2014
comment
Я боюсь, что вставка новой строки не вызвана функциями gets() fgets() scanf() или любой из этих функций. Это поведение консольного приложения.   -  person Anonymous    schedule 21.11.2014
comment
@Deduplicator Обычно я бы использовал scanf... но я решаю проблему в SPOJ и постоянно получаю ошибку неправильного ответа... Я нашел предложение на их форуме использовать gets для обработки любых входных данных (тестовые случаи)...   -  person Kok Nikol    schedule 21.11.2014
comment
Просто прочитайте два вопроса, которые я связал, почему это ужасный совет.   -  person Deduplicator    schedule 21.11.2014


Ответы (1)


образец для исправления

int main()
{
    char test[20], m[20];
    int n;

    scanf("%d%*c", &n);//skip the newline following the numeric input

    while(n)
    {   
        scanf("%19[\^n]", test);//gets has been abolished.
        //test.kolona = n;//The array does not have a member field.

        //strcpy(m, decode(test));//m = decode(test); //Can not be assigned to the array in this way 

        printf("%s\n", m);
        //putchar('\n');

        scanf("%d%*c", &n);
    }
}
person BLUEPIXY    schedule 21.11.2014
comment
Я проверю, что делают ваши модификации, спасибо. Что касается того, что вы закомментировали, я сделал структуру в оригинале и не исправил все, чтобы в примере это выглядело хорошо. - person Kok Nikol; 26.11.2014