Проверка корректности ввода целого числа обманывается, если первый символ '-' (Ерунда какая-то...)

Модератор: Модераторы разделов

_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение _Gleb_ »

Написал функцию проверки корректности ввода целого числа:

Код: Выделить всё

int cent(char vv[])
{
  int answer, i;
    if ((vv[0]>=0 && vv[0]<=9) || (vv[0]!='-'))
      answer=0;
    else {
      i=1;
        while (vv[i]>=0 && vv[i]<=9)
          i++;
        if (vv[i]=EOF)
          answer=1;
        else
          answer=0;
    }
  return answer;
}

Если ввести сначала знак '-', а потом какую угодно ерунду, она возвращает 1. Я ума не приложу, в чём тут дело. Много раз пересматривал -- вроде, всё правильно.
Изображение
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение _Gleb_ »

if ((vv[0]<0 || vv[0]>9) && (vv[0]!='-'))
answer=0;

Тоже не выходит.
Изображение
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение serzh-z »

В C/C++, "=" - это оператор присваивания. Всегда и везде, даже в условии if.

Если трудно запомнить, что в C/C++ оператор равенства - это "==", то можно взять за правило при сравнении в качестве левого значения использовать константу, например "if(EOF=vv[i])". В это случае ошибка была бы найдена при первой попытке компиляции.
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение _Gleb_ »

Втупую забил "(!(vv[0]='0' || vv[0]='1' || ... || vv[0]='9' || vv[0]='-'))" -- помогло. Но больше, похоже никак. На:

Код: Выделить всё

    if ((vv[0]!='0') && (vv[0]>=9 || vv{0}<=0))
      answer=0;
    else {...

Почему-то ругается: "expected ‘)’ before ‘{’ token". Это я вообще не понимаю, почему.

serzh-z писал(а):
24.12.2007 04:14
В C/C++, "=" - это оператор присваивания. Всегда и везде, даже в условии if.

Ясно, спасибо. А с "before ... token" что делать?
Изображение
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение serzh-z »

_Gleb_, "{" применяется для описания блоков кода (или инициализации переменных), а не для индексирования массивов.
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение _Gleb_ »

Исправил. Этот код:

Код: Выделить всё

while (vv[i]>=0 && vv[i]<=9)
  i++;
    if (vv[i]==EOF)
      answer=1;
    else
      answer=0;

почему-то стал всегда выдавать answer=0. Я пробовал '\n' вместо EOF -- не помогло. Что делать?
Изображение
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение drBatty »

while (vv[i]>='0' && vv[i]<='9')
9 - это число девять
'9' это цифра девять, обычно равна 57(пятидясети девяти).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение _Gleb_ »

Но значки < и > всё равно можно?
Изображение
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение _Gleb_ »

Поставил кавычки -- не помогает.
Изображение
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение promov »

_Gleb_ писал(а):
24.12.2007 06:32
Исправил. Этот код:

Код: Выделить всё

while (vv[i]>=0 && vv[i]<=9)
     i++;
       if (vv[i]==EOF)
         answer=1;
       else
         answer=0;

почему-то стал всегда выдавать answer=0. Я пробовал '\n' вместо EOF -- не помогло. Что делать?
Не надо гадать.

Глеб, вот тебе подсказка. Подумай: ты ввёл массив из n символов и передал его в функцию. функция, как ты помнишь, работает с самим массивом, а не с его копией. Что из себя представляет элеменнт номер n массива? (Нумерация элементво, напомню, начинается с ноля)

Ну, и про кавычкм не забывай, сказал что поставил, а я их что-то не наблюдаю.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение _Gleb_ »

promov писал(а):
24.12.2007 22:48
Подумай: ты ввёл массив из n символов и передал его в функцию. функция, как ты помнишь, работает с самим массивом, а не с его копией. Что из себя представляет элеменнт номер n массива?

Я так думаю, он представляет из себя символ. Но это не проясняет для меня ситуацию.
Изображение
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение promov »

_Gleb_ писал(а):
24.12.2007 23:02
promov писал(а):
24.12.2007 22:48
Подумай: ты ввёл массив из n символов и передал его в функцию. функция, как ты помнишь, работает с самим массивом, а не с его копией. Что из себя представляет элеменнт номер n массива?

Я так думаю, он представляет из себя символ. Но это не проясняет для меня ситуацию.
А какой именно символ? Я скажу, конечно, ты не думай ничего такого, но... cогласись, как-то не очень это будет... Подумай ещё. Посмотри в учебник.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение _Gleb_ »

На всякий случай: вот так у меня сейчас выглядит функция:

Код: Выделить всё

int cent(char vv[])
{
  int answer, i;
    if ((vv[0]!='-') && ! (vv[0]>='0' && vv[0]<='9'))
      answer=0;
    else {
      i=1;
        while (vv[i]>='0' && vv[i]<='9')
          i++;
        if (vv[i]==EOF)
          answer=1;
        else
          answer=0;
    }
  return answer;
}

Соответственно, не работает. Со значками >= и <= точно можно так поступать?
Какой символ? n+1-ый, наверное, символ.
Изображение
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение promov »

_Gleb_ писал(а):
24.12.2007 23:21
На всякий случай: вот так у меня сейчас выглядит функция:
Соответственно, не работает. Со значками >= и <= точно можно так поступать?
Какой символ? n+1-ый, наверное, символ.
Пойдёт
Теперь по символу. Он называется символ конца строки, он не \n и не EOF, он сам по себе. Он- одни ноли. Вот так вот 00000000. Это ты прочитай в книге. Вот с ним и надо сравнивать. Вот так:

Код: Выделить всё

  if ((int) vv[i]== 0)
    answer= 1;

Видишь, если мы сравниваем с нулём (как с числом, но не как с символом), то и элемент массива vv нужно тоже сделать числом. А правильно будет сказать: "преобразовать к типу int", что я и сделал, написав (int). Вот, собственно и всё. Вся функция. Про значки я ничего не понял. Да там ничего сложного быть не должно.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение drBatty »

Странные вы какие-то, а дебагером по шагам сложно проверить???

PS: и уберите answer, сразу по return выходите. Зачем плодить ненужные сущности?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение promov »

drBatty писал(а):
24.12.2007 23:52
Странные вы какие-то, а дебагером по шагам сложно проверить???
Я слов-то таких не знаю...
drBatty писал(а):
24.12.2007 23:52
PS: и уберите answer, сразу по return выходите. Зачем плодить ненужные сущности?
Что не так? Куда выходить? answer эта та штука... Короче, если её убрать, то значение какой переменной будет возвращатьcя в функцию main?

Да всё правильно, Глеб, не парься, мы с тобой тонкостей знать не обязаны, потому как начинающие только! Это всё с опытом приходит!
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение _Gleb_ »

Спасибо, теперь заработало. Просто в книжке (КиР) было написано, что строка, получаемая из scanf(), всегда заканчивается EOF.
А что значит запись "(int) vv[i]"?
Изображение
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение promov »

_Gleb_ писал(а):
25.12.2007 00:00
Спасибо, теперь заработало. Просто в книжке (КиР) было написано, что строка, получаемая из scanf(), всегда заканчивается EOF.
А что значит запись "(int) vv[i]"?
Ещё бы не заработало... Кто делал то...
А вообще эта запись значит, что переменная vv [i] становится переменной типа int. Она, как видно из заголовка функции имеет тип char. Проще говоря, она- символ. А теперь она становится числом. Но! Опять же, не абы каким, а тем, которое соответствует символу. А вот на этой весёлой нотке я закончу- тут долго объяснять, ты лучше в книге прочти. И обязательно купи что-то помимо K&R. Я этих авторов вообще засунул куда подальше и учусь по двум другим книгам. А в них очень редко заглядываю.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение promov »

_Gleb_ писал(а):
25.12.2007 00:00
Просто в книжке (КиР) было написано, что строка, получаемая из scanf(), всегда заканчивается EOF.
Глеб, ты не поленись, скажи, в какой главе там это написано. Что-то мне аж интересно стало- надо с этим разобраться.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение _Gleb_ »

Похоже, я неправильно понял: в гл. 7.4 ("Форматный ввод") сказано, что по исчерпании файла, scanf выдаёт EOF. Соответственно, я подумал, что для системы поток ввода -- это тоже что-то вроде файла.
А в главе 1.9 ("символьные массивы") сказано, что getline в конец создаваемого симвойльного масива помещает '\n'. Соответственно, я пробовал сравнивать и с ним.
Изображение
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение drBatty »

promov писал(а):
24.12.2007 23:59
Я слов-то таких не знаю..
жаль.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение drBatty »

promov писал(а):
24.12.2007 23:59
Что не так? Куда выходить? answer эта та штука... Короче, если её убрать, то значение какой переменной будет возвращатьcя в функцию main?

Код: Выделить всё

        if (vv[i]==EOF)
          answer=1;//return 1;
        else
          answer=0;//return 0;
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение promov »

drBatty писал(а):
24.12.2007 23:52
PS: и уберите answer, сразу по return выходите. Зачем плодить ненужные сущности?
А вот Ваш код
drBatty писал(а):
26.12.2007 19:27

Код: Выделить всё

        if (vv[i]==EOF)
               answer=1;//return 1;
             else
               answer=0;//return 0;


Это код Глеба, Вы answer из него не убрали, как нам советовали, только комментарии добавили. Покажите, как обойтись без answer.

drBatty писал(а):
26.12.2007 19:22
promov писал(а):
24.12.2007 23:59
Я слов-то таких не знаю..
жаль.
Я учусь только.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение drBatty »

promov писал(а):
26.12.2007 19:42
Это код Глеба, Вы answer из него не убрали, как нам советовали, только комментарии добавили. Покажите, как обойтись без answer.
Я учусь только.

1) Убейте код, оставьте комментарии ;)
2) Я для вас только хорошего желаю (С) http://www.kdevelop.org/ Просто давите F10(F11) и смотрите как работает ваша программа. Это очень интересно, нет, в правду!
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Debris
Сообщения: 282
ОС: Debian GNU/Linux Lenny

Re: Проверка корректности ввода целого числа обманывается, если первый символ '-'

Сообщение Debris »

promov, _Gleb_, http://ru.wikipedia.org/wiki/Отладка_программы вообще дебаггер это очень полезная вещь для того чтобы понять как программа работает и что происходит при ее выполнении.
Спасибо сказали: