Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2011, 19:22   #1
cheef
Форумчанин
 
Регистрация: 16.03.2009
Сообщений: 205
По умолчанию Си, gets

Код:
#include<stdio.h> 
#include<math.h>
#include<stdlib.h>

#define N 256

int Length(char *text) 
{
    int i = 0;
    while(text[i] != '\0') i++;
    return(i);
}

void Reverse(char *text) 
{
    int i;
    char dump;
    for (i = 0; i < Length(text); i++)
    {
        dump = text[i];
        text[i] = text[Length(text)-1];
        text[Length(text)-1] = dump;
    }
    puts(text);
}

int main()
{
    do
    {
        int menu;
        char text[N],subtext[N];
        system("clear");
        printf("Меню программы:\n");
        printf("1. Определить длину строки\n");
        printf("2. Перевернуть строку\n");
        printf("3. Возврат номера позиции первого вхождения подстроки в строку\n");
        printf("4. Возврат строки, полученной после добавления второй строки в*конец первой\n");
        printf("5. Возврат строки, полученной после вставки второй строки в первую, начиная с*указанной позиции N\n");
        printf("6. Возврат части данной строки длиной K, начинающейся с позиции с*номером N\n");
        printf("Выберите действие: ");
        scanf("%d",&menu);
        switch(menu)
        {
            case 1:
                system("clear");
                printf("Задача: Определить длину строки. Введите строку: ");
                gets(text);
                printf("Длина строки - %d",Length(text));
                break;
            case 2:
                system("clear");
                puts("Введите строку: ");
                gets(text);
                Reverse(text);
                break;
        }
    }
    while(getchar() == 'y');
    return 0;
}
Почему-то gets не работает, не даёт ввести даже текст, сразу переходит к следующему оператору. iostream использовать нельзя.
cheef вне форума Ответить с цитированием
Старый 18.11.2011, 19:43   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Вызывайте перед функцией gets функцию fflush
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 18.11.2011, 19:46   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

gets читает до перевода строки, а на момент вызова gets перевод строки после scanf ещё висит непрочитанный.
Его можно прочитать или ещё одним gets, или циклом с getc. А fflush для stdin вызывать нельзя - будет undefined behaviour.

Последний раз редактировалось Somebody; 18.11.2011 в 19:50.
Somebody вне форума Ответить с цитированием
Старый 18.11.2011, 19:59   #4
cheef
Форумчанин
 
Регистрация: 16.03.2009
Сообщений: 205
По умолчанию

У меня же нет работы с файлами, но всё равно спасибо, погуглил, нашёл ф-цию flushall(). Но компилятор g++ выдаёт ошибку:
Код:
zad5_1.c:43: error: ‘flushall’ was not declared in this scope
Хотя в описании ф-ции написано, что она поддерживается UNIX. stdio.h подключен.
cheef вне форума Ответить с цитированием
Старый 18.11.2011, 20:02   #5
cheef
Форумчанин
 
Регистрация: 16.03.2009
Сообщений: 205
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
gets читает до перевода строки, а на момент вызова gets перевод строки после scanf ещё висит непрочитанный.
Его можно прочитать или ещё одним gets, или циклом с getc. А fflush для stdin вызывать нельзя - будет undefined behaviour.
Спасибо, gets(text) после последнего scanf помог.
cheef вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц