2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Я не понимаю getchar()!
Сообщение05.12.2013, 15:13 
Добрый день, уважаемые участники форума!
Недавно с ужасом обнаружил факт, размещенный в заголовке темы и прошу у вас помощи в ликвидации столь досадного недоразумения.

Задача: выравнивание текста по ширине, с введением этой самой ширины и текста пользователем.
Решение(Начало): посимвольное чтение этого текста с помощью getchar(), использование динамического массива. Куча недоработок с "динамичностью", но пока нет нормального ввода(соль в том, что надо обойтись без gets())!Код с комментариями:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdio.h>
#define TRUE 1
#define START_SIZE 10 /* по замыслу начальный размер динамического массива, так мало
что бы потом удобнее было наблюдать за realloc()*/
char* JustifyText(char const *str, int width); //прототип функции, которой пока нет

int main(void)
{
        int width;
        char *st_ptr = malloc(START_SIZE * sizeof(char)); //начальный адрес
        char *cur_ptr = st_ptr; //указатель с которым идет работа

        printf("Task E-11: Text alignment. Please, input width: \n");
        while(TRUE) /////////////////////////////////////////////////
        {
         printf("Width: ");
         do{
     scanf("%i", &width); //вводим ширину
         if(width<=0)
          printf("Incorrect value for width, try again\n");
         }while(width<=0);
     //getchar(); // попытка нейтрализовать ошибку, о которой пойдет речь
     printf("Now, please, input text for alignment\n");
         
         while(TRUE)
         {
         *st_ptr = getchar();

         if(*st_ptr='\n') //как только нажимается Enter - конец ввода
/*Здесь основная проблема - когда мы пишем ширину (ранее) мы жмем Enter*/
           break;
         ++st_ptr;
     }

    }//////////////////////////////////////////////////////////////
return 0;
}

Вот, в общем можно было бы реально начать писать работу с динамическим массивом и саму функцию, но без ввода как-то досадно.

 
 
 
 Re: Я не понимаю getchar()!
Сообщение05.12.2013, 17:33 
Ваша проблема в том, что вы смешиваете форматированный ввод (scanf) и неформатированный. Проходится вдаваться в детали работы scanf.
А именно, после завершения scanf указатель ввода останавливается на следующем символе, не соответствующем формату данных. Это может быть перевод строки, буква, запятая, и даже пробел, а также много других вариантов.
Соответственно, если надо ввести целиком следующую строчку, то сначала придётся полностью пропустить остаток текущей, т.е. все символы до перевода строки.

-- Чт дек 05, 2013 09:35:04 --

Кстати, можно опустить sizeof(char), так как он строго равен единице по определению оператора sizeof.
Ну и проверок ошибок не хватает, особенно при вводе.

 
 
 
 Re: Я не понимаю getchar()!
Сообщение06.12.2013, 08:25 
venco, понял, будем разбираться.

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group