Сканирование, проверка, преобразование, копирование значений ... Как? - C - - PullRequest
0 голосов
/ 12 мая 2010

Это было давно, и я все еще пытаюсь заставить работать определенный код. Ранее я задавал некоторые вопросы о различных командах и т. Д., Но теперь я надеюсь, что это последний вопрос (объединение всех вопросов в одном коде).

Я в основном хочу:

* Сканирование ввода (должно быть символом?)

* Проверьте, если это номер

* Если нет, верните ошибку

* Преобразование этого символа в число с плавающей точкой

* Скопируйте значение в другую переменную (я назвал это imp здесь)

Вот что я придумал:

РЕДАКТИРОВАННЫЙ КОД *

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
main(){  
  int digits;
  float imp=0;
  char* alpha;
  do{

    printf("Enter input\n\n");
    scanf("\n%c",alpha);
    digits=isdigit(alpha);
      if(digits==0){
         printf("error\n\n");
      }
     imp=atof(alpha);
  }while(digits==0);

}

Проблема в том, что этот код вообще не работает ... Он дает мне понять, что atof должен быть const char, и всякий раз, когда я пытаюсь изменить его, он просто перестает работать. Я расстроен и вынужден спросить здесь, потому что я полагаю, что много пробовал и продолжаю терпеть неудачу, но я не почувствую облегчения, пока не заставлю его работать xD Так что мне очень нужна ваша помощь, ребята.

Скажите, пожалуйста, почему этот код не работает, что я делаю не так? Я все еще изучаю C и очень ценю вашу помощь:)

EDIT Ошибка с учетом атм:

Argument no 1 of 'isdigit' must be of type 'const int', not '<ptr>char'

EDIT Этот код компилируется нормально, но вылетает при вводе.

  #include<stdio.h>
  #include<stdlib.h>
  #include<ctype.h>
  main(){  
  int digits;
  float imp=0;
  char* alpha=0;
  do{

   printf("Enter input\n\n");
   scanf("\n%s",alpha);
   digits=(isdigit(alpha[0]));
   imp=atof(alpha);
  }while(digits==0);
 }

Ответы [ 2 ]

1 голос
/ 13 мая 2010

Почему бы не сделать scanf для вас atof преобразованием?

 #include <stdio.h>
 int main()
 {  
    float imp=0;
    while (1)
    {
       printf("Enter input\n\n");
       if (scanf("%f", &imp) < 1) break;
    }
    return 0;
}

Ваш последний пример терпит неудачу, потому что alpha - это пустой указатель. Объявите это как char alpha[40];, чтобы выделить место для этого. Возможно, вы захотите использовать% 40s в строке формата, чтобы предотвратить переполнение scanf alpha.

Кроме того, используйте strtod вместо atof, и вы узнаете, было ли преобразование успешным (лучше, чем ваш метод использования isdigit, который не даст отрицательного целого числа).

1 голос
/ 12 мая 2010

Возможно, вам нужно использовать %s вместо %c и поместить его в массив char (char*). Вы также, вероятно, получите сообщение об ошибке, что вам нужно использовать const char*, а не const char.

Вы не хотите читать только один символ - вы хотите прочитать всю строку ...

EDIT

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
main(){  
  int digits,i;
  float imp=0;
  char* alpha = malloc(100); /* 100 is for example */
  do{
    printf("Enter input\n\n");
    scanf("\n%s",&alpha);
    for (i = 0; i != 100; ++i)
    {
      if (alpha[i] == '\0')
        break;
      if (!isdigit(alpha[i]))
      {
        printf("error\n\n");
        return ...;
      }
    }
     imp=atof(alpha);
  }while(true);
}
...