Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [С] GETCHAR() vs. SCANF(), что лучше и почему? 
:(
    Опции темы
ressac
  Дата 26.3.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



в чём разнится между следующим:

Код


scanf("%c",car);
car=getchar();



что лучше использовать, и почему?

PM MAIL   Вверх
Kuvaldis
Дата 26.3.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Лучше использовать getchar(), так как она заточена именно под чтение одного символа. scanf() - более универсальная функция. Поэтому код с ее использованием - больше.



--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
ressac
Дата 27.3.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



кто-то ещё хочет добавить что-то?
PM MAIL   Вверх
vinter
Дата 27.3.2007, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(ressac @  26.3.2007,  22:46 Найти цитируемый пост)
что лучше использовать, и почему?

что тебе больше нравится, то и используй, тут все зависит от твоего вкуса.



--------------------
Мой блог
PM MAIL WWW   Вверх
Greeen
Дата 27.3.2007, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 7
Всего: 18



Нельзя сказать что лучше, а что хуже. Зависит от ситуации. В приведенном примере ИМХО все равно.


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
zkv
Дата 27.3.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(ressac @  27.3.2007,  20:42 Найти цитируемый пост)
кто-то ещё хочет добавить что-то? 

ок, если говорить про скорость программы и размер выполняемого кода, то вообще абсолютно по барабану, что использовать. Ну можно сказать, что getchar() более читабельно смотрится. 

А вообще разговор ни о чем, типа: "Что лучше носить, кепку или панамку?" Вообщем то все равно, но в кепках вроде чаще ходят  smile
PM MAIL   Вверх
Kuvaldis
Дата 27.3.2007, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Как правило, getchar() реализуется как макрос. Отсюда: код с getchar() не только меньше, но и быстрее (стек не трогаем)


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Lomir
Дата 27.3.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 30.1.2007
Где: Lithuania::Kaunas

Репутация: 1
Всего: 1



Незнаю как в С, но в С++ разница в скорости где то в 2-2,5 раза.
Считывание 10к символов со scanf("%c", &...) занело 6-6,5 сек, с getchar() и getc() тока 2,5 сек.
PM MAIL ICQ Skype   Вверх
AndrRus
Дата 27.3.2007, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 14.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



На мой взгляд, все зависит от задачи. scanf более гибкий инструмент, например, слово "вектора" считать, как "тор" - и это довольно легко в реализации.

Это сообщение отредактировал(а) AndrRus - 28.3.2007, 10:53
PM MAIL ICQ   Вверх
Novojiloff
  Дата 31.3.2007, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 31.10.2006

Репутация: нет
Всего: нет



Вот в этом просто коде...
... getchar() нагло отказывается у меня работать  smile 

Код

#include<cstdio>
#include<cstdlib>
#include<iostream>

int main(int nNumberofArgs, char* pszArgs[])

{
    char name[15], last[15]; // Используется для строк (%s)
    char itinial; // Используется для символов (%c)
    int age;
    
    printf("Enter your name: "); 
    gets(name);
    
    printf("Your initial: ");
    itinial=getchar();
    putchar('\n');
    
    printf("Your last: ");
    gets(last);
    
    printf("Enter your age: ");
    scanf("%d",&age);
    
    puts("______________________________________________");
    printf("\nYour full: %s %s %c",last,name,itinial);
    printf("\nYou age %d\n\n",age); 
    
    system("PAUSE");
    return 0;
    

PM   Вверх
ressac
Дата 31.3.2007, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



странно , у меня он пашет, но после него надо ставить 


Код


fflush(stdin);



иначе следущий gets cчитает '\n' который оставил getchar.
PM MAIL   Вверх
Novojiloff
  Дата 31.3.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 31.10.2006

Репутация: нет
Всего: нет



to Ressac:

Спасибо! Теперь все ок  smile 
Только вопрос, а что это за функция fflush(stdin) ?
PM   Вверх
ressac
Дата 31.3.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



fflush чистить буфер , тойсть по всей видимости getchar прочитал лишь одну букву и оставил в буфере НОВУЮ ЛИНИЮ (Enter или просто "\n" ), а gets() считывает эту новую линю,вот и получается фигня...

PM MAIL   Вверх
Novojiloff
  Дата 31.3.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 31.10.2006

Репутация: нет
Всего: нет



Ясно  smile 
PM   Вверх
Novojiloff
  Дата 31.3.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 31.10.2006

Репутация: нет
Всего: нет



Странно, но здесь у меня getchar(); снова не пашет  smile 

Код

#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;
int main(int nNumberofArgs, char* pszArgs)
    
{
    int temps[4];
    int index, found, total=0, count;
    float average, celcius, num;
    char ch1;
    
    index=0;
    
    do
    {
            printf("Enter #%d temps: ",index);
            scanf("%d",&temps[index]);
            index++;
    }
    
    while(index<4 && temps[index-1] != 555);        
    index=0;
    
    do      
    {
            total+=temps[index];
            index++;
    }    
    
    while(index<4 && temps[index-1] != 555);               
    count=index; average=total/count;                
    printf("\nsr_arif %.2f\n\n\n",average);
    
    index=0;
    do
    {
            celcius=(5.0/9.0)*(temps[index]-32);
            printf("%d\t\t%6.2f\n",temps[index],celcius);
            index++;
            
    }        
    while(index<4 && temps[index-1] != 555); 

    for(int delay=0; delay<100000000; delay++); // Пауза
    
    puts("Your initial: ");
    ch1=getchar();
    fflush(stdin);
    if(ch1=='y' || ch1=='Y')
    {
    
    printf("Ukajite zna4enie, kotoroe jelaete nayti: ");
    scanf("%f",&num);
    
    index=0; found=0;
    
    while(! found && index<4 && temps[index] != 555)
    {
            if(temps[index]==num)
            found=1;
            
            else
            index++;
    }
    
    int a;
    printf("Vvedite koli4estvo otborov: "); scanf("%d",&a);
    while(ch1=='y' || ch1=='Y')
    {
    
    if(! found)
    puts("Ukazannogo zna4eniya net v massive");
    else
    printf("Ukazannoe zna4enie soderjitcya v elemente %d\n",index);
    
    puts("Repeat?");
    puts("Your initial (y - 2 repeat): ");
    ch1=getchar();
    fflush(stdin);
}
    }
    
    
    
    system("PAUSE");
    return 0;
    
}        

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0629 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.