Войти

Показать полную графическую версию : Функция ограничения занятости памяти - С


Страниц : 1 [2]

ivank
03-02-2004, 15:49
Внимательно читаем документацию на ф-ии scanf и gets. В частности, scanf после считывания числа, оставляет символа перехода на новую строку во входном потоке, если его специально не попросить его убрать. А ф-ия gets, как известно считывает до первого '\n', поэтому наткнувшись на этот символ, не убранный ещё scanf'ом она сразу завершает свою работу.

Должно быть так: scanf("%d\n",&veg.caloricity );

Если, число записано на отдельной строке, то его можно считать в строку (т.е. массив char), а затем sscanf'ом или atoi перевести в число.

Ginger
03-02-2004, 18:38
Должно быть так: scanf("%d\n",&veg.caloricity );
это не работает

Если, число записано на отдельной строке, то его можно считать в строку (т.е. массив char), а затем sscanf'ом или atoi перевести в число.
вот этого не поняла.
предложение понятно, функции почти понятны (sscanf - не совсем понятно как работает: sscanf (input_string, "%as %as", &str_arg1, &str_arg2); - но так же можно просто scanf("%s", &string) ), но к чему это?

и спасибо за помощь и обьяснения :)

Исправлено: Ginger, 18:39 3-02-2004

ivank
04-02-2004, 04:14
sscanf работает так же как и scanf, за тем исключением, что считывает не со стандартного потока ввода, а из строчки, которая передаётся первым параметром. К чему это было сказано: если не дружишь со scanf'ом, но дружишь с gets'ом. То считывай всё gets'ом в отдельные буферы, а затем уже из них sscanf'ом вычленяй данные как хочешь.

Т.е. вместо (псевдокод)sscanf("%d", &calor);
gets(name);будет что-то вродеchar buf[256+1];
// ...
gets(buf);
gets(name);
sscanf(buf, "%d", &calor);

И всё же приведи маленький рабочий пример где scanf работает неправильно. Маленький, значит не более 10 строчек, а рабочий, значит что б его можно было без всяких переделок скопипастить в свой редактор, скомпилировать и посмотреть результат. А то по куску программы трудно судить.

Ginger
04-02-2004, 13:39
И всё же приведи маленький рабочий пример где scanf работает неправильно.
18 строчек пойдут ;)

#include <stdio.h>

int main(void)
{
int x;
int i;
char y[10];
for(i=0; i<4; i++)
{
printf("Please, enter your name: ");
gets(y);
printf("Please, enter your age: ");
scanf("%i", &x);
printf("%s - %i ", y, x);
}
}


первый луп проходит на ура, но следующие нет.

char buf[256+1]; // ...
gets(buf);
gets(name);
sscanf(buf, "%d", &calor);

а. ясен пень :) так работает.

может тему переименовать? - Создание бд с помощью structure и file в С
к нам, конечно, никто не прикапывается, но тему мы не по названию обсуждаем. потом кому-нить пригодиться, в поиске найдёт...

Исправлено: Ginger, 15:08 4-02-2004




© OSzone.net 2001-2012